6月 27th, 2008 at 3:02am |
Windowsだとexe吐きたいんだよ!!
インストール手順メモ
MinGWとMSYSが必要になるのでいれとく
chickenはCドラ直下に入れる なぜかそうしないとダメ
export PATH=”/c/chicken/bin:/c/MinGW/bin:$PATH”とかしてパス通してあげる
msysのetc/profileの
if [ $MSYSTEM == MINGW32 ]; then
export PATH=”.:/usr/local/bin:/mingw/bin:/bin:$PATH”
else
export PATH=”.:/usr/local/bin:/bin:/mingw/bin:$PATH”
fi
の後らへんに書いとくと毎回設定しなくていいので楽
そんでcsc test.scmとかやるとtest.exeが吐かれるよ!
ついでにobjdump -p test.exeしてみたら
DLL Name: libchicken.dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
こんな感じ
eggのインスコの仕方がイマイチわからないけどとりあえずおっけーとしておくだわさ
なんかmsys.batをダブルクリックしてもMSYSが起動しなくなったんだけどなにが原因なんだか…?
Read the rest of WindowsでChicken scheme
6月 27th, 2008 at 2:47am |
実行方法
gosh life.scmとかなんか適当
Chickenではsrfi-27なくて無理やった… chicken-setup srfi-27しても途中でコケるしとりあえず保留
初めてじゃ、どうかく?おるぐに投稿してみた
PLAIN TEXT
SCHEME:
(use srfi-1)
(use srfi-27)
(define width 14) ;フィールドの幅
(define height 10) ;フィールドの高さ
(define population 0.3) ;初期人口密度
(define birth '(3)) ;隣人が何人いれば新たに生まれるか
(define keep '(2 3)) ;隣人が何人のとき生存できるか
;フィールドの要素のx座標を取得
(define element-x caar)
;フィールドの要素のy座標を取得
(define element-y cadar)
;フィールドの要素の値を取得
(define element-value cadr)
;座標の束を作る
(define xy-asix
(fold-right append '()
(let
((width (+ width 2))
(height (+ [...]
Read the rest of SchemeでLifeGame
6月 19th, 2008 at 2:43am |
call/ccについて勉強する(難しいイメージがあるが案外わかる気がするので)
現時点で知っている事。漠然としたイメージ。
・ambとか実装できる(バックトラックってかっこいい)
・そのときの実行状況を返すらしい(実行状態の保存?好きなときに再開もできるとか聞いたことがあるぞ)
・関数呼び出しと関数からのリターンを1つの対として扱おうとすると便利らしい(両方操作できる的な意味で)
(意味論がどーだか?対象性がうんたら?)
・うまく使ってあげればなんかGUIとか便利に作れそうな気がする
(ボタンを押されると欲しい結果が得られるところまで実行して継続を返す プログラム的にはループで扱えて幸せ)
(1ステップ実行して処理をコントローラに返す時とか便利そう)
・Kahuaみたいな感じで使うと幸せになれる(Sessionみたいな擬似的な処理の継続を使わず、本当の継続でWebページとかを構成できるので幸せ)
なんかコルーチン(こっちもどういうものかよくわかってない マイクロスレッド ファイバ)のイメージとすげー似てる気がする。
調べてみよう!
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/continuation.html
(define call/cc call-with-current-continuation)
call/ccは1引数関数らしい
違った 1引数関数を引数に取るらしい あ、違わない 1引数関数で、1引数関数を引数に取るらしい(ややこしい)
call/ccをコールした時点で継続が生成される
引数として渡した1引数関数に現在の継続を渡すらしい
(+ (* 1 2) (call/cc (lambda (c) (* 3 4))))
↑値に2を加える という継続が生成される
(+ 2 ?) こういうことか
で、(call/cc (lambda (c) (* 3 4)))には継続が渡されるんだと
で、先のlambda式の中で継続を呼び出していないので(* 3 4)の結果が返却され(+ 2 12)だってさ
一方
(+ (* 1 2) (call/cc (lambda (c) (* 3 (c 4)))))
だと継続を呼び出している(見た目、継続は関数として適用できるものらしい)
>関数の実行を直ちに終了して,継続への引数をcall/ccの値として,継続を実行する.
言い換えると、call/ccは1つの値を返す手続きなだけで、継続とは計算の続きのことだから要するに別の言語で言うところのreturn(計算の続きに値を渡す)と同じことだから、実行を直ちに中止して継続に渡した値でもって実行を継続してくれたほうが理にかなってるわけだ。理解できた。
継続は大域脱出に使える
大域脱出は例外処理に使える
例を見ると、次にかける数が0だったら継続に0を渡して大域脱出している。
gotoとか使ってなくてとっても安全ですね!
あと計算の回数も少なくなっていることがわかる。
次の例も理解できる。脱出したくなったらcall/ccのおかげで即脱出できている。
ここまででcall/ccがどういう挙動をするのかは理解できた。
確かにバックトラックはできそう。
別に難しいお話じゃないね、call/cc
でも、うまく使おうとするとすごく難しそう…
http://www.shido.info/lisp/scheme_amb.html
【お題】
ambっぽいものを作る
ていうか(define (hoge . huga) (〜〜〜〜))の.ってなんだっけ
可変長引数か
Rubyで言うと def hoge(*huga) 〜〜〜〜 end か
色々ぐだぐだ頑張って考えたんだけど、理解できてみるとお手本サイトの解説が非常にすっきりしてる。
failに(lambda () (cc 'no-choise))を束縛しなおす。
あ、ちょっとわかんないぞ
call/ccはどこまでを継続として生成するのやら
(set! fail (lambda [...]
Read the rest of call/cc
6月 12th, 2008 at 8:57pm |
大越冬と部屋乃掃除をしようと思いつつFEZやってしまうわけだが!
1.3.4 値として返される手続き
手続きを返す手続きを考えてみる
(define (average-damp f)
(lambda (x) (average x (f x))))
だと
((average-damp square) 10)
で、(average 10 (square 10))で55を返す
つまり、average-dampは手続きを渡すと、引数として渡した値とaverage-dampに渡した手続きが返す値の平均をとる手続きを返すということだ。
で、何が嬉しいかというと
1.1.7で作成したsqrtとここで作成するsqrtは分かりやすさがぜんぜん違うということらしい
1.1.7sqrt
PLAIN TEXT
SCHEME:
(define (good-enough? guess x)
(<(abs (- (square guess) x)) 0.001))
(define (improve guess x)
(average guess (/ x guess)))
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
[...]
Read the rest of SICPその9
6月 10th, 2008 at 9:17pm |
人類の生み出す誘惑のなんと多きことか!
またしてもFEZはじめました生きててすいません
SICPその6のトップで書いたヤツ間違ってるよ
autoじゃなくてaddだよadd
で、毎回忘れてauto? path?なんだっけ?って忘れて自分のサイトがひっかかってまた困ったりしてるよチクショー
(add-load-path "D:\\Scheme\\code")
(load "1.21.scm")
問 1.31
PLAIN TEXT
SCHEME:
(define (square x)
(* x x))
(define (sum term a next b)
(if (> a b)
0
(+ (term a)
(sum term (next a) next b))))
(define (product1 term a next b)
(if (> a b)
1
[...]
Read the rest of SICPその8
6月 9th, 2008 at 1:55am |
あのmasuidriveさんも一度は落ちたというRuby検定を土曜日に受けてきたよ!
84/100点(合格75点)でRuby検定ゲッツでした!びくとりー!
NaCl提供の想定問題集やってったけど割と似たような問題が一杯出た。
Ruby本体に引き渡すオプションとかirb周りはほとんど出なかった印象。
勉強方法的にはRubyリファレンスを読み込んでおけば十分な印象かも。
組み込みクラス的にはArray Hash Class Module Proc Range String Struct Timeあたりメインに攻めていけばだいぶフォローできる印象。
あと言語仕様的な部分。
6月入ってから勉強開始して1日3時間程度でイケた。
MethodとかUnboundMethodとかDirとかContinuationとかは勉強しなくても大丈夫っぽい感触ではあったなぁ…
とりあえず、これで会社に言い訳がたつヨ…
1月にRuby研修受けて資格取れって言われてほっといてたからね…
Read the rest of Ruby技術者認定試験