<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/ME2.0.11" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>だめな子</title>
	<link>http://www.thrudr.net/blog</link>
	<description>だめな子ですが頑張って成長してゆくのです。</description>
	<pubDate>Tue, 30 Sep 2008 15:34:44 +0900</pubDate>
	<generator>http://wordpress.xwd.jp/?v=ME2.0.11</generator>
	<language>ja</language>
			<item>
		<title>ypsilonをMacPortsで入れたい</title>
		<link>http://www.thrudr.net/blog/archives/54</link>
		<comments>http://www.thrudr.net/blog/archives/54#comments</comments>
		<pubDate>Wed, 01 Oct 2008 00:34:44 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>電脳雑記</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/54</guid>
		<description><![CDATA[と思ったけどypsilonなかった...
自分でmakeすればインストールできるけど、まだあまりUnix文化に馴染んでないし(変なことしたら自力で元に戻せなさそう)他のものはMacPortsが面倒みて...]]></description>
			<content:encoded><![CDATA[と思ったけどypsilonなかった...
自分でmakeすればインストールできるけど、まだあまりUnix文化に馴染んでないし(変なことしたら自力で元に戻せなさそう)他のものはMacPortsが面倒みてくれてるからなるべく同じようにやりたい...

で、作ってみたらなんかできた [1]
port destroot ypsilonしただけでなんか変なとこにインストールされちゃったりなんだりで結構苦労したけど頑張ったらなんとかなった(気がする)
試行1回に案外時間がかかるのが大変 間違いが含まれてそうで怖いな
あとデフォルトのヒープサイズを指定できるっぽいけど、variantsで port install ypsilon +heap_size 64 みたくできんのかな デフォルトのままで一向に困らないからいいんだけど...
手で頑張って作るのめんどいから、自前でPortfileかかないで普通にportで取ってこれるようになんないかなぁ

あと、手書きなのかどうなのかわからないけどMakefileが綺麗で慣れてないうちでもさるっっと読めた

参考サイト
MacPortsWikiJP HowTo/PrivatePortfileTutorial [2]
Mac Ports 勉強会資料 [3]


また別のお話で、moshがなんかうまくコンパイルできないぽい
以下のコードがgaucheとypsilonだと動くけどmoshだと動かない
[scheme]
(define-syntax test
  (syntax-rules (in out)
    ((_ in s) 
     (begin
       (display "< -")
       (display s)
       (newline)))
    ((_ out s)
     (begin
       (display "->")
       (display s)
       (newline)))))

(test out "hoge")
(test in "fuga")
[/scheme]

あれー？
makeでもこけてなさそうだしmake testもちゃんと通ってそうに見えるよ...

[1] http://lapangan.net/darwinports/index.php?PrivatePortfile%2Fypsilon
[2] http://lapangan.net/darwinports/index.php?HowTo%2FPrivatePortfileTutorial
[3] http://www.scribd.com/doc/2674173/MacPorts]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/54/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Schemeで非決定性探索 深さ優先探索と幅優先探索</title>
		<link>http://www.thrudr.net/blog/archives/53</link>
		<comments>http://www.thrudr.net/blog/archives/53#comments</comments>
		<pubDate>Mon, 29 Sep 2008 22:08:02 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>Scheme</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/53</guid>
		<description><![CDATA[MacBook Air買いました！(挨拶
で、LLFutureんとき買ったOn Lispをがんばってしこしこ読んだらマクロのありがたさが少しわかったような
　　↓
でもSchemeってtraditio...]]></description>
			<content:encoded><![CDATA[MacBook Air買いました！(挨拶

で、LLFutureんとき買ったOn Lispをがんばってしこしこ読んだらマクロのありがたさが少しわかったような
　　↓
でもSchemeってtraditional macroないんだよね... aifもかけやしねぇ
　　↓
syntax-caseで外の環境の変数とか補足できるよ！aifかけるよ！これは勝つる！！
　　↓
...あれ、使い方全然わかんない...←今ここ

それはそれとして、On Lispに乗ってる幅優先探索ってなんか思った通りの動作をしてくれない気がするんだけど...
見つかる解は浅いところのがちゃんと見つかるっぽいんだけど検索順路が深さ優先探索と同じ順序で探索していくのがなんかこー微妙な気持ち
どうすればいいんだ！！

深さ優先探索
[scheme]
;;depth first search
(define depth-fail #f)
(define (depth-choose . args)
  (if (null? args)
      (depth-fail)
      (let ((fail0 depth-fail))
	(call/cc
	 (lambda (cc)
	   (set! depth-fail
		 (lambda ()
		   (set! depth-fail fail0)
		   (cc (apply depth-choose (cdr args)))))
	   (cc (car args)))))))

(call/cc
 (lambda (cc)
   (set! depth-fail
	 (lambda ()
	   (cc 'fail)))))
[/scheme]

幅優先探索
[scheme]
;;width first search
(define width-fail #f)
(define *search-path* '())
(define (width-choose . args)
  (call/cc
   (lambda (cc)
     (set! *search-path*
	   (append *search-path*
		   (map
		    (lambda (arg)
		      (lambda () (cc arg)))
		    args)))
     (width-fail))))

(call/cc
 (lambda (cc)
   (set! width-fail
	 (lambda ()
	   (if (null? *search-path*)
	       (cc 'fail)
	       (let ((path (car *search-path*)))
		 (set! *search-path* (cdr *search-path*))
		 (path)))))))
[/scheme]

で
[scheme]
;;sample code
(define choose width-choose)
(define-syntax fail
  (syntax-rules ()
    ((_) (width-fail))))
;(define choose depth-choose)
;(define-syntax fail
;  (syntax-rules ()
;    ((_) (depth-fail))))

(let* ((a (choose 1 2 3 4 5 6))
       (b (choose 1 2 3 4 5 6))
       (c (choose 1 2 3 4 5 6)))
  (if (and (odd? a) (even? b) (odd? c))
      (print a " " b " " c)
      (fail))
  (fail))
[/scheme]
途中(define fail depth-fail)とかやっててあれー？動かないなーとかむーむーうなってたのは内緒(しかも結構長時間]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/53/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JRuby触ってみた！</title>
		<link>http://www.thrudr.net/blog/archives/52</link>
		<comments>http://www.thrudr.net/blog/archives/52#comments</comments>
		<pubDate>Thu, 04 Sep 2008 00:21:04 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>Ruby</category>

		<category>Java</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/52</guid>
		<description><![CDATA[ほんとに触っただけすぎてどうしようもないけどね
とりあえず普通にjrubyとかjirbでRubyと同じように遊べる
更には普通にJavaのクラスとか使えるし呼べるしすげー！って感じ
仕事でこっそり使っ...]]></description>
			<content:encoded><![CDATA[ほんとに触っただけすぎてどうしようもないけどね

とりあえず普通にjrubyとかjirbでRubyと同じように遊べる
更には普通にJavaのクラスとか使えるし呼べるしすげー！って感じ
仕事でこっそり使ってもバレないんじゃないかコレ…

で、WindowsではjrubycがないのでRubyコードからバイトコードが作れない…
でもjrubycっていうファイルは%JRUBY_HOME%\binにあるので中身見てみるとなんかソレっぽいソースになってたので

@echo off
jruby -e "require 'jruby/jrubyc'; JRubyCompiler::compile_argv(ARGV)" %1 %2 %3 %4

こんなようなjrubyc.bat作っておけばOKな気がした
で
jrubyc hello.rb
set CLASSPATH=.
java -cp "%JRUBY_HOME%/lib/jruby.jar;%CLASSPATH%" hello
とかやっちゃうと
"Hello world!"
っとなりましたとさ

なんか普通にMechanizeとかもgemって使えるらしいしこれは夢がひろがりんぐかもわからんね！]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/52/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google Chrome</title>
		<link>http://www.thrudr.net/blog/archives/51</link>
		<comments>http://www.thrudr.net/blog/archives/51#comments</comments>
		<pubDate>Wed, 03 Sep 2008 23:50:58 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>電脳雑記</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/51</guid>
		<description><![CDATA[なんか朝いきなり現れた謎のブラウザ
しかもGoogle謹製ですよ！
とりあえずインスコして色々つつきまわしてみたけど、デザイン的にはとてもスラリとしていてかっこいいなー
ただ、タブが多段にならないのか...]]></description>
			<content:encoded><![CDATA[なんか朝いきなり現れた謎のブラウザ
しかもGoogle謹製ですよ！

とりあえずインスコして色々つつきまわしてみたけど、デザイン的にはとてもスラリとしていてかっこいいなー
ただ、タブが多段にならないのかなーとかFirefoxのあの拡張と同じような機能がほしいなーとかブックマーク周りがなんか貧弱だなーって感じ
それに、例えばブックマークのフォルダの中身全部開くときに、右クリックからのメニューでやらんと全部一気にゃひらけんよーみたいなバッドノウハウっていうと変だけど、普通気がつかないような操作方法がちらほらありそうで気に食わない！

その他
http://jp.techcrunch.com/archives/20080902google-officially-announces-chrome/ ユーザ側でプラグインを作ることは今のところ不可能らしい
TEXTAREAが手動でリサイズできて便利
TiddlyWikiとかGTDWikiみたいなローカルにファイル保存する系のJavaScriptがうまく動かない…？
Omnibox(アドレスバー)でAlt押しつつEnterで新しいタブで開けるなぁ
描画エンジンはWebkitでJavaScriptのエンジンがV8とかゆーGoogle独自のモノらしい WebkitならClient-side database storageもイケる？と思ったけどまぁJavaScriptエンジンが別なら使えないよね…
ていうかGoogle Gearsがデフォルトで入ってるからそっち使えばいいじゃんな感じ

一番注目すべきなのはたぶん｢Webアプリとして保存｣機能なのかなぁ？
Webブラウザがプラットフォームと化してきて、そーするとGoogle Chromeみたいな発想の新しいブラウザが出てくるのも納得だ
LLFutureでいってたLLVMバイトコードをABCに変換するだとかなんだとか、みんなが日常使うアプリケーションがWebアプリとして作られる日も近いのかしら
そしたら、EeePCみたいなマシンで一般人はホントに十分だよなー]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/51/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lightweight Language Futureいってきたよ！！</title>
		<link>http://www.thrudr.net/blog/archives/50</link>
		<comments>http://www.thrudr.net/blog/archives/50#comments</comments>
		<pubDate>Sun, 31 Aug 2008 18:03:28 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>ぷろぐらむ</category>

		<category>電脳雑記</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/50</guid>
		<description><![CDATA[
たいへん楽しかった！
基調講演
PerlのLarryWallさんが来日して講演
通訳つくんだろとか思ってたら1時間ずっと英語
何いってるか1割くらいしかわかんなかった
LLで未来を発明する
話のワク...]]></description>
			<content:encoded><![CDATA[ [1]

たいへん楽しかった！

基調講演
PerlのLarryWallさんが来日して講演
通訳つくんだろとか思ってたら1時間ずっと英語
何いってるか1割くらいしかわかんなかった

LLで未来を発明する
話のワクが広すぎてネタが色々な方向にとんでって面白かった
Ypsilonの中の人がエラーメッセージが幸せだと幸せ！みたいなこと言っててそーだよねーと思った
俺が書いたブツは俺が使えればいいやすぎてエラーメッセージが超ないがしろなので自省しるということかっ
あと78年後には大統一理論が打ち立てられて｢なんだ、やっぱLispに収束したじゃん｣ってなるに違いない！ってひげぽんさんが言ってた！
最後に質問の人が｢【セキュリティ】という単語がこのセッション中に1回も出なくて絶望したっ！！｣って言ってたけど、そんなもんフレームワークとかで担保すればいいんじゃないの？と思う派の俺。言語が使いやすくて触ってて幸せになれるんなら、あとは他の人がそれをWrapすればいいじゃんみたいな。
言語としてセキュリティが保障されていることが重要なのかなぁ…。

サイコー！？フレームワーク
Seasarの中の人がアウェーな雰囲気すぎて笑った
Javaは書いててめんどくささがものすごいのが嫌いだ！
何であんなにめんどくさい印象になってるのか我ながら謎だけど
Gauche on Railsの吉田さんが｢いや、Gauche on Railsっていらなくね？DSL作りやすいからそれぞれ用のフレームワーク勝手に作れば十分っしょ｣みたいな趣旨のことを言ってたように思う(で、そういうもんなのか、っと思った)
あと、RoRは更新早すぎて一般人にはついていけないくて暗黒面に踏み込んだシスの人々しか使いこなせないんだって！
なんつー恐ろしいモノなんだ…

吉田さんは9/13にGauche/Kahuaセミナー [2]もやるらしい
行ってみたいな でもレベル的に(俺が)下すぎて参加するとヤバい気もする どーしょー…

LLでアート
増田さんのAction Codingは見た目すげーカッコよかったし簡単そうに見えた
あーゆーカッコいいスクリーンセーバーとか壁紙とか欲しいなー
Proce55ingとゆーJava製の割とこわい(硬い)ものをJRubyでさっくり包んであげて色々工夫して触りやすくしました！みたいな物体だと判断
そういうアプローチもあるのかー みたいな JRubyやらJythonやらは会社でこっそり使ってもばれなさそうでいいですね！(バレるし

そして後半ぶっちゃけ落ちてた(ｻｰｾﾝ

キミならどう書く！？
shinhさんが見てみたかったのでとりあえず満足
最後のHole 8のshinhさんの解説と回答が変態すぎて困った
色々みたセッションの中でかなり上位に入る笑えるっぷりだったー
最後に出てた質問の答えの
｢ループの中で今何週目〜みたいなのが取れる組み込み変数が一番欲しい｣っていうのはよかったなー デバッグのとき便利そう…

古い言語、新しい言語
あろはさんはどこからでもETに持ってく人だと思ってましたがETのEの字も出ませんでした。なんたることでしょう。
要約すると｢JavaScript上で色々な言語処理系作ってみたよ！｣と、｢LLVMのバイトコードをABC [3]に変換してブラウザ上でなんでも動かせばいいじゃん！｣みたいな話だった
JavaScriptやらActionScriptってそんなに頑張れるの？どうなの？みたいなっ
ハッカーと画家(LLF会場で買ってまだあんまし読んでないけど)で書いてたみたく、そーなると一般ユーザはホント難しいこと考えないでブラウザだけあれば十分になると便利そうだよねぇ

ライトニング・トーク
面白かったものを抽出して…
Client-side database storageで実際にアプリケーションを作成してみた
めちゃめちゃ面白かった
クライアントサイドにSQLite仕込んで超Cookie！みたいなっ！でもドメイン単位でユニークなので超劣化クッキー！みたいなっ！
テンポラリビュー作りまくって作業できるしやりたい放題できてサイコーｗｗｗ使ってるの俺だけｗｗｗｗ状態らしい
ちょっと調べてみたけど、HTML5の仕様に盛り込まれている新機能なのか
Safari3.1ではもう使えるらし Firefoxはどうなのかしら…
なんかこれで面白そうなネタ作れないかなー
ドメイン内でDB共有状態！なのを逆手にとった遊びとかも出来る気もするよなー

私は如何にしてNarioを作り、一面をクリアしたか
Grepして置換！Grepして置換！の壁紙が欲しくなった！

「Pit」で救う世界
なんつーか純粋に便利そう
IDやらパスワードやらを一元管理しましょう そうすると500年が節約できます！(適当すぎ
みたいなっ

UnBabel LLにLLを埋め込んでみた
大富豪的プログラミングｗｗｗどんだけｗｗｗｗ
しかし、問題に適した言語をその都度選択するのは頭いいな
IOをRubyで書いてロジック部分をBrainF*ckで記述する！みたいな夢のような業務アプリがっ！すげーｗｗｗ

Ruby on Railsで実現する自走式Webサーバー
なんという馬力(色々な意味で
これは会場でデモするべきだった！
大好き

ちょっと草植えときますね型言語Grass
存在は知ってたけどどんだけだしｗＷＷｗｗｗｗＷＷｗｗ
つーか読んでも文法わかんねぇ…

思い出しつつ書いてみるとあんまり理解できてなかったらしいことに気がついてちょっと泣きたくなった
えと演者の6〜7割がMacでﾋﾞﾋﾞﾀ X61買ってUbuntuかなぁとか思ってたけど頑張ってMac買おうかなぁ あのインターフェースは一度は常用してみたい！
来年もあったらまたいく！！

[1] http://ll.jus.or.jp/2008/
[2] http://www.timedia.co.jp/news/press/3545906324
[3] http://d.hatena.ne.jp/keyword/ActionScript%20Byte%20Code]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/50/feed/</wfw:commentRss>
		</item>
		<item>
		<title>LL Futureチケット買いました</title>
		<link>http://www.thrudr.net/blog/archives/48</link>
		<comments>http://www.thrudr.net/blog/archives/48#comments</comments>
		<pubDate>Tue, 29 Jul 2008 01:45:18 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>電脳雑記</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/48</guid>
		<description><![CDATA[こーゆーイベントって行ったことないから楽しみだー
すみっこでわくわくしながら帰ってこようと思います！
お友達ほしい！けど知らない人こわい！ｷｬｰｷｬｰ

]]></description>
			<content:encoded><![CDATA[こーゆーイベントって行ったことないから楽しみだー
すみっこでわくわくしながら帰ってこようと思います！
お友達ほしい！けど知らない人こわい！ｷｬｰｷｬｰ]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/48/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SchemeでLifeGame v3</title>
		<link>http://www.thrudr.net/blog/archives/47</link>
		<comments>http://www.thrudr.net/blog/archives/47#comments</comments>
		<pubDate>Mon, 07 Jul 2008 23:15:38 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>Scheme</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/47</guid>
		<description><![CDATA[PLAIN TEXT
SCHEME:




&#40;use srfi-1&#41;


&#40;use srfi-27&#41;


&#160;


&#40;define width 14&...]]></description>
			<content:encoded><![CDATA[[scheme]
(use srfi-1)
(use srfi-27)

(define width 14)
(define height 10)

(define population 0.3)

(define birth '(3))
(define keep '(2 3))

(define element-x car)
(define element-y cadr)
(define element-value caddr)
(define (make-element x y v) (list x y v))

(define (make-field)
	(define (flatten x) (fold-right append '() x))
	(map
		(lambda (e) (make-element (car e) (cadr e) #f))
		(zip
			(apply circular-list (iota width 0))
			(flatten
				(map
					(lambda (x) (iota width x 0))
					(iota height 0))))))

(define (randomize-field field)
	(random-source-randomize! default-random-source)
	(map
		(lambda (e) 
			(if (< (random-real) population)
				(make-element (element-x e) (element-y e) #t)
				(make-element (element-x e) (element-y e) #f)))
		field))

(define (print-field field)
	(define (print-cell e)
		(if	(element-value e)
			(display "[*]")
			(display "[ ]")))
	(let loop ((left field))
		(if	(not (null? left))
			(begin
				(print-cell (car left))
				(if	(= (element-x (car left)) (- width 1))
					(newline))
				(loop (cdr left))))))

(define (game-next field)
	(define (count field) (length (filter (lambda (e) (element-value e)) field)))
	(define (get-neighbors x y)
		(let
			((x-1 (remainder (+ x width -1) width))
			 (x+1 (remainder (+ x width +1) width))
			 (y-1 (remainder (+ y height -1) height))
			 (y+1 (remainder (+ y height +1) height)))
			(filter
				(lambda (e)
					(let
						((cx	(element-x e))
						 (cy	(element-y e)))
						(or
							(and (= x-1 cx) (= y-1 cy)) (and (= x   cx) (= y-1 cy)) (and (= x+1 cx) (= y-1 cy))
							(and (= x-1 cx) (= y   cy))                             (and (= x+1 cx) (= y   cy))
							(and (= x-1 cx) (= y+1 cy)) (and (= x   cx) (= y+1 cy)) (and (= x+1 cx) (= y+1 cy)))))
				field)))
	(define (next-state e)
		(define neighbors (count (get-neighbors (element-x e) (element-y e))))
		(define live? element-value)
		(define (live->next)
			(if (fold (lambda (x y) (or x y)) #f (map (cut = neighbors ) keep))
				e
				(make-element (element-x e) (element-y e) #f)))
		(define (dead->next)
			(if (fold (lambda (x y) (or x y)) #f (map (cut = neighbors ) birth))
				(make-element (element-x e) (element-y e) #t)
				e))
		(if	(live? e)
			(live->next)
			(dead->next)))
	(map
		next-state
		field))

(define (play)
	(define (field-chain field)
		(cons
			field
			(delay (field-chain (game-next field)))))
	(define field-list (field-chain (randomize-field (make-field))))
	(define count ((lambda ()
		(define counter 0)
		(define (inc)
			(set! counter (+ counter 1))
			counter)
		inc)))
	(define (iter)
		(display (count))
		(newline)
		(print-field (car field-list))
		(display "if you want to exit. press e.")
		(newline)
		(if (char=? #\e (read-char)) (exit 0))
		(set! field-list (force (cdr field-list)))
		(iter))
	(iter))

(play)
[/scheme]
・CPSっぽいやり方じゃなくなった
・無限ストリームっぽいものになった
play内部のcountの作り方に1〜2分悩んだ(おばか
[scheme]
(define (play)
	(define (field-chain field)
		(cons
			field
			(delay (field-chain (game-next field)))))
	(define field-list (field-chain (randomize-field (make-field))))
	(define (iter count)
		(display count)
		(newline)
		(print-field (car field-list))
		(display "if you want to exit. press e.")
		(newline)
		(if (char=? #\e (read-char)) (exit 0))
		(set! field-list (force (cdr field-list)))
		(iter (+ count 1)))
	(iter 1))
[/scheme]
playの定義はこっちのが綺麗ですよねーってなるよねぇ…]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/47/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SchemeでLifeGame v2</title>
		<link>http://www.thrudr.net/blog/archives/46</link>
		<comments>http://www.thrudr.net/blog/archives/46#comments</comments>
		<pubDate>Thu, 03 Jul 2008 22:05:31 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>Scheme</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/46</guid>
		<description><![CDATA[他の人の投稿も見てみた結果こうなった
PLAIN TEXT
SCHEME:




&#40;use srfi-1&#41;


&#40;use srfi-27&#41;


&#160;


&#...]]></description>
			<content:encoded><![CDATA[他の人の投稿も見てみた結果こうなった
[scheme]
(use srfi-1)
(use srfi-27)

(define width 14)
(define height 10)

(define population 0.3)

(define birth '(3))
(define keep '(2 3))

(define element-x car)
(define element-y cadr)
(define element-value caddr)
(define (make-element x y v) (list x y v))

(define (step-exec value next proc)
	(define (iter value cc)
		(cc value
			(lambda () (iter (next value) cc))))
	(lambda () 
		(iter
			value
			(lambda (value cc) (proc value) cc))))

(define (make-field)
	(define (flatten x) (fold-right append '() x))
	(map
		(lambda (e) (make-element (car e) (cadr e) #f))
		(zip
			(apply circular-list (iota width 0))
			(flatten
				(map
					(lambda (x) (iota width x 0))
					(iota height 0))))))

(define (print-field field)
	(define (print-cell e)
		(if	(element-value e)
			(display "[*]")
			(display "[ ]")))
	(let loop ((left field))
		(if	(not (null? left))
			(begin
				(print-cell (car left))
				(if	(= (element-x (car left)) (- width 1))
					(newline))
				(loop (cdr left))))))

(define (randomize-field field)
	(random-source-randomize! default-random-source)
	(map
		(lambda (e) 
			(if (< (random-real) population)
				(make-element (element-x e) (element-y e) #t)
				(make-element (element-x e) (element-y e) #f)))
		field))

(define (count field)
	(length (filter (lambda (e) (element-value e)) field)))

(define (game-next field)
	(define (get-neighbors x y)
		(let
			((x-1 (remainder (+ x width -1) width))
			 (x+1 (remainder (+ x width +1) width))
			 (y-1 (remainder (+ y height -1) height))
			 (y+1 (remainder (+ y height +1) height)))
			(filter
				(lambda (e)
					(let
						((cx	(element-x e))
						 (cy	(element-y e)))
						(or
							(and (= x-1 cx) (= y-1 cy)) (and (= x   cx) (= y-1 cy)) (and (= x+1 cx) (= y-1 cy))
							(and (= x-1 cx) (= y   cy))                             (and (= x+1 cx) (= y   cy))
							(and (= x-1 cx) (= y+1 cy)) (and (= x   cx) (= y+1 cy)) (and (= x+1 cx) (= y+1 cy)))))
				field)))
	(define (next-state e)
		(define neighbors (count (get-neighbors (element-x e) (element-y e))))
		(define live? element-value)
		(define (live->next)
			(if (fold (lambda (x y) (or x y)) #f (map (cut = neighbors ) keep))
				e
				(make-element (element-x e) (element-y e) #f)))
		(define (dead->next)
			(if (fold (lambda (x y) (or x y)) #f (map (cut = neighbors ) birth))
				(make-element (element-x e) (element-y e) #t)
				e))
		(if	(live? e)
			(live->next)
			(dead->next)))
	(map
		next-state
		field))

(define next
	(step-exec
		(randomize-field (make-field))
		game-next
		(lambda (e) (print-field e))))

(let loop
	((c (read-char))
	 (count 1))
	(if	(char=? #\e c)
		(exit 0)
		(begin
			(display count)
			(newline)
			(set! next (next))
			(display "next -> any keys.")
			(newline)
			(display "exit -> press e.")
			(newline)
			(loop (read-char) (+ count 1)))))
[/scheme]

・のりしろがなくなった
・make-element やら element-* を使ってればセルの表現を気にしないでよくなった(相変わらず全体はセルのリストだ

毎回get-neighborsしてるのはバカらしい気もするけどまぁいいや]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/46/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WindowsでChicken scheme</title>
		<link>http://www.thrudr.net/blog/archives/45</link>
		<comments>http://www.thrudr.net/blog/archives/45#comments</comments>
		<pubDate>Fri, 27 Jun 2008 03:02:55 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>Scheme</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/45</guid>
		<description><![CDATA[Windowsだとexe吐きたいんだよ！！
インストール手順メモ
MinGWとMSYSが必要になるのでいれとく
chickenはCドラ直下に入れる なぜかそうしないとダメ
export PATH="/...]]></description>
			<content:encoded><![CDATA[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が起動しなくなったんだけどなにが原因なんだか…？]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/45/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SchemeでLifeGame</title>
		<link>http://www.thrudr.net/blog/archives/44</link>
		<comments>http://www.thrudr.net/blog/archives/44#comments</comments>
		<pubDate>Fri, 27 Jun 2008 02:47:37 +0900</pubDate>
		<dc:creator>vvakame</dc:creator>
		
		<category>Scheme</category>

		<guid isPermaLink="false">http://www.thrudr.net/blog/archives/44</guid>
		<description><![CDATA[実行方法
gosh life.scmとかなんか適当
Chickenではsrfi-27なくて無理やった… chicken-setup srfi-27しても途中でコケるしとりあえず保留
初めてじゃ、どうか...]]></description>
			<content:encoded><![CDATA[実行方法
gosh life.scmとかなんか適当
Chickenではsrfi-27なくて無理やった… chicken-setup srfi-27しても途中でコケるしとりあえず保留

初めてじゃ、どうかく？おるぐ [1]に投稿してみた [2]

[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 (+ height 2)))
			(map
				(lambda (x)
					(zip
						(iota width 0)
						(make-list width x)))
				(iota height 0)))))

;見える範囲の座標の束を作る
(define visible-xy-asix
	(filter
		(lambda (e)
			(let
				((x (car e))
				 (y (cadr e)))
				(and (< 0 x) (next)))
	(define (calc-next)
		(map
			(lambda (e)
				(if	(find (cut equal? (car e) ) visible-xy-asix)
					(next-state e)
					e))
			field))
	(copy-overlap-field (calc-next)))

;準備
(define next
	(step-exec
		(copy-overlap-field (randomize-field (make-field)))
		game-next
		(lambda (e) (print-field e))))

;実行
(let loop
	((c (read-char))
	 (count 1))
	(if	(char=? #\e c)
		(exit 0)
		(begin
			(display count)
			(newline)
			(set! next (next))
			(newline)
			(loop (read-char) (+ count 1)))))
[/scheme]

[1] http://ja.doukaku.org/
[2] http://ja.doukaku.org/comment/6597/]]></content:encoded>
			<wfw:commentRss>http://www.thrudr.net/blog/archives/44/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
