と言ってもブログの引っ越しです。いっかいWordpressを触ってみたかったので自鯖に立てて、しばらく運用してみたのですが満足したので、はてなに移ります。
http://d.hatena.ne.jp/gabuchan/
id:gabuchan が取れたのが、すごく嬉しいので、はてな大好きになりました。
と言ってもブログの引っ越しです。いっかいWordpressを触ってみたかったので自鯖に立てて、しばらく運用してみたのですが満足したので、はてなに移ります。
http://d.hatena.ne.jp/gabuchan/
id:gabuchan が取れたのが、すごく嬉しいので、はてな大好きになりました。
「コンパイラを作ろう」第3回にして初エントリーを書くとか、相当ブログばなれが進んでいるなぁと反省。
どうでもいいけど、Wordpressのビジュアルモードが激しくウザいので、はてダに乗り換えたいと考え中。
ってことで、知らない人のためにも書くと先月から、CSNAGOYAの「コンパイラを作ろう」という勉強会に参加しています。冨沢高明さんの「コンパイラ入門」という最高の参考書をもとに全員が好きな言語でコンパイラを作るという勉強会です。参考書がPascalのコンパイラを作るため僕らもPascalの構文を解析することになりました。
好きな言語でコンパイラを作る。ということで、かなり悩んだあげくSICPを読むためにSchemeを覚えたいなぁと思い、GaucheでPascalのコンパイラを作ることに。この組み合わせが何とも言えません。
ちなみに、どこまで勉強会が進んでいるかというと
さて、前置きが長くなりましたが今日までの宿題になっていた、字句解析部分の実装を晒すことになっているんですが、Gauche を合計1週間も勉強していない人間が作ったソースコードだと思って読んでください。(言い訳)
main も、用意していないので lexer 関数に string を渡すと、それをTokenに分解して print する所までしか出来ていません。(print は本質的には必要ないんですがデバッグ用です。)
(use srfi-1)
(define-class ()
((def :init-keyword :def :init-value “”)
(str :init-keyword :str :init-value “”)
(type :init-keyword :type :init-value “”)))
(define (make-token def str type)
(make :def def :str str :type type))
(define reserved
(hash-table ’string=?
‘(”MODULE” . 0)
‘(”BEGIN” .0)
‘(”END” .0)
‘(”VAR” .0)
‘(”INTEGER” .0)
‘(”STRING” .0)
‘(”IF” .0)
‘(”THEN” .0)
‘(”ELSE” .0)
‘(”WHILE” .0)
‘(”DO” .0)))
(define symbols
(hash-table ’string=?
‘(”+” . “PLUS”)
‘(”-” . “MINUS”)
‘(”*” . “MULT”)
‘(”/” . “DIV”)
‘(”=” . “EQ”)
‘(”< " . "LT")
'("<=" . "LE")
'(">” . “GT”)
‘(”>=” . “GE”)
‘(”<>” . “NE”)
‘(”:=” . “ASSIGN”)
‘(”;” . “COLON”)
‘(”:” . “SEMICOLON”)
‘(”,” . “COMMA”)
‘(”(” . “OPEN”)
‘(”)” . “CLOSE”)
‘(”.” . “PIRIOD”)))
(define (add lis e)
(append lis (list e)))
(define (print-token-list lis)
(map (lambda (e) (print #`”DEF[,(ref e ‘def)]ttSTR[,(ref e ’str)]”)) lis))
(define (lexer str)
(print-token-list (scanner (string->list str) ‘())))
;; (d (scanner (string->list str) ‘())))
(define (scanner char-list token-list)
(if (null? char-list)
token-list
(let ((c (car char-list))
(cs (cdr char-list)))
(cond [(char-whitespace? c) (scanner cs token-list)]
[(char-alphabetic? c)
(pred-scanner cs
token-list
(list c)
(lambda (char) (or (char-alphabetic? char) (char-numeric? char)))
(lambda (char-list)
(let* ((str (list->string char-list))
(def (if (hash-table-exists? reserved str)
str
“IDENT”)))
(make-token def str “”))))]
[(char-numeric? c)
(pred-scanner cs
token-list
(list c)
(lambda (char) (char-numeric? char))
(lambda (char-list)
(make-token “NUMBER” (list->string char-list) “”)))]
[(char-numeric? c) (scan-of-pred cs (list c) token-list char-numeric?)]
[(or (equal? c #=)
(equal? c #+)
(equal? c #-)
(equal? c #*)
(equal? c #/)
(equal? c #;)
(equal? c #,)
(equal? c #()
(equal? c #))
(equal? c #.))
(let ((str (make-string 1 c)))
(scanner cs (add token-list (make-token (hash-table-get symbols str) str “”))))]
[(or (equal? c #< )
(equal? c #>)
(equal? c #:))
(let ((pred (cond [(equal? c #< )
(lambda (e) (or (equal? e #=)
(equal? e #>)))]
[(equal? c #>)
(lambda (e) (equal? e #=))]
[(equal? c #:)
(lambda (e) (equal? e #=))])))
(pred-scanner cs
token-list
(list c)
pred
(lambda (char-list)
(let ((str (list->string char-list)))
(make-token (hash-table-get symbols str) str “”)))))]
[(equal? c #\”)
(let ((index (list-index (lambda (c) (equal? c #\”)) cs)))
(scanner (drop cs (+ 1 index)) (add token-list (make-token “STR” (take cs index) “”))))]
))))
(define (pred-scanner char-list token-list buffered-char-list pred maker)
(if (null? char-list)
(scanner char-list (add token-list (maker buffered-char-list)))
(let ((c (car char-list))
(cs (cdr char-list)))
(cond [(pred c) (pred-scanner cs token-list (add buffered-char-list c) pred maker)]
[else (scanner (cons c cs) (add token-list (maker buffered-char-list)))]))))
こんなソースコード生んで本当にすみません。
でも、綺麗にしたいんです><コメントお願いします><
恒例のフィボナッチベンチで V8 と Smalltalk、Ruby、Python、Scheme とを戦わせてみるにHaskellがいないではないか!ってことで、やってみた。(やってからブログ書く暇がなくて、かなり乗り遅れてるけど)
gabu@ubuntu-vm:~/haskell/fib$ time ./fib 39 63245986 real 0m0.019s user 0m0.000s sys 0m0.012s
0.019秒きたーーー。
ソースはこちら。
import System fibonacci = 1:1:zipWith (+) fibonacci (tail fibonacci) main = do args <- getArgs print $ fibonacci !! ((read $ head args) - 1)
List の index の関係で マイナス1してるのがださいけど、こんなもんですかねぇ。
フィボナッチ数列の作り方は、フィボナッチ数列 - Haskell はスケるよから頂きました。読んでも意味が分かりません。。。誰か解説プリーズ。
Imagine Cup 2008 のニュース で初めて Imagine Cup という存在を知ったんですが、Microsoft の Imagine Cup の公式サイト でヒアリングの練習がてらプレゼン動画を見ていたら 2007 年大会の インターフェイス デザイン部門で1位になった「INTOI」というデジタルホワイトボードが凄いよく出来ていて感動したので紹介します。
とにかくデモ動画をどうぞ!
INTOI 公式サイト欲しい!欲しすぎる。
でも僕の英語力ではこれが製品として売られてるのか、売られているなら日本で買えるのかが分かりません。個人で買うのも何かアレだし><
日本に似たような製品ってあるんですかね?
こういう純粋にダイレクトに「すげー」とか「便利ー」とか言われる製品を作ってみたいです。これいったいどうやって出来てるんだ。。。キニナル。
あなたの考えは、すべての出来事、存在をあるがままに、前向きに肯定し、受け入れることです。それによって人間は重苦しい陰の世界から解放され、軽やかに なり、また時間は前後関係を断ち放たれて、その時その場が異様に明るく感じられます。この考えをあなたは見事に一言で言い表しています。すなわち『これで いいのだ』と。
Rails で作る AI vs AI Reversi - ストーリー の続きです。勉強会のメンバーからの案を踏まえ、API仕様書0.1版を作りました。ひとまず公開します。
コメント等々いただければと思います。
モデルを再設計しなければぁ。
昨日(Rails で作る AI vs AI Reversi - モデル設計)の続きです。今日はストーリー(ユースケース)について。
クライアントにあたる Reversi AI は、 おそらくバッチ的なプログラムになるでしょう。その場合、実際のリバーシのアルゴリズム以外に、どうやって対戦相手を見つけるか・前述の Game をどうやって生成するか、などが問題になります。プレイヤーにはアルゴリズムのプログラミングに集中してもらいたいため、「ゲームの生成・対戦相手を見つける・対戦結果を見る」などは、Webサイト上で提供しようと考えています。
それを踏まえた上で考えたストーリーです。
前準備
Web サイトにて
自分の PC にて
Web サイトにて
いかがでしょうか。最後に見たのは数年前だけど、「対戦相手を待つ」あたりは、ハンゲっぽいのをイメージしてます。
自分の PC にて
どうしよっかなぁ。(結構楽しんでる
)
昨日(Rails で作る AI vs AI Reversi - 経緯とコンセプト)の続きです。今日はモデル設計について。

いろいろ悩んだんですが今日時点では、こんな感じで考えてます。こんな感じと言っても、わけわかんないかもしれないので簡単に説明します。
2008/7/22 更新: 詳細に書いても変更になった時に困るのでポイントだけ書きます。
Board モデルが盤上の石の座標を二次元配列で持っています。
Log モデルが1手目から status(パスか黒が打ったか白が打ったか)と、打たれた座標、ひっくり返った石の座標の配列を持っています。
Log モデルは、Webサイト上でFlash などで視覚的に対戦状況を見ることができる、Reversiビューアのために作ったモデルです。
Logモデルを現在の手数+1をポーリングで監視して、更新があれば描画する、みたいな AS を書けばビューアは簡単に作れるんじゃないかなぁと思ってます。
以上。
OSC2008Nagoya に、我らが勉強会 CSNagoya が参加するのは決まってたんだけど、出し物として「Haskell で作る Twitter」って考えてたんですが、どうも「ふーん」で終わってしまいそうなので、「雑談で話していた AI Reversi をやりたいっす><」と自己主張したところ、「いいんじゃない、頑張って!」ということで、草案(発案者の方のアイデアをそのまま)投下。なんだか「gabu ちゃん一人で頑張ってw」的な空気が漂ってるんですが、いじめですかねw
というようなコンセプトです。
クライアントとゲームサーバは http 通信を基本として、できるだけ RESTful な API を公開することを考えています。(Restful な API って日本語あやしいな・・・)
つまり! http 通信できるなら、どんなプログラミング言語でも参加 OK!
その点が、OSC のオープンソースに引っかかるという名目で進みます。いいですよね?勉強会の皆様。
モデルとか必要そうなアクションとか考えてたんですが、眠いので、また明日。おやすみなさいませ。。。
PS. 「たまには普通の話とか子供の話とか書いてくださいよー」と言われてたのに、こんな話でごめんなさい><
いつか必ず書きます><
Recent Comments