C#

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 …

遅延評価と例外

C#

以下のようなメソッドから投げられる例外ってどうやったらキャッチできるのかなぁ。 public IEnumerable<int> Enumerate5() { yield return 0; yield return 1; yield return 2; yield return 3; throw new Exception(); yield return 4; } 以下のようにしてみた</int>…

アプリの多言語化

10月に韓国である国際学会でセミナーをやることになった。セミナーで某ソフトウェア(研究室謹製、日本語版のみ)を使うらしいので、そのソフトを多言語化しなくてはならなくなった。もちょっと具体的に言うと、日本語の環境下では日本語で、それ以外は英語…

EnumerableでLISPできそうなきがする

C#

ここ数回直積の件でIEnumeralbeをリスト的に扱ってみたけど、これでLISPできるんじゃね?とふと思った。ってことで純LISPの5関数。いつか書いてみよう。 car exp.ElementAt(0); cdr exp.Skip(1); cons コンスセルを表現するのは難しそうだなぁ。IEnumerable…

可変個の集合から、直積の集合を作る(その2)

C#

直積の件でトラバもらった。→ 可変個の集合から、直積の集合を作る - チキン煮込みチーズミックス4辛 自分がPythonよくわからないので、内容は理解できなかったけども>< で、そのトラバをうけて、IEnumerableって無限リスト的に扱えるのかちょっと気になっ…

標準ライブラリにFold相当のメソッドがあった

C#

昨日のエントリ「可変個の集合から、直積の集合を作る - チキン煮込みチーズミックス4辛」で、Foldを自作したけど、これと同じ働きをするメソッドが標準であるみたいだ。Enumerable.Aggregateって拡張メソッドがそれ。ってことで、該当箇所をこっちで書き換…

可変個の集合から、直積の集合を作る

C#

集合の個数が固定ならば、[C#]forever for(のコメント欄)のようにすれば簡単だけど、可変個の場合ちょっとややこしいなぁーとか思いつつググってたら、こんなん見つけた。 id:youkoso_guest:20081212:1229089595 reduceってなんぞ?ってな感じだったので、…

brainf*ckらめぇぇぇぇ

C#

激しく今さら感漂いまくりだけど、brainf*ck作ってみた。まあいろいろ突っ込み所はあると思いますが勘弁してね。 using System; using System.IO; using System.Text; namespace Brainf_ckProcessor { class Program { static void Main(string[] args) { //…

コルーチンをC#で

前回のコルーチンっぽいものをC#で書いてみた。いろいろ問題があるかもしれないけど。 無限ループなので、Ctrl+Cかなんかで中断すべし。 /// <summary>The class which represent the co-routines which should be work cooperatively.</summary> /// <typeparam name="T">The type of return value </typeparam>…

lambda式って何だろう

C#

id:yagiey:20080204:1202147003の内容の続きっぽいけど... // C#2.xにはFunc<T>が無い delegate TRet Func<TRet>(); // 匿名メソッドのテスト static void NotExpected() { // 手続きを作成 List<Func<int>> procs = new List<Func<int>>(); for (int i = 0; i < 5; i++) procs.Add(delega</func<int></func<int></tret></t>…

evalできた

evalはちゃんと勉強してから作りたかったけど、やっぱり気になって仕方がないので作ってみた。 データ構造(リストとアトム) 主要な手続き(consやcarやcdrなど) を定義して、あとはThe Little Schemerのvalue(id:yagiey:20081105以降)をそのままC#に移…

後はeval

字句解析、構文解析、S式の出力を実装出来たので、REPLの「R」と「P」はできたことになる(のか?) ってことで、あとはエヴァりたい。むしろヱヴァりたい。 ...でも、やっぱ本を進めたい。 ってことで、少し暖めておく。 早くSICP読みたいし。 積読書は堆く…

構文解析できた

俺LISPを少しずつ作っている。とりあえず、構文解析まではできた。 受理する構文をBNF的に書くと、以下の通り。 <expr> ::= <atom> | <list> <atom> ::= <identifier> | <string> | <number> | <boolean> <list> ::= <open_paren> [<expr>+ [<dot> <expr>]] <close_paren> ただし、それぞれ はS式 はアトム は識別子 は文字列 は数値 は真理値 はコンスセルまたは空リスト は</close_paren></expr></dot></expr></open_paren></list></boolean></number></string></identifier></atom></list></atom></expr>…

リストとツリー

今、無謀にも、なんちゃってSchemeをC#で実装しようと試みているところ。 まだ字句解析器しかできてないけど。ヽ(´Д`;)ノ アゥア 切り出したトークンの並びをチェックしつつ、リストを構成するのは今から。 構文解析器って言うのかな? マクロはまだ自分が理解…

FizzBuzzをがんばって短くしてみた

C#

twitterにポストできるくらいの文字数でFizzBuzzを書いてみようと思い立ち、仕事中にも関わらずやってみた。 Enumerable.Range(1,100).Select(n=>0==n%15?"FizzBuzz":0==n%5?"Buzz":0==n%3?"Fizz":n.ToString()).ToList().ForEach(s=>Console.Write(s+" "));…

delegateについて

C#

ちょっと意外な動きをした。 delegate void Func(); static void Main(string[] args) { Func func = null; for (int i = 0; i < 5; i++) func += delegate() { Console.WriteLine(i); }; func(); } へー。