внутри макроса, я могу иметь, var оценивать как пустое / ничего? - PullRequest
3 голосов
/ 12 мая 2011

Благодаря предыдущим ответам на общий lisp: как макрос может определять другие методы / макросы с программно сгенерированными именами? У меня есть макрос, который определяет вспомогательные функции (на самом деле у меня есть макрос, мой новый любимый lisp -newbie-молот). Но внутри этого макроса есть кое-что, что решает, должны ли вспомогательные функции принимать определенный аргумент. Итак, у меня есть оператор if с почти одинаковыми ветвями - я размещаю одну ветвь var в лямбда-списке сгенерированных функций. Вниз по другой ветке, я опускаю, вар. (Я пишу DSL для непрограммистов, поэтому я не хочу, чтобы они видели такие вещи, как & не обязательно)

Есть ли способ избежать дублирования кода? Если я установлю var на "", то "" появится в лямбда-списке моих сгенерированных defuns. Если я установлю var в nil, то вместо этого появится NIL.

Есть ли значение, которое я могу использовать так, чтобы var вообще ничего не вычислял, теряя сознание? (И философского интереса, не должно ли быть один?)

1 Ответ

5 голосов
/ 12 мая 2011

Один из вариантов - использовать ,@var, и ваше значение должно быть списком, если оно должно использоваться, nil, если это не так. Например:

(let ((used `((frob 1 2 3)))
      (unused nil))
  `(progn ,@unused ,@used))
=> (PROGN (FROB 1 2 3))

Значение unused исчезло.

...