2011-03-08 68 views
0

对表达式执行符号和数字操作的LISP函数我目前正在为一个小型项目开展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

什么“两个不计算功能”? – 2011-03-08 06:14:28

回答

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))) 
+0

这是惊人的,完美的作品。 LISP可以是一种优雅的语言,但如果你不理解它,它肯定会成为一个真正的痛苦。我一直在试图破解它,但我不认为我会得到像你一样简单和整齐的东西。谢谢你,先生! – TomMElack 2011-03-08 17:56:16

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代码。

+0

真棒谢谢你的即时回复。我现在要尝试着解决这个问题。非常感谢! – TomMElack 2011-03-08 05:04:24