Archive for the ‘プログラミング’ Category

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

金曜日, 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月 5th, 2008

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

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

ニコニコ動画で三目並べ

金曜日, 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行に沢山書きすぎると動かないとか。
心を無にして書き続ければそれなりに何か作れるはず。
(*)試験期間中は逃避エネルギーによってプログラミングの効率は普段の三倍まで上昇する

括弧と角括弧

木曜日, 1月 31st, 2008

R6RSで角括弧が同義語になったって書いてますが、
どうもリストの場合だけであって、ベクタは違うようです。

<list> → (<datum>*) | [<datum>*]
    | (<datum>+ . <datum>) | [<datum>+ . <datum>]
    | <abbreviation>
<vector> → #(<datum>*)

gaucheではどうなんだろうと思い、試してみたところ

gosh> #[1 2 3]
#[ 1-3]
gosh> (vector? #[1 2 3])
#f

なんだかよく分からないけど、ベクタじゃないということだけは分かりました。

R6RSに登場する言語

水曜日, 1月 30th, 2008

zickです。
R6RSを読んでいると、ふと思ったのですが、
「これは○○言語などと同様である」といった感じで登場する、
Scheme以外の他のプログラミング言語の数が、
R5RSと比べて増えている気がしました。
で、気になったので各言語の登場回数を数えて見ました。
(ただし、謝辞と参考文献は除いています。)

言語 R5RS R6RS
Snobol 1 0
APL 3 0
Pascal 3 0
Haskell 1 4
Algol 5 3
Common Lisp 6 3
ML 2 3
C 2 2
Python 0 3
Smalltalk 0 4
C# 0 3
Ruby 0 4
合計 23 29

登場する言語の種類でみたら、R5RSが8種類、R6RSが9種類。
登場回数で見たら、R5RSが23回、R6RSが29回。
やはり増えているようです。
しかし、APLやSnobolが登場しなくなり、RubyやPythonが登場したというのは分かるのですが、
なんで今更になってSmalltalkが登場したのでしょうか。謎です。

世界初(?) プリンタでlispが動いた

月曜日, 1月 28th, 2008

以前、日記で、pslispについて、


つまり、目標はプリンタで動かすことなんですが、
現状ではGhostscriptでしか動作を確認していません。

と書いていたら、koguroさんが実際に動かしてくれました。
pslispをPSプリンタに出してみた
簡単なリスト操作で6分かかったというのがなんとも生々しいですが、
普通に印刷できているようで感動しました。
koguroさん、ありがとうございます。

PostScriptの上のLispの上のPostScript

金曜日, 1月 25th, 2008

昨日はPostScriptでLispインタプリタをつくり、それを用いLispインタプリタをつくりました。
そして今日は、PostScriptでつくったLispインタプリタを用い、PostScriptインタプリタをつくりました。

  • PostScriptインタプリタ (pslisp用のプログラム。普通のSchemeインタプリタでも運がよければ動くかも?)
  • pslisp (昨日から結構手を加えました。)

実際にpslispで動かす際には改行を空白に置き換え、1行で記述してください。
PostScriptをつくったといっても、もちろんそのごく一部だけで、
図形も何も描けません。ただ計算ができるだけで、
実際につくったのは以下の機能だけです。

  • 四則演算(add, sub, mul, div)
  • スタック操作の一部(dup, exch, pop)
  • 条件分岐(if, ifelse)
  • 変数の定義(def)
  • 数値比較(eq)

上記のソースを利用してPostScriptのプログラムを書くには次のように、
(postscript ‘(プログラム))
を評価します。
(PostScriptインタプリタのソースの最後に実際にこれが記述してあります。)

(postscript '(
/fact
{
dup 0 eq
{
pop 1
}
{
dup 1 sub fact mul
} ifelse
} def
10 fact
))

ここでは10の階乗を求めるPostScriptのプログラムを書いています。
「PostScriptの1トークン = Lispの1シンボル」として読み込ませているので、
トークンとトークンの間には必ず空白を入れる必要があります。
全くもって使い道のないものをつくってしまいましたが、
大学の試験が近づいていることから逃避することによって発生するエネルギーを、
プログラミングによって発散した結果、生まれてしまったかわいそうなプログラムなので、
どうか生暖かい目で見守ってください。

わーい \(^o^)/ LispをPostScriptで書いたLispで書いたよー!

木曜日, 1月 24th, 2008

zickです。
最近、巷(*)ではLisp(Scheme?)を実装するのが流行っているようで。
その流れにのっとって私も変なものをつくってみました。
***PostScriptで書いたlisp***

名前はまだないのですが、仮にpslispと呼びます。
このpslispはPostScriptで書いたLispインタプリタです。
単に式を評価するだけではなく、その値を図示してくれる優れもの(?)です。
実は去年の4月ごろにほぼ完成していたんですが、
条件分岐などを加え、再帰が使えるようになりました。
***pslispで書いたlisp***

pslispで動かすためにエスケープ文字を付加し、改行を消しているためカオスなことになってます。

(追記)
はてなブックマークにて指摘がありました。

yshl (と)が対応していればエスケープは無くていいし、文字列中で改行できるので、もっと読みやすくなるはず。

ありがとうございます。お陰でずいぶん読みやすくなりました。
改行の方は面倒なのでまた今度で(笑)

まあ、これだけ見てもなんのことやらといった感じですが、
自分で書いたlispインタプリタの上でさらに、
lispインタプリタが動いていると考えると、なかなか感慨深いものです。

なんでまたPostScriptなのかというと、
「PostScriptってチューリング完全らしいよ」
「ってことはプリンタでLispを動かすことができるんですか!?」
という会話をし、そのまま勢いでつくったというだけです。
相変わらず何も考えていません(笑)
つまり、目標はプリンタで動かすことなんですが、
現状ではGhostscriptでしか動作を確認していません。
レーザプリンタなどで動作確認をしてくれたら嬉しい……ですが、プリンタの安全は保障しかねます。
(*)巷の人たち

Erlangで毒電波送信

木曜日, 12月 6th, 2007

お久しぶりです。zickです。
数日前、『Lispの歌』という言葉を目にし、一体何なのかと思ったら、
『かっこうの歌』のことだったんですね。(「かっこう→括弧」という洒落)
某所でネタとしてLisperが実際に歌った由緒正しきモノだそうです。

話は変わりますが、相変わらずErlang触ってます。
それで、今はソケットの勉強をしているのですが、
練習という名目で毒電波(SSTP)を飛ばしてみました。

即席で作った怪しげなスクリプトを読み込んで、それに基づいてErlangがSSTPを飛ばします。
毒電波を飛ばしているErlangの関数はこんな感じです。

send_and_receive(Str) ->
{ok,Sock} = gen_tcp:connect("localhost", 9801, [binary, {packet, 0}]),
ok = gen_tcp:send(Sock, Str),
receive_data(Sock, []).
receive_data(Sock, SoFar) ->
receive
{tcp,Sock,Bin} ->
receive_data(Sock, [Bin|SoFar]);
{tcp_closed,Sock} ->
list_to_binary(lists:reverse(SoFar))
end.
send_sstp(Body, Ver, Retry) ->
Header = "SEND SSTP/"++Ver++"\r\n"
"Sender: "++?SENDER++"\r\n"
++Body++
"Charset: "++?CHAR_SET++"\r\n\r\n",
case {Retry, send_and_receive(Header)} of
{true, <<"SSTP/1.1 409",_/binary>>} ->
timer:sleep(2000),
send_sstp(Body, Ver, Retry);
{_, Any} ->
Any
end.

怪しげなスクリプトはこんな感じ。

%ラベルは*から始まり、命令は^から始まります
%字句は全て改行区切りという不気味な作りです(笑)
*start
\h\s0電波、\w8届いた?
届いた
届いてない
わからない
^list_speak
届いた
arrive
^eq_jump
わからない
not_understand
^eq_jump
\h\s0それじゃあ、もう一度送るね\w8…\w8…そりゃ!
^next_speak
start
^jump
*arrive
\u\s0いや、むしろErlangから毒電波がこっちに届いてるんだけど
^normal_speak
^exit
*not_understand
\h\s0聞くは一時の恥、聞かぬは一生の恥。わからないことは悪いことじゃないよ\uどーでもいい\e
^normal_speak
^exit

FreeBSDへのErlangのインストール

金曜日, 11月 9th, 2007

毎度のことながらzickです。
FreeBSDにErlangを入れたのでそのときのメモを残しておきます。
最初、portsから入れようとしたんですが、
失敗したので、ソースからmakeすることにしました。
———-
FreeBSDへのErlangのインストール
———-
0)JDKをインストール
$ pkg_add diablo-jdk-freebsd6-1.5.0.06.00.tbz
1)Erlangのソースを入手
2)ファイルを展開し、 lib/odbc/c_src/odbcserver.c の冒頭に次の行を追加
#include <netinet/in.h>
3)gmake
4)gmake install
———-
さほど難しいことではないのかもしれませんが、
普段Windowsばかり使っている私にはなかなか堪えました。
しかし、何でJavaが必要なんでしょうかね。
こんどはFreeBSDにESDLを入れようとしているんですが、
なかなか上手くいかず、苦労しています。