Reasoned Schemer (65) Forewordとか
ForewordとかPrefaceから読み返してみる
そうだそういうことやってたんだ、という気分(忘れてる
- relationとgoalを理解して使えるようになる(第1章〜第8章)
- relationalでない演算子を使い、pureでないrelational programmingを行う(第9章)
- Schemeで関係型プログラミング言語を実装する(第10章、付録A)
- 第1章では低レベルで基礎的な記法を学んだあと、
==
、fresh
、conde
、defrel
といった上位の文法に移行する
今回はSince the First Editionも読んでみる
なんかわかりそうで役に立ちそうな気がした
言語の変更
conde
、fresh
、run*
を一般化したのでcondi
、all
、alli
が不要になった
これはよくわからん
define
をやめてdefrel
を使うようにした
だいぶすっきりしただろうな
unify
はsubstitusionを拡張する前にoccurs?
を呼ぶ
occurしてても拡張してたのか別途チェックしてたのか
run
、run*
のインタフェースを変更した
使いやすくなったらしい
else
はやめて#t
にした
Translationのため
alwayso
とnevero
はgoalではなく引数なしのrelationとした
今回は(alwayso)
とか(nevero)
とか書いてたけど
前は単にalwayso
とnevero
って書いてたということだな
理由は書いてない
defrel
で定義しようと思ったらそうなる、ってくらい?
disj2
とconj2
を導入した(conde
とfresh
を導入するためだけに)
このあと10章、つまりminikanrenの実装の話なんだけど
First Editionと違った説明をしてるってことだろうか
それとも10章がなかったということ?
Littleシリーズで言語の実装がないってことはない気がするけど
こんな感じで進めるという
そうだったそうだった
-
まずvariable、substitutionなどunificationに関する概念の導入
-
続いてstreamとsuspensions、
disj2
、conj2
-
appendo
を例にとって、低レベルの言語にどうやって展開されるか -
ifte
とonce
-
できるだけ関数として実装した
-
おかげでマクロが簡単になった
-
まず
disj
とconj
、続いてほかのマクロを定義 -
再帰なのは
fresh
とconda
だけ -
マクロがなくても、関数がファーストクラスな言語であれば10章の関数は定義できる
めんどくさいのはその関数を使うときって話だと思うけど
LawsやCommandmentsを明確にしたりTranslationを導入したり
文章を見直したり章の構成を見直したり
÷o
がわかりやすいようにsplito
の説明を増やしたり(でも難しかったけど)
quasiquoteの書き方を変えたり
前のバージョンではバッククオートやカンマを書いてなかったそうな
みかけはすっきりしそうだけどたまに混乱しそう