Значит была у меня задача: Сделать с некоторыми 2 аргументами простую задачу (посмотреть что-то в базе данных и выполнить простые расчеты).
Это всё сводилась к вызову функции do-something:
(do-something a b)
Теперь мне надо сделать так, чтобы когда я в REPL ввожу [a b c ... n] (итд до n), вызывались функции:
(do-something a b)
(do-something a c)
...
(do-something a n)
Ну а возвращаемые значения, скажем, собирались в лист.
Что я делаю:
(defun call-do-something (stream char)
(let* ((lst (read-delimited-list #\] stream))
(firstarg (first lst))
(rest (cdr lst)))
`(loop for i in ',rest collect (do-something ,firstarg i))))
(set-macro-character #\[ #'call-do-something)
При вводе конструкции типа [a b c ... n] в REPL, лисп ждет что-то дальше, как если бы я ввел:
( 54 54 55 4 4
При определении символа #\] как макро-символа:
(set-macro-character #\] (get-macro-character #\)))
Всё работает.
Вопрос: Что же закрывает ] ?
Вот здесь:
http://www.ida.liu.se/imported/cltl/clm/node188.html#SECTION002611000000000000000
в пункте 3 написанно, что если функция, связанная с макросимволом возвращает значение, то the algorithm is done. То есть, как я понял, он возвращает loop-конструкцию и заканчивает работу. А откуда тогда ещё открытая скобка берется?
P.S. Да, возможно моя терминология хромает и я где-то назвал собаку кошкой. Поправляйте меня)