算術式とは
(数を含む)アトムか、2つの算術式を+か×か↑で結合したもの
算術式の例として
- 1 (アトム)
- 3 (アトム)
- 1 + 3(1と3、2つの算術式を+で結合)
- 1 + 3 × 4(1と3、2つの算術式を+で結合した算術式と、4を×で結合)
- cookie(アトム)
算術式の表現
「カッコはそこにないと思えばいいでしょう。」
カッコなんて飾りです。
(n + 3)というS式でn + 3を表現すると次のような利点が。
- S式なので関数の引数とすることが可能。
- 構造的にn + 3と似てる。
算術式と算術式が結合したら?
- 3 + 4 × 5は(3 + (4 × 5))
- 普通の入れ子だ!
最初に定義したnumbered?
cookieなどのシンボルや"文字列"もアトムなので算術式。
numbered?は、算術式の表現(S式)が+×↑を除いて数だけを含んでいるかどうかを決める。
- アトムどうか
- 演算子が+×↑かどうか
- 第一被演算子と第二被演算子をnumbered?で調べる。
簡素化したnumbered?
aexpが算術式だと分かっているなら+×↑とアトムのみ含まれるという事がわかる。
なので
- もしもaexpがアトムなら数かどうか調べる。
- 数でないなら、第一被演算子と第二被演算子をnumbered?で調べandを取る。
という風に簡素化出来る。
value
数値式である算術式の自然な値と思われるものを返す。
- 算術式が数ならその数自身。
- +や×や↑で結合されているなら、2つの部分式に対してvalueを再帰していけばいい。
- 性質が同じだから再帰出来る!(2つの部分式はどっちも算術式)
算術式の表現を変える
補助関数を定義する
部分式を取り出す補助関数、1st-sub-expと、2nd-sub-expを定義する。
演算子を取り出す補助関数、operatorも定義する。
補助関数は表現を隠す
実際の算術式の表現を扱うのは補助関数。
なのでvalueで直接表現を触らずに補助関数を使うようにすると、表現の変更の影響が少くなる。(補助関数を書き換えるだけ)
抽象化出来る!
実は数も表現だった
4は4という概念を表す表現。アラビア数字の記号。
別に4を表すなら空リスト4つのリストでもいいんじゃね?
数を抽象化する補助関数
sero? edd1 zub1を定義
それを使って+を書きなおすと数の表現が()のリストで出来る。
感想
表現を直接使わないよう、補助関数を使い抽象化すると表現の変更が楽。
算術式の部分式も算術式だから再帰で処理していける。
補助関数スゴいよぅ
0 件のコメント:
コメントを投稿