我正在尝试使用此函数来显示文字expr2和expr1 进入。输入的数据格式为(+ x y)。
(DEFUN deriv (expr var) ; function name and arguments
(COND ( (ATOM expr) ; check for atomic expression (variable or constant)
(IF (EQL expr var)
1
0
) )
( (EQL (FIRST expr) '+) (deriv-add (SECOND expr) (THIRD expr) var) )
( (EQL (FIRST expr) '-) (deriv-minus (SECOND expr) (THIRD expr) var) )
( (EQL (FIRST expr) '*) (deriv-multi (SECOND expr) (THIRD expr) var) )
( (EQL (FIRST expr) '/) (deriv-divide (SECOND expr) (THIRD expr) var) )
( T (ERROR "UNKNOWN arithmetic operator"))
)
)
(DEFUN deriv-multi (expr1 expr2 var)
(LIST '+ (* (deriv expr1 var) expr2) (* expr1 (deriv expr2 var)))
)
(SETQ e2 '(* (+ x y) (+ y 7)) )
(DERIV e2 'x)
答案 0 :(得分:3)
这是对Lisp的一个很好的基本介绍:
http://www.cs.cmu.edu/~dst/LispBook/
'Common Lisp:由David S. Touretzky撰写的“象征性计算的温和介绍”。
免费PDF。
顺便说一下,你的功能什么都没有显示。它调用函数'LIST'。为什么expr1
和expr2
周围有括号?
关于您的代码:
在Lisp中使用自解释代码是一种很好的编码风格。由于您可以使用符号来实际命名(而不是概念的缩写),因此您可以使用描述性符号。然后通常在编辑器中使用符号完成来输入更长的符号。这可以让你摆脱评论。
不添加额外空间。写紧凑的代码。
将您的代码格式化为精简版。
使用缩进和其他行来帮助阅读代码
示例:
(defun derive (expression variable)
(if (atom expression)
(if (eql expression variable) 1 0)
(funcall (case (first expression)
(+ #'derive-addition)
(- #'derive-subtraction)
(* #'derive-multiplication)
(/ #'derive-division)
(otherwise (error "unknown arithmetic operator")))
(second expression) (third expression) variable)))
(defun derive-multiplication (expression1 expression2 variable)
(list '+
(* (derive expression1 variable)
expression2)
(* expression1
(derive expression2 variable))))
上面的功能仍有错误,很容易修复。你不想执行乘法。
(defun test ()
(assert (equal (derive '(* (+ x y) (+ y 7)) 'x)
'(+ (* (+ 1 0)
(+ y 7))
(* (+ x y)
(+ 0 0)))))))