Peter Norvig's में महाकाव्य टोम Paradigms of Artifical Intelligence Programming अध्याय 7 में - वह एक समारोह interp
का वर्णन करता है जो प्रभावी रूप से एक सरल eval
फ़ंक्शन का उपयोग करता है जब एक आरईपीएल में नंगे हड्डियों की योजना का अर्थ होता है।अभिभावक eval (पाठक) समारोह?
(defun interp (x &optional env)
"Interpret (evaluate) the expression x in the environment env."
(cond
((symbolp x) (get-var x env))
((atom x) x)
((case (first x)
(QUOTE (second x))
(BEGIN (last1 (mapcar #'(lambda (y) (interp y env))
(rest x))))
(SET! (set-var! (second x) (interp (third x) env) env))
(IF (if (interp (second x) env)
(interp (third x) env)
(interp (fourth x) env)))
(LAMBDA (let ((parms (second x))
(code (maybe-add 'begin (rest2 x))))
#'(lambda (&rest args)
(interp code (extend-env parms args env)))))
(t ;; a procedure application
(apply (interp (first x) env)
(mapcar #'(lambda (v) (interp v env))
(rest x))))))))
दिलचस्प बात यह - Christian Queinnec'sLisp In Small Pieces के उद्घाटन अध्याय वह यह eval
कॉल एक बहुत समान कार्य है।
;;; This is a naive evaluator for Scheme written in naive Scheme.
(define (evaluate e env)
(if (atom? e)
(cond ((symbol? e) (lookup e env))
((or (number? e) (string? e) (char? e)
(boolean? e) (vector? e))
e)
(else (wrong "Cannot evaluate" e)))
(case (car e)
((quote) (cadr e))
((if) (if (evaluate (cadr e) env)
(evaluate (caddr e) env)
(evaluate (cadddr e) env)))
((begin) (eprogn (cdr e) env))
((set!) (update! (cadr e) env (evaluate (caddr e) env)))
((lambda) (make-function (cadr e) (cddr e) env))
(else (invoke (evaluate (car e) env)
(evlis (cdr e) env))))))
मेरा प्रश्न है - जहां Clojure स्रोत बराबर eval
/interp
समारोह है है? मुझे लगता है कि यह कहीं भी पाठक कोड में है।
ओपी अब बहुत निराश है - उसने क्लोजर के गंदे रहस्य को पाया कि eval क्लोजर नहीं है :) –
@MarkoTopolnik दरअसल! । और मैं भी हूं - मेरा मतलब है, थोड़ा निराश:/ –
ग्रेट - इसके लिए धन्यवाद। क्या मैं यह मानने में सही होगा कि क्लोजरस्क्रिप्ट में कोई eval function नहीं है? रिच हिकी क्लोजरस्क्रिप्ट परिचय बातचीत को देखने से मुझे यह इंप्रेशन मिला। – hawkeye