উত্তর:
এলিস্প কোডের একটি স্ট্রিং মূল্যায়ন একটি দ্বি-পর্যায়ে প্রক্রিয়া: আপনার ব্যবহার করে স্ট্রিংটি পার্স করতে হবে read-from-stringএবং তারপরে ফলাফলের লিসপ এক্সপ্রেশনটি মূল্যায়ন করতে হবে eval।
(defun my-eval-string (string)
"Evaluate elisp code stored in a string."
(eval (car (read-from-string string))))
এখন (my-eval-string "(+ 1 2)")মূল্যায়ন 3।
সম্পাদনা:
@ লুনারিওর্ন দ্বারা চিহ্নিত হিসাবে , read-from-string কেবল প্রথম প্রকাশটি পড়ে , তাই এটি আরও ভাল হওয়া উচিত:
(defun my-eval-string (string)
(eval (car (read-from-string (format "(progn %s)" string)))))
সম্পাদনা 2:
পার্শ্ব প্রতিক্রিয়াগুলির জন্য এলিস্প কোডটি মূল্যায়নের জন্য যে কেউ ব্যবহার করতে পারে with-temp-bufferএবং eval-buffer( eval-bufferসর্বদা ফিরে আসে nil)।
(defun my-eval-string-for-side-effects (string)
"Evaluate a string of elisp code for side effects."
(with-temp-buffer
(insert string)
(eval-buffer)))
(my-eval-string-for-side-effects "(message \"hello!\")")
with-temp-bufferআদর্শ চেয়ে কম হয় কারণ এটা করবে সব বাফার সংক্রান্ত কল, যেমন সঙ্গে জগাখিচুড়ি আপ buffer-file-name...
কনস্ট্যানটাইন এর উত্তর ঠিক আছে।
কেবলমাত্র একটি সামান্য পরিবর্তন সরবরাহ করতে:
(defun my-eval-string (str)
"Read and evaluate all forms in str.
Return the results of all forms as a list."
(let ((next 0)
ret)
(condition-case err
(while t
(setq ret (cons (funcall (lambda (ret)
(setq next (cdr ret))
(eval (car ret)))
(read-from-string str next))
ret)))
(end-of-file))
(nreverse ret)))
(my-eval-string "1 2 3 (+ 3 1)")
শেষ ফর্মটি তালিকাটি ফিরিয়ে দেয় (1 2 3 4)।
(calc-eval "1 - 2 + 3")আপনার অজগর উদাহরণটি আরও ভাল ফিট করে যদিও এটি বৈধ এলিস্প নয়। আপনার যদি এখনওcalcপ্যাকেজটির প্রয়োজন না হয় তবে আপনার আগে এটি লোড করা দরকার(require 'calc)। (আমি জানি যে এটি আপনার প্রশ্নের উত্তর দেয় না Hence সুতরাং এটি মন্তব্য হিসাবে