जवाबों:
एलीस्प कोड की एक स्ट्रिंग का मूल्यांकन एक दो-चरण की प्रक्रिया है: आपको स्ट्रिंग का उपयोग करके पार्स करने की आवश्यकता है 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
।
संपादित करें:
जैसा कि @lunaryorn द्वारा बताया गया है , 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)
। (मुझे पता है कि यह आपके सवाल का जवाब नहीं देता है। इसलिए इसे टिप्पणी के रूप में तैयार किया गया है।)