0

我目前正在为一个小项目进行 LISP 练习,需要大量帮助。这可能或多或少是一个初学者的问题,但我完全迷失在编写一个接受两个未评估函数并根据变量是否被分配了结果的特定函数。

一个例子是

(setq p1 '(+ x (* x (- y (/ z 2)))))

在哪里

(evalexp p1 '( (x 2) (z 8) ))
    returns (+ 2 (* 2 (- y 4)))

我的目标是编写 evalexp 函数,但我什至想不出从哪里开始。

到目前为止我有

(defun evalexp (e b) )

.. 不是很多。如果有人可以请帮助或引导我朝着一个好的方向前进,我将不胜感激。

4

2 回答 2

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)))
于 2011-03-08T12:47:30.677 回答
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 代码时,肯定会有一些细节需要解决。

于 2011-03-08T04:33:25.153 回答