-
Notifications
You must be signed in to change notification settings - Fork 0
OCamlで作ったLispインタプリタのようなもの
License
tana/mylisp
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
習作Lispインタプリタ mylisp(仮称) OCamlで実装したLispインタプリタです。 まだ条件もquoteも使えないのでLispとしては不完全です。 組み込み関数を増やせば実装できるかもしれません。 今のところ機能はあまりありません。文字列も小数も真偽値も使えません。 言語仕様は、他のLisp言語とは少し違う仕様になっています。 変数定義がdefで、無名関数がfunになっています。 さらに、マクロも値です。マクロも関数と同じように、無名マクロを使って定義します。 その仕組みは、マクロが「引数は評価せずそのままリストとして渡されて、戻り値は評価されて返る」という仕組みだからです。 レキシカルスコープも今は正しく実装できていません。 とりあえず、「関数が作られた時に環境をコピーし、関数が呼び出された時、コピーした環境から変数を検索し、無ければ現在の環境から検索する」という仕組みにしています。 組み込み関数: print 値を表示。引数は一つだけ。 例: (print 10) +,-,*,/ 四則演算。可変長引数。 例: (* 2 5) def 変数定義。引数は変数名と値。 例: (def a 10) fun 無名関数。引数は仮引数と式。 例: (fun (x y) (+ x y)) mac 無名マクロ。引数は仮引数と式。 例: (mac (x) (car x)) list リストを作る。引数はリストの要素。可変長引数。 例: (list 1 2 3) car リストの最初の要素を取得。引数はリスト。 例: (car (list 1 2 3)) cdr 最初の要素を除いたリストを取得。引数はリスト。 例: (cdr (list 1 2 3)) begin 式を順番に実行。最後の式の結果が返る。 例: (begin (def a 10) (print a)) quote 引数を評価せずにそのまま返す。引数は一つだけ。 例: (quote (a b c)) qquote 準クオート。基本的にquoteと同じだが、(unq 式)というのが出た時は式を評価。 beginは新しいスコープを作ります。 ソースコードの構成: parser.mly: 構文解析。ocamlyacc用定義ファイル。 lexer.mll: 字句解析。ocamllex用定義ファイル。 evaluator.ml: 評価器。 mylisp.ml: 組み込み関数の定義とREPL。 ビルド方法、使い方: OCamlが必要です。 makeするとmylispという実行ファイルが生成されるので、 ./mylispを実行すればREPLが起動します。 終了の方法はまだ作っていないので、構文エラーを出すかCtrl+CかCtrl+Dで終了します。 例: defunマクロの定義 (def defun (mac (name params body) (qquote (def (unq name) (fun (unq params) (unq body)))))) 連絡先: tana mail: tana.laevatein@gmail.com blog: http://d.hatena.ne.jp/tana-laevatein twitter: @tana_ash ライセンスなど: MIT Licenceです。LICENCEファイルを読んでください。
About
OCamlで作ったLispインタプリタのようなもの
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published