একটি স্ট্রিংয়ে থাকা এলিস্প কোডটি কীভাবে মূল্যায়ন করবেন?


21

প্রশ্নটি বেশ কিছুটা বলেছে: আমার কাছে একটি বৈধ এলিস্প অভিব্যক্তির উত্স কোডযুক্ত একটি স্ট্রিং রয়েছে এবং আমি এটি মূল্যায়ন করতে চাই।

(পাইথনে, উদাহরণস্বরূপ, এক্সপ্রেশনটি eval("1 - 2 + 3")2 এ মূল্যায়ন করে))


2
দ্রষ্টব্য, (calc-eval "1 - 2 + 3")আপনার অজগর উদাহরণটি আরও ভাল ফিট করে যদিও এটি বৈধ এলিস্প নয়। আপনার যদি এখনও calcপ্যাকেজটির প্রয়োজন না হয় তবে আপনার আগে এটি লোড করা দরকার (require 'calc)। (আমি জানি যে এটি আপনার প্রশ্নের উত্তর দেয় না Hence সুতরাং এটি মন্তব্য হিসাবে
টোবিয়াস

উত্তর:


24

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

5

কনস্ট্যানটাইন এর উত্তর ঠিক আছে।

কেবলমাত্র একটি সামান্য পরিবর্তন সরবরাহ করতে:

(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)

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