Scheme

R5RS読んでて分からない言葉や文章など

ヨムヨム詐欺で終わっていたR5RSをちょっと読んでみた。もちろん日本語訳の方ね! R5RS (Revised^5 Report on Algorithmic Language Scheme) 日本語訳 http://www.schemers.org/Documents/Standards/R5RS/ 3章まででも分からないこと多すぎ。10ページ足らず…

λ式とクロージャ

クロージャって何だろう? lambda式とどう違うんだろう?

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

再定義って言っていいのかわからんけど。 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 (…

気になったので実験

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

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

コード補完

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

名前をまとめる何か

item-properties item-property-get get-player-attr update-player-attr! たった4つの手続きなのに、もうだめだ。 全ての名前が平等で、のっぺりとしたイメージが気持ち悪い。 クラスや名前空間など、名前をまとめる何かが欲しくなるな。 じゃぁ、作れば?…

準クォート

リテラルデータに手続きを埋め込むにはちょっとした工夫が必要です。 ということだが、手続きに関わらず、評価済みの値を埋め込む場合一般的に言える話ですな。 gosh> (define foo '(hoge . (lambda (n) (+ n 1)))) foo gosh> foo (hoge lambda (n) (+ n 1))…

シンボルって何よ?

Schemeをいじりはじめて1年くらいかな(つんどく期間を除いて)。 まだまだ分からないことだらけ。 その一つが、シンボル。 http://karetta.jp/book-node/gauche-hacks/023107で紹介されているFizzBuzzのソースコードだけど、ぼけーっと読んでて気づいたこと…

多値をreceiveで受け取らなかったら

114ページからの「手続きによるパターンの抽象化」を読み返しているとき、ふと不思議に思ったことがある。 それは、手続きtraverseを使ったmember2の定義内での、valuesの使い方。 ;; traverseを用いない (define member2 (lambda (elt lis . opt) (let-opti…

delete-1

さて、半年つんどくしていました「プログラミングGauche」。 続きからやろうと思ったら「今まで何やってたっけ?」っていう感じだったので、9章の始めからつらつらと読んでた。 で、つまずいてたdelete-1のnon-copyバージョンを書いてみると、割とすらすらと…

WindowsでGauche

WindowsでGaucheやるには、おそらくGaucheboxが一番お手軽。 以下よりダウンロード、インストール。 http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3AGauchebox

MacでGauche

ご無沙汰してます。Schemeはあれから全く進んでません。ヽ(´Д`;)ノアゥア つんどくYeah!!!!6月にMacbook Pro 13インチを買ったので、今更ながらMacでのScheme開発環境構築(Gauche + emacs)に関して覚え書き。大まかな流れは、 X11のインストール XCodeのイン…

一般化set!、その2

確か、121ページまで終わってたはず。 9章6節、「リストの変更と一般化set!」の続き。 HPの取得と変更は、get-itemとadd-item!にならって、次のように書ける。 ;; HPの値を取得 (define get-hp (lambda (player) (cdr (assoc 'hp player)))) ;; HPの値を変更…

わかった!...かな?

id:yagiey:20090322:1237738147でpush!後に持ち物リストが更新されないことが理解できなかったけど、トラックバックもらって分かった。 id:SaitoAtsushi:20090323:1237790745 まず、例えば、持ち物がpotion、dagger、cookieだったら (assoc 'inventory playe…

add-item!

指定したプレイヤーの持ち物に、指定したアイテムを追加する手続きadd-item!。 答えを見ずに書いたら間違えた。 ;; アイテムを追加する (define add-item! (lambda (player item) (let ((items (cdr (assoc 'inventory player)))) (push! items item)))) 使…

has-item?

さて、9章6節の後半。 make-player(id:yagiey:20090314:1237041715)で作った値で大域変数*player*を束縛しといて、*player*をいろいろ変更していく。 まず、指定したプレイヤーが指定したアイテムを持っているかどうか調べるhas-item? (define has-item? (…

delete-1を名前付きletで書き直し

やってみた。 gosh> (use gauche.test) #<undef> gosh> (define delete-1 (lambda (elt lis . options) (let-optionals* options ((cmp-fn equal?)) (let loop ((lis lis)) (cond ((null? lis) lis) ((cmp-fn elt (car lis)) (cdr lis)) (else (let ((tail (loop (c</undef>…

再帰的思考

やっぱり、自分はまだ再帰的思考ができていないと思う。 9章1節のdelete-1が、自分で書いたやつと模範解答がだいぶ違うのを思い出したので、改めてヒントを読んで考えてたけど、まったく分からなかった。 それどころか、模範解答を読んでもすぐには理解でき…

リテラルデータの破壊に注意

9章5節のコラム「リテラルデータの破壊に注意」。 Schemeの仕様では、リテラルデータを変更することは許されていないそうだ。 gosh> (define *nums* '(1 2 3 4 5)) *nums* gosh> (set! (car *nums*) 0) ; やっちゃだめ。 #<undef> gosh> *nums* (0 2 3 4) ってやる</undef>…

pop!

push!があるならpop!もあるんじゃないかなと思ってやってみたら、やっぱりあった。 gosh> (define *nums* (list 1 2 3 4)) *nums* gosh> (pop! *nums*) 1 gosh> *nums* (2 3 4) gosh> (pop! (cdr *nums*)) 3 gosh> *nums* (2 4) popした値を返すのね。 popの…

一般化set!

9章6節。最近は1日1節にも満たないなぁ。 超スローペース。こりゃいかん。 id:yagiey:20090307:1236410958で登場したset!が再び登場。 set!は既に束縛されている名前を別のオブジェクトに束縛し直す手続き(?マクロ?よく分からんけど)だったけど、SRFI-17…

push!マクロ

9章1節で出てきたけど、ガン無視してた。 先頭に要素を追加したリストで名前を束縛し直す操作 gosh> (define *nums* (list 1 2 3 4)) *nums* gosh> *nums* (1 2 3 4) gosh> (set! *nums* (cons 0 *nums*)) (0 1 2 3 4) みたいなのはよくあることなので、push…

手続き?マクロ?

手続きとマクロの区別がつかなかったけど、最近見分ける方法に気づいた。 「気づいた」って、そうたいそうなことじゃないけど...。 gosh> car #<subr car> gosh> (lambda (x) x) #<closure #f> gosh> push! #<macro push!> たぶん、#以外が手続きなんだと思う。</macro></closure></subr>