Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2009-09-28

Smalltalkのブロック風

| 01:01 | Smalltalkのブロック風 - わだばLisperになる を含むブックマーク はてなブックマーク - Smalltalkのブロック風 - わだばLisperになる

Smalltalkの

[: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))というのもありかもしれません。

というかこのエントリーのタイトルからするとこっちが本筋ですね…。