Befunge日記
5時間あればBefungeインタプリタとBefungeで書かれたKEMURIインタプリタを作れると思うけど、 3倍で見積もった上で、今15時間かけて作るべきかと考えると…。
…。
「やりたいことはいくらでも沸いてくるけども、やる時間は有限なので 何かを捨てなきゃいけない。」
でも「精神衛生を保つために息抜きが必要だと割り切って、 遊ぶときにはしっかり遊ぶ」
ううむ。
とりあえず昼間から遊ぶのはダメだと思う。 しっかり働いてから遊ぼう。
でも今日遊ぶならウダーの練習がしたいなー。
というわけでBefungeはなし。
=
v @_ v >0"!dlroW"v v :# < >" ,olleH" v ^ <は
v @_^ >0"!dlroW"v v :# < >" ,olleH"v ^< <にした方が1マス縮まるし、無理に再利用しないで
v >0"!dlroW"v v :# < >" ,olleH"v ,:!#@_ >ってやれば
0"!dlroW"v v " " < >",olleH"v ,:!#@_ >、
0"!dlro"v v ", W" < >"olleH"v ,:!#@_ >、とだいぶ小さくなると思う。 でも机上プログラミングなのでバグが入ってるかもしれない。 やっぱりスタックの中身とかいろいろな情報を表示しながら 実行してくれるツールが欲しいな。
= 淡々と執筆(いつものごとくエンジンがかかるまでに時間がかかったけど)
3-0 done 3-1 done 3-2 done
安西先生、Haskellがしたいです…
Jython本なので当然 Java+Pythonの話だけをしているわけだけど、 もちろんJava+RubyでもJava+JavaScriptでもいいことは知っているわけで。 なんかもう、Jython本を書き終わったらJavaとPythonをしばらく封印して、 FlashとActionScriptでGRINEdit的なものを作ってみたいような。
自分の性格がよくわかった。自分は一つのテーマを長時間ずっとやるのは苦手だ。 HaskellとかActionScriptとかBefungeとかしたいぞーーーー。
= 晩ご飯を食べながら思いついたことを、忘れないうちに試してみた。
西尾泰和のブログ: Haskell In Python ver. 0.01
いちおう期待通りに動いている。 イメージだけよりも、やっぱり具体的なモノがあった方が色々わかる。 0.01ではPythonの関数をHaskellから呼ぶことはできないけど、 モナドとしてなら実現は難しくない。Pythonで書いた関数を純粋な関数として扱うためには もうちょっと僕がHaskellの中身を理解していないと作れない。
でもまあ40分で書いた31行のコードなので、それなりなことしかしていません。 だからver 0.01。
= PyStringをStringに変換しないといけない、という話題。 自分がJythonの単なる一ユーザーの時は、 「そっか、変換しないといけないんだな」 で済んだのだけど、 それを人に解説すると 「あれ、でもどうして変換の必要があるんだ? 変換の必要のない実装は不可能なのだろうか?」 と考えるハメになる。
PyStringというクラスを導入せずにStringで押し切ることは不可能なのだろうか? 押し切るとどういう不都合が起きるのだろうか? 今の実装はPyString extends PyObjectだけど、 PyString extends String implements IPyObjectじゃダメなんだろうか、
= 秋元@サイボウズラボ・プログラマー・ブログ: JavascriptによるC系ソースコードのハイライトライブラリgoogle-code-prettify。 入れた。 PythonのIDLEのカラーリングとは一致はしない。 たとえばifやprintなどの予約語と、 あらかじめ用意してあるけども予約はされていないので上書きしてもいいintやTrueなどは、 IDLEでは区別されるけども、これでは区別されない。 両方ともキーワードという扱いになる。 あとdefやclassで新しく定義する名前は、IDLEでは青く着色されるけど、 これでは「普通のコード」と判定されて着色されない。 spanタグ自体がIDLEの着色方法と対応していない付き方をしているので スタイルシートをいじってもどうしようもない。
でも、まぁ許容できる範囲の違いかな、と思う。 もともとまったく色の付いていないのでも許容していたし。
西尾泰和のブログ: Haskell In Python ver. 0.01 のように、「コードのように見える文字列」がある場合は、着色前よりだいぶ見やすくなるね。
= Haskellはなんか名前の衝突が起きやすいのが嫌だなぁ。 下の二つのcodeが衝突する。 Situationから値を取り出す関数codeは、 Situationを引数に取らないと意味がないわけだから、 文脈で二つのcodeを区別できそうなのにね。
code = [
"0\"!dlro\"v",
"v \", W\" <",
">\"olleH\"v",
" ,:!#@_ >"]
data Situation = Situation {
code::[String], pos::Pos, dir::Dir, textMode::Bool, skipMode::Bool}
= ちょ、Haskell、
data Foo = Foo{x :: Int}
main = print $ x $ (Foo -1)
これが
test.hs:3:20:
Couldn't match expected type `Foo'
against inferred type `Int -> Foo'
In the second argument of `($)', namely `(Foo - 1)'
In the second argument of `($)', namely `x $ (Foo - 1)'
In the expression: print $ (x $ (Foo - 1))
こういうエラーになるのはひどい…。
-1くらい整数のリテラルとして認めてあげてよ…。
それかせめて整数の符号を反転させる演算子「-」の優先順位を、
関数の適用よりは上にしてよ…。
= 行方不明だった万歩計、お台場にあった!
本とかを持って帰るために来たのに、手提げ袋を忘れた。
火曜日にもまた来ることになったし、その時でいいかな。
= ラボの机をだいぶ片付けた。 19時。 Shibuya.esが始まるのでとりあえずfreenode.netに入ってみた。 ネット中継のリンクがまだ現れない…。
ふむふむ。FlashもJavaScriptでHTMLをいじる時みたいなツリー構造でいじれるのか。
小さくて更新頻度の高い画像と、 大きくて解像度の高い更新頻度の低い画像とが表示されている。 大きい側でスクリーンを拡大して表示するらしい。 これはなかなかよさそう。
Macromedia - Flash TechNote : fl0277 - ローカル Shared Object とは。 これを使えばローカルにいろいろな値を保存しておくこともできる。
akihiro kamijo: E4X。 ECMAScript for XML。 ドット接続で要素名がつなげられるし、ハッシュっぽいアクセスの仕方もできる。
わーお、「..」ってなんだー。 指定したのの直下に限らず、ってことだろうか。あてかん。
腰が痛くなってきた。
「Firebugがあればどんな複雑なCSSだってなんとかなる。」byはまちちゃん
ABC (ActionScript Byte Code) → MIR → x86
Shibuya.jsはプレゼンツールを自作してくる必要がある →手書きプレゼン(へた字)
「fcwrapを使え」
あまりの面白さに吹き出してしまった。 みんな帰った後でよかったw
haXe
alertがヒューマンリソースを食いつぶす。
document.cookieは共有されるので…おおおお。
= Haskellはパターンマッチで関数fooの定義を書いている間で関数barの定義をすると その後のfooの定義でmultiple declarationエラーになる。 かといってそこで使っている関数を関数fooの定義の後ろまで持って行くと、 離れてしまって見やすくない。 そこでwhereでくっつけてみたら、結局関数barを定義する必要がないじゃないかと。 可読性は下がった。
そうも行かない。 barが1カ所でしか使われないのならくっつけてしまうのもアリだけど 下のようなケースではどうしたらいいんだ。
(doCommandの定義がたくさん 略)
calc2 w f = let (u:v:rest) = stack w in
w{stack = (f u v):rest}
doCommand '+' = calc2 (+)
doCommand '-' = calc2 (-)
doCommand '*' = calc2 (*)
doCommand '/' = calc2 (/)
doCommand '%' = calc2 mod
doCommand '`' = calc2 $ \x y -> if x > y then 1 else 0
= とりあえず行きの電車の中とShibuya.es聞きながらの内職で
main = return startWorld >>= dump >>= step >>= dumpってやると
X"!dlro"v v ", W" < >"olleH"v ,:!#@_ > 0 [] 0X!dlro"v v ", W" < >"olleH"v ,:!#@_ > " [0]と表示されるようになりました。 もう帰ろうっと。
= 帰りの電車がなかなか来ない。
テキストモードにはいるのは実装していたけど抜けるのを実装していなかった。
完成。
ああっ、 befungeにXOR命令はないじゃん。 加減乗除とかでXORを実装しないといけないのか。 コードの一部を書き込み用のスペースにして 自力で10進数から2進数に変換したりしないといけないのかな。
とりあえず5時間で完成するコースではなく、 15時間かかってしまうコースであることがはっきりしたので、 befungeでKEMURIを作るのは無期限で延期。