Идентификация пользователей в бэкэнде с Auth0

Пример. Если вы хотите построить список с символом 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 могут печатать разные, основываясь на настройках этих переменных.

0
задан sravs 5 March 2019 в 17:54
поделиться