2009-01-01から1年間の記事一覧

SchemeとActor理論

「最初のSchemeインタプリタは関数とアクターの双方を実装していた」 http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/p/frag/frag_f.html 例えば「1と2と3からなるメッセージをアクターaに送る」という事を [a 1 2 3]と書く 新しくアクターを作る事もで…

Haskellで書かれたOS

House - Haskell User's Operating System and Environment House is a demo of software written in Haskell, running in a standalone environment. http://programatica.cs.pdx.edu/House/ HaskellでスタンドアローンのOSが書けるとは。 どうでもいいけど…

qemuでgPXE

PXE

実機でROMを焼くのは面倒なのでqemuで試してみた。 OSが起動する前なのにDNSで名前解決してHTTPでファイルをとってこられるのがすごい。 ROMイメージの取得 http://rom-o-matic.net/gpxe/gpxe-git/gpxe.git/contrib/rom-o-matic/ にアクセスして, 1. output…

SUMPRODUCT

SUMPRODUCTって各要素をかけ算して最後に足し算するだけの関数だと思ってたけど、 SUMPRODUCT関数にはなぜかヘルプには載っていないけれど良く使われる使い方がこれ以 外にあるのです。 「複数の条件を満たすものの足し算」の場合にその方法は用いられるよう…

タートルグラフィックでの近似円

半径1の円に内接する正n角形の1辺の長さは2sin(180°/n) 円の中心Oから正n角形の1辺ABに下ろした垂線OHが作る△OHBにおいて ∠BOH=∠AOB/2=(360°/n)/2=180°/n (中心角360°をn等分すれば∠AOBになる) なので BH=AB/2=OBsin∠BOH=sin(180°/n) 一辺ABの長さは AB=2*…

ntpd

psで見るとntpdが動いてるのになぜか接続できなかった。 ntpdは通常ntp.confファイルを編集することで編集します。OS Xのntpdの場合は少し変わっていて、設定ファイルが2つ(ntp.confとntp-restrict.conf)あります。しかしながら通常の ntpdの設定項目が2つ…

1から10までの自然数の合計

弊社の入社試験に、「1から10までの自然数の合計を出すプログラムを書きなさい」というのがあるのですが、ゾウリムシ1匹をコップに入れておくと1時間後には2匹、2時間後には4匹、3時間後には8匹となり、72時間後にコップ一杯になります。では最初に2匹入れて…

PならばQ(含意)

C言語で書くと、!P||Qと同じ ifで書くと、if P then Q の後ろに else 1 がついている、という感じか。 なぜ、Pが偽ならば、Qの真偽にかかわらず「PならばQ」が真なのか P Q PならばQ 例「この仕事が成功しなければ辞表を出す」 0 0 1 仕事が成功してかつ辞表…

ThinkPad USB トラックポイントキーボード(英語)

いつの間にかトラベルキーボードの後継が出てた。 値段が下がって、しかも前のよりもキータッチがよさそう。 スライドパッドと一緒にパームレストもなくしてくれれば更によかったが。 製品番号 55Y9003 商品名 ThinkPad USB トラックポイントキーボード(英語…

俺Prologを動かす

俺Lispでcall/ccが動くようになったので、昔call/ccを使ってGauche上で作った俺Prologをこっちで動かしてみた。 repl> (?- (append X Y (a b c)) (write (x = X y = Y)) (fail)) (x = () y = (a b c)) (x = (a) y = (b c)) (x = (a b) y = (c)) (x = (a b c)…

iframeについて

<iframe id=iframeId name=iframeName src='foo.txt' onload='foo(this)'>window.document.getElementById('iframeId')はthisと同じ物で,値は[object HTMLIFrameElement] window.iframeNameはthis.contentWindowと同じ物で,値は[object Window] つまり,idでアクセスしたときとnameでアクセスしたときの参照先は別物。 参照先のUR</iframe>…

カーソル位置取得

IEはselectionStartが使えないのでその対策が必要。 現時点では以下のようにした。 function getpos(obj){ if(obj.selectionStart != undefined) return obj.selectionStart; var range = document.selection.createRange(); if(obj.type == 'textarea'){ va…

内部defineを作る

俺Lispを内部defineに対応させてみた。 repl> (letrec () (define x 1) (define y 2) (cons x y)) (1 . 2) http://kar.s206.xrea.com/lisp/?e=(letrec%20()%20(define%20x%201)%20(define%20y%202)%20(cons%20x%20y)) 以下のような展開処理をしてる。 (letre…

マクロの変数捕捉

説明用のシンプルな例を思いついたのでメモ。例えばmy-orを次のように定義したとする。 (define-macro (my-or test1 test2) `(let ((x ,test1)) (if x x ,test2)))しかしこれでは、以下の場合に正しい結果を返さない。 gosh> x #t gosh> (or #f x) #t gosh> …

自家製quasiquote

俺Lispのunquoteしか対応していなかったquasiquoteをunquote-splicingにも対応させてみた。 and,or,cond等の基本マクロの定義にもquasiquoteを使えるように、quasiquote自体の定義にはそれらは使わずに以下で代用。 (and x y) → (if x y #f)で代用。 (or x y…

俺Lispでcall/ccと末尾再帰最適化

昔作った俺Lispにcall/ccと末尾再帰最適化を実装してみた。 (call/cc (lambda (c) (list 1 (c 2) 3))) 2 http://kar.s206.xrea.com/lisp/?e=(call%2Fcc%20(lambda%20(c)%20(list%201%20(c%202)%203))) call/ccのテスト結果 (1 2 3)のリストを作る途中で抜け…

天下一プログラマーコンテスト

以下の文字列はUTF-8を文字エンコーディング形式とする16進数のバイト列である。 UTF-8でエンコーディングされた文字列として解析した場合、この文字列の【文字数】を答えなさい。 http://www.klab.jp/tenka1programer/bosyu.html この問題を、sed、tr、wcで…

関数のアドレスとポインタ

C言語編 第43章 関数ポインタ pという名前の関数ポインタに、myabs関数のアドレスを代入するには、 p = myabs; とするだけです。次に、関数ポインタから関数を呼び出す方法ですが、これには2通りの方法があります。 ans = (*p)(-100); /* myabs(-100); …

computed goto

Gaucheのソースではgotoって使われているんだろうかと思ってのぞいてみたら、vm.cにおもしろそうな箇所発見。 /* We take advantage of GCC's `computed goto' feature (see gcc.info, "Labels as Values"). */ #ifdef __GNUC__ #define SWITCH(val) goto *d…

疑似Continuationモナド

HaskellのContinuationモナドを雰囲気だけGaucheに移植してみる。 Contクラス まず、疑似Continuationモナドとして、Contクラスを作る。 Contクラスが持つrunContスロットは同名のgetter関数を持つ。 returnは全然ジェネリックファンクションになってないん…

フィールドラベル

runContは関数ではなくてフィールドラベルを選択関数として使ったものだった。 Continuation モナド newtype Cont r a = Cont { runCont :: ((a -> r) -> r) } -- r は計算全体の最終の型 http://www.sampou.org/haskell/a-a-monads/html/contmonad.html new…

継続渡しスタイル

rubyの場合は継続の受け渡しにブロック構文を使うといい感じに書けるんだな。 同じく階乗の例。 def fact(n) n==0 ? yield(1) : fact(n-1){|r|yield(n*r)} end fact(4){|r|puts r}

Continuation モナド

理解するのにすごく苦労したのでメモ。 まず、定義はこんな感じ。 instance Monad (Cont r) where return a = Cont $ \k -> k a -- i.e. return a = \k -> k a (Cont c) >>= f = Cont $ \k -> c (\a -> runCont (f a) k) -- i.e. c >>= f = \k -> c (\a -> f…

鬼車 for VisualWorks

鬼車 for VisualWorks Ver.003 正規表現ライブラリ鬼車をCincom Smalltalk VisualWorks から使用するためのラッパーライブラリ。 http://d.hatena.ne.jp/kaminami/20090506/p1 これほしかった。 COMDispatchDriver経由のVBScript.RegExp利用だとwindows限定…

SheevaPlug

電源アダプタ型Linuxサーバ「SheevaPlug」 写真はちょっと大きめの電源アダプタという見た目ですが、その実はMarvell社のれっきとしたLinuxサーバ「SheevaPlug」。コンセントに直接挿しておける小型・省電力サーバで、デスクトップ型ホームサーバを置き換え…

2-NOTs problem

問題 A,B,Cの3入力, A',B',C'の3出力を持つブラックボックスがある. 入出力の関係は A'=not A B'=not B C'=not C である. ブラックボックスには, andとorは好きなだけ使われているが, notは2つしかないことが分かっている. 内部はどうなっているか. http://p…

トランポリン

gotoが使えない言語での末尾呼出し最適化はどうするのかと思っていたらこれを発見。 ベース言語が末尾呼出し最適化を保証してくれない場合によく使う手としてトランポリンがあります。 各関数を、結果を返すのではなく、その関数の継続手続きを返すように書…

JScriptでInputBox

wsh

ScriptControlを使うとできる。 var sc = new ActiveXObject("ScriptControl"); sc.Language = "VBScript"; sc.AddCode("Function f(x,y,z)\nf=InputBox(x,y,z)\nEnd Function"); WScript.Echo(sc.Run("f", "メッセージ", "タイトル", "初期値"));関数fを定…

空白の有無に応じた優先順位

中置演算子を書いたときに込めた気持ちをくむように、 つめて書いた場合は優先順位が高くなり、 空白を挟んで書いた場合は優先順位が低くなると便利そう f x + y → (f x) + yと解釈 f x+y → f (x + y)と解釈すでに考えてる人がいた。が、評判よくないのか…。…

無名関数での複数パターンマッチ

できる言語 MLでは以下のように、無名関数の定義時に|で区切って複数のケースのパターンマッチが書ける http://www.geocities.jp/m_hiroi/func/smlnj05.html fn pat1 => expr1 | pat2 => expr2 | ... | patN => exprNOCamlでは以下のように書ける http://www…