トップ «前の日記(2008-02-13 (Wed)) 最新 次の日記(2008-02-21 (Thu))» 編集

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-20 (Wed)

[Scheme] iscm0: マクロ実装開始

「ナイーブな実装」というのは、これより数段まともなものを指すに違いない。

ともかく、

(define-syntax let
  (syntax-rules ()
    ((let ((name val) ...) body1 body2 ...)
     ((lambda (name ...) body1 body2 ...)
      val ...))))

(let ([x 42]
      [y 100]
      [z (* 3 3)])
  (display (* x y z)) (display "\n"))

が動くようになりました。

ところで、上の let の定義は R5RS に書かれているものの一部なんですが、 どうして body1 body2 と二つかかれているのか不思議だったんですよねー(←素人)。

これは、「body は一個以上必要」というのを表現しているんですね。 パターン言語の説明を読んで、なっとく。

まだいろいろいい加減なのにくわえ、まだ健全じゃない。 マクロを展開した結果が lambda になったときに、 束縛変数のリネーム処理を行ってやれば良いんじゃないかと思っている。

ところで、マクロつくりたてほやほやの iscm0 で

(let ([a 1]
      [b (/ 3 0)])
  (display a) (display "\n"))

を実行しようとすると「ゼロでわったよ」と言って止まるんだけど*1、 gauche は平気そうだ!……遅延評価?!

一瞬うろたえたんですが、もちろん、んなわきゃなかった。

gosh> (display (/ 1 0))
#i1/0#<undef>
gosh>

*1 iscm は「Integer くらいしか扱えないスキーム(笑い)」の略ですからなぁ、わっはっは。


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 | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声