kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

非遅延純粋関数型言語IMO(Io MOnad)を公開します

2年半くらい前に、言語開発合宿という、二泊三日でオレ言語の仕様とその処理系を作るという楽しいイベントがありまして、その時に、「HaskellのIOモナドがよくわからんから、実際にIOモナドを持ったミニ関数型言語を作って理解しよう」と思って作ったものです。ずいぶん長い間古いノートPCの中に埋もれていたのですが、ふと思い出して、せっかくだしということで公開することにしました。処理系はここから、サンプルプログラムはここからダウンロードできます。実用性は皆無なのでその点に注意してください。コマンドラインから以下のように入力することで、プログラムを実行できます。

java -jar imo.jar [プログラムファイル名]

以下、IMOのドキュメントです。間違いや言語仕様に関する質問・要望はコメント欄で受け付けています。あと、たぶん居ないと思いますが、もし、ソースコードを公開して欲しいという方が居るようであれば、ソースコードも公開したいと思います。あと、型チェッカとかかなり適当で、割と簡単にバグってくれると思いますので、あまりいじめないでやってください。

== 静的型純粋非遅延関数型言語IMO
* 実用性は全くありません
* 名前の由来:IoMOnad
* 静的型
* 純粋関数型
* eagerな評価
  * デフォルトがlazyはキライ
* データ型
  * IO型(パラメタ付き型。一般の多相型はサポートしない) io('a)
    * Haskell等のIOモナドに相当
  * 関数型(パラメタ付き型): 'a -> 'b
  * string(文字列)型
  * int(整数)型
  * bool型
  * unit型
* 型推論
  * そんな便利なものはありません
* 文法
  * コメントは//の出現から行末まで
  * 基本的に変数の値への束縛と式のみから成る。CとかJavaにあるような、
    実行される文みたいな概念は導入しない
  * 関数定義
    def var_name(arg : arg_type) : ret_type = body
    デフォルトでカリー化される。というか、非カリー化形式が存在しない
    Example:
      def foo(x :int) :int = x // int -> int
      def add(x :int y :int) :int = x + y // int -> int -> int 
  * 式
    * x op y //二項演算子
      Example: x + y
    * op x //単項目演算子
      Example: not true
    * f x //関数適用
      println "foo"
    * let var_name = exp in body
      let x = 1 in x
    * \arg_name : arg_type. body // 無名関数
    * if (cond_exp) then_exp else else_exp //cond_expはbool型でなければならない
* 実行モデル
  * 実行はmainから開始。mainの型はstring -> io('t)(任意のIO型)とする。
* IOオブジェクトを構築する組み込み演算子
  * 特別に多相的に扱われる
  x >>= y :: io('a) -> (a -> io('b)) -> io('b)
  x >> y :: io('a) -> io('b) -> io('b)
  return x :: 'a -> io('a)
* 関数適用
  f x
* 二項演算子
  x and y :: bool -> bool -> bool //先行評価ではないので、厳密な意味ではIMOの関数ではない
  x or y :: bool -> bool -> bool //先行評価ではないので、厳密な意味ではIMOの関数ではない
  x + y :: int -> int -> int
  x * y :: int -> int -> int
  x / y :: int -> int -> int
  x % y :: int -> int -> int
  x / y :: int -> int -> int
  x < y :: int -> int -> bool
  x > y :: int -> int -> bool
  x <= y :: int -> int -> bool
  x >= y :: int -> int -> bool
* 単項演算子
  not x :: bool -> bool
  + x :: int -> int
  - x :: int -> int  
* 組み込み関数
  parse_int :: string -> int
  print :: string -> io(unit)
  println :: string -> io(unit)
  print_number :: int -> io(unit)
  read_line :: int -> io(string)


追記:ソースコード公開して欲しいという要望が(1名だけど)あったので、zipアーカイブしたのを公開しときます。ダウンロードはここから。あまり綺麗なソースではないですしコメントも全然無いですが、簡単な言語処理系とか書いたことのある人なら、まあ一応読めるものにはなってると思います。