2008-02-01から1ヶ月間の記事一覧

ラムダは究極のgoto

ラムダとgotoの区別がつかなくなってきた。 #include <stdio.h> int main(void) { int i = 10; int n; int acc; loop: if (i == 0) goto end; else { #define loop_dec_cont loop #define display_cont loop_dec #define fact_cont display n = i; acc = 1; goto fact</stdio.h>…

いかんいかん

マクロだけになってきた。禁断の果実の実が甘すぎる。 ついでにメモ。 #define print(fmt, ...) printf(fmt, __VA_ARGS__) print("hello %s %s", "macro", "world!!"); __VA_ARGS__で可変長なマクロが生成できる。C99から。 define,include,undefはヤバイ。…

Schemeをつくろう(20) read-print-loop

コードリーディングを元に継続なSchemeを作っていこう。今のところ一個しか継続が無いし、evalも無い。しかし、重要なのはイメージだよ。イメージ。イマジネーションで。 typedef void *(*cont)(scheme); void *print_cont(scheme scm); void *read_cont(sch…

Schemeの古典

Mini Schemeのオリジナルは何処にあるんだろうと思って調べてたら、Scheme Repositoryなるものが!!結局Mini Schemeのオリジナルは見つかりませんでしたが、Scheme Repositoryには1990年代のSchemeの歴史が詰まってます。僕は20年遅れてるんだ・・・。

Mini Schemeのコードリーディング

Tiny Schemeのサイトに置いてあるMini Schemeを読んでます。読んでいると言うより、書き換えながら遊んでる感じ。 雑感 2400行しかないので読みやすい。 Mini Schemeからの派生版として、Tiny Scheme, AM Scheme等がある。 オリジナルのコードは1989年製。古…

Schemeをつくろう(19) GCの速度改善

GCの速度を改善してみる。改善したのは2箇所。 一度巡ったオブジェクトは巡らない ルートは違うけど、参照を共有してる ペア-+--+->数字 U | | U ペア-+ +->ペア-+->数字 N U | U +->NULL2個目のペアを巡る場合、参照先ににフラグが立っていれば、以降はフラ…

Schemeをつくろう(18) GC作ってみた。

前回作ったSchemeの欠点を克服すべく第二段を作ろうかと。まったりペースでSchemeを作ります。今回の目標は、 独自GC 末尾呼び出しの最適化 とりあえず2点を目標にしていきたいと思います。 まず ペアと、数字オブジェクトを作りました。これだけあればなん…

継続が実装できた!!

おしゃぁぁぁ!!Unlambdaの方言で継続を実装しました。クロージャとか邪魔なので、Scheme組み込みを使います。 (define ((k x) y) x) (define (((s x) y) z) ((x z) (y z))) (define (i x) x) (define (un-apply op arg) (eval `(,op ,arg))) (define (un-eva…

あっちゃ

ノートPCの上にハードカバーの本(コンパイラの構成と最適化)を落としたら、「動かなくなった」変な音が(笑)ハードディスクが逝ったっぽい。すげーやばい感じ。なんか1年前にもこんな事があった気がする(笑)いい機会だし、買い換えるかな・・・ しばらく…

継続の実装は

Unlambdaのソースを読め。うは。その手があったか!!SKK!!SKK!! 以下激しく読みずらい作業メモ。後でまとめます。 コード読み やっぱり、C版をちょっと読む。 906行。僕のschemeよりも長いかも(笑 GNU式に書かれてるので、ちと読みずらい。 なので、mainから…

多値メモ

多値のメモ。 とりあえずMzSchemeのデフォルトで使えるのが、 (call-with-values (lambda () (values 2 3)) (lambda (a b) (list a b))) valuesで多値を投げて、lambdaで受け取る。 SRFI-8で定義されてるレシーバマクロを使うと、ちょっと短く書ける。 (requ…

SICPを読む(88) 問題 2.77-2.80 汎用演算システム

汎用演算システムに入ります。パッケージの定義が単調過ぎてあんまり面白みが無い。 問題 2.77 '(complex rectanglar 3 . 4)に対して、 (magnitude z)を評価したら、ダメだった。complexパッケージに、アクセサの手続きを加えたら、うまく動いた。何故か? ap…

なんか違う気がする

なんか全然違う気がするけど、遅延評価してみた。正解では無い気がする。 (define (forever) (forever)) (define (true x y) (lambda () (x))) (define (false x y) (lambda () (y))) (define (if b x y) (lambda () (((b) (lambda () (x)) (lambda () (y)))…

コンビネータメモ

メモメモ。 Z Yをη変換するとZ Y f = f (Y f) Z f = f (λy.Z f y)η変換ってなんだかよくわからんけど、λを一個追加(削除?)することらしい。とりあえずη変換してみよう。 (lambda (x) x) ; ↓ η変換 (lambda (y) ((lambda (x) x) y)) 一回lambdaで囲んでも意味…

Hello, Forth World!!

はい。今日も新たな言語に挑戦してみます。前回は、s kだけで全部出来ちゃうよ〜という純粋関数型言語Unlambdaでしたが、今回はもうちょっと高級に攻めてみたいと思います。今日の言語はForth。噂によると相当早い言語らしい。なんか聞いたことがあったけど…

Hello,Unlambda world!!

Hello,Unlambda world!! `r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i Hello,Unlambda world!!うっは。2行表示してみよう。 ``r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i `r`````````````````````.H.e.l.l…

部分適用

引数が足りてないオブジェクトを作ることが出来る。キモい。 inc :: Int -> Int inc = (1 +) (1 + ) 何かえぇぇぇ。分解すると、 add :: Int -> Int -> Int -> Int add x y z = x + y + z ans = ((((add) 1) 2) 3) addオブジェクトを作って、(1 +) オブジェ…

Vimからhrefを見る

さっくりと設定っと。 command! -nargs=1 Href !href <args> | nkf -w nmap <buffer> K :Href <cword><CR> とりあえずオッケー。</cr></cword></buffer></args>

ふつける(3) - 3章(2) map

3章後半はmapっす。 car,cdrを作ってみる car,cdrが無いと思ったら、ナンダコレ!! car :: [a] -> a car (x:xs) = x cdr :: [a] -> [a] cdr (x:xs) = xs 引数が分解出来ちゃうらしい。不思議な世界だ。 map それがわかれば、mapは簡単で、 my_map :: (a -> b)…

ふつける(2) - 3章(1) 型の練習

全然ふつける読んでなかった!!文法すら忘れてた状態だったので、1章から読み直してた。やっと3章デス。型ってムズカシイ!! 型の練習 3章のtranslateを改造して型の練習です。+は1足す。-は1引く。という言語。 input :: String input = "+++++++++----++--++…

不動点オペレータ

どうやら、Yコンビネータという名前はあんまり一般的な名前ではなく、不動点コンビネータやら、不動点オペレータというのが一般的な名前らしい。鉄は熱いうちに打てって言葉があるので、勢いで行く事にする。英語だけど、Fixed point combinator - Wikipedia…

はじめの一歩

「はじめの一歩」という奴は、 (Y はじめの一歩) と表すことが出来る。つまり、 (Y はじめの一歩) = (はじめの一歩 (Y はじめの一歩)) である。切っても切っても「はじめの一歩」が出てくる。 しかし、はじめの一歩を踏み出さなければ、次の一歩はない。 ト…

Yコンビネータを読み解こう

Y コンビネータって何? - IT戦記で話題になってるYコンビネータがイマイチわからない。良記事発見したので、Y CombinatorのYコンビネータを読み解いて行きたいと思います。英語版も必見デス。 相当長いです。 Yコンビネータとはナニモノ!? そういや、再帰っ…

うは。スゲー降ってるし。

ifの再定義

PHP で Yコンビネータ booleanとif文も全部関数だけで実現できちゃった。 やってみた。 gosh> (define (true x y) x) true gosh> (define (false x y) y) false gosh> (define (if f x y) (f x y)) if gosh> (if true 1 2) 1 gosh> (if false 1 2) 2ホントダ…