Возвращаемый параметр для функции Lisp - PullRequest
0 голосов
/ 18 ноября 2011

Я пытаюсь заставить эту функцию отображать литералы expr2 и expr1 по мере их ввода.Вводимые данные имеют форму (+ xy).

(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 Ответ

3 голосов
/ 18 ноября 2011

Это хорошее базовое введение в Лисп:

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

«Общий Лисп: нежное введение в символические вычисления» Дэвида С. Турецкого.

Бесплатный PDF.

Кстати, ваша функция ничего не отображает.Вызывает функцию «СПИСОК».Почему круглые скобки вокруг expr1 и expr2?

О вашем коде:

  • это хороший стиль кодирования на Лиспе, использующий код, который объясняет само собой.Поскольку вы можете использовать символы, чтобы действительно называть вещи (а не сокращать понятия), вы можете использовать описательные символы.Ввод более длинных символов обычно выполняется с помощью завершения символов в редакторе.Это позволяет избавиться от комментариев.

  • не добавляет дополнительного пространства.Пишите компактный код.

  • форматируйте ваш код красиво и компактно.

  • используйте отступы и дополнительные строки, где это помогает читать код

Пример:

(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)))))))
...