Внутри кондишона iif'а можно биндить куски кода переменным и затем использовать в конечных. (iif (< (:bind xx (+ 12 x)) 34) (1+ xx) (-1 xx)) (:bind xx (+ 12 x)) - значит забиндить xx'у в (+ 12 x) в одной из конечных, в текущей же форме-предикате оно заменится на (+ 12 x)
Этот макрос решает проблему, которая меня много раз дико раздражала: когда в условии if'а большой кусок кода, который необходимо дублировать в конечных его формах.
Кстати, макросы с захватом переменных где-то даже как-то по-хитрому обзывали - вроде бы на букву "э".
Насчёт вложенных - это да, но я пока не встречал макросов, в которых бы использовались формы с головой-кейвордом :bind. А на счёт it'ов - мне кажется, если делать без особых извратов, то один будет затеняться другим где надо.
Кстати, на лиспере был такой эпичный тред: http://lisper.ru/forum/thread/49 Товарищ предлагал очень интересные и даже где-то гениальные синтаксические извраты.
Большинство простых общеупотребительных форм уже были придуманы до нас :) Поэтому наверное стоит посмотреть уже существующие пакеты например: anaphora, matabang-bind, hu.dwim.defclass-star, hu.dwim.syntax-sugar
Comments 16
Reply
(iif (< (:bind xx (+ 12 x)) 34) (1+ xx) (-1 xx))
(:bind xx (+ 12 x)) - значит забиндить xx'у в (+ 12 x) в одной из конечных, в текущей же форме-предикате оно заменится на (+ 12 x)
Макроекспанд будет выглядеть так:
(LET ((IT (< (+ 12 X) 34)) (XX (+ 12 X))) (IF IT (1+ XX) (-1 XX)))
Этот макрос решает проблему, которая меня много раз дико раздражала: когда в условии if'а большой кусок кода, который необходимо дублировать в конечных его формах.
Кстати, макросы с захватом переменных где-то даже как-то по-хитрому обзывали - вроде бы на букву "э".
Reply
Reply
Reply
Reply
Reply
Reply
Товарищ предлагал очень интересные и даже где-то гениальные синтаксические извраты.
Reply
Поэтому наверное стоит посмотреть уже существующие пакеты например:
anaphora, matabang-bind, hu.dwim.defclass-star, hu.dwim.syntax-sugar
Reply
Reply
Leave a comment