Lisp: списки и символы используются в данных и в коде
Это одно из приложений, где код является данными.В Лиспе символы и списки являются данными.Но они также используются для написания программ: символы затем используются для имен переменных , имен функций и многих других.Списки используются для написания выражений на языке Лисп - они называются формы .
В программе на Лиспе
(+ 1 2)
- это вызов функции функции с именем +
с двумя значениями.
'(+ 1 2)
или
(quote (+ 1 2))
, а затем данные -> список символа +
и чисел 1
и 2
.
Пример: преобразование из инфикса в префикс
Используемая вами форма определяет отображение символа, обозначающего математическую функцию, весу и фактической функции Лиспа, которую она представляет для преобразования.
См. Lispology: инфикс для префикса
(defparameter *binary-operators*
; operator weight Lisp function
'((+ 1 +)
(- 1 -)
(* 2 *)
(x 2 *)
(/ 2 %)
(^ 3 expt)))
Мы можем использовать его для преобразования инфиксных математических выражений в префиксные выражения Lisp (см. Выше связанную статью для кода):
CL-USER 52 > (infix-prefix '(2 * 3 ^ 4))
(* 2 (EXPT 3 4))
Когда мы изменим этот список ассоциаций, преобразование будет другим.Давайте изменим вес оператора ^
:
CL-USER 53 > (defparameter *binary-operators*
'((+ 1 +)
(- 1 -)
(* 2 *)
(x 2 *)
(/ 2 %)
(^ 1 expt))) ; weight changed to 1
*BINARY-OPERATORS*
Теперь мы можем преобразовать приведенный выше пример и получить другую форму Lisp:
CL-USER 54 > (infix-prefix '(2 * 3 ^ 4))
(EXPT (* 2 3) 4)
Итак, *binary-operators*
это данные, которые управляют преобразованием математических выражений инфикса в формы Lisp.Вместо того, чтобы вводить правила в код, здесь мы используем связанный список для сохранения отображений.Таким образом, мы можем добавлять новые операторы, изменяя связанный список , не изменяя фактический код.