Basic Werk | Memo | Contact


MEMOMEM

Scheme_define-syntax



define-syntax 構文を使ったマクロの生成で、syntax-rules 直後のリストにはマクロ内で使用する識別子を指定する。

また、パターン内ではマクロの名前を _ で置換できる。



;; new-if (define-syntax new-if (syntax-rules (then else) ((_ predi then consq else altna) (if predi consq altna)) ((_ predi then consq) (if predi consq #f)) ((_ predi else altna) (if predi #f altna))))

gosh> (new-if (number? 0) then "Num" else "Not Num") "Num" gosh> (new-if (number? 0) then "Num") "Num" gosh> (new-if (number? "aaa") then "Num") #f gosh> (new-if (number? "aaa") else "Not Num") "Not Num" gosh> (new-if (number? 0) else "Not Num") #f


マクロ内で使用する識別子がない場合、syntax-rules の後は空リストでOK。



;; nand (define-syntax nand (syntax-rules () ((_) #f) ((_ a b) (not (and a b)))))
gosh> (nand #t #t) #f gosh> (nand #t #f) #t


参考:

素数夜曲: 女王陛下のLISP

P.453~


#Scheme #Gauche #Lisp #Macro #define-syntax



SN 2013/07/12 23:45:02

Archives > Scheme_define-syntax.html







MEMOMEM



More Contents

Basic Werk | Previous Blog

仕事と日 | 中村 心