「は」制作 覺へ書き2

今回の更新は つまづきの連續だつた
式の評価方法を 根本から見直し パターンマッチと再歸を實現するのが目標だつた
正直なところ 自分の書いたコードの細部まで 自信をもつて 挙動を予想できるやうに なつてゐない
とりあへず 何とか 動いた といふのが 實感である
もちろん そこは これからコードを吟味しつつ
バグを直し 簡潔にできるところは まとめ
より汎用性の高いものを目指すつもりだ
少なくとも 次のやうな パターンマッチ ・ 再歸を實現することができた
Haskell風に書くと

something 0 = 0
something x = (something (x-1)) + 3

この函數somethingに引數4を適用して評価すると
something 4 は 12 となる
「は」の表記法で ひらがなを使ひ 同じことを書くと 次のやうになる

これは ろ か ろ に あ か あきひ み た

函數「これ」に引數「よ」を適用し評価すると
「は よ これ た」は 「ひふ」となる

www.nicovideo.jp

やったことを 簡潔に箇条書きにすると

  • 今までは 入力された文字列を 二度整形し (函數の部分を書き換へるなどして) 三度目に整形された文字列リストを評価してゐた
  • 今回 文字列の評価は 一度とし 必ず 前から後ろへ 一要素ずつ 評価しながら 整形するやうにした
  • 状態として登録される函數は 引數の組と それを用ひた式をペアにして それを複數もてるやうにし パターンマッチに對應した

おそらく Data.List モジュールを使へばすぐ實現できるやうなことも 自前で函數をつくり 實現した

理由は ただ さうしたかつたからである

特に 予想外に苦勞したのは 次の函數である

sepWith :: String -> String -> String
sepWith wd str 
  | length str >= length wd =if (take (length wd) str)==wd
                                then " x "++(sepWith wd (drop (length wd) str)) 
                                else [(head str)]++(sepWith wd (tail str))
  | otherwise = str

これは 文字列を 文字列で分割し 分割する文字列を" x "で置きかへる函數である
例へば
sepWith "あか" "しろあかあお"
とすると
"しろ x あお"
が返される
これができると あとから 「x」の部分を別のものに置きかへることができ
函數の引數を 連続した文字列の中で変換させることができるやうになる
實例でいふと 先程の「は」式中の 「あきひ」の部分でこれが適用されてゐる
具體的には「あきひ」の「あ」は函數の引數なので それを除いた 「きひ」の部分が
"ratio"の型をもつと判断された場合 「あ」の部分が 與へられた數(例の場合は「よ」)に置き換へられ
結果として「よきひ」の形になつて 「み」を得る といふやうに 使はれてゐる

github.com