俺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…

モジュール関連

gosh> (current-module) #<module user> gosh> (module-precedence-list (current-module)) (#<module user> #<module gauche.gf> #<module gauche> #<module scheme> #<module null>) Builtin Module: null このモジュールはR5RSで述べられている"null environment"に相当します。 R5RSの構文要素への束縛だけを含んだモジュールです。 Builtin Modul</module></module></module></module></module></module>…

quickrun.vim

vim

バッファ上のソースコードを実行 - MEMO:はてな支店 今後の課題 実行結果を分割ウインドウに出せるといいなあ http://d.hatena.ne.jp/katona/20070723/1185200165 と書いたままほったらかしにしている間に、この課題を解決+αしているものを発見。 Vim-users…

コロン

「:」をdefineしようとすると以下のエラーになる gosh> (define : cons) *** ERROR: Compile Error: syntax-error: (define : cons)R5RSには以下のように書いてある。 拡張アルファベット文字は、識別子の中で文字のように使用することができる。拡張アルフ…

QiII

Haskellの型推論が邪魔だった俺にはこれいいかも。 2. Lisp じゃなくて Qi で書く事の利点は何? * Qi II は CAR / CDR を強制しない。かわりに、パターンマッチを使う事ができる。典型的な Qi プログラムは Lisp プログラムと比較して非空白文字が40%程度に…

数式パーサその2

中置演算子とHaskell風の関数呼び出しをパースする処理をSchemeで書いてみた。 例えば以下のサンプルを実行すると11と6を表示する。 ( ~ a = 2 ~ b = a + 1 ~ print (a + b * 3) ~ fact n = n == 0 and 1 or n * fact (n - 1) ~ print (fact b) )実際には、…

キーワードメッセージを括弧付きに

SmallTalk R4.1のつくりかた。ロングバージョン キーワードメッセージを括弧付きに、というネタも '12345' copyReplaceAll: '123' with: 'ABC' '12345' copyReplaceAll('123', 'ABC') http://www.smalltalk-users.jp/Home/gao-zhi/dai8kaismalltalkbenkyouka…

引数名と同じスロットを用意するコンストラクタ

関数の引数名と同じスロットを挿入するinitメソッドを作ってみた。 Function.prototype.init = function(obj,arg){ var slot = this.toString().match(/\(([^)]*)/)[1].split(/, /); for(var i=0;i

Britain's Got Talent

スーザン・ボイル - Wikipedia 2009年4月11日、イギリスのオーディション番組「Britains Got Talent」第3シーズンの初回に出場 この番組の模様がYouTubeなどの動画配信サイトに転載されると、1週間で4300万回を超える視聴回数を記録し、海外からも注目された…

Functionコンストラクタの遅さ

関数式と関数宣言で定義された関数は一度しか解析されませんが、Function コンストラクタで定義された関数はそうではありません。 つまり、Function コンストラクタに渡された関数本体を表す文字列が、評価されるたびに必ず解析されます。 関数式は毎回クロ…