LISP函数使用+, - ,*和/对表达式执行符号和数字运算

时间:2011-03-08 04:25:37

标签: lisp numeric clisp operations

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

一个例子是

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

其中

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

我的目标是编写evalexp函数,但我甚至无法想到从哪里开始。

到目前为止我已经

(defun evalexp (e b) )

..不是很多。如果有人能够帮助或引导我朝着一个好的方向发展,那么我将非常感激。

2 个答案:

答案 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代码时,肯定会有一些细节可以解决。