En Peter Norvig's tomo épico Paradigms of Artifical Intelligence Programming en el Capítulo 7 - él describe una función interp
que es efectivamente una función eval
simple utilizada al interpretar un Esquema escueto en un REPL.Función de evaluación de padres (lector) en la fuente de 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))))))))
Curiosamente - la apertura del Capítulo Christian Queinnec'sLisp In Small Pieces tiene una función muy similar, lo llama 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))))))
Mi pregunta es - ¿dónde está la fuente de Clojure es el equivalente a la función eval
/interp
? Supongo que está en el código del lector en alguna parte.
OP ahora está muy decepcionado - descubrió el secreto sucio de Clojure que eval no es Clojure :) –
@MarkoTopolnik ¡De hecho! . Y también lo estoy, quiero decir, un poco decepcionado:/ –
Genial, gracias por esto. ¿Sería correcto suponer que ClojureScript no tiene una función eval? Esa fue la impresión que tuve de ver la introducción de Rich Hickey ClojureScript. – hawkeye