C#

日付や時間を表す文字列を受理するオートマトン③

どのパターンか判断できるようにしてみた。Ideone.com - vcrHk5 - Online C# Compiler & Debugging Tool

日付や時間を表す文字列を受理するオートマトン②

以下のフォーマットを受理するDFAを作った。 Ideone.com - FxXej0 - Online C# Compiler & Debugging Tool yyyy/MM/dd HH:mm:ss.fff yyyy/MM/dd HH:mm:ss yyyy/MM/dd HH:mm yyyy/MM/dd HH yyyy/MM/dd yyyy/MM yy/MM/dd HH:mm:ss.fff yy/MM/dd HH:mm:ss yy/MM…

整数を表す文字列を受理するオートマトン②

以前作った整数のオートマトン、文字列"01"を受理するかどうかはさておき、"0"を受理しないのは問題だと思うので修正した。

実数を表す文字列を受理するオートマトン③

先日εNFAをNFAに変換した。 今度はこのNFAをDFAに変換したい。これをやるのが「部分集合構成法」というものらしい。以下にDFAの状態遷移表を作っていく。 NFAの初期状態はのみなので、初期状態の集合はとなる。そして、初期状態の集合から遷移する可能性のあ…

整数を表す文字列を受理するオートマトン

正規表現は ^[-+]?[1-9][0-9]*$でいいんじゃないかな。これに相当する状態遷移図は でいいんじゃないかな。S2が受理状態。S3になったら直ちにエラーとして停止していい。これを元に作ってみたC#のクラスは interface Checker { /// <summary>このオブジェクトの状態を</summary>…

デシリアライズではまった

C#

次のサンプルコードのMyMapクラスのようなクラスをファイルにシリアライズしてデシリアライズすると、デシリアライズ用のコンストラクタの中で_entriesの要素が全部(null,null)になってしまう。entry.Item1とentry.Item2を使って処理をしていたので、実行時…

ループでEval(その1)

evalを再帰で書くとすぐStackOverflowExceptionで死んじゃうので、ループで書いてみようという試み。 単純に走査するだけのコードを前回のエントリで書いたので、それを使いつつ。 こんな感じ。 using System; using System.Collections.Generic; abstract c…

S式の要素を走査する

再帰とループの2通りの方法でS式(リスト)を走査してみる。ループの方はスタックの使い方これでいいのかよくわからんけど。 using System; using System.Collections.Generic; abstract class SExp { } class Pair : SExp { public SExp Car { get; private…

階乗計算

言語が提供するコールスタックを利用せずに再帰の要領で計算したくなった。特にオチは無い。 using System; using System.Collections.Generic; class App { static public void Main(string[] args) { const int N = 6; //////////////////////////////////…

外部イテレータもできた!

C#

前回 のForEachDetailを、外部イテレータからも利用できるためには、外部イテレータが「現在の値」を取得できるようにしないとダメ。2分木のイテレータに関して再開 - チキン煮込みチーズミックス4辛 からは内部イテレータだけに話を絞っていたので、ForEach…

内部イテレータできた!

C#

ForEachDetailLeftとForEachDetailRightを単純に組み合わせてできるわけじゃなかった。だけどヒントにはなった気がする。やり方は違うけど、結果的に 木構造の外部イテレータ - チキン煮込みチーズミックス4辛 となんか似てる。何がって言われてもよくわから…

再左の葉から根へ

C#

できたっぽい?こんな感じ。 /// <summary>左と自分を処理する</summary> static void ForEachDetailLeft( TreeNode<T> root, Action<T> action, JobHolder holder) { // nodeを根として、最小のノードまで進む TreeNode<T> n = root; while (n._left != null) n = n._left; // そこから</t></t></t>…

問題を単純にしてみる

C#

難しい原因は、 左の部分木を走査 自分の値を走査 右の部分木を走査 という感じで、再帰する部分が2ヶ所あることだと思う。ということで、まずは、 左の子を無視して、自分→右の子と走査する という感じで、ものすごく簡単にしてみた。するとこうなる。 /// <summary></summary>…

配列との違いは何だろう

C#

木構造の内部イテレータでつまづいている話の続き。木構造で考える前に、配列で考えていたので、それに戻ってみる。配列をラップしたMyArrayクラスのソースコードは以下の通り。 class MyArray<T> : IIterableIn<T> { T[] _ar; public MyArray(T[] ar) { _ar = ar;</t></t>…

2分木のイテレータに関して再開

C#

数か月放置していたこのテーマ。またこの数日考え始めたけど、まだ解決してない。yield returnで2分木の外部イテレータ作れたから、考える意味なくなったけど。いや!意味がないはずはない。どこかで役に立つはず!NextJobSetterやNextJobAccessorは、次に行…

yield returnで2分木の外部イテレータ

C#

yield return - チキン煮込みチーズミックス4辛 で、できないとか言ってたけどできるやんけ。なんでこんな事思いつかんのじゃ...。 // NodeクラスのGetEnumeratorだけ抜粋 public IEnumerator<int> GetEnumerator() { if (_left != null) { foreach (int n in _le</int>…

内部イテレータを外部イテレータに変形する(その2:2分木構造の場合)

C#

つづき。ようやく当初の目的だった木構造。 配列のときと同様、目標は、以下のような2分木クラスの内部イテレータTreeNode.ForEachを元にTreeNode.ForEachIterableを作成し、外部イテレータを返すTreeNode.GetEnumeratorからTreeNode.ForEachIterableを呼ぶ…

内部イテレータを外部イテレータに変形する(その1:配列の場合)再考

C#

木構造で考える前に、もうちょっと配列で考えてみる。(元ネタ:「http://d.hatena.ne.jp/terazzo/20090308/1236526403」) 「内部イテレータを外部イテレータに変形する(その1:配列の場合) - チキン煮込みチーズミックス4辛」の最後らへんでちらっと書い…

継続渡しに関する無駄思案

さっさと続き書けよって感じだけど。また横道へ。 継続渡し形式で手続きは、概念的に「呼び出し元へ戻る」ってことがなくなるので、例えばC#でちゃんとした継続渡し形式の手続きを書こうとすると、複数の文(セミコロンが2個以上)になることはないような気…

内部イテレータを外部イテレータに変形する(その1:配列の場合)

C#

「内部イテレータを外部イテレータに手動で変換してみる実験 - terazzoの日記」の「内部イテレータを外部イテレータに変形する 1.配列の場合」。かなり長くなってしまった。 ForEachの引数に渡すIntProcedureはPredicateで置き換えようと思ったけど、後々Int…

木構造の外部イテレータ

C#

ちょっと横道へそれる。 「ツリー構造用の外部/内部イテレータの実装 - terazzoの日記」には、以下の3つのアプローチによるm分木の外部イテレータの実装例がある。 いったん木構造を配列にしてから、その配列のイテレータを返す スタックで現在位置を保持し…

処理を保存してみる

C#

前回の続き。今回は「内部イテレータを外部イテレータに手動で変換してみる実験 - terazzoの日記」の、「継続渡し形式を中断可能にする」の部分。 前回はFactとFiboをCPS変換してFactCpsとFiboCpsに書き換えてみたけど、CPS変換前後で再帰関数であることは変…

CPS変換の復習

C#

木構造に対するイテレータに関して、もうちょっと考えると楽しそうな気がしていた(根拠は無く直感的に)のでぼんやりと考えてたら、 yield returnはコルーチンだし、コルーチンがあればイテレータが簡単に実装できるのかぁ... そういえばプログラミングGauc…

yield return

C#

イテレータを簡単に書けるyield returnが便利で好きなのだけれど、以下のようなのが書けたらなーと思ったのでメモ。 using System; using System.Collections.Generic; class Hoge : IEnumerable<int> { int[] _a; int _b; int[] _c; public Hoge(int[] a, int b,</int>…

難読化と多言語化

今まで日本語のみで作成していたC#のプログラムを以下の手順で多言語化し、その後NanDoKuで難読化したところ日本語が出なくなった。 フォームのデザイン時にLocalizableプロパティをTrueに変更 まずLanguageプロパティを「(既定値)」にして英語でデザイン …

StackOverflowExceptionはcatchできない

僕は素人なので、Lisp処理系作ったらとりあえずYコンビネータ動かしてみたくなる。ってことで、scallopでもやろうとして、間違って次のようなコードを評価してしまった。 (define Y (lambda (f) ((lambda (g) (g g)) (lambda (g) (f (lambda (x) ((g g) x)))…

動的なDLLのロード

C#

とあるシステムをC#で開発している人から、 実装の詳細は異なるけど同じ働きをする同じ名前のクラスを別々のDLLに入れといて、実行時にそれらをロードして簡単に切り替えて使いたいけど、何か良い方法は無いかな? と尋ねられたので考えてみた。要は、何通り…

プッシュダウンオートマトンでS式の作成

先日教えてもらったアルゴリズムで字句の列からS式を構築するパーザを作ってみた。ここに恥を晒しておく。 // 字句の列からS式を作る public SExp Parse(IEnumerable<LexerToken> tokens) { IEnumerator<LexerToken> itor = tokens.GetEnumerator(); SExp exp = null; if (itor.MoveN</lexertoken></lexertoken>…

TextReaderのClose

C#

昨日、数時間悩んだこと。 using System; using System.IO; using System.Collections.Generic; class Program { static public void Main(string[] args) { Console.WriteLine("From string:"); TestBehavior(FromString("hello")); Console.WriteLine("");…

Metafileに重ね書きできないよ...

C#

同一のMetafileオブジェクトからは1個しかGraphicsオブジェクトを作れないっぽい? I believe (not absolutely sure) that once a metafile is created (which happens when the metafile's Graphics object gets disposed), it isn't possible to re-write …