【お知らせ】プログラミング記事の投稿はQiitaに移行しました。第17回目の参加記事です。狙ったわけではありませんが去年と同じ17番手です。V6で使われているK&R以前の古いC言語のlexerを書いていて、シンボル名は最初の1文字だけ数字が使えないという制約をどう実装するか考えていたことに由来します。はじめにデータが1つずつ渡される状況での評価関数について考えました。3より小さいかを判定します。後の例と比較しやすいよう、無名関数にはしていません。今回は副作用の是非については論じません。最初だけ3以上、それ以降は3より小さいかの判定について考えます。評価関数を差し替え可能とするため、インターフェースは変えないものとします。クラス最初に思い付いたのはクラスで状態を持つ方法です。(Eval().eval)クロージャフィールドの代わりにローカル変数をキャプチャしたクロージャに置き換えてみます。mutableをrefに書き換えただけで、それ以外はあまり変わりません。evalこれだとevalは一度しか使えないので、関数化して再利用できるようにします。(eval())クラスでもクロージャでも同じことができました。どちらを使うかは好みの問題もあるため、ここでは論じません。追記[twitter:@nagat01]さんより、副作用のない例を教えていただきました。今回私はtestを固定化するという発想で副作用を導入しましたが、そもそもtestを固定化する必然性が薄かったです。先ほどevalを再利用するために関数化しましたが、敢えてシングルトンにする場合は関数化しない方が好都合です。この技はC言語の静的ローカル変数を直訳するのに使えると気付きました。static)すらインスタンス化すると知ったときの衝撃を思い出しました。レイヤが異なるのでちょっと乱暴な感想ですが。meetingでid:atsushienoさんに教えてもらいました。(1)はてなブログをはじめよう!n7shiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。