トップ «前の日記(2008-02-20 (Wed)) 最新 次の日記(2008-02-22 (Fri))» 編集

uDiary

海野秀之(うんのひでゆき)の外部記憶

Twitter (twilog) / RSS / アンテナ / ぶくま

2006|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|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|

2008-02-21 (Thu)

[Scheme] iscm0 のできたてほやほやマクロは特殊形式になってますか

SICP 練習 1.6 相当

(define-syntax if
  (syntax-rules ()
    ((if predicate then-clause else-clause)
     (cond
      (predicate then-clause)
      (else else-clause)))))

(if (= 1 1)
    (display "eq1\n")
    (display "neq1\n"))

(define new-if
  (lambda (predicate then-clause else-clause)
    (cond (predicate then-clause)
	  (else else-clause))))

(new-if (= 1 1)
    (display "eq2\n")
    (display "neq2\n"))

これを実行してみましょう。

% iscm0 < ex1_6mod.scm
eq1
eq2
neq2

マクロで書かれた方の if は、ちゃんと特殊形式になっていて、 意図通りの動作となっています。 (iscm0 では、cond が built-in な特殊形式となっています。 if じゃなくて cond の方を組み込みにしたのは、僕が cond の方が好きだから! ってか、僕は if なんて使わない (使えない))

よかった。

一見まともに動いている iscm0 のマクロですが、 ちょっと想定から外れたコードを食わせると死亡するので、 その辺をまともに*1 していこう。

でもって、健全に*2する!

あ、そういや、syntax-rules のリテラル部の働きがよーわかってない。 Hygienic にするための処理にかかわってんじゃないかと思っているんだけど、 理解しようとすること自体を後回しにしている。

*1 あと、自分があまりよく理解していない機能(=マクロ)を考えながらコーディングしたので、この期間に書いたコードは特に汚い。汚いまま放ってはおけない。

*2 Scheme 用語としての hygienic の訳は、「保健的」、「健全な」のどっちが優勢なんですかね。日常会話文脈なら「衛生的な」だと思うけど。

[Web] ドラクエ3

ドラクエ3プレイ日記 (d.y.d.経由)

読むのがとまらん。


2006|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|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|
Categories 3imp | Card | Cutter | Dalvik | Euler | Football | GAE/J | Hand | Haskell | Re:View | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声