Skip to content
/ mylisp Public

OCamlで作ったLispインタプリタのようなもの

License

Notifications You must be signed in to change notification settings

tana/mylisp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

No packages published

Languages