作ったものさて、4ヶ月ぶりの更新です。やることはタイトルのとおりです。2])は縛っていきます。基本的に変数を使いたくなったらラムダ式に変換します。仕組みは正規表現マッチとObject#sendを使って、正規表現にマッチしなくなるまで変換し続けていく形です。このままじゃ読めないので、分解していきます。->(a){r[->(b){r[->(d){r[->(g){g.gsub(/(-?\d+)([*\/])(-?\d+)/){$1.to_i.send($2,$3.to_i)}},d].gsub(/(-?\d+)([-+])(-?\d+)(?![*\/])/){$1.to_i.send($2,$3.to_i)}},b].gsub(/\((-?\d+)\)/){$1}},a]}まずは、rとfに分解します。rの詳細とZコンビネータさらにrを分解します。x[a]}[f[s]]}}][v]}(一つラムダ式とその呼出が増えていますが、動きは一緒です。)元の形ではrの内部でrを呼び出して再帰をしていたのですが、この縛りだとrの名前がなくなるので、簡単に再帰はできません。Zコンビネータを使います。(ぶっちゃけZコンビネータの中身は理解できてないし、これの使い方に試行錯誤する時間が多分一番長かった気がする)fの詳細ついでにfもわかりやすくしてみます。]}実はものすごいネストしています。r(f,v)は値が変わらなくなるまでfを呼び続けます。逆ポーランド式電卓の方にもそんな感じの部分があります。それをネストしながら呼び続けることによって、優先順位のある計算を行います。括弧の処理は中の+-*/を計算し尽くしてできた(x)をxに置き換えることによって行っています。[f,v,a]を置いてみると、計算の様子がよくわかります。(Procの部分を置き換えています。)(なんか括弧の優先順位が違うような気がするけど、とりあえず正常に動くので気にしない・・バグがあったらコメント等で教えてくれるとありがたいです。->(s){r[->(t){f2[t].gsub(/\((-?\d+)\)/){$1}},s]}ハマったところrの再帰の呼び出しr[f,a]をf[a]にしていて、なんかおかしいなと思いつつも大体の式はうまく動いちゃうので微妙なバグでした。f1は楽だけど、f2のf1を呼ぶ部分で迷った・・3重ループになるはずだから、多分ここで合ってるはず・・実際式を入れたら動くのだし()Zコンビネータの使い方・・あれって2つの引数を持つ再帰はできないのかな・・?最初fも再帰の引数に入れてて詰まってました。この後のaの値が気になる。実際にやっ...2016-12-27少しclojureに触れてみた感想ringとか使ってました。日)なんとなく思ったこととかを書いてたりする。月別リストはてなブログをはじめよう!soukoukiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。