Моя цель - оценить выражение во время компиляции, как некоторые простые вещи, как (+ 1 1).Но я хотел бы, чтобы целое число «2» компилировалось вместо полной операции «1 + 1», выполняемой во время выполнения, без использования именованного макроса .Это делает мой исходный код более понятным, показывая, как я получил значение «2», не тратя при этом процессорное время, повторяя ту же операцию «1 + 1».Вот простой пример, иллюстрирующий основную идею, но не для реальных случаев, скажем, моя идеальная цель функция defun выглядит следующим образом:
(defun test ()
(+ 1 2 3))
Мне бы хотелось, чтобы буквально «2» было вычисляется во время компиляции , поэтому я использую eval-when-compile :
(defun test ()
(+ 1
(eval-when-compile (+ 1 1))
3))
Однако получается:
(defun test ()
(+ 1 '2 3))
Это, конечно, хорошо для этого простого случая, но эта дополнительная цитата вызывает проблемы для более сложных случаев.
Определение именованного макроса works:
(defmacro 1+1 () `,(+ 1 1))
(defun test ()
(+ 1 (1+1) 3))
Это даст мой идеальный результат без quote с добавлением целого числа "2":
(defun test ()
(+ 1 2 3))
Есть ли простой способ, подобный приведенному выше eval-when-compile для достижения этого в defun ?Что-то вроде безымянного макроса, чтобы избавиться от именованного помощника 1 + 1 , или я должен назвать это "лямбда-макрос" ?