2003-03-08 [長年日記]
λ. gtk2 on cygwin
急に色々なところから注目されてビックリする。柴田さん、早田さん、CyGnomeのBiju G. C.さん、むとうさん、安部さん、たむらさん、どうもありがとうございます。
それから、スクリーンショットに足永さんのGImageViewの画像を加えてみたり。プラグインをDLL化したりとかは面倒そうだけど、バータリーになら簡単にコンパイル可能。
λ. Rucheme / Scheme(subset) interpreter on Ruby
のコードを眺めていて、以前に書いたSchemeもどきのRougeを思い出す。当時はSchemeに関する知識も言語処理系の実装に関する知識もほとんど無かったこともあって、Rougeのコードは今見返すと随分ひどいなぁ。
しかし、末尾再帰の除去ってどうやって実装するんかな。うーん。しかし、properly tail recursive : 正しく末尾再帰を行う、という表現、なんか不思議。
SchemeをRubyで実装する場合、Ruby自身が末尾再帰の除去に対応していない以上、例えばトランポリンを使う形に変換するとか……(以下略)
λ. OHMSS
って、「On Her Majesty's Secret Service」の略なのね。知らなかった。
はじめまして。とりあえず悩んでます。いかに楽に仕様準拠するか。というかマクロ無理っぽいです。面倒で。
R5RSはそんなに大きな仕様ではないですけど、<br>真面目に準拠するのはやはり結構大変みたいですね。<br><br>私はマクロは_仕様を理解するのが面倒_という<br>実装以前の理由で諦めたヘタレなのですが、<br>やっぱり実装も面倒なのでしょうか?
おーい、オレが忘れられてるよ〜(T_T) > gtk2 on cygwin
redoを使うとか。<br>とまったく見もせずに書いてみるテスト。
や、申し訳ない。追加しときました。> むとうさん<br># 単にむとうさんの日記を見るよりも先に書いてしまっていただけなので、<br># 気を悪くしないで下さいね。<br><br>自己末尾再帰以外の末尾再帰をどうするかが問題ですが、<br>redoを使うというのも面白そうですね。
とりあえずやってみました。末尾再帰除去。いろいろアレでナニでいやーんなソースになりました。<br>redo はなんとなく嫌だったらしく使われませんでした。その代わり、遅い・・・。<br>マクロ、仕様を改めて見直したら、実装、なんか面倒そうですわ。でも、if と lambda だけになるのは魅力なんですけどねぇ>他をいろいろ考えなくていい。
ついでに、いまだにscheme/言語処理系の知識は十分でないです。私。処理系作ってると新たな発見があって面白い。って、長々と失礼しました。
そうですね。<br>実装して初めて気付く事って結構ありますよね。<br><br>最近もCPL(Categorical Programming Language)という言語を<br>実装していたのですが、この時も随分勉強になりました。<br><br>そういえば、<br>Schemeでevalの引数に出来るのは式だけで定義等が許されない事も、<br>以前は不思議に思っていたのですが、<br>コンパイラの実装を考えれば自然な制約ですよね。<br><br>ところで、逆にこういった制約を持たないrubyは<br>やっぱりコンパイラには向かないんじゃないかとも少し思ったりしますが、<br>どうせevalは特別扱いしなくちゃいけないだろうから、<br>ひょっとしたらあまり関係ような気もするし、どうなんだろう……
eval って定義(define) 駄目なんですか。知らなかった。仕様読んで無いじゃん、私。コンパイラにそんなに向かないものなんですか。
evalの説明に以下のような下りがあるので、定義を許す必要は無いというだけで、別に許したって構わないと思います。<br><br>Expression must be a valid Scheme expression represented as data, and 〜. Implementations may extend `eval' to allow non-expression programs (definitions) as the first argument and 〜<br><br>それから、これは想像なので間違ってるかもしれませんが、例えば以下のtest関数内のfooの部分のコードを生成する場合を考えるとどうでしょう?<br>evalが定義を許さない場合は、トップレベルの環境から値を参照するようなコードをあらかじめ生成できますが、evalが定義を許す場合には実行時に環境を探索するかあるいは...<br><br>(define foo #t)<br><br>(define (test x)<br> (eval x)<br> foo)<br><br>(display (test '(define foo #f)))<br>(display "\n")
げ、definitions って non-expression だったのか!(駄目じゃん俺・・・) lambda のシンタックスシュガーだと思ってました。あぁ、駄目駄目。たしかに define には syntax とか書いてなかったから不思議だとは思ってたんですが(誤記だと思っていた(笑))。たしかに読み返すと別物って書いてある。じゃぁ、なんだろ。正直、lambda による変数のバインドと define によるバインドの違いがわかっておりません。5.2.2 にletrec と等価とは書いてあるけど。ふーむ。トップレベルの環境を形成するためには define しかないという意味か。環境セットアップのための便利な書き方って意味くらいしかないんだろうか。うーん。<br><br>(let ((define +) (a 1))<br> (define a 2))<br>;=> 3<br>なんてソースは通るし(これは、シンボルの解釈の順序の問題か・・・)<br><br>eval 中のコンパイルについては、たしかにうざったいですね。eval 外が eval内に影響を受けるようなことを考えていませんでした。<br><br>; と、また長々とお邪魔しました。