2009-09-28
Smalltalkのブロック風
*standard-output*, Common Lisp |
[:x | x + 1]
のようなブロックを見て、ふとマクロを思い付いたので書いてみました。
(DEFMACRO BIND (&BODY BODY)
(DO ((BODY BODY (CDDR BODY))
(BINDS () (DESTRUCTURING-BIND (VAR VAL &REST IGNORE) BODY
(DECLARE (IGNORE IGNORE))
(PUSH `(,(INTERN (SYMBOL-NAME VAR)) ,VAL)
BINDS))))
((NOT (KEYWORDP (CAR BODY)))
`(LET (,@(NREVERSE BINDS))
,@BODY))))
(BIND :X 10 :Y 20 :Z NIL (LIST X Y Z)) ;⇒ (10 20 NIL)
ただ単に、変数束縛部とボディを分けるのにシンボルの種類の違いで分けられるなという思い付きでございました。
リーダーマクロを使って [:x (+ 1 x)] ⇒ (lambda (x) (+ 1 x))というのもありかもしれません。
というかこのエントリーのタイトルからするとこっちが本筋ですね…。
■