tkykmw code

学びたいことを学ぶ

Ruby

アンダースタンディング コンピュテーション 6.1.11.2 再帰なしRANGEの弱点

本文には書いていない点。 再帰なしのMODが0除算に対して異なる結果を返すのと同じように、再帰なしのRANGEも元と異なる結果を返す場合がある。 値の範囲の大小を入れ替えた場合、再帰版は空のリストを返すのに対し、再帰なし版は終端の値を含む要素1のリス…

アンダースタンディング コンピュテーション 6.1.11.1 MULTIPLES_OF 別解

倍数の無限ストリームMULTIPLES_OFの別解。 MULTIPLES_OF = -> m { Z[-> f { -> c { UNSHIFT[-> x { f[INCREMENT[c]][x] }][MULTIPLY[c][m]] }}][ONE] } 数列として表現するなら だから、この方が素直だと思う。さらに、この構造を見れば、実はMAPとUPWARDS_…

アンダースタンディング・コンピュテーション6.1.10まで

後半、説明が飛ばし飛ばしでややわかりにくいので、補足を試みる。 リストの作り方 PAIRが入れ子になっていることへの説明がないので、混乱する。要は、リストの一つの要素を、3つのフィールドで構成しているのだ。 リストの末尾かどうか判定するフラグ 値へ…

Yコンビネータによる無名再帰をRubyで理解する

アンダースタンディング コンピュテーション180ページでは、Yコンビネータ(Zコンビネータ)によって無名再帰を実装している。 が、詳しい説明が省かれているので、Wikipediaの不動点コンビネータの例をRubyで書いて理解してみる。 まず普通に再帰を使って、…

アンダースタンディング コンピュテーション3章のNFA/DFAをGraphvizでビジュアル化

せっかく正規表現→NFA→DFAと変換できるようになったんだから、グラフ図(状態遷移図)で見たいよね、というわけで定番のGraphvizを使ってビジュアル化してみた。 Graphviz用のRubyライブラリはいくつも存在するようだが、どれも用途に合わなかったので、自作…

アンダースタンディング コンピュテーション 4章の感想とか

第4章。プッシュダウン・オートマトン。 実行中に拡張可能なワーキングメモリがあれば、できることが増える。これはプログラミングに対する素朴な実感にもあっていて、納得感があった。初めてC言語を勉強したあの日、malloc を覚えて、初めてやりたいことが…

アンダースタンディング コンピュテーション 3章の感想とか

「単純なコンピュータから始めましょう」という導入で有限オートマトンが出てきて、しばらくはどういう展開につながるかわからないので、かなり面食らった。 3章全体が、最終的には「正規表現を作る」という形で、実用的な成果に至ることを押さえておけば、…

RubyのStructを継承して、共通の振る舞いを追加する

Struct.new の戻り値は Struct のインスタンスではなく、サブクラスである。 Person = Struct.new(:name, :age) Person.is_a?(Struct) #=> false Person < Struct #=> true しかし「 new によってサブクラスが作られる」という振る舞いそのものは継承されな…