Это хорошее базовое введение в Лисп:
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)))))))