SICP1.1
モチベーションの維持、というかやる気なくしても戻ってこれるためのメモ。
・複合式:(f a1 a2 ...)、f:演算子、ai:被演算子
各式(演算子、被演算子)を評価してから演算子を被演算子に適用する。
・複合式は基本式(1 2 3 ...とか+とか)と、それらの組み合わせ(再帰的に定義)。
・特殊形式:上とは評価の方法が異なる式。
・(define a b):特殊形式の一つ。aとbを(aという名前をbに?)関連付ける(この情報はグローバル環境に保存される)。グローバル環境には基本式の定義も入ってそう。
・(define (f x1 x2 ...) (body)):defineは手続きの定義もできる。x1 x2...は仮引数であり、fに束縛されている。
・適用順序評価:上のように演算子を適用しながら式を簡約する方法。雑に考えたら括弧の内側から見る感じだと思う。Lispはこれ。
・正規順序評価:前から順番に演算子を基本式に展開してから式を簡約する。
・(cond (p1 e1) (p2 e2) ...(else en)):特殊形式の一つ。p1から順に述語を評価して、真が出たら対応する結果式を評価する。elseは恒心命題。
・(if (p e1 e2)):特殊形式の一つ。pを評価して真ならばe1、偽ならばe2を実行。
・(and e1 e2 ...):特殊形式の一つ。e1から順に評価し、偽がでたら終了し偽、出なければ最後の式の値を返す。
・(or e1 e2 ...):特殊形式の一つ。e1から順に評価し、真が出たらその式の値を返す。出なければ偽を返す。
・ここで、真・偽は#t、#fという定数だが、Lispでは#tを#fでない述語の値と解釈する。
・レキシカルスコーピング:ある手続きに束縛された変数はその内部の手続きの自由変数としてとってくることができる。
・問題1.5について:
(define (p) (p)) (p):これが無限ループになるって話。これを、
(define (p) (p)) p:とするとpの中身を求められ、別にエラーも出ない。
なんとなく、(p)はvoid *p;みたいにpのポインタのように感じる。
そこで適当に(define <p/(p)> <q/(q)>) <p/q/(p)/(q)>をやってみた。
1. (p)が何かしら定義されててpを評価→pの中身を求められ、別にエラーも出ない。
2. (define p (q)) <p/(p)>→qの参照がないよってエラー。
3. qを評価→qは未定義、またはqの参照がないよってエラー。
結構多い。メモするの正解っぽいな(内容が合ってたらだが…)