Scheme

新たな変数名の作成

id:yagiey:20100213:1266088272で 「新たな変数名を作り出す」という要請に対しての解決策という形で紹介される伝統的なマクロ とか言ったけど、 (define-macro (make-foo) 'foo) でも、立派に新しい名前を作ってると言えるよね。ただ、外側でfooが束縛され…

もうちょっと

gosh> (define-macro hoge 'hoge) *** ERROR: Compile Error: procedure required, but got hoge "(stdin)":1:(define-macro hoge 'hoge) Stack Trace: _______________________________________ マクロは0個以上の引数を取る、手続きと同じ形でなくてはなら…

マクロ定義の練習

今回はid:yagiey:20100126:1264525307で紹介したレガシーなマクロに関して。っていうか前回もだったけど。 id:yagiey:20100213:1266088272で 「新たな変数名を作り出す」という要請に対しての解決策という形で紹介される伝統的なマクロを次回。 といってみた…

やっと分かった

ずっと (define-macro (my-when test . body) `(if ,test (begin . ,body))) が理解できなかった。具体的に言うと、 (my-when (even? 4) 1 2 3 4) って使うと、,testが#tになると思い込んでいたので、,bodyが(1 2 3 4 5)という関数適用でエラーにならないこ…

R5RSマクロの限界

Schemeのマクロには大きく分けて R5RSマクロ:パターンマッチによるマクロ レガシーなマクロ:LISPに伝統的なマクロ があるとid:yagiey:20100126:1264525307で紹介した。 今回は後者に関して。 R5RSマクロは以下のようなマクロを実現できない、もしくは実現…

マクロの使用例

マクロ定義の実例として、簡単なオブジェクトシステムを書くことを想定したケースが紹介されている。ここで登場するオブジェクトは、以下のような銀行口座を表すオブジェクト。(以下のC#コードは動作確認してません) using Sysmtem; public class Account …

マクロをいつ使うか

letはlambdaによる無名関数の適用へと展開される(id:yagiey:20100128:1264705405)。 だからletは(仕様が要求するけど)必須構文ではない。 だけどletによって「ローカル変数」という概念ができる。 このように、 そのマクロによってまとまった、明確な抽…

マクロの健全性

id:yagiey:20100127:1264595558のorマクロを使って次のようなコードを書いたとする。 (let ((tmp 2)) (or #f tmp)) orを素直に展開すると (let ((tmp 2)) (let ((tmp #f)) (if tmp tmp tmp))) ってなって、展開前に意図した結果が得られない。困った。 さら…

マクロ定義はメタプログラミング?

id:yagiey:20100128:1264631316で定義したマクロfooはhogeが束縛されているかどうかは気にしない。 展開された結果の式が、評価できる式なら構わないんだな。 マクロ展開を計算と捉えれば、マクロの定義はメタプログラミング考えられる。しかもホスト言語と…

syntax-rulesの正体!?

id:yagiey:20100128:1264631316でfooというマクロを定義して、hogeという字句を含むように強制してみた。 syntax-rulesが何者か疑問に思っていたが(id:yagiey:20100128:1264631023)、hogeみたいな感じでsyntax-rulesという字句を強制してんじゃね?って一…

R5RSマクロその2

R5RSマクロは、 式の構造のパターンマッチ マッチした時に展開されるテンプレート という形で定義されるってのはこの前やった。 しかし、式の構造だけではなく、同じ字句かどうかで判定しなければならないことがある。それがcondで、なぜならelseという字句…

syntax-rulesって何者?

define-syntaxで、syntax-rulesなるS式が出てきた。 一方で、必須構文の中にsyntax-rulesが入ってなかったので、ちょっと意外だった。構文だと思ってたのに。 ってことで、やってみた。 gosh> syntax-rules *** ERROR: unbound variable: syntax-rules Stack…

let

マクロの練習に、自分でletを定義してみた。 (define-syntax my-let (syntax-rules () ((my-let ((var init) ...) expr ...) ((lambda (var ...) (begin expr ...)) init ...)) ((my-let fname ((var init) ...) expr ...) (my-let ((fname #f)) (set! fname…

R5RSマクロその1

R5RSマクロはパターンマッチの仕組みを利用して、式の変換規則を定義する。 こんな感じ。 (define-syntax マクロ名 (syntax-rules () (パターン1 テンプレート1) (パターン2 テンプレート2) ;; 中略... (パターンn テンプレートn))) パターン1、パターン2と…

構文の拡張

やっとここまで来たなぁ。18章は「構文の拡張」。 ...って、12〜17章はすっ飛ばした。悪しからず。いつか読む。 とにかく18章と19章が早く読みたかったし、特に飛ばしても差し支えなさそうだったし。 さて、18章はLISPをLISPたらしめると言われている(どこ…

マクロって?

マクロ周辺で、用語の使い分けができてない。 id:yagiey:20100115:1263548281の最後で、 マクロとはユーザ定義の構文らしいので、beginやset!はマクロとは呼ばないかもです。 と言ったけど、そのソースを明記していなかったために、自分でも正しい訂正だった…

用語

Common Lispでは「関数」であり「function」、Schemeでは「手続き」であり「procedure」。 一方で、ラムダ式exprを定義してみると(はラムダ式、は識別子) ::= ::= (λ . ) ::= ( ) となるけど、3番目は「関数適用」。できればこの言葉にあわせたい気持ちも…

気になったので実験してみた

useしたものは、局所環境フレームに束縛が追加されるのかな? gosh> (begin ((lambda () (begin (use srfi-1) #t))) (iota 10 1)) (1 2 3 4 5 6 7 8 9 10) あれ?iotaされてしまった。 Gaucheのドキュメント読まないと分からんなぁ。

3imp

Schemeの実装について書かれた論文と聞いて(ガラッ id:propella:20100111で紹介されていた論文3impに興味津津! あー、僕もScheme実装してみたいなぁー。...いかんいかん、また病気が。

ポップされた環境フレーム

前のエントリで、ポップされた環境フレームに関する疑問をちょっと書いた。 で、それっぽい答えを出したけど、その答えが正しいとしたら、また新たな疑問がでてくる。 例えば、次の条件を全て満たすような場合はどうするんだろう。 環境からポップされた環境…

環境フレームモデル

置き換えモデルではbeginやset!が絡んだ時に正しい値にならなかった。だけど、環境フレームモデルでは正しく計算できるらしい。 だい〜ぶお利口、置き換えモデルよりいくらかCOOL(by 宮崎吐夢 環境フレームモデルでも「環境」を用いるが、置き換えモデルの…

漠然とした不安

なにがそんなにモヤモヤするのかちょっと考えてみた。そしたら、以下のことが、漠然とした不安を感じさせているんじゃないかと気づいた。 gosh> (lambda (a b) (foo a b)) #<closure #f> gosh> ((lambda (a b) (foo a b)) 1 2) *** ERROR: unbound variable: foo Stack T</closure>…

作用順序評価

2つの評価モデルの話に進む前に、作用順序評価という概念について少し。 id:yagiey:20100103:1262535864の最後らへんで書いた内容に関係するような気がするなぁ。 Schemeでリストを式として評価する時は基本的に関数適用になるけど、この関数適用に先立って…

評価モデル

計算の様子を理解するためにはどうすればいいだろうか? 計算機で実際に動かす 何をやってるかは分かるだろうけど、ある特定のプログラムに関してしか使えない方法だ。計算一般で使えるような方法はないか? 機械語を追って計算機をシミュレート あまりにも…

置き換えモデルと副作用

置き換えモデルでは、副作用がある式を扱えない場合があるらしい。まず「副作用」を定義しなくちゃいけないだろうけど、自分もちゃんと理解できていないので定義せずスルーする。ごめんなさい。では、置き換えモデルで (((lambda (y) (lambda (x) (begin (se…

置き換えモデル

「名前」と「名前に紐づけられた値」のペアを束縛という。 ある時点での束縛は複数あることが普通。ここでは piが3.14に fooが42に barが"hello"に 束縛されているとしたら、 名前 値 pi 3.14 foo 42 bar "hello" みたいな表になる。これを環境と呼ぶ。束縛…

例外その2

今回はGaucheのtest*、test-start、test-endの簡易版を実装してみようという内容。 今までの知識を以ってすれば特に難しくはないが、簡易版test*であるmytestの実装でのthunkの話がポイントですかね。 手続きの評価を遅らせるために、関数適用ではなくラムダ…

例外その1

10章のうち、後半の例外について。まず、他の言語との概念の違いについて。Schemeには例外に関係する用語として以下のようなものがある。 例外:例外的な事象のこと。 コンディション:例外が発生した時に作成される、例外の状況を記述するためのオブジェク…

テスト

10章「テストと例外処理」のうち、テストに関する箇所をば。 手続きtest* ちなみに、test* は以下でも出てきた。 id:yagiey:20090307:1236410685 id:yagiey:20090321:1237653683 評価結果が○○と等しくなるはずだ!ってな感じで、次のように使う。 gosh> (use…

こんなの見つけた

はてなようせいとまなぶ R5RS表示的意味論 必要になったら読んでみよう。 いつになることやら...。