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さん、ありがとうございます。

やる夫がgauche.nightの第1部座談会に出演するそうです

1月 27th, 2008
       ____
     /      \
   /  _ノ  ヽ、_  \
  /  o゚⌒   ⌒゚o  \  もう試験間近だお…
  |     (__人__)    |  きっと単位沢山落とすお…
  \     ` ⌒´     /
            / ̄ ̄\ 
          /   _ノ  \
          | し ( ●)(●)
          |     (__人__)  お前、ソフトウエア演習の授業出てないだろ
             |     ` ⌒´ノ  課題はネットで外から出せるようになってるけど、
              | し       }   先生に直接見せないと未提出扱いらしい
              ヽ        }   早く先生のとこ行ってきたほうがいいぞ
            ヽ、.,__ __ノ
   _, 、 -― ””::l:::::::\ー-..,ノ,、.゙,i 、
  /;;;;;;::゙:’:、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
           ____
       /::::::::::::::::\
      /::::::─三三─\
    /:::::::: ( ○)三(○)\  
    |::::::::::::::::::::(__人__)::::  | 今までそんなことなかったって聞いてたのに…
     \:::::::::   |r┬-|   ,/  そうか、新しい先生が授業やってるんだったお!!!!
    ノ::::::::::::  `ー’´   \ 
  /:::::::::::::::::::::            
 |::::::::::::::::: l   
       ____
     /      \
   /  _ノ  ヽ、_  \
  /  o゚⌒   ⌒゚o  \  もう何もする気も起こらないお…
  |     (__人__)    |  色々と終わったお…
  \     ` ⌒´     /
            , ‘´  ̄ ̄ ` 、
          i r-ー-┬-‐、i
           | |,,_   _,{|
          N| “゚’` {“゚`lリ  そこの、ボーイ!!
             ト.i   ,__”_  !   gauche.nightの第1部座談会に出演しないかい?
          /i/ l\ ー .イ|、    出演者の方はチケット購入の必要ないよ!
    ,.、-  ̄/  | l   ̄ / | |` ┬-、 
    /  ヽ. /    ト-` 、ノ- |  l  l  ヽ.
  /    ∨     l   |!  |   `> |  i
  /     |`二^>  l.  |  | <__,|  |
_|      |.|-<    \ i / ,イ____!/ \   .|     {.|  ` - 、 ,.---ァ^! |    | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l __{   ___|└―ー/  ̄´ |ヽ |___ノ____________|   }/ -= ヽ__ - 'ヽ   -‐ ,r'゙   l                  | __f゙// ̄ ̄     _ -'     |_____ ,. -  ̄ \____|   | |  -  ̄   /   |     _ | ̄ ̄ ̄ ̄ /       \  ̄| ___`\ __ /    _l - ̄  l___ /   , /     ヽi___.|  ̄ ̄ ̄    |    _ 二 =〒  ̄  } ̄ /     l |      ! ̄ ̄| _______l       -ヾ ̄  l/         l|       |___|      ____         /      \        /  ─    ─\    (gauche.night? /    (●)  (●) \    それって結構有名イベントだお… |       (__人__)    |    なんで声が掛かったのかさっぱり分からないけど /     ∩ノ ⊃  /      声が掛かったってのはきっと名誉なことだお) (  \ / _ノ |  |      .\ “  /__|  |     \ /___ /             / ̄ ̄\           /   _ノ  \  ■ gauche.nightとは           |    ( ●)(●)  書籍「プログラミングGauche」が刊行されるのを           |     (__人__)  記念して開かれるイベント。              |     ` ⌒´ノ  SchemeとGaucheとλとS式を愛するすべての人の               |          }   ためのイベントだとのこと。               ヽ        }   しかし、この説明で分かるような人は             ヽ、.,__ __ノ   そもそもこれの存在を知ってるだろうと    _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、  つっこまざるをえない。   /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
       ____
     /⌒  ⌒\
   /( ●)  (●)\    はい、参加したいお!何をするか教えて欲しいお!
  /::::::⌒(__人__)⌒::::: \   (本来1500円のチケットがタダってのは魅力的だお!)
  |     |r┬-|     |
  \      `ー’´     /
            , ‘´  ̄ ̄ ` 、
          i r-ー-┬-‐、i
           | |,,_   _,{|
          N| “゚’` {“゚`lリ   R6RSを肴にしてみんなで飲む会だよ!
             ト.i   ,__”_  !   それで参加してもらえるかい?
          /i/ l\ ー .イ|、    
    ,.、-  ̄/  | l   ̄ / | |` ┬-、 
    /  ヽ. /    ト-` 、ノ- |  l  l  ヽ.
  /    ∨     l   |!  |   `> |  i
  /     |`二^>  l.  |  | <__,|  |
_|      |.|-<    \ i / ,イ____!/ \   .|     {.|  ` - 、 ,.---ァ^! |    | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l __{   ___|└―ー/  ̄´ |ヽ |___ノ____________|   }/ -= ヽ__ - 'ヽ   -‐ ,r'゙   l                  | __f゙// ̄ ̄     _ -'     |_____ ,. -  ̄ \____|   | |  -  ̄   /   |     _ | ̄ ̄ ̄ ̄ /       \  ̄| ___`\ __ /    _l - ̄  l___ /   , /     ヽi___.|  ̄ ̄ ̄    |    _ 二 =〒  ̄  } ̄ /     l |      ! ̄ ̄| _______l       -ヾ ̄  l/         l|       |___|      ____         /      \        /  ─    ─\    (R6RS? /    (●)  (●) \    Schemeの新しい仕様だお… |       (__人__)    |   そもそも古い仕様もあまり知らないお) /     ∩ノ ⊃  /     (  \ / _ノ |  |      .\ “  /__|  |     \ /___ /        ____      /⌒  ⌒\    /( ●)  (●)\     (でも誘ってもらったのに断るのは悪いお!   /::::::⌒(__人__)⌒::::: \     R6RSも今から読めばなんとかなるはずだお)   |     |r┬-|     |   \      `ー'´     /          ____         /\  /\       /( ●)  (●)\      / :::::⌒(__人__)⌒:::::\       |     |r┬-|       |       \     ` ー'´     /      /          \       | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |  トン    _(,,) ぜひとも      (,,)_   /  |   参加させて     .|  \ /    |       欲しいお   .|    \     .|__________|             , '´  ̄ ̄ ` 、           i r-ー-┬-‐、i            | |,,_   _,{|           N| "゚'` {"゚`lリ   了解したよ。              ト.i   ,__''_  !   公式サイトを更新して、           /i/ l\ ー .イ|、    ブログのほうにも書いておいたよ。     ,.、-  ̄/  | l   ̄ / | |` ┬-、      /  ヽ. /    ト-` 、ノ- |  l  l  ヽ.   /    ∨     l   |!  |   `> |  i
  /     |`二^>  l.  |  | <__,|  |
_|      |.|-<    \ i / ,イ____!/ \   .|     {.|  ` - 、 ,.---ァ^! |    | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l __{   ___|└―ー/  ̄´ |ヽ |___ノ____________|   }/ -= ヽ__ - 'ヽ   -‐ ,r'゙   l                  | __f゙// ̄ ̄     _ -'     |_____ ,. -  ̄ \____|   | |  -  ̄   /   |     _ | ̄ ̄ ̄ ̄ /       \  ̄| ___`\ __ /    _l - ̄  l___ /   , /     ヽi___.|  ̄ ̄ ̄    |    _ 二 =〒  ̄  } ̄ /     l |      ! ̄ ̄| _______l       -ヾ ̄  l/         l|       |___|      ____    /      \   /  _ノ    ⌒\  なんか瞬時に後戻りできなくなったお /    (○)  (○) \  とにかくR6RS読まないとまずいお・・・ |       (__人__)    |   それ以前にSchemeあまり触ってないし・・・。 /     ∩ノ ⊃  /    (  \ / _ノ |  | .\ “  /__|  |   \ /___ /       ____      /⌒  ⌒\    /( >)  (<)\      /::::::⌒(__人__)⌒::::: \    まあ、3月だしまだまだなんとかなるお!   |    /| | | | |     |    地味に勉強すれば大丈夫なはずだお!   \  (、`ー―'´,    /          / ̄ ̄\     /ノ( _ノ  \                  | ⌒(( ●)(●)    勉強? それ以前に試験の勉強しろ!     .|     (__人__)     授業サボってる奴が試験前に勉強しなかったら            |     ` ⌒´ノ      確実に単位落とすだろ!     / ⌒ヽ     } =つ≡つ=つ≡つ=つ≡つ    /  へ  \   }≡つ=つ≡つ=つ≡つ=つ  / / |      ノ  =つ≡つ=つ≡つ=つ≡つ ( _ ノ    |      \≡つ=つ≡つ=つ≡つ=つ        ____      /      \    /  _ノ  ヽ、_  \   /  o゚⌒   ⌒゚o  \  試験のことを忘れてたお…   |     (__人__)    |    \     ` ⌒´     / (この物語はフィクションです)

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でしか動作を確認していません。
レーザプリンタなどで動作確認をしてくれたら嬉しい……ですが、プリンタの安全は保障しかねます。
(*)巷の人たち

NScLisper 一周年

1月 12th, 2008

zickです。
なんと今日でNScLisperをつくり始めてから1年(と1日)が経ちました!
わーい わーい
去年、どんな心境でNScLisperをつくったのか。
それがどういう形でリリカルLispに繋がったのか。
当時の貴重な資料(といっても私の日記ですが)が見つかったので公開します。

あどばんすど NScLisper オフィシャルガイド

12月 29th, 2007

zickです。
リリカル☆Lispの通販特典としていた
『あどばんすど NScLisper オフィシャルガイド』
を一般公開しようかと思います。
こちらからご自由にお持ち帰り下さい。
内容はNScripterでのLispインタプリタの作り方をかなり大雑把に書いてあるという感じです。
テキトーなことを書いてあるので鵜呑みにしないようにしてください(笑)

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を入れようとしているんですが、
なかなか上手くいかず、苦労しています。

Erlangでゲーム作り

11月 8th, 2007

zickです。
11月2日の日記で書いたとおり、ESDLを入れたのですが、
せっかくなんで簡単なゲームを作ってみました。

昔からよくあるエアホッケーみたいなゲームですが、
LAN上の二台のマシンで対戦ができます。
(ただし、上の画像では一つのマシンで二つ立ち上げています)
ネットワークプログラミングなんてろくにやったことのない私ですが、
思いつくままに書いたら何故かうまく動きました。Erlang万歳!
しかし、ESDLって文字表示できないんですね。
数字を表示するため画像を準備するはめになりました。
本格的にゲームを作るのはちょっと面倒かもしれません。