kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Reasoned Schemer (65) Forewordとか

ForewordとかPrefaceから読み返してみる
そうだそういうことやってたんだ、という気分(忘れてる

  • relationとgoalを理解して使えるようになる(第1章〜第8章)
  • relationalでない演算子を使い、pureでないrelational programmingを行う(第9章)
  • Schemeで関係型プログラミング言語を実装する(第10章、付録A)
  • 第1章では低レベルで基礎的な記法を学んだあと、==freshcondedefrelといった上位の文法に移行する

今回はSince the First Editionも読んでみる
なんかわかりそうで役に立ちそうな気がした

言語の変更

  • condefreshrun*を一般化したのでcondiallalliが不要になった

これはよくわからん

  • defineをやめてdefrelを使うようにした

だいぶすっきりしただろうな

  • unifyはsubstitusionを拡張する前にoccurs?を呼ぶ

occurしてても拡張してたのか別途チェックしてたのか

  • runrun*のインタフェースを変更した

使いやすくなったらしい

  • elseはやめて#tにした

Translationのため

  • alwaysoneveroはgoalではなく引数なしのrelationとした

今回は(alwayso)とか(nevero)とか書いてたけど
前は単にalwaysoneveroって書いてたということだな
理由は書いてない
defrelで定義しようと思ったらそうなる、ってくらい?

  • disj2conj2を導入した(condefreshを導入するためだけに)

このあと10章、つまりminikanrenの実装の話なんだけど
First Editionと違った説明をしてるってことだろうか
それとも10章がなかったということ?
Littleシリーズで言語の実装がないってことはない気がするけど

こんな感じで進めるという
そうだったそうだった

  • まずvariable、substitutionなどunificationに関する概念の導入

  • 続いてstreamとsuspensions、disj2conj2

  • appendoを例にとって、低レベルの言語にどうやって展開されるか

  • ifteonce

  • できるだけ関数として実装した

  • おかげでマクロが簡単になった

  • まずdisjconj、続いてほかのマクロを定義

  • 再帰なのはfreshcondaだけ

  • マクロがなくても、関数がファーストクラスな言語であれば10章の関数は定義できる

めんどくさいのはその関数を使うときって話だと思うけど

LawsやCommandmentsを明確にしたりTranslationを導入したり
文章を見直したり章の構成を見直したり
÷oがわかりやすいようにsplitoの説明を増やしたり(でも難しかったけど)

quasiquoteの書き方を変えたり
前のバージョンではバッククオートやカンマを書いてなかったそうな
みかけはすっきりしそうだけどたまに混乱しそう