2015-10-23 4 views
1

J'essaye d'écrire une fonction nommée calculate qui obtient une liste comme une entrée, et calcule sa valeur (fonctionne comme un réducteur de lambda calculus).EVAL: fonction indéfinie NIL en Lisp

Voici mon code:

(defun substitue(x y z) 
    (cond ((atom z) (cond ((eq z y) x) 
         (T z))) 
     (T (cons (substitue x y (car z)) 
       (substitue x y (cdr z)))))) 

(defun substitute-and-eval(x y z) 
    (eval (substitue x y z))) 

(defun calculate(l) 
    (cond ((eq l nil) nil) 
     ((atom l) (eval l)) 
     (T (substitute-and-eval (calculate (cdr l)) 
           (calculate (car l)) 
           l)))) 

mais quand je l'appelle la ligne suivante dans Lisp, je reçois l'erreur:

(calculate '((lambda (x) (+ x 2)) 
      (lambda (y) (y)) 
      ((lambda (z) (+ z 4)) 3))) 

Erreur:

EVAL: undefined function NIL 

Je retracé l'histoire de code et ne trouve nulle part où j'appelle récursivement eval sur nil, donc je ne pouvais pas trouver le problème. Je ne suis pas sûr que ma fonction de calcul fasse ce qu'elle devrait faire correctement. Comme je suis un novice en Lisp, j'apprécierais toute aide.

Répondre

2

Si nous appelons calculate sur ((lambda (z) (+ z 4)) 3), il appelle alors calculate sur la cdr de ci-dessus, qui est (3). Ensuite, appelez le (substitute-and-eval nil 3 '(3)). Lequel tente alors d'évaluer (nil) ...

Avec un stepper, le mauvais appel est facile à trouver, voir STEP.

+0

bel appel, merci. –