Пример. Если вы хотите построить список с символом foo
и номером переменной:
(foo <some-number>)
Теперь мы напишем для него функцию:
(defun foo-it (n)
(list 'foo n))
Очевидно
(defun foo-it-1 (n)
(foo n))
Не будет работать. Он будет вызывать функцию FOO
на n
вместо построения списка.
(defun foo-it-2 (n)
'(foo n))
Выше также не будет работать, поскольку список (foo n)
не оценивается и не возвращается как есть.
Теперь Lisp имеет синтаксис backquote:
(defun foo-it-3 (n)
`(foo ,n))
Выше будет работать. Запятая отмечает, что будет оценен символ n
.
Для вашей проблемы. Замените foo
на quote
:
(list 'foo n) -> (list 'quote n)
или
`(foo ,n) -> `(quote ,n)
Основное отличие заключается в том, что принтер Lisp всегда будет печатать (foo 3)
как (foo 3)
. FOO
не имеет специальной цели. Но QUOTE
имеет (поскольку он определен на языке), и принтер Lisp может печатать (quote 3)
как '3
.
Пример:
CL-USER 14 > (progn
(write (list 'foo 3) :pretty nil)
(terpri)
(write (list 'foo 3) :pretty t)
(values))
(FOO 3)
(FOO 3)
CL-USER 15 > (progn
(write (list 'quote 3) :pretty nil)
(terpri)
(write (list 'quote 3) :pretty t)
(values))
(QUOTE 3)
'3
Это просто потому, что в Lisp символ quote
определяется встроенным синтаксисом, и принтер знает об этом.
Также обратите внимание, что печать также изменяется набором специальных символов, таких как *print-pretty*
, *print-readably*
, .... Так что разные настройки Lisp могут печатать разные, основываясь на настройках этих переменных.