Posted 2016-12-10 07:17:19 GMT

方言の系統

MDL

主要開発者

Gerald Sussman、Carl Hewitt、Chris Reev、Dave Cressy

登場時期

1970年頃

特徴

1970年代としては画期的で実験的な機能を多数持ち、後続のLispに長所が取り入れられることになった。

後続への影響

Lisp Machine Lisp、Common Lispのラムダリストキーワード、述語に ? を付ける命名規約等

概要

MDLは、Muddleと読むとのことですが、Plannerの成果を踏まえた処理系で、ダイナミック・モデリングなシステムを構築するために作られたのが始めのようです。

Lispの対話性を持つ

型指定が可能

リスト、文字列、ベクタ、一様ベクタ等多数の型を持ち、ユーザー定義も可能

コンパイラが優秀。ネイティブコンパイラで当時のFORTRAN、COBOL並のスピードは出る

パッケージシステムを持つ

拡張されたラムダリスト

等々の特徴があります。

MDLのマニュアルを眺めるとその後のMIT系Lisp、特にLisp Machine Lispに甚大な影響を与えているようで、

リストのスプライシング記法(!を使う)

コルーチン

oblistを管理する block を発展させたパッケージシステム

を発展させたパッケージシステム 拡張されたラムダリスト(“OPTIONAL”、“TUPLE”、“AUX”(“TUPLE”がCommon Lispでいう &rest ))

)) オプショナルな型宣言

などはそのままに近い形で輸入されている感じです。

型宣言などは、どちらかといえばCommon Lispに強く影響が現れているかもしれません。

スプライシングは、Common Lispのように、バッククォートと、コンマの対ではなく、 ! を使った記法になっています。

式(form)とデータ型のリスト(list)は別々の為、クォートはあまり出てきません

<SET FOO (1 2 3)> (!.FOO 1 2 3) ;=> (1 2 3 1 2 3)

見た目の特徴としては、 < 、 > で囲まれているのがよくあるLispとは違います。

<DEFINE FIB (N "OPTIONAL" (A1 1) (A2 0)) #DECL ((N A1 A0) FIX) <COND (<0? .N> 0) (<1? .N> .A1) (ELSE <L? .N 2> <FIB <- .N 1> <+ .A1 .A2> .A1>)>> <FIB 10> => 55

<> が式で () がリスト、 . は、 <lval ...> を表わすリーダーマクロで、ローカル変数を取得します( , は大域変数)

データ型は、 #なんとか (...) と書かれますが、関数もデータ型に含まれていて、 #FUNCTION ((X) <* .X .X>) のように書け無名関数として使えます

<#FUNCTION ((X) <* .X .X>) 9> => 81

以上、概略にもなっていませんが、非常に面白い機能が満載なので興味を持った方は是非マニュアルを眺めてみてください!

以下、目についた所を紹介します。

細かいけど面白い所

整数(FIX)がコレクションの要素にアクセッサになる

arcと同じですが、

<1 (1 2 3 4)> => 1

という挙動です。MDLは、1オリジンなので、 LENGTH の結果で最後の要素にアクセスしたりするようです。

<<LENGTH .FOO> .FOO> => ...

; でコメントアウトするのは直後の一つの式

Schemeの #; と同じですが、

FOO-BAR-BAZ ;"foo bar baz"

のように書きます。複数行に渡って書く場合は、文字列にするという慣例があるようです。

型によって評価規則を変えられる

EVALTYPE

APPLYTYPE

PRINTTYPE

というものが用意されていますが、これらを使って、型に応じて印字結果を変えたり(Common Lispのプリティプリントのような)、評価規則を変えたりできます。

マニュアルの例では、LISTをFORMと同じくすることで、普通のLispのように丸括弧で評価できるようにする方法が紹介されています。

<EVALTYPE LIST FORM> <EVALTYPE ATOM ,LVAL> (+ 42 42) ;=> 84

上では関数のみを受け付けますが、スペシャルフォームの扱いもどうにかできるのか興味があるところです。

文字列補間がある

MDLの場合、文字列中の % の直後の式が評価され合体されます。

マクロを書く場合に使う例が載っていますが、Common Lispで書けば文字列で書いて、 read-from-string で式に変換する所です。

<DEFMAC INC (ATM "OPTIONAL" (N 1) #DECL ((VALUE) FORM (ATM) ATOM (N) <OR FIX FLOAT>) <FORM SET .ATM <FORM + <FORM LVAL .ATM> .N>>> <DEFMAC INC (ATM "OPTIONAL" (N 1) #DECL ((VALUE) FORM (ATM) ATOM (N) <OR FIX FLOAT>) <PARSE "<SET %.ATM <+ %.ATM %.N>>">>

体験

PDP-10上で稼動する、MDLは、TOPS-10のエミュレータ上で動かすことができます。(simh、KLH等)。公開TOPS-20サイトを利用してみるのも良いでしょう。

これらのサイトで遊べるZorkはMDLで書かれているオリジナルです。

実行コマンドは、

mdl105

(です105はバージョンらしい)

まとめ

MDLはZorkが書かれたことで有名ですが、言語としては、MDLの系統がそのまま引き継がれることはなかったものの、Lisp Machine LispからCommon Lispに多大な影響を及ぼしています。

1970年代前半のMIT系Lispは時代を20年は先取りしてますね!!

是非マニュアルを眺めてみてください。

参考文献

■

