我目前正在为一个小项目进行LISP练习,需要大力帮助。这可能或多或少是一个初学者的问题,但我完全迷失了写一个函数,它接受两个未评估的函数,并根据变量是否给定赋值而吐出结果。
一个例子是
(setq p1 '(+ x (* x (- y (/ z 2)))))
其中
(evalexp p1 '( (x 2) (z 8) ))
returns (+ 2 (* 2 (- y 4)))
我的目标是编写evalexp函数,但我甚至无法想到从哪里开始。
到目前为止我已经
了(defun evalexp (e b) )
..不是很多。如果有人能够帮助或引导我朝着一个好的方向发展,那么我将非常感激。
答案 0 :(得分:1)
这是一个完整的解决方案。这很简单,所以我会省略一个完整的解释。在评论中询问我是否有任何你无法弄明白的事情。
(使用eval
进行实际评估可能不是您在练习/项目中想要的。查找“元循环翻译”以换取另一种方式。)
(defun apply-env (exp env)
(reduce (lambda (exp bdg) (subst (cadr bdg) (car bdg) exp))
env :initial-value exp))
(defun try-eval (exp)
(if (atom exp)
exp
(let ((exp (mapcar #'try-eval exp)))
(if (every #'numberp (cdr exp))
(eval exp)
exp))))
(defun evalexp (exp env)
(try-eval (apply-env exp env)))
答案 1 :(得分:0)
这是一个提示,这是你可能会这样做的(伪代码):
function replace(vars, list):
for each element of list:
if it's an atom:
if there's an association in vars:
replace atom with value in vars
else:
leave atom alone
else:
recursively apply replace to the sublist
当你将它转换为Lisp代码时,肯定会有一些细节可以解决。