2011年5月30日月曜日

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を定義


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


感想


表現を直接使わないよう、補助関数を使い抽象化すると表現の変更が楽。


算術式の部分式も算術式だから再帰で処理していける。


補助関数スゴいよぅ





0 件のコメント:

コメントを投稿