উত্তর:
এলিস্প কোডের একটি স্ট্রিং মূল্যায়ন একটি দ্বি-পর্যায়ে প্রক্রিয়া: আপনার ব্যবহার করে স্ট্রিংটি পার্স করতে হবে 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 সুতরাং এটি মন্তব্য হিসাবে