Trong Peter Norvig's tome hoành tráng Paradigms of Artifical Intelligence Programming trong Chương 7 - ông mô tả chức năng interp
có hiệu quả là chức năng đơn giản eval
được sử dụng khi diễn giải Sơ đồ xương trần trong REPL.Chức năng eval (reader) của cha mẹ trong nguồn Clojure?
(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))))))))
Điều thú vị là đủ - khai mạc Chương của Christian Queinnec'sLisp In Small Pieces có một chức năng rất giống nhau, ông gọi nó 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))))))
Câu hỏi của tôi là - nơi được nguồn Clojure là tương đương eval
/interp
chức năng? Tôi cho rằng nó nằm trong mã người đọc ở đâu đó.
OP giờ đây rất thất vọng - anh đã phát hiện ra bí mật bẩn của Clojure mà eval không phải là Clojure :) –
@MarkoTopolnik Thật vậy! . Và tôi cũng vậy - Ý tôi là, một chút thất vọng:/ –
Tuyệt vời - cảm ơn vì điều này. Tôi có đúng khi giả định rằng ClojureScript không có hàm eval? Đó là ấn tượng mà tôi nhận được khi xem buổi nói chuyện giới thiệu Rich Hickey ClojureScript. – hawkeye