Scheme手習い Chapter 6(再)

算術式とは

(数を含む)アトムか、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式)が+×↑を除いて数だけを含んでいるかどうかを決める。

  1. アトムどうか
  2. 演算子が+×↑かどうか
  3. 第一被演算子と第二被演算子をnumbered?で調べる。

簡素化したnumbered?

aexpが算術式だと分かっているなら+×↑とアトムのみ含まれるという事がわかる。
なので

  1. もしもaexpがアトムなら数かどうか調べる。
  2. 数でないなら、第一被演算子と第二被演算子をnumbered?で調べandを取る。

という風に簡素化出来る。

value

数値式である算術式の自然な値と思われるものを返す。

  • 算術式が数ならその数自身。
  • +や×や↑で結合されているなら、2つの部分式に対してvalue再帰していけばいい。
    • 性質が同じだから再帰出来る!(2つの部分式はどっちも算術式)

算術式の表現を変える

補助関数を定義する

部分式を取り出す補助関数、1st-sub-expと、2nd-sub-expを定義する。
演算子を取り出す補助関数、operatorも定義する。

補助関数は表現を隠す

実際の算術式の表現を扱うのは補助関数。
なのでvalueで直接表現を触らずに補助関数を使うようにすると、表現の変更の影響が少くなる。(補助関数を書き換えるだけ)
抽象化出来る!

実は数も表現だった

4は4という概念を表す表現。アラビア数字の記号。
別に4を表すなら空リスト4つのリストでもいいんじゃね?

数を抽象化する補助関数

sero? edd1 zub1を定義
それを使って+を書きなおすと数の表現が()のリストで出来る。

感想

表現を直接使わないよう、補助関数を使い抽象化すると表現の変更が楽。
算術式の部分式も算術式だから再帰で処理していける。
補助関数スゴいよぅ