#'omegashift
- это макрос для чтения, который расширяется до списка (function omegashift)
.
Когда вы оцениваете (function omegashift)
, вы получаете функцию, но вы не оцениваете ее, потому что вы цитировали список. Итак, вы просто получаете список, до которого расширяется макрос для чтения.
Вы бы увидели то же самое, если бы сделали (listp (car '('foo)))
. 'foo
расширяется до списка (quote foo)
. Это приводит к символу foo
, но кавычка перед списком препятствует вычислению.
Чтобы получить функции вместо списков, вам нужно вычислить выражения функции. Вы можете сделать это, вызвав функцию list
вместо цитирования списка.
(setq *spider* (make-spider
:omegas '()
:values (list *input*)
:k (list #'omegashift #'dec #'dupval (list (cons 0 #'dec) (cons 1 #'inc) (cons 2 #'dec)))))
Вы также можете использовать обратную цитату, чтобы упростить это:
(setq *spider* (make-spider
:omegas '()
:values (list *input*)
:k `(,#'omegashift ,#'dec ,#'dupval '((0 . ,#'dec) (1 . ,#'inc) (2 . ,#'dec)))))
Внутри выражения в кавычках вы используйте запятую, чтобы отметить подвыражения, которые вы хотите вычислить.
Кстати, вы должны использовать setq
для присваивания переменных, а не set
с символом в кавычках. Они эквивалентны для глобальных переменных, но вы не можете использовать set
с локальной переменной.