2009-11-01から1ヶ月間の記事一覧

トップレベルじゃないところで再定義

再定義って言っていいのかわからんけど。 gosh> (let ((car cdr)) (car '(foo bar baz))) (bar baz) gosh> (let ((car cdr)) (define first (lambda (l) (car l))) (first '(foo bar baz))) (bar baz) gosh> (car '(foo bar baz)) foo この前のfirstの結果と…

リテラルで書けないオブジェクト

手続きなどのリテラルが書けないものは、名前をつけて捕まえておかないと、参照できなくなってしまう。 だから、consやらlambdaやらは「定義によって設定されたものでないトップレベルのバインド」(id:yagiey:20091116:1258342949のコメント参照)にしない…

束縛されているかどうか

昨日、add-nをdefineするときにエラーにならなかった。 何故なのか、ド素人なりに考えてみた。 lambda式を評価して手続きオブジェクトを作成するとき、出現した変数が束縛されているか否かは、トップレベルまで見に行けば決定できる。 (define mul (lambda (…

手続きオブジェクト

defineを実装して、lambdaやらquoteやらも再定義可能にするには、手続きオブジェクトの内部表現を考えないと駄目だ、という結論に達した。 たとえば、 gosh> car #<subr car> とかいうやつ。 #で始まる値はリテラルで表現できないものらしい(id:yagiey:20090129:12332</subr>…

銀メダル獲得!

はてダ書き始めてちょうど100日目らしく、はてなダイアリー市民のアイコンが銀に! ...で、何が嬉しいんだろう?単なる気持の問題?

気になったので実験

ちょっと気になったことを実験してみた。 実験1:defineで名前をつけるとき、2つ目の引数は評価されるのか? gosh> (define add-n (lambda (m) (+ m n))) add-n gosh> (add-n 1) *** ERROR: unbound variable: n Stack Trace: _____________________________…

今後の課題

今回作ったevalだと、defineが無いから名前をつけられない。 defineでテーブルにエントリを追加しなきゃダメだなぁ。 あと、defineでテーブルに追加しても、現時点では以下のものはテーブルから探さずに、決まった処理してるので、再定義ができない。 lambda…

evalできた

evalはちゃんと勉強してから作りたかったけど、やっぱり気になって仕方がないので作ってみた。 データ構造(リストとアトム) 主要な手続き(consやcarやcdrなど) を定義して、あとはThe Little Schemerのvalue(id:yagiey:20081105以降)をそのままC#に移…

後はeval

字句解析、構文解析、S式の出力を実装出来たので、REPLの「R」と「P」はできたことになる(のか?) ってことで、あとはエヴァりたい。むしろヱヴァりたい。 ...でも、やっぱ本を進めたい。 ってことで、少し暖めておく。 早くSICP読みたいし。 積読書は堆く…

9章おしまい

9章の最終節、8節「グラフ」。 今までプレイヤーのHPやら持ち物を操作する手続きを作ってきた。 その中に、現在位置を更新する手続きset-position!も定義してみたが、positionが保持する値の意味は規定していなかった。 ということで、positionを使って、動…

構文解析できた

俺LISPを少しずつ作っている。とりあえず、構文解析まではできた。 受理する構文をBNF的に書くと、以下の通り。 <expr> ::= <atom> | <list> <atom> ::= <identifier> | <string> | <number> | <boolean> <list> ::= <open_paren> [<expr>+ [<dot> <expr>]] <close_paren> ただし、それぞれ はS式 はアトム は識別子 は文字列 は数値 は真理値 はコンスセルまたは空リスト は</close_paren></expr></dot></expr></open_paren></list></boolean></number></string></identifier></atom></list></atom></expr>…

リストとツリー

今、無謀にも、なんちゃってSchemeをC#で実装しようと試みているところ。 まだ字句解析器しかできてないけど。ヽ(´Д`;)ノ アゥア 切り出したトークンの並びをチェックしつつ、リストを構成するのは今から。 構文解析器って言うのかな? マクロはまだ自分が理解…

コード補完

意味の上でのある程度のまとまりごとに、名前をドットで区切ってやれば、名前の衝突は防止できるな。 まぁ、単なる文字列なので、その「意味」に当たる部分は、プログラマの頭の中だけにしか無いけど。 名前の衝突を防止の他に、コード補完によるコーディン…