LINUX.ORG.RU

История изменений

Исправление q0tw4, (текущая версия) :

Ещё надо учесть конструкции типа (abc it), где abc — макрос

Плавно приходим к racket way (врядли реально починить все случаи с eval, вытаскиванием за контекст и прочим)

(defmacro aif (it-sym test then &optional else)
  `(let ((,it-sym ,test))
     (if ,it-sym ,then ,else)))

(defmacro fwrite (stream x)
  (let ((it (gensym)))
    `(aif ,it ,stream (format ,it "~a" ,x) nil)))

(fwrite t 3) ;  => 3
(aif it 3 (fwrite t it)) ; => 3

после чего чешешь затылок и говоришь, верну ка я if вместо aif и будет мне счастье.

Исходная версия q0tw4, :

Ещё надо учесть конструкции типа (abc it), где abc — макрос

Плавно приходим к racket way

(defmacro aif (it-sym test then &optional else)
  `(let ((,it-sym ,test))
     (if ,it-sym ,then ,else)))

(defmacro fwrite (stream x)
  (let ((it (gensym)))
    `(aif ,it ,stream (format ,it "~a" ,x) nil)))

(fwrite t 3) ;  => 3
(aif it 3 (fwrite t it)) ; => 3

после чего чешешь затылок и говоришь, верну ка я if вместо aif и будет мне счастье.