Что-то вроде этого с вычисленными функциями времени чтения не будет делать то, что вы думаете.Упрощено из вашего кода:
(defun foo (a b test)
#.(defun equality-test (x y)
(funcall test x y))
(funcall #'equality-test a b))
Нет способа, которым это может работать.
Причина 1 : время чтения созданная функция не имеет доступа к лексическим переменным из окружающего кода (здесь нет способа ссылаться на test
, поскольку среда с функцией foo
не существует во время чтения)
The test
переменная внутри equality-test
не относится к лексической переменной.Не определено / не объявлено.
Причина 2 : DEFUN оценивается как символ
Код выглядит следующим образом после чтения и оценки кода времени чтения:
(defun foo (a b test)
equality-test
(funcall #'equality-test a b))
Ну, equality-test
- это несвязанная переменная.Что является ошибкой во время выполнения.
Причина 3 : функция equality-test
может не существовать
Если мы скомпилируем код с помощью файлового компилятора, функция equality-test
создается во время компиляции во время чтения формы, но не будет частью скомпилированного кода.