MYAO's WEBSITE

2017-07-29

JuliaでLispを書いた話

どうにも、Emacsの調子が悪くて、さっきから二度ほど固まったので、どこまで書く気力が続くがわからないけれど、書いていく。

まとめ的なものは、また別のところで書くかもしれない。今回のは感想的なものと思ってほしい。まあ、どっちにしてもそんな感じだろうというのは、まあ。

最近JuliaでLisp(純Lispっぽいもの)を書いた。出来上がったものは、(こちら)[https://github.com/myaosato/my-first-lisp]に置いてある。GCとか自分で書いてないし、多分にバグだらけだけれど、まあ。

なぜJuliaかというと、Juliaには前から興味があって、触っておこうと思いつつホントに触れる程度(REPLで電卓に毛が生えた程度のことをする)だった状態だった。Lispを書いてみようと思って、Twitter上でどうしましょかねみたいなことを言っていたら、Juliaはどうですかと薦めてくださったので、ではJuliaでという流れ。まあ、何も考えずに書いたが、Juliaのことをもっと知った上で、もうちょっとマシなものをって話はこの先出てくるかもしれない。(かもしれない。)

さて、今回は、特に何か教本的なものを参考にするというようなことはやめて、自分で勝手に楽しむというコンセプトで作ってる。まあ、そりゃ、効率甚だしく悪いバグモリモリなものなら書けるだろうからなぁということは有ったが、まあ、何かを覚えるということよりも、最初の一歩目ということを重視した。まあ、言い訳。なお、バグモリモリ動向の前に、例外処理を一切していない。ごめんよ。

しんどいというか、詰まるほどではないにせよって部分は、まあ、文字列をS式ってかリストにパースするようなところで、なんとなくどうにもうまく書けた気がしない。開きカッコや閉じカッコや、シンボル、.、空白なんかの単位で読み込んでいって、CONSセルを作って、まずCAR側詰め込む。終端に達したら、(再帰で書いているので)戻ってきてCDR側で同じことをする。シンボルならシンボルを作る。まあ、ざっくり言うとこんな感じなんだけど、最後? までうまく出来ていなかった。もうちょっとわかりやすくなると思うんだけれどなぁ。このあたりは形式的な勉強をちゃんとした方がいいなぁと思う。

もう一つ、考えたのはLAMBDAをどうするかということ、まあ、本体はS式として保存しとけば良いやって思ってたので、そのとおりにした。環境というのか、まあ変数と引数の類をどうするかってことで、とりあえず、引数一覧とLAMBDAが評価される時のグローバルでない変数(辞書型の配列を使って管理している)を保持する。LAMBDAで作られたオブジェクトが評価される時には、現状のグローバルでない変数を退避させておいて、オブジェクトに保持していたグローバルでない変数達を読み込み直して、引数に値をくっつけて、それもグローバルでない変数として配列に加える。グローバルでない変数はこの方法でのみ生み出されるということにしている。一応、これでレキシカルスコープになると思うんだけれど、違うのだろうか。グローバルじゃなくてダイナミックと呼ぶほうが良いのかもしれない。なんかそのあたりまだ完全には分かってない。とりあえず、それっぽく動いた。

一応、実装したのはCONS CAR CDR QUOTE IF DEF(変数の宣言) SET(再束縛) LAMBDA EVAL 書いてて、ATOMないわってことに気づく。数値とかは扱っていない。Symbolそのものと、リストは扱える。まあ、そんなところ。

とりあえず、次に行けばいいかと思ってたが、ATOM実装していないのはなぁと思ったので、もう少し書くかも。