কেন ঠিক খারাপ মন্দ?


141

আমি জানি যে লিস্প এবং স্কিম প্রোগ্রামাররা সাধারণত বলে যে evalকঠোরভাবে প্রয়োজন না হলে এড়ানো উচিত। আমি বেশ কয়েকটি প্রোগ্রামিং ভাষার জন্য একই প্রস্তাবনাটি দেখেছি, তবে আমি এখনও ব্যবহারের বিরুদ্ধে পরিষ্কার যুক্তিগুলির তালিকা দেখিনি eval। ব্যবহারের সম্ভাব্য সমস্যার একটি অ্যাকাউন্ট আমি কোথায় পাব eval?

উদাহরণস্বরূপ, আমি GOTOপদ্ধতিগত প্রোগ্রামিংয়ের সমস্যাগুলি জানি (প্রোগ্রামগুলি অপঠনযোগ্য এবং বজায় রাখা শক্ত করে তোলে, সুরক্ষা সমস্যাগুলি খুঁজে পাওয়া শক্ত করে তোলে ইত্যাদি) তবে আমি এর বিরুদ্ধে যুক্তিগুলি কখনও দেখিনি eval

মজার বিষয় হল, একই যুক্তিগুলির বিরুদ্ধে GOTOধারাবাহিকতাগুলির বিরুদ্ধে বৈধ হওয়া উচিত, তবে আমি দেখতে পাচ্ছি যে স্কিমাররা উদাহরণস্বরূপ বলবেন না যে ধারাবাহিকতা "মন্দ" - সেগুলি ব্যবহার করার সময় আপনার অবশ্যই যত্নবান হওয়া উচিত। তারা evalধারাবাহিকতা ব্যবহার করে কোডের চেয়ে কোড ব্যবহার করে অনেক বেশি ভুল হওয়ার সম্ভাবনা রয়েছে (যতদূর আমি দেখতে পাচ্ছি - আমি ভুল হতে পারি)।


5
alভাল মন্দ নয়, তবে মন্দই মন্দ কাজগুলি করে
অনুরাগ

9
@ ইয়ার - আমার ধারণা আপনার মন্তব্যটি খুব একক-প্রেরণ-অবজেক্ট-কেন্দ্রিক বিশ্ব দৃশ্যকে ইঙ্গিত করে। এটি সম্ভবত বেশিরভাগ ভাষার ক্ষেত্রে বৈধ, তবে কমন লিস্পে পৃথক, যেখানে পদ্ধতিগুলি ক্লাসের অন্তর্গত নয় এবং ক্লোজারে আরও বেশি আলাদা, যেখানে ক্লাসগুলি কেবল জাভা ইন্টারপ ফাংশনগুলির মাধ্যমে সমর্থিত। জে এই প্রশ্নটিকে স্কিম হিসাবে ট্যাগ করেছেন, যার ক্লাস বা পদ্ধতিগুলির কোনও অন্তর্নির্মিত ধারণা নেই (ওওর বিভিন্ন রূপ গ্রন্থাগার হিসাবে উপলব্ধ)।
জাক

3
@ জাক, আপনি সঠিক, আমি কেবল জানি আমার জানা ভাষাগুলি, তবে আপনি স্টাইল ব্যবহার না করে ওয়ার্ড ডকুমেন্ট নিয়ে কাজ করলেও আপনি শুকনো হন না। আমার বক্তব্যটি নিজেকে পুনরাবৃত্তি না করার জন্য প্রযুক্তিটি ব্যবহার করা ছিল। ওও সর্বজনীন নয়, সত্য ...
ড্যান রোজনস্টার্ক

4
আমি এই প্রশ্নের ক্লোজার ট্যাগ যুক্ত করার স্বাধীনতা গ্রহণ করেছি, যেহেতু আমি বিশ্বাস করি যে ক্লোজার ব্যবহারকারীরা এখানে পোস্ট করা দুর্দান্ত উত্তরগুলির সংস্পর্শে লাভবান হতে পারেন।
মিশা মারকজিক

... ভাল, ক্লোজারের জন্য, কমপক্ষে একটি অতিরিক্ত কারণ প্রযোজ্য: আপনি ক্লোজার স্ক্রিপ্ট এবং এর ডেরাইভেটিভগুলির সাথে সামঞ্জস্যতা হারাবেন।
চার্লস ডাফি

উত্তর:


148

কারও ব্যবহার না করা তার বেশ কয়েকটি কারণ রয়েছে EVAL

নতুনদের জন্য প্রধান কারণ: আপনার এটির দরকার নেই।

উদাহরণ (সাধারণ লিস্প অনুমান করে):

বিভিন্ন অপারেটরগুলির সাথে একটি অভিব্যক্তি মূল্যায়ন করুন:

(let ((ops '(+ *)))
  (dolist (op ops)
    (print (eval (list op 1 2 3)))))

এটি আরও ভাল লিখেছেন:

(let ((ops '(+ *)))
  (dolist (op ops)
    (print (funcall op 1 2 3))))

প্রচুর উদাহরণ রয়েছে যেখানে লিস্প শিখতে শুরু করা ব্যক্তিরা তাদের প্রয়োজন বলে মনে করেন EVALতবে তাদের এটির প্রয়োজন নেই - যেহেতু এক্সপ্রেশনগুলি মূল্যায়ন করা হয় এবং কেউ ফাংশন অংশটিও মূল্যায়ন করতে পারে। বেশিরভাগ সময় ব্যবহারটি EVALমূল্যায়নকারীর বোঝার অভাব দেখায়।

এটি ম্যাক্রোগুলির একই সমস্যা। প্রায়শই নতুনরা ম্যাক্রো লেখেন, যেখানে তাদের ফাংশন লিখতে হবে - ম্যাক্রোগুলি আসলে কী তা বোঝেন না এবং বুঝতে পারেন না যে কোনও ফাংশন ইতিমধ্যে কাজটি করে।

এটি প্রায়শই কাজের ব্যবহারের জন্য ভুল সরঞ্জাম EVALএবং এটি প্রায়শই নির্দেশ করে যে শিক্ষানবিশ সাধারণত লিস্প মূল্যায়নের নিয়মগুলি বুঝতে পারে না।

আপনি কি মনে করেন আপনার যা দরকার তা যদি EVALহয়, তাহলে মত যদি কিছু পরীক্ষা FUNCALL, REDUCEবা APPLYপরিবর্তে ব্যবহার করা যেতে পারে।

  • FUNCALL - যুক্তি সহ একটি ফাংশন কল করুন: (funcall '+ 1 2 3)
  • REDUCE - মানগুলির তালিকায় একটি ফাংশন কল করুন এবং ফলাফলগুলি একত্রিত করুন: (reduce '+ '(1 2 3))
  • APPLY- আর্গুমেন্ট হিসাবে একটি তালিকা সঙ্গে একটি ফাংশন কল: (apply '+ '(1 2 3))

প্রশ্ন: আমার কি সত্যিই ইওল দরকার বা সংকলক / মূল্যায়নকারীর ইতিমধ্যে যা আমি চাই তা চাই?

EVALসামান্য আরও উন্নত ব্যবহারকারীদের জন্য এড়ানো প্রধান কারণ :

  • আপনি নিশ্চিত করতে চান যে আপনার কোডটি সংকলিত হয়েছে, কারণ সংকলকটি অনেক সমস্যার জন্য কোডটি পরীক্ষা করতে পারে এবং দ্রুত কোড জেনারেট করতে পারে, কখনও কখনও খুব বেশি কিছু (এটি ফ্যাক্টর 1000 ;-)) দ্রুত কোড করে

  • যে কোডটি নির্মিত এবং মূল্যায়ন করা দরকার তা যত তাড়াতাড়ি সম্ভব সংকলন করা যায় না।

  • ইচ্ছামত ব্যবহারকারীর ইনপুট বিভক্ত করা সুরক্ষা সমস্যাগুলি খুলবে

  • মূল্যায়নের কিছু ব্যবহার EVALভুল সময়ে ঘটতে পারে এবং সমস্যা তৈরি করতে পারে

একটি সরল উদাহরণ দিয়ে শেষ পয়েন্টটি ব্যাখ্যা করতে:

(defmacro foo (a b)
  (list (if (eql a 3) 'sin 'cos) b))

সুতরাং, আমি কোনও ম্যাক্রো লিখতে চাই যা প্রথম প্যারামিটারের ভিত্তিতে হয় SINবা হয় ব্যবহার করে COS

(foo 3 4)না (sin 4)এবং (foo 1 4)না (cos 4)

এখন আমাদের থাকতে পারে:

(foo (+ 2 1) 4)

এটি পছন্দসই ফলাফল দেয় না।

তারপরে কেউ FOOভেরিয়েবলটি মূল্যায়ন করে ম্যাক্রোটি মেরামত করতে চান :

(defmacro foo (a b)
  (list (if (eql (eval a) 3) 'sin 'cos) b))

(foo (+ 2 1) 4)

কিন্তু তারপরেও এটি কার্যকর হয় না:

(defun bar (a b)
  (foo a b))

ভেরিয়েবলের মান কমপাইল করার সময় কেবল জানা যায় না।

এড়াতে একটি সাধারণ গুরুত্বপূর্ণ কারণ EVAL: এটি প্রায়শই কুৎসিত হ্যাকগুলির জন্য ব্যবহৃত হয়।


3
ধন্যবাদ! আমি ঠিক শেষ পয়েন্টটি বুঝতে পারি নি (ভুল সময়ে মূল্যায়ন?) - আপনি কিছুটা বিশদভাবে বর্ণনা করবেন দয়া করে?
জয়

41
+1 এটি হ'ল আসল উত্তর - লোকেরা evalকেবল পিছনে পড়ে কারণ তারা জানে না যে তারা কী করতে চায় তার জন্য একটি নির্দিষ্ট ভাষা বা গ্রন্থাগারের বৈশিষ্ট্য রয়েছে। জেএস-এর অনুরূপ উদাহরণ: আমি গতিশীল নাম ব্যবহার করে কোনও বস্তু থেকে সম্পত্তি পেতে চাই, তাই আমি লিখি: eval("obj.+" + propName)যখন আমি লিখতে পারতাম obj[propName]
ড্যানিয়েল আরউইকার

আমি এখন আপনি কি বলতে চাই, রাইনার! Thansk!
জয় 18

@Daniel: "obj.+"? সর্বশেষ আমি যাচাই করেছিলাম, +জেএস-এ ডট-রেফারেন্স ব্যবহার করার সময় বৈধ নয়।
হ্যালো 71

2
@ ড্যানিয়েল সম্ভবত ইওল ("আপত্তি।" + প্রোপনাম) বোঝায় যা প্রত্যাশা অনুযায়ী কাজ করা উচিত।
ক্লজ

41

eval(যে কোনও ভাষায়) একইভাবে মন্দ নয় যেমন চেইনসও মন্দ নয়। এটি একটি সরঞ্জাম। এটি এমন একটি শক্তিশালী হাতিয়ার হিসাবে দেখা যায় যা অপব্যবহার করা হলে, অঙ্গগুলি ভেঙে ফেলতে পারে (রূপকভাবে বলা যায়) তবে প্রোগ্রামার এর টুলবক্সে অনেকগুলি সরঞ্জামের ক্ষেত্রে এটি একই কথা বলা যেতে পারে:

  • goto এবং বন্ধুরা
  • লক-ভিত্তিক থ্রেডিং
  • continuations
  • ম্যাক্রোস (হাইজেনিক বা অন্যান্য)
  • পয়েন্টার
  • পুনরায় আরম্ভযোগ্য ব্যতিক্রম
  • স্ব-সংশোধনকারী কোড
  • ... এবং হাজার হাজার cast

যদি আপনি নিজেকে এই শক্তিশালী, সম্ভাব্য বিপজ্জনক সরঞ্জামগুলির কোনও ব্যবহার করতে দেখেন তবে নিজেকে তিনবার জিজ্ঞাসা করুন "কেন?" একটি শৃঙ্খলে। উদাহরণ স্বরূপ:

"আমাকে কেন ব্যবহার করতে হবে eval?" "ফু এর কারণে।" "কেন ফু দরকার?" "কারণ ..."

যদি আপনি সেই শৃঙ্খলের শেষে পৌঁছে যান এবং সরঞ্জামটি এখনও মনে হচ্ছে এটি করা সঠিক জিনিস, তবে এটি করুন। এটি থেকে নরক দস্তাবেজ। এটি থেকে জাহান্নাম পরীক্ষা করুন। বারবার এবং আবারও সঠিকতা এবং সুরক্ষা পরীক্ষা করুন। তবে কর।


ধন্যবাদ - এর আগে আমি ইওল এর কথা শুনেছি ("নিজেকে কেন জিজ্ঞাসা করুন") তবে সম্ভাব্য সমস্যাগুলি কী তা আমি এখনও কখনও শুনিনি বা পড়িনি। উত্তরগুলি থেকে এখন তারা দেখতে পাচ্ছি (সুরক্ষা এবং কার্য সম্পাদনের সমস্যা) problems
জয়

8
এবং কোড পাঠযোগ্যতা। ইভাল পুরোপুরি কোডের প্রবাহকে স্ক্রু করে এনে বোঝা যায় না।
আমার সঠিক মতামতটি

আপনার তালিকায় কেন "লক-ভিত্তিক থ্রেডিং" [sic] রয়েছে তা আমি বুঝতে পারি না। একযোগে এমন কিছু রূপ রয়েছে যা তালাগুলিতে জড়িত না এবং লকগুলি নিয়ে সমস্যাগুলি সাধারণত পরিচিত but
asveikau

4
অ্যাসভেইকাউ: লক-ভিত্তিক থ্রেডিংটি সঠিকভাবে পাওয়া খুব কুখ্যাত (আমি অনুমান করতে পারি যে লক ব্যবহার করে 99.44% প্রোডাকশন কোডটি খারাপ)। এটি রচনা করে না। আপনার "মাল্টি-থ্রেডড" কোডটি সিরিয়াল কোডে পরিণত করার প্রবণতা রয়েছে। (এটির জন্য সংশোধন করার পরিবর্তে কোডটি ধীর এবং প্রস্ফুটিত হয় পরিবর্তে ST
আমার সঠিক মতামতটি

"কেন চেইন" :) এটি আঘাত করতে পারে এমন 3 টি পদক্ষেপের পরে থামাতে ভুলবেন না।
szymanowski

27

Eval জরিমানা, যতদিন না পর্যন্ত আপনি জানেন হিসাবে ঠিক কি এটা মধ্যে যাওয়া হয়। এটিতে যে কোনও ব্যবহারকারীর ইনপুট রয়েছে তা অবশ্যই যাচাই করা উচিত এবং যাচাই করা উচিত এবং সবকিছু। আপনি যদি 100% নিশ্চিত হতে না জানেন তবে তা করবেন না।

মূলত, কোনও ব্যবহারকারী প্রশ্নযুক্ত ভাষার জন্য যে কোনও কোডে টাইপ করতে পারেন এবং এটি কার্যকর হবে। আপনি নিজেই ভাবতে পারেন যে সে কতটা ক্ষতি করতে পারে।


1
তাই আপনি যদি আমি আসলে করছি উৎপাদিত একটি আলগোরিদিম যা সরাসরি ব্যবহারকারীর ইনপুট কপি হবে না, এবং যে যদি সহজ ও ম্যাক্রো বা অন্যান্য কৌশল ব্যবহার করে চেয়ে কিছু নির্দিষ্ট অবস্থায় পরিষ্কার হয়, তাহলে আমি কিছু নেই অনুমান "মন্দ ব্যবহার ব্যবহারকারীর ইনপুট উপর ভিত্তি করে এস-এক্সপ্রেশন "এটা সম্পর্কে? অন্য কথায়, কেবলমাত্র ইওলির সমস্যাগুলি এসকিউএল ক্যোয়ারী এবং অন্যান্য কৌশলগুলির সাথে একই যা ব্যবহারকারীদের সরাসরি ইনপুট ব্যবহার করে?
জয়

10
এটিকে "দুষ্ট" বলা হবার কারণ হ'ল এটি অন্যায় করার চেয়ে অন্যায় করার চেয়ে খারাপ করা। এবং যেমনটি আমরা জানি, newbies ভুল জিনিস করতে হবে।
টোর ভালামো

3
আমি বলব না যে কোডটি সমস্ত পরিস্থিতিতে বিলোপের আগে অবশ্যই বৈধ হওয়া উচিত। উদাহরণস্বরূপ একটি সাধারণ আরপিএল বাস্তবায়নের সময়, আপনি সম্ভবত ইনপুটটি কেবল চেক না করা অবস্থায় ফিড করবেন এবং এটি কোনও সমস্যা হবে না (অবশ্যই কোনও ওয়েব-ভিত্তিক আরপিএল লেখার সময় আপনার স্যান্ডবক্সের প্রয়োজন হবে, তবে এটি সাধারণ ক্ষেত্রে নয়) ব্যবহারকারীর সিস্টেমে চালিত সিএলআই-রিপ্লেগুলি)।
sepp2k

1
যেমনটি আমি বলেছিলাম, আপনি যখন জানাতে চান যা আপনি খাওয়ান ঠিক তখনই আপনাকে জানতে হবে। যদি এর অর্থ হয় "এটি স্যান্ডবক্সের সীমাতে কিছু কমান্ড কার্যকর করবে", তবে এর অর্থ এটি। ;)
টোর ভালামো

@ তোরাভালামো জেল ভাঙার কথা কি কখনও শুনেছেন?
Loïc Faure-Lacroix

21

"কখন ব্যবহার করব eval?" একটি ভাল প্রশ্ন হতে পারে।

সংক্ষিপ্ত উত্তরটি হ'ল "যখন আপনার প্রোগ্রামটি রানটাইমের সময় অন্য প্রোগ্রামটি লেখার উদ্দেশ্যে থাকে এবং তারপরে এটি চালানো হয়"। জেনেটিক প্রোগ্রামিং এমন একটি পরিস্থিতির উদাহরণ যেখানে এটি ব্যবহারের সম্ভবত বোধগম্য হয় eval


14

আইএমও, এই প্রশ্নটি এলআইএসপি-তে নির্দিষ্ট নয় । পিএইচপি-র জন্য একই প্রশ্নের উত্তর এখানে দেওয়া হয়েছে, এবং এটি এলআইএসপি, রুবি এবং অন্যান্য ভাষায় প্রয়োগ হয় যার একটি উদাহরণ রয়েছে:

ইভাল () সহ প্রধান সমস্যাগুলি হ'ল:

  • সম্ভাব্য অনিরাপদ ইনপুট। অবিশ্বস্ত পরামিতি পাস করা ব্যর্থ হওয়ার উপায়। কোনও পরামিতি (বা এর অংশ) পুরোপুরি বিশ্বাসযোগ্য তা নিশ্চিত করা প্রায়শই তুচ্ছ কাজ নয়।
  • Trickyness। ইভাল () ব্যবহার কোডকে চতুর করে তোলে, তাই অনুসরণ করা আরও কঠিন। ব্রায়ান কার্নিগানকে উদ্ধৃত করে " প্রথম স্থানে কোডটি লেখার চেয়ে দ্বিগুণ শক্ত হয়ে পড়েছে । সুতরাং, আপনি কোডটি যতটা চালাকতার সাথে লিখেছেন, সংজ্ঞা অনুসারে আপনি এটিকে ডিবাগ করার পক্ষে যথেষ্ট স্মার্ট নন "

প্রকৃত ব্যবহারের () ব্যবহারের মূল সমস্যাটি কেবল একটি:

  • অনভিজ্ঞ বিকাশকারীরা যারা যথেষ্ট বিবেচনা ছাড়াই এটি ব্যবহার করেন।

এখান থেকে নেওয়া হয়েছে

আমি মনে করি কৌতুকময় টুকরা একটি আশ্চর্যজনক বিষয়। কোড গল্ফ এবং সংক্ষিপ্ত কোডের আবেগের ফলে সর্বদা "চালাক" কোড আসে (যার জন্য প্রমাণগুলি দুর্দান্ত সরঞ্জাম। তবে আপনার কোডটি পঠনযোগ্যতার জন্য লিখতে হবে, আইএমও, আপনি বুদ্ধিমান এবং কাগজ সংরক্ষণ না করার তা প্রদর্শন করার জন্য (আপনি যেভাবে এটি প্রিন্ট করবেন না)।

তারপরে এলআইএসপিতে প্রাসঙ্গিক সম্পর্কিত কিছু সমস্যা রয়েছে যেখানে ইওল চালানো হয়, তাই অবিশ্বস্ত কোড আরও কিছু জিনিস অ্যাক্সেস পেতে পারে; এই সমস্যাটি যাইহোক সাধারণ মনে হয়।


3
ইভিএল সম্পর্কিত "দুষ্ট ইনপুট" সমস্যাটি কেবল অ-লিস্প ভাষাগুলিকেই প্রভাবিত করে, কারণ এই ভাষাগুলিতে সাধারণত alভাল () একটি স্ট্রিং আর্গুমেন্ট নেয় এবং ব্যবহারকারীর ইনপুটটি সাধারণত বিভক্ত হয় user ব্যবহারকারীরা তাদের ইনপুটটিতে একটি উদ্ধৃতি অন্তর্ভুক্ত করতে পারে এবং এতে পালিয়ে যেতে পারে উত্পন্ন কোড। তবে লিস্পে, এভ্যালের যুক্তিটি কোনও স্ট্রিং নয় এবং আপনি সম্পূর্ণ বেপরোয়া হয়ে থাকলে ব্যবহারকারীর ইনপুট কোডে পালাতে পারে না (যেমন আপনি কোনও এস-এক্সপ্রেশন তৈরি করতে READ-FROM-STRING এর সাথে ইনপুটটি পার্স করেছেন, যা আপনি এতে অন্তর্ভুক্ত করেছেন এভাল কোডটি এটি উদ্ধৃত না করেই। আপনি যদি এটিকে উদ্ধৃত করেন, উদ্ধৃতিটি এড়ানোর কোনও উপায় নেই)।
অ্যাকাউন্টে ফেলে দিন

12

অনেক দুর্দান্ত উত্তর পেয়েছে তবে এখানে র‌্যাকেটের অন্যতম প্রয়োগকারী ম্যাথু ফ্ল্যাটের কাছ থেকে আরেকটি গ্রহণ করা হয়েছে:

http://blog.racket-lang.org/2011/10/on-eval-in-dynamic-languages-generally.html

তিনি ইতিমধ্যে কভার করা অনেকগুলি পয়েন্ট করেছেন তবে কিছু লোক তবুও তার গ্রহণ আকর্ষণীয় বলে মনে করতে পারে।

সংক্ষিপ্তসার: এটি যে প্রসঙ্গে ব্যবহৃত হয়েছে তা ইওলির ফলাফলকে প্রভাবিত করে তবে প্রায়শই প্রোগ্রামাররা এটি বিবেচনা করে না, অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যায়।


11

ক্যানোনিকাল উত্তর হ'ল দূরে থাক। যা আমি অদ্ভুত বলে মনে করি, কারণ এটি একটি আদিম, এবং সাতটি আদিমতার (অন্যটি কনস, গাড়ি, সিডিআর, যদি, এক এবং কোট) হয়, এটি কমপক্ষে ব্যবহার এবং ভালবাসার পরিমাণ পেয়ে যায়।

অন ​​লিসপ থেকে : "সাধারণত, স্পষ্টভাবে স্পষ্ট কল করা বিমানবন্দরের উপহার-দোকানে কিছু কেনার মতো।

সুতরাং আমি কখন ইওল ব্যবহার করব? একটি সাধারণ ব্যবহার হ'ল মূল্যায়ন করে আপনার REPL এর মধ্যে একটি REPL রাখা (loop (print (eval (read))))। সবাই যে ব্যবহারে ভাল আছেন।

তবে আপনি ম্যাক্রোগুলির ক্ষেত্রেও ফাংশনগুলি সংজ্ঞায়িত করতে পারেন যা ব্যাককোটের সাথে ইওলকে সংযুক্ত করে সংকলনের পরে মূল্যায়ন করা হবে । তুমি যাও

(eval `(macro ,arg0 ,arg1 ,arg2))))

এবং এটি আপনার জন্য প্রসঙ্গটি মেরে ফেলবে।

Swank (ইমাস স্লাইমের জন্য) এই ক্ষেত্রে পূর্ণ। তারা এ জাতীয় চেহারা:

(defun toggle-trace-aux (fspec &rest args)
  (cond ((member fspec (eval '(trace)) :test #'equal)
         (eval `(untrace ,fspec))
         (format nil "~S is now untraced." fspec))
        (t
         (eval `(trace ,@(if args `(:encapsulate nil) (list)) ,fspec ,@args))
         (format nil "~S is now traced." fspec))))

আমি মনে করি না এটি একটি নোংরা হ্যাক। আমি ম্যাক্রোগুলিকে ফাংশনগুলিতে পুনরায় সংহত করতে আমি নিজেই সর্বদা এটি ব্যবহার করি।


1
আপনি কার্নেল ভাষাটি পরীক্ষা করতে চাইতে পারেন;)
আর্টেমোনস্টার

7

লিস্প ইভাল সম্পর্কে আরও কয়েকটি পয়েন্ট:

  • এটি আপনার স্থানীয় প্রসঙ্গটি হারিয়ে বিশ্বব্যাপী পরিবেশের অধীনে মূল্যায়ন করে।
  • কখনও কখনও আপনি ওয়াল ব্যবহার করতে প্রলুব্ধ হতে পারেন, যখন আপনি সত্যিই রিড-ম্যাক্রো ব্যবহার করতে চেয়েছিলেন '#'। যা পড়ার সময় মূল্যায়ন করে।

আমি বুঝতে পারি যে বিশ্বব্যাপী এনভির ব্যবহার সাধারণ লিস্প এবং স্কিম উভয়ের জন্যই সত্য; এটা কি Clojure জন্য সত্য?
জে

2
স্কিমে (কমপক্ষে R7RS এর জন্য, সম্ভবত আর 6 আরএসের জন্যও) আপনাকে অবশ্যই একটি পরিবেশ পাস করতে হবে।
সিএসএল

4

গোটো "রুল" এর মতো: আপনি কী করছেন তা যদি আপনি না জানেন তবে আপনি কোনও গোলযোগ করতে পারেন।

কেবলমাত্র পরিচিত এবং নিরাপদ ডেটার বাইরে কিছু তৈরি করা ছাড়াও, কিছু ভাষা / বাস্তবায়ন কোডটি যথেষ্ট পরিমাণে অনুকূল করতে পারে না এমন সমস্যা there's আপনি ভিতরে ব্যাখ্যা করা কোড দিয়ে শেষ করতে পারে eval


গোটোর সাথে এই নিয়মের কী সম্পর্ক আছে? এমন কোনও প্রোগ্রামিং ভাষার কোনও বৈশিষ্ট্য রয়েছে যার সাহায্যে আপনি গোলযোগ করতে পারবেন না ?
কেন

2
@ কেন: কোনও গোটো নিয়ম নেই, সুতরাং আমার উত্তরে উদ্ধৃতি চিহ্ন রয়েছে। যারা নিজের জন্য ভেবে ভয় পান তাদের জন্য এখানে কেবল একটি মতবাদ রয়েছে। Alভাল জন্য একই। আমি মনে করি ইয়াল ব্যবহার করে কিছু পার্ল স্ক্রিপ্ট নাটকীয়ভাবে গতি বাড়িয়েছি। এটি আপনার টুলবক্সে একটি সরঞ্জাম। অন্যান্য ভাষার নির্মাণগুলি আরও সহজ / আরও ভাল যখন Newbies প্রায়শই ইওল ব্যবহার করে। তবে এটিকে পুরোপুরি এড়িয়ে চলা কেবল শীতল হওয়া এবং কৌতূহলী লোকদের দয়া করে?
স্টেচ

4

ইভাল কেবল অনিরাপদ। উদাহরণস্বরূপ আপনার নিম্নলিখিত কোড রয়েছে:

eval('
hello('.$_GET['user'].');
');

এখন ব্যবহারকারী আপনার সাইটে এসে url প্রবেশ করে http://example.com/file.php?user= );; is_admin = সত্য; প্রতিধ্বনি (

তারপরে ফলাফলের কোডটি হ'ল:

hello();$is_admin=true;echo();

6
তিনি কথা বলছিলেন লিস্প পিএইচপি না ভেবে ভাবেন
fmsf

4
@ এফএমএসফ তিনি লিস্প সম্পর্কে বিশেষত কথা বলছিলেন তবে সাধারণত evalযে কোনও ভাষায় তা ছিল সে সম্পর্কে ।
স্কিলড্রিক

4
@fmsf - এটি আসলে একটি ভাষা-স্বাধীন প্রশ্ন। এটি স্থির সংকলিত ভাষাগুলির ক্ষেত্রেও প্রযোজ্য কারণ তারা রানটাইমগুলিতে সংকলককে কল করে ওয়াল সিমুলেট করতে পারে।
ড্যানিয়েল আরউইকার

1
সেক্ষেত্রে ভাষাটি একটি সদৃশ। আমি এখানে এই মত প্রচুর দেখেছি।
fmsf

9
পিএইচপি ইভাল লিপ ইভালের মতো নয়। দেখুন, এটি একটি চরিত্রের স্ট্রিংয়ে কাজ করে এবং ইউআরএলটিতে শোষণ একটি পাঠ্য বন্ধনী বন্ধ করতে এবং অন্যটি খুলতে সক্ষম হওয়ার উপর নির্ভর করে। এই ধরণের স্টাফের জন্য লিস্প ইভাল সংবেদনশীল নয়। আপনি যদি এটি সঠিকভাবে স্যান্ডবক্স করেন তবে কোনও নেটওয়ার্ক থেকে ইনপুট হিসাবে উপস্থিত ডেটাগুলি প্রমাণ করতে পারেন (এবং এটির জন্য কাঠামোটি হাঁটার পক্ষে যথেষ্ট সহজ)।
কাজ

2

ইভাল মন্দ নয়। ইভাল জটিল নয়। এটি এমন একটি ফাংশন যা আপনার কাছে দেওয়া তালিকার সংকলন করে। বেশিরভাগ অন্যান্য ভাষায়, স্বেচ্ছাসেবক কোড সংকলনের অর্থ ভাষার এএসটি শেখা এবং সংকলক এপিআই বের করার জন্য সংকলক ইন্টার্নালগুলিতে প্রায় খনন করা। লিস্পে, আপনি কেবল ইভাল কল করেন।

আপনি কখন এটি ব্যবহার করা উচিত? যখনই আপনার কোনও কিছু সংকলনের প্রয়োজন হয়, সাধারণত এমন একটি প্রোগ্রাম যা রানটাইম সময়ে স্বতন্ত্র কোড গ্রহণ করে, উত্পন্ন করে বা সংশোধন করে

আপনি কখন এটি ব্যবহার করবেন না? অন্যান্য সমস্ত ক্ষেত্রে।

আপনার যখন প্রয়োজন হবে না তখন কেন এটি ব্যবহার করবেন না? কারণ আপনি অযথা জটিলভাবে এমন কিছু করছেন যা পাঠযোগ্যতা, কর্মক্ষমতা এবং ডিবাগিংয়ের জন্য সমস্যা তৈরি করতে পারে।

হ্যাঁ, তবে আমি যদি শিক্ষানবিশ হয় তবে কীভাবে আমি এটি ব্যবহার করব কিনা তা আমি কীভাবে জানব? ফাংশনগুলির সাথে আপনার যা প্রয়োজন তা কার্যকর করার চেষ্টা করুন। যদি এটি কাজ না করে তবে ম্যাক্রোগুলি যুক্ত করুন। যদি এখনও কাজ করে না, তবে খোল!

এই নিয়মগুলি অনুসরণ করুন এবং আপনি কখনই খারাপ কাজ করবেন না :)


0

আমি জাকের উত্তরটি খুব পছন্দ করি এবং তিনি বিষয়টিটির সারমর্মটি পেয়েছেন : আপনি যখন কোনও নতুন ভাষা, স্ক্রিপ্ট বা কোনও ভাষার সংশোধন লেখেন তখন al ভাল ব্যবহৃত হয়। তিনি আসলেই আরও ব্যাখ্যা করেন না তাই আমি একটি উদাহরণ দেব:

(eval (read-line))

এই সহজ লিস্প প্রোগ্রামে ব্যবহারকারীকে ইনপুট দেওয়ার জন্য অনুরোধ জানানো হয় এবং তারপরে যা কিছু তারা প্রবেশ করেন তা মূল্যায়ন করা হয়। এটি কাজের জন্য প্রতীক সংজ্ঞাগুলির পুরো সেটটি উপস্থিত থাকতে হবে যদি প্রোগ্রামটি সংকলিত হয়, কারণ ব্যবহারকারী কোন ফাংশনটি প্রবেশ করতে পারে সে সম্পর্কে আপনার কোনও ধারণা নেই, সুতরাং আপনাকে সেগুলি সমস্ত অন্তর্ভুক্ত করতে হবে। এর অর্থ হ'ল আপনি যদি এই সাধারণ প্রোগ্রামটি সংকলন করেন তবে ফলাফলিত বাইনারিটি বিশাল ig

নীতি হিসাবে, আপনি এমনকি এই কারণে এটি একটি সংকলনযোগ্য বিবৃতি বিবেচনা করতে পারবেন না। সাধারণভাবে, আপনি একবার eval ব্যবহার করার পরে , আপনি একটি ব্যাখ্যামূলক পরিবেশে কাজ করছেন, এবং কোডটি আর সংকলন করা যাবে না। আপনি যদি ইভাল ব্যবহার না করেন তবে আপনি সি প্রোগ্রামের মতো একটি লিস্প বা স্কিম প্রোগ্রাম সংকলন করতে পারেন। অতএব, আপনি নিশ্চিত করতে চান যে আপনি ইওল ব্যবহার করার প্রতিশ্রুতি দেওয়ার আগে একটি ব্যাখ্যা করা পরিবেশে চান এবং তা প্রয়োজন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.