考えた方がいいでしょう。'()なども同様です(ただし、()は終端記号)。見分けが付かなくなるためかと思います。dotはその名の通り「.」を表します。pointers]はユニークな記号の集合です。適当に眺めたらあとは、必要になったときに見返せばいいでしょう。言い方を変えると「穴の開いた不完全な式」です。...)これは式です。いっても誰も文句を言わないでしょう。次のものはどうでしょうか(等号の右辺に注目してください)。この一箇所だけ穴の開いた式を評価文脈といいます。入れると前者と同じ式になりますね。F1[e0]のように表します。穴の中には任意のものを入れることができます。ぶんみゃくのぶんぽうR6RSの完全な文脈の文法の定義を眺めてみましょう。Fは一箇所だけ穴の開いた式を表します。文脈Sはクォートを外すのに使用するためあらゆるところに穴がくることができます。読んでいるうちに分かるでしょう。Fは次のような形を取ることができます。e)また、[]*と[]oといったものが現れますが、これは通常の穴[]とは異なります。文脈に明示的に指定したときのみ使用します。逆に、それらが指定された場合は通常の穴[]は使用しません。value)が望まれる場所で使用されます。ことを意味します(†2)。e)などがその条件に適合します。[]oという三種類の終端記号と考えればいいでしょう。考えると、穴に何か入れるというのは、特定の終端記号を別のもので置き換えるというだけです。くぉーと前に文脈Sという定義の長いものを見たと思うけど、それを使ってquoteの簡約を行うわ。ちなみに文脈Sが出てくるのはここだけよ。あんなに定義が長いのに悲しくなるわね......かんやくきそく簡約規則というものを見てみましょう。簡約規則とはそのまま「簡約の規則」です。抽象機械の一回の動作を規定するわけです。ここで登場するのはクォートを外す規則です。上から順に見ていきましょう。value)、つまり評価したら自分自身になる値です。1番目の規則はこの自己クォートな値にクォートが付いていたら外せることを定義しています。'171))このようなプログラムにこの規則を使うことを考えて見ましょう。es)という文脈が作れることができ、これをS1とします。第2引数、第3引数のクォートも外せます。文脈Sの文法から、クォートはかならずbeginの左から外れていくのが分かります。次に、2番目の規則を見てみましょう。これは入力'()を空リストを表す終端記号nullに変えるだけです。3番目と4番目の規則を見てください。左辺が全く同じ形をしています。これはどちらか好きな方を(処理系の実装者が)選んでいいことを示しています。これらの規則はリストに対するクォートの処理です。あることを示しています。これは組み込み関数で、以下のように定義されています。一言で説明すると、リストをconsを使った式に直します。Liは通常のconsを使い、書き換え可能(mutable)なリストを作っています。Lmはconsiというものを使い、書き換え不可能(immutable)なリストを作っています。なんかこの組み込み関数、iとmが逆な気がするんですが、そう定義されてるんで仕方ないですね。クォートをつけないと変数と間違えられて評価されてしまうため、このようになっています。シンボルのクォートは最後まで取れることはありません。(これは普通のインタプリタの実装とは大きく違いますね)たちこの節は説明が短くて読みやすい気がするけど、それは説明をしてないからよ♪たちが悪いわね。call-with-valuesの定義は頑張って自分で読んでね。かんやくきそく次に、多値に関する簡約規則を見てみましょう。1つ目の規則を見てみましょう。穴[]*を使用しています。これは、多値が望まれているところに単一値がある場合、多値に書き換えます。6)))といった感じです。一つだけ値を持つ多値がある場合に書き換えます。2))3つ目、4つ目はcall-with-valueに関する規則です。これについては説明しなくても大丈夫でしょう。れいがいR6RSはそこらじゅうでexceptionをraiseしなさいってうるさいの。Libraries」の方にしか載ってないの。R6RSの本編(?)には例外の扱いが載ってないので説明は省略します。面倒だったからじゃないですよ!すうちけいさんこのあたりから説明がかなりいい加減になってきてるわこの説明に頼らずに頑張って自分でR6RSを読んでね♪あと、早速例外の説明を省略した付けが回ってきたわ。"raise"とかは気にしちゃだめよ♪かんやくきそく数値計算に関する簡約規則を見てみましょう。4)))というプログラムを簡約する場合を考えて見ます。4)))に簡約されます。4)))に簡約することができます。現状の規則ではこれ以上簡約できません。いうのも、Fの生成規則を見れば分かるように、beginの第2引数の位置に穴はこれないからです。逆に言えば、beginは必ず第1引数が評価されることが保障されています。最後の式を全体の結果とするにはbeginの簡約規則を定める必要があります。きほんふぉーむbeginやifの規則をつくるわ。これができたらずいぶん面白くなってくるわよ。最後に第1引数を結果として返すものよ。見てみたらどこでも説明してなかったから今言うわね♪かんやくきそく基本的なフォームに関する簡約規則を見てみましょう。さっき、途中まで簡約したbeginの例の続きを考えて見ましょう。4)))に簡約することができます。これはプログラムの最終結果となります。次に、ifに関する規則を見てみます。ifの条件部は通常通り、簡約することができます。e2は評価されません。if文全体がe1かe2のどちらかに簡約されます。りすとコンスセルをつくるために、メモリというかヒープを使うわ。R6RSの中ではstoreって呼んでるから注意してね。説明が完全に投げやりだから頑張ってね♪かんやくきそくリストに関する簡約規則を見てみましょう。最初の2つの規則は関数listをconsに書き換えるものです。次の規則はconsに関する規則です。consを適用すると、メモリ上にコンスセルが作られます。簡約結果はそのアドレスとなります。コンスセルは常に新しいアドレスに割り当てられることになります。carとcdrはメモリから引数に指定されたアドレスを探し、そのCAR/CDRを返します。set-cdr!はメモリ上のコンスセルの値を書き換えます。5))(*3)R6RSではアドレスという表現は使われていません。これがいちばんしっくりとくるので、使いました。substitution"の一言でR6RSは済ませてるわ。かんやくきそく手続きに関する簡約規則を見てみましょう。引数の評価順序は決まっていないため、すこし変な感じの規則となっています。1つ目の規則はlambdaを使って引数の評価を1つずつに分解しています。あることに注意してください。文脈Fの評価規則を見直してみてください。全てv(簡約済みの値)となっています。引数を評価することができます。この規則を使う必要がありません。よって、1つ目の規則は複雑な条件付きとなっています。3))2つ目、3つ目の規則は手続きの適用に関する規則です。3つ目の規則は仮引数を実引数で置き換えます。2つ目の規則は手続きに引数に対するset!が含まれる場合のみに使われます。これは、実引数の値をメモリにコピーし、そのアドレスで変数を置き換えます。4つ目の規則は全引数に対する処理が終わった後にlambdaをbeginに書き換えます。mp1))くみこみかんけいset!があるか判定する組み込み関係Vは次のように定義されます。複雑な定義ですが、単に関数の中にset!があり、それが引数に対して使われているか調べるだけです。こーるしーしーとだいなみっくうぃんどこーるしーしー♪かんやくきそくcall/ccとdynamic-windに関する簡約規則を見てみましょう。dwはdynamic-windで使うもの、throwは継続オブジェクトです。2つ目の値を全体の値とします。形式になるまで、dwそのものは残ります。プログラムをthrowで包んだもの(=継続オブジェクト)に適用します。現在のプログラムを捨て、throwの中のxを引数で書き換えたものを使うだけですみます。...)で書き換えたものを使います。これから処理すべき文脈を作り、それを返します。そのサンクを抜ける前に継続呼び出しをした場合です。この場合は、そのサンク中でdynamic-windを使っているか調べます。dynamic-windの第1引数(before)の適用、および続きの処理を行う文脈を返します。その中でさらにdynamic-windを使っているか調べます。続きの処理を行う文脈を返します。この集め方によって、外側のdynamic-windのbeforeから行うことになります。Sの1つ目の定義は誤字ではないかと思います。右辺のS[[E1]]はS[[H2]]だと私は考えます。内側のdynamic-windのafterから順に呼び出すものになります。この中にはTの定義より、1が入ります。Sの定義は分かりにくいですが、頑張ってください。っとれっくとかletrecとスタートレックって似てるわね。そのための情報もメモリにおきます。そんなことをできるPrologをお勧めします。ステッキと似ていて素敵です。』の場合がわからない......えーと、E*は穴の種類の情報を引き継いで、あれFはどうなるんだろう?この場合、E[X]であっても、E[X]*であっても、Fは普通の穴[]を使うことになるわ。分かりにくいかな?説明がね!。