500行Lisp
組み込み用途で500行のLispインタプリタ作ってみました。
使用言語はC++でboostライブラリ使ってます、
コンパイルは
Windowsでcygwinをつかっているのならば、
最新のcygwin setup.exeで、devel -> boost-devel、gcc-c++ を選択し
ソースコードをテキスト保存して
> g++ hoge.cpp -o a.exe
でコンパイルできます
(Linuxや、そのほかのコンパイラでのboost C++ Libraries インストールにかんしてはコチラのサイトLet's Boostが詳しいです)
実行は、こんな感じ、
> a.exe "(+ (* 3 4 5) (* 5 6 7))"
とりあえず四則演算と比較関数、if文と文字列の足し算とlambdaとクロージャーしか実装してません。
これからスレッドとか、ソケット周りとかを実装しようとおもってるんですが、
作法がわからない、そもそもLispの一般的なルールとかがわからない、
関数名とか速度とかいろいろな面でダメダメ、
ソースコードはいまのとこ、こんなんです。(かなり読みにくいです)
http://noncopyable.hp.infoseek.co.jp/soft01/lisp03.html
データはS式モドキで、パーサーが一括コンバートしたあと、ソースを全く読まないで動作します。
Lisp自体はよく知りません、なのでこのまま俺言語になりそうです、
だれかひまなひとが軌道修正してくれるとありがたいのですが。
http://noncopyable.hp.infoseek.co.jp/soft01/lisp06.html
ちょっとマシに。
- skimu(2005/12/15 21:43:37 PST) : うーむ、この lisp、 cons 無いんですか?
- Shiro(2005/12/16 00:31:22 PST): 何を目標としているのか (コンパクトな実装なのか、
シンプルなコードなのか、速度なのか、C++との親和性なのか、CLなりSchemeなりの
既存の言語仕様を目指すのかそれともLispっぽいマイ言語を目指すのか、等々)
によって実装方法は根本からがらっと変わってくるので、方針を書いてもらった
ほうがコメントがつきやすいんじゃないかと思います。
- 500行Lisp(2006/01/20 18:02:18 PST) : どうも返事が遅れてすいません、ええと、実はなんとなく作っちゃってるんですが、
いまのところ必要なのは、アプリの挙動やらをユーザーが多少自由にいじれるとか、
ソケットをひらいてサーバーもどきを立ち上げるとか、その程度なんですが。
- skimu(2006/01/20 20:22:23 PST): どうでしょう、ちょっと遠回りかもしれないですが、まずは Lisp を勉強して Lisp で書いてみるというのはいかがでしょう? そうすれば Lisp 一般的なルールとかも身に付きますし、作った処理系で走らせるプログラムを書くときにも役にたちますよ。ここを見る人は Scheme ラブな人が多いと思うので、Scheme で書くと、消化しきれないほどアドバイスがもらえる事請け合い。いちど作り方が分かってしまえば他の言語で作り直すのも簡単です。
- たとえば、
- Gauche で動く Scheme を作る。(この時点ではアプリに組み込むとかスピードのこととかは考えないで処理系の構造に集中する)
- C++ で作る処理系はこの Scheme で書かれた処理系が正しく動く事を目標にする。
- アプリから呼び出すときに便利な機能を考えたり実装したりする。
- すると、根本的に駄目な部分が見えてくるので 1 から新しく書き直す。
- てな感じ。
- 500行Lisp(2006/01/22 05:04:35 PST):
どうもです。
LispでLispを作るんですか!それはちょっと無理です、よくわかってませんし。
しかし、やっぱり平行して勉強しながら作ってくしかないでしょうかねえ。
Scheme:Brainfuck ← とりあえずなんとかコレが動くようにしてみます。
Last modified : 2007/01/18 16:09:37 UTC