Я пытаюсь сделать общий лисп-эквивалент этой вспомогательной функции UCI Lisp / Interlisp для набора шаблонов.
(DRM /? (LAMBDA () (LIST '*VAR* (READ]
Документация выглядит следующим образом:
-Variables, which are used by the pattern matcher, start with a question mark ("?"), as in ?FOO.
-This is converted internally to (*VAR* role-name), so ?FOO becomes (*VAR* FOO).
-The DRM defines ? to convert itself to *VAR* when it is read
Это моя текущая реализация:
(set-macro-character #\? (lambda () (list '*var* (read))))
Но когда я запустил функцию сопоставления ниже:
(match (ptrans (actor ?x) (object ?x) (to (store)))
(ptrans (actor (person)) (object (person)) (to (store))) nil)
, я получаю следующую ошибку, исходящую от функции DRM:
*** - EVAL/APPLY: too many arguments given to :LAMBDA
Верна ли моя реализация?