কারও ব্যবহার না করা তার বেশ কয়েকটি কারণ রয়েছে 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
: এটি প্রায়শই কুৎসিত হ্যাকগুলির জন্য ব্যবহৃত হয়।