Entries from 2008-02-01 to 1 month
『プログラミング言語SCHEME』のR.ケント・ディヴィグこれは買うね。間違いない。
読んだことのない作家で期待せず読んだら大きく裏切られた。最後まで一気に読んでしまうほど面白い。 いわゆる叙述トリック系のミステリィなのだが、切れ味鋭く読者を誤誘導するのが自然で上手い。 折原一の作品からドロドロや粘りを取り除いて、鋭く知的に…
現在の3passにおいて、いかなるタイミングで free variables をマーキングすべきかを考えます。 display に必要なもの3つ まず display に必要なものは3つ。 変数参照解決 REFER_FREE N 各 let/lambda に対して free variables の列挙が完了している必要あり…
(define (hello) (display "Hello World!\n Scheme")) 上記のような手続きを用意。その後 eval。 (hello) ; C-x C-e で eval Hello World! Scheme ;; インデント => #<undef> ここで make-test C-t すると (test* "Hello World!\n Scheme" (with-output-to-string (</undef>…
pass1 の書き換え&テストが終わった。コードがすっきりした。
クロージャのインライン展開を実装していたら実装の矛盾が見つかった。さらに Lingr で shiro さんに頂いたヒントで let も display を実装しようと決意。 ノートに問題点と解決法を書き出す。勝算があると確信したのでコンパイラを大幅に書き直すことに。連…
行きつけのスタバの店員の多くがGCされた模様。 世代別GCでいうところの殿堂入りが2人いるけど。*1 *1:GCを直訳するとあまりイメージの良くない文章だな
Soffritto Inc.の代表取締役の人がラボに来たよ。
大きめのコードで不要 let がきちんと動くようになった。 動かしてみて分かったのですがなかなか不要な let はないです(笑)。 一つ、はまったのが以下の入れ子の let の場合。正解は let が2つとも削除されて定数0 = ($CONST 0) なのだけど。 (let1 a 0 (l…
Gauche拡張で vector-ref に3つ目の引数 fallback がある。 なので vector-set! のつもりで、誤って vector-refと打ち間違えても (vector-ref v 0 'a) とかやっても引数の個数違いでエラーにならず気づきにくいので注意。 もちろん fallback がある方がうれ…
単純な例で不要 let が削除されるようになった。 (let ([a 0]) a) (let ([a 0] [b 1]) b) うまくいかない例 (let ([a 0] [b 1]) a b) を調べよう。→ $SEQ の body の中を最適化していないからだった。 (let ([a 0] [b 1] [c (func 0)]) a b) ; => 初期値は $…
進んでも0.1%とかだとやる気が続かない。 うーむ。
インライン展開時できるかの判断に手続きが self recursive かどうかという情報が必要。 最適化で IForm をなめるときにクロージャを記録する仕組みをいれた。
不要 let 削除のコードを書いたがテストしてない。
試行錯誤が多い。一方考える時間は少なめになりがち。バランスが悪い。
コードを改変中に良いことを思いつき、それも同時にやろうとすると失敗するよ。 アイデアだけメモして1つずつやろう。
list の中から何かを探したいときは、「探す」だから find だ。 うんうん。そうだけど単純な場合はもっと良い方法があったはず。でも思い出せない。(というのを3日くらい) あぁ。memq/memv/member だ。なぜ忘れていたのだろうか。
今日は苦戦した。粘って結論は出たが、そこにたどり着く時間の長さと効率の悪さが微妙。 S式 -> IForm の変換時に決定しておいて良いもの 参照の種類 (bind/local/global/free) クロージャの自動変数の列挙 最適化でクロージャが丸ごとなくなる場合はどうす…
ダシにして申し訳ないが、典型的なLisperからみたかつてのid:higeponや、現在のid:amachangの「知力」は高いとはとても言えない。例えば遅延評価のことは、SICPを読めばちゃんと書いてある。そしてこれはまともなComputer Scienceがある大学なら、一番最初に…
ローカル変数参照を値で置き換えると let が不要になる場合があります。 (let ([a 0]) a) ;==>ローカル変数参照置き換え (let ([a 0]) 0) ;===>letの削除 0 ;; こうしたい! let の削除 基本的には let で使われている変数の、参照カウントが 0 であれば let…
現在の実装では中間表現の時点でローカル変数の参照位置を決定している。例えば (let ([a 0]) (let ([b 1] [c 2]) a ; a は (1, 0) の位置 b ; b は (0, 0) の位置 c ; c は (0, 1) の位置 )) (n, m) は n は現在の環境から見て何番目の環境か?(環境=let…
初期値が $const なローカル変数参照は、その変数が set! されないことが保証されれば、値で置き換えることが出来る。 この判定に必要なものは set! されるかどうかの情報 初期値が const かどうかの情報 LOCAL_REF から上記2つの情報にアクセスできること …
銀色にピカピカと光る本を読んでいる黒いタートルネックを着たニットの女性。美しい装丁。
先日「雪の撮り方?」で教えていただいたように シャッタースピードを速く ISO感度下げる ストロボ強制発光 で撮ってみました。 この写真には残念ながら写ってないですが湯気が出てました。
もう東京に住んで大分経つが一度も行ったことがなかったので明治神宮へ。 広いね。家族の健康をお祈りしてきました。 帰り道の渋谷で、「原宿はどちらですか?」と女性二人に英語で訊かれて答えた。 うちの妻は話かけられやすいオーラがでているんだろうか。…
昨日の続きです。クロージャとcallの最適化。 クロージャは lambda、call は手続きの呼び出しのことです。 ((lambda (...) ...) arg ...) 呼び出される手続きが、lambda 式の場合。この呼び出し自体を let に変換する事が出来ます。 ($call ($lambda .. (LVa…
shiro さんが開発されている Scheme 処理系 Gauche 0.8.12 の最適化処理を勉強のためにまとめました。 よく Gauche のコードは宝の山だと聞きますが、その一端を分かってもらえるとうれしいです。 基本的にGaucheのコードのコメントをまとめただけです。 Sch…
id:amachang が Scheme の勉強のために Arc のコードを読んでいて感心したので真似をする。 良く考えれば Lisp のプロが書いた Scheme のコードが読めるのだから良いチャンスだよね。 実際に Arc が実行されるのは arc.scm の arc-eval。 Arc のコード(S式…