Archive for 2月, 2008

ふつうのHaskell

日曜日, 2月 17th, 2008

『ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門』を買いました。
Haskellの本を買うのは初めてなんですが、私がHaskellに抱いていたイメージとして
「インデントでブロックを表す言語」というものがありまして、まあ、実際その通りなんですが、

「{ }」と「;」を使うと、複数の式を束ねる構文がインデントを使わずに記述できます。
(7.2節 レイアウト)

とあり、実は

main = do {
cs <- getContents;
putStr cs
}

こんな書き方もできるようです。
ああ、これなら読みやすい……と一瞬思ったのですが、
Haskell使ってる方は使ってないような気がします。
(使ってたら、逆にインデントの話の方がマイナーな話になるだろうし。)
だとしたら、あまり使わない方がいいですね。
とりあえず、最初の方は大体読んだので、
たのしみにしていたモナドの説明は明日にでも読めそうです。
ワクワクして寝れなくなったら今日中に読むかもしれませんが(笑)
話は変わりますが、
「car/cdrを使っていたらCommonLispを使う職場で笑われて、
それ以降はfirst/restを使うようにした」
なんて記事を読んだことがあるのですが、そんなもんなんですかね。
本しか読んでないとその言語の常識ってのがいまいち分からないです。

ブラックホールに束縛されている変数

金曜日, 2月 15th, 2008

R6RSのAppendix A. Formal semanticsを読みました。
R5RSの形式的意味論は日本語で呼んでもさっぱり分からなかったけど、
R6RSの形式的意味論は英語でも(*)結構分かった気分になれました。
すこし面白かったのがletrecの説明。

… but it initializes both ordinary variables, and variables that are current bound to the black hole(bh).
しかし、それは通常の変数と現在ブラックホール(bh)に束縛されている変数の両方を初期化する

ブラックホールに束縛されている変数ですよ。ブラックホール。
まあ、天文学のブラックホールとは一切関係ないと思いますが。
(変数に割り当てたロケーションにとりあえず放り込んでおく値です)
あと、気になったのがリストが循環しているか確かめるメタな述語(関係?)

b ∈ 2pp×val×(sf …)
b [[ pp1, pp2, (sf1 … (pp2 (cons v1 v2)) sf2 …) ]] if pp1 = v2
b [[ pp1, pp2, (sf1 … (pp2 (cons v1 v2)) sf2 …) ]]
  if b [[ pp1, v2, (sf1 … (pp2 (cons v1 v2)) sf2 …) ]] and pp1 ≠ v2
(画像版はこちら)

リストに循環部分がないか、これをリストの全ての要素に適用して確かめてるんですが、
これって、リストの途中に循環構造があった場合一生終わらない気がするんですが、いいんでしょうか。

(*)いろんな文章に対して「英語で読んだ方が分かりやすいよ」とかいう言葉を聞きますが、
英語がろくにできない人にとってはどんな文章でも日本語版と英語版があれば、
どう考えても日本語版の方が分かりやすい…そういっても過言ではないかもしれません
いえ、ずばり過言ではないでしょう

クロージャを教えるのは苦労じゃ

火曜日, 2月 12th, 2008

大学に入ってすぐの頃、「クロージャって何ですか」と聞いたときの返答がこれでした。
そのときはCのstaticな変数と同じようなものかと理解したけど、
今思うと遠いような近いような……

R6RSという奴は…

日曜日, 2月 10th, 2008

R6RSではR4RSで登場したsyntax-caseが復活すると聞いていました。
確かに、R6RSの9.2節に
「syntax-caseでもdatum->syntaxを使わなければ衛生的なマクロが定義できる(12.6節参照)」
という説明がありましたが、syntax-caseという言葉が登場するのは恐らくそこだけで、
おまけに、R6RSは11章までしかありませんでした。
でも、よく見てみたら参照と書いてあるのは、標準ライブラリ(*)の12.6節でした。
R6RSの本体が90ページ(付録を除いても60ページ)もあるのに、
標準ライブラリの説明も70ページもあります。
英語がろくに読めない私にはあまりにも過酷です。
仕様書が薄いのがSchemeの特徴だったはずじゃ……
(*) Revised6 Report on the Algorithmic Language Scheme — Standard Libraries
—-
でも、syntax-caseが仕様に戻ったというのは嬉しいです。
syntax-ruleだけじゃ、私には使いこなせない気がするからです。
というのも、去年の夏休み、Common Lispでyaccもどきを作ったんです。
ただ、yaccのようにファイルに記述したBNFを読み取ってソースを吐き出すのではなく、
S式として記述してあるBNFを入力とし、Lispのプログラムを吐き出すマクロとして作りました。
例えば、次のような文法の構文解析器を生成したいとします。

EE+T
ET
TT*F
TF
F→<E>
F→i

この場合は、次のように書きます。
(ここでは、構文解析と同時に計算もするものを作ってます)

(setf (symbol-function 'parser)
(make-parser (E (E '+ T) (+ $1 $3)
(T) $1)
(T (T '* F) (* $1 $3)
(F) $1)
(F ('< E '>) $2
('i) $1)))

そしたら、こんな関数が作られます。


#<CLOSURE :LAMBDA (#:G267)
(LET ((#:G266 '(#:G253)) (#:G268 (POP #:G267)))
(LABELS
((#:G265 (#:G269)
(IF (EQ #:G268 '#:G252) (CAR #:G267)
(CASE #:G269
((#:G264)
(CASE #:G268
((#:G230)
(LET (($1 NIL))
(SETF $1 (PROGN (POP #:G266) (POP #:G266) (POP #:G266)))
(LET ((#:G292 (CAR #:G266))) (PUSH #:G268 #:G267) (SETF #:G268 'T)
(PUSH $1 #:G267) (#:G265 #:G292))))
((*)
(LET (($1 NIL))
(SETF $1 (PROGN (POP #:G266) (POP #:G266) (POP #:G266)))
(LET ((#:G291 (CAR #:G266))) (PUSH #:G268 #:G267) (SETF #:G268 'T)
(PUSH $1 #:G267) (#:G265 #:G291))))
(以下略)

まあ、正直いいものとは言いがたいのですが、
とりあえず、動くものを作ることができました。
けど、実はCommon Lispのマクロをまともに使ったのはこれが初めてでした。
それでも問題なく書けたのは、マクロを使ったといっても、それは最初に入力を受け取る箇所だけで、
後は普通にLispの関数を書きなぐっただけだったからです。
だから、ボトムアップに開発を進めることができて、
関数単位でテストができたので、Cなんかで同じものを作るよりも、
圧倒的にデバッグが楽だったと思います。
しかし、これをR5RS通りのsyntax-caseがないSchemeで作ろうとすると、
syntax-ruleでマクロを書く必要があり、
syntax-ruleでは展開コードはテンプレートで記述する必要があり、
テンプレートからは普通のSchemeの関数を呼び出したりはできないので……
と、考えただけでも恐ろしいことになりそうです。
という訳で、Schemeを使ってマクロ展開コードを生成できるsyntax-caseが
復活したことに私は賛成です。(といっても、syntax-caseをいまいち分かってないんですが(笑))

「偽のゆとり教育」を受けた学生はどうなるのか

土曜日, 2月 9th, 2008

「真のゆとり教育」が生んだ18歳天才プログラマー
ゆとり教育で「情報」の授業が必修になりましたが、
私の高校ではレポート一枚で終わりました。
翌年、その事実が発覚して色々大変なことになりました。

     ____
   /      \
  /  _ノ    ⌒\  偽のゆとり教育というか、
/    (○)  (○) \  本物のゆとり教育を受けたやる夫はどうすればいいお…
|       (__人__)    |   アホプログラマーになれるのか…
/     ∩ノ ⊃  /   
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /

カッココッカにしてあげる♪【してやんよ】

            ___
       /      \
      /ノ  \   u. \     なんという歌…
    / (●)  (●)    \    やっぱりLispはネタが多いお…
    |   (__人__)    u.   |    京大にはLisper魔美なんてものもあるらしいし…
     \ u.` ⌒´      /    
    ノ           \    
  /´               ヽ  
 |    l              \
 ヽ    -一””””~~``’ー–、   -一”””’ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
       ____
     /      \
   /  _ノ  ヽ、_  \   世の中は広いお…
  /  o゚⌒   ⌒゚o  \  本を出したり、すごいモノつくってる人たちの中に混じって、
  |     (__人__)    | ゆとり世代の大学生がgauche.nightに出るのは
  \     ` ⌒´     /  無理があったかもしれないお…
            ’ー/.:.:.:.:.:.::::/.:.:.:.:.:.:/.://.:.:.:.:.:.:.:.:.:..:.:.:.:.:.:.:.:.\
            /.:.:./.:::::::/.:.:.:.:.∨.:/ ./.:.:.:.:.:.:.:.:.:.:.:.:.:.:./:.:.:.:.:.:.:ヽ
           /.:.:.:.:/.:.::::::::/.:.:.://X   ,’.:.::.:::.:.:.:.:.:.:.:.:.:.:/ :.:.:.:.:i::.:.:.∧
.         ー–イ.:.::::::::::,’.:.:; ‘    \i.:.:.::::.:.:.:.:.:./.:.::;イ:.:.:… ;    ’,
             /.::::::::/|.:./        !.:::::.:.:.:.:.:,イ.:.::/ |:.:.:.:.:.,’:..     i
              ,’::::::,イ::::::|イ  \    |::::.:.:.:./7ーrー-|–:./.:.:.:.:..  .;
         /i:::;イ::Y.::::::/    \   |:::.:/ //  .|.:.:./.:.:.:.:.:.:.:.:./
         ’´ |//:::,’::::::/  ̄ ̄ ̄   j/       |.:/.:.:.:.::.:.:.|:./
             //|.:::八 :::::::           ___ j/:..:.:.:::.:.:..j/ 大丈夫
      __/´ ̄_) 、 |.::::::∧   ___       \     /.:.:.:.:::::::::.:.:|  だってヴぁ!
      /_: :`: . 、  )ノ |:.::;:’.j/\ i´‘′`ヽ     \ /.:.:.:::::::;イ:.:.:;’  秘策が
.     /_: :`: : 、: :\)’r|.:/ / :¨`r_>、   ,!  ::::::::::: , ‘:.:::::::/|::|.::/  あるってヴァ!
   ,.ノ‐ 、`: :、: :\: :ヽj/ / : : /‐- 、` ¨i´‐rー–‐/.:::::::/_,ノ:.:|/
.  /    \: :\: :ヽ/.’ / : : /    .>’´: : :`ヽ/::.:::::;:イ:::/ヽ:::.:.|
 /        ヽ: : ヽ/: :i i : : ;’   /: : :;-r‐r=r-<´ |:/   \|        ____      /⌒  ⌒\     先輩、助かります!    /( ●)  (●)\    (この先輩は色々とすごいひとだお!   /::::::⌒(__人__)⌒::::: \   きっといい案があるに違いないお!)   |     |r┬-|     |     \      `ー'´     /                   / : : : : : : /: : : : : : : : : : : : : : : : : : \                 /: : : : /: : /| : : : : : : : : : : /: : : : : : : : : ヽ               /: : /: :/: :{/  | : : : : : : /: : /: : : :│: : : : : : '.           /: :〃: : :,': :.∧  |:l: : : : :./ | :ハ. : : : |: /: : : : : |         \  /// : : /l: :/ __\ハ: : : : / j/ _,斗: : :j/: : : : :l: :| .     ―‐-   /'´/⌒V:│;〃アf心ヾ: :Vー孑ゥ≠ミ: : / : : : : : l: | .    --―     /    V:l小. {ト イ| ∨   f{ノ::Ⅵ ∨: : : :.j: : :| | 「ゆとり代表」って     _, -'´   {     V: : } Vヒソ     |トーイソ/: : : : ∧.:.:|: | 書いたTシャツを           ∧      '; : { ''    ' -―v` ー〃: : : : : :/ヽ'; :|: :| 着とけば           レ ヘ、   ヽ:ゝ ._  f     )′: : : : : /_ノ: V|\| いいってヴぁ!             \  j/⌒\>ゝ .. _//:.: :/∨: :/\ |              `/     \ : : :_|厶-―< ^}/|/            __/  /    マ'弋\ `ヽ\  ∨           /   {  /   /  ∨ヘ    \\∧            (____`ー{ _,/    |川     \ヽ|        ____      /      \    /  _ノ  ヽ、_  \   /  o゚⌒   ⌒゚o  \  先輩はやっぱりすごいお・・・   |     (__人__)    |  涙がとまらないお…   \     ` ⌒´     / (この物語はフィクションです)

ニコニコ動画でシューティング

火曜日, 2月 5th, 2008

明日でようやく試験も終わりです。
なので、こんなものを作りました。
開く前に注意
「ムービー中のスクリプトが原因で…(中略)…スクリプトの実行を中止しますか?」
というメッセージボックスが表示されますが、ここで「いいえ」を選ぶという問答をなんども繰り返す必要があります。
(私のノートでは10回程でした)

結論:
ニコスクリプトであんまし無茶をやっちゃいけない
ニコスクリプトの開発者の方にはもう少し高速化してもらいたいものです。
あと、もう少し機能を追加して欲しいものです。
最後に、もう少しだけ簡単な文法にして欲しいです。できればS式で。
スクリプトに入れた空白は自動的に取り除かれるようなのですが、
『” “』(二重引用符の中にスペース)のスペースまで取り除くのはどうかと……

R6RSはポータブルじゃない

月曜日, 2月 4th, 2008

R6RSを印刷すると紙の枚数が多くなる。
非常に重い。
持ち運びに不便。
ポータブルじゃない。

ニコニコ動画で三目並べ

金曜日, 2月 1st, 2008

ニコニコ動画のスクリプト『ニコスクリプト』の話。
試験期間中というのもあって(*)、こういうものを作ってみました。

あと、このスクリプトでの簡単なアクションゲームの作り方も思いついたんですが、
残念ながら現状ではLispインタプリタは作れそうにありません。
個人的なニコスクリプトの未公開命令のまとめ

  • 基本
    未公開命令を使う時は行頭にスラッシュをつける。
    処理の列はセミコロンで区切る(二つ目以降の命令にスラッシュは不要)
    『時間::/命令1;命令2;…;命令n』が基本の形
    式はJavaScriptな「気分」で書ける(実際はかなり制約がある)
  • commentTrigger(then:処理の列, timer:SEC)
    コメントが入力された(正確には画面に表示された)ときに処理を実行する。他人のコメントでも処理が実行される
    SEC秒の間のみ有効となり、有効時間内は何度でもコメントの数だけ処理が実行される
  • chat
    commentTriggerの中で使用する『変数』(命令ではない)
    chat.messageにはコメントの内容が入っている
    chat.isYourPostが真の時、そのコメントは現在の視聴者が入力したものである
  • if(when:条件式,then:処理の列)
    条件式は色々書ける(比較は==で。&&等も使用できる)
    ifの中にifを書くこともできる
  • drawText(text:文字列, size:サイズ, color:0xRRGGBB, x:X座標, y:Y座標)
    画面上に文字列を表示する。何もしなければずっと残り続ける
    座標は画面中心を(0,0)とし、指定した座標に文字列の中心がおかれる
    drawTextの戻り値を利用して属性(textとか)を変更できる
    visible属性にtrue/falseを入れて表示/非表示を切り替えられる
    例) t = drawText(text:””,size:30,color:0xRRGGBB,x0,y:0); t.text=”ほげ”
  • 文字列1.indexOf(文字列2)
    文字列2が文字列1の何文字目でマッチしたかを返す
    マッチしなければ-1が返る
    文字列1/2には変数も使用可能
    例) chat.message.indexOf(t.text)

ざっとこんな感じです。あとは、1行に沢山書きすぎると動かないとか。
心を無にして書き続ければそれなりに何か作れるはず。
(*)試験期間中は逃避エネルギーによってプログラミングの効率は普段の三倍まで上昇する

R6RS誤字(結末)

金曜日, 2月 1st, 2008

以前の日記で、R6RSに誤字がある?
と書いたのですが、R6RSの中の人に
「これって誤字ですか?」
とメールを送ってみたところ
「その通りだ」
って返事が返ってきました。
少しSchemeコミュニティに貢献した気分になれました。

やる夫が変な夢をみたそうです

金曜日, 2月 1st, 2008