Запутанный синтаксис Lisp с (оператор-целое-оператор) формат - PullRequest
0 голосов
/ 26 ноября 2018

Я новичок в lisp, и у меня возник вопрос о синтаксисе LISP:

(defparameter *binary-operators*
  '((+ 1 +) (- 1 -) (* 2 *)
    (x 2 *) (/ 2 %) (^ 3 expt)))

Насколько я понимаю, defparameter позволяет переназначать переменную бинарных операторов, но я не совсем понимаю, как (+ 1 +), (- 1 -) ... оцениваются.Я знаю в LISP, что (+ 4 6) приведет к (4 + 6) = 10, но та же логика приведет к (1 + +), что не имеет смысла.Что представляет собой приведенный выше синтаксис?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

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.Вместо того, чтобы вводить правила в код, здесь мы используем связанный список для сохранения отображений.Таким образом, мы можем добавлять новые операторы, изменяя связанный список , не изменяя фактический код.

0 голосов
/ 26 ноября 2018

В Common Lisp,

(defparameter name initial-value)

(см. Руководство ) вводит новую специальную (глобальную) переменную name с новым значением, полученным путем оценки initial-value.

Итак, в приведенном выше примере специальной переменной *binary-operators* присваивается список троек, каждая из которых состоит из символа, числа и другого символа.Другими словами, он присваивает некоторые данные переменной, а не, как вы думали, переопределяет синтаксис языка.

Судя по значениям, присутствующим в списке, эта переменная, похоже, присваиваетсясписок арифметических операторов, каждый из которых имеет приоритет и эквивалентный оператор / функция Common Lisp.Может быть, это строка какой-то программы, которая отображает арифметические выражения в s-выражениях lisp, или что-то в этом роде.

...