我试图让这个函数显示文字 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)
最佳答案
这是对 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)))))))
关于function - Lisp 函数的返回参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174546/