IoPLMaterials

MiniML5 and beyond: やりこみのための演習問題

おめでとう!ここまでやれば,一応関数型言語のインタプリタと呼べるものは出来上がったと言って良い.ここからはやりこみのための演習問題をすこし挙げておく.(今のところリストとパターンマッチに関する問題しか作れていない.ごめん.良い問題があったら Issue で提案してください.)

リストとパターンマッチ

Exercise 3.6.1 [**]

空リスト [],右結合の二項演算子 ::match 式を導入して,リストが扱えるように MiniML4 インタプリタを拡張せよ.match 式の構文は,

match e with [] -> e | <識別子>::<識別子> -> e

程度の制限されたものでよい.

Exercise 3.6.2 [*]

リスト表記

[e1; ... en]

をサポートせよ.

Exercise 3.6.3 [*]

match式のパターン部において,リストの先頭と残りを表す変数(::の両側)に同じものが使われていた場合にエラーを発生するように改良せよ.

Exercise 3.6.4 [***]

より一般的なパターンマッチ構文を実装せよ.

Exercise 3.6.5 [**]

ここまで与えた構文規則では,OCaml とは異なり,iflet, fun, match 式などの「できるだけ右に延ばして読む」構文が二項演算子の右側に来た場合,括弧が必要になってしまう.この括弧が必要なくなるような構文規則を与えよ.例えば,

1 + if true then 2 else 3;;

などが正しいプログラムとして認められるようにせよ.

自由課題

Exercise 3.6.6 [???]

(この課題は出来に応じて星の数を決める.)OCaml 以外の世の中にあるプログラミング言語の「ミニ」なバージョンを定義し,そのインタプリタを作れ.例えば C, C++, Java, Haskell, Scheme, VHDL, 正則表現,Rust, Go, Erlang, Prolog, LiLFeS, Eiffel, Clojure, Ruby, Perl, Python, PHP, Perl, R, MATLAB, Mathematica, Maple, sh, bash, zsh, csh, tcsh, Pascal, x86アセンブリ, SPARC アセンブリ, MIPS アセンブリなど.どのくらい「ミニ」なものを作るかはお任せするが,あまりにミニすぎたりしょぼいものであった場合には,機能拡張の要求を出すことがある.

Exercise 3.6.7 [???]

(この課題は出来に応じて星の数を決める.)なにかイケているプログラミング言語を設計し,そのインタプリタを作れ.技術的な有用性を追求しても,笑いを追求してもよいが,あまりにしょぼい場合(例えば「空文字列のみがプログラムとして許され,任意のプログラムが何もしないという動作を行うプログラミング言語を設計しました!」など)は機能拡張の要求をすることがある.