返回Lisp函数的参数

时间:2011-11-17 21:26:54

标签: function lisp return

我正在尝试使用此函数来显示文字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)

1 个答案:

答案 0 :(得分:3)

这是对Lisp的一个很好的基本介绍:

http://www.cs.cmu.edu/~dst/LispBook/

'Common Lisp:由David S. Touretzky撰写的“象征性计算的温和介绍”。

免费PDF。

顺便说一下,你的功能什么都没有显示。它调用函数'LIST'。为什么expr1expr2周围有括号?

关于您的代码:

  • 在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)))))))