Использование # a.k.a. read-macro
Читая книгу Дуга Хойта «Let Over Lambda», я нашел следующее описание#.
sign, a.k.a. read-macro:
Основной макрос чтения, который поставляется с COMMON LISP - это #. Макрос Eval времени чтения. Этот макрос чтения позволяет встраивать в формы, которые вы читаете, объекты, которые не могут быть сериализованы, но могут быть созданы с небольшим количеством кода для lisp.
Это из главы 4, большую часть книги можно найти здесь:http://letoverlambda.com/index.cl/toc
Это пример из книги, который показывает, как одно и то же выражение может каждый раз читаться по-разному:
* '(football-game
(game-started-at
#.(get-internal-real-time))
(coin-flip
#.(if (zerop (random 2)) 'heads 'tails)))
(FOOTBALL-GAME
(GAME-STARTED-AT 187)
(COIN-FLIP HEADS))
* '(football-game
(game-started-at
#.(get-internal-real-time))
(coin-flip
#.(if (zerop (random 2)) 'heads 'tails)))
(FOOTBALL-GAME
(GAME-STARTED-AT 309)
(COIN-FLIP TAILS))
Далее автор демонстрирует некоторые хардкорные трюки, создавая вариации с#
макро.
Итак, получается, что#'
также является своего рода макросом для чтения и обычно используется перед символами, которые представляют имена функций. Но нужно ли это, и какая у него там работа?
Я могу поставить символ для функций более высокого порядка с#'
или без него:
CL-USER> (defun test nil t)
TEST
CL-USER> (funcall #'test)
T
CL-USER> (funcall 'test)
T
с таким же успехом.