
Lispプログラミング言語では、M式(またはメタ式)は、 FortranやALGOLなどの当時の言語に触発された、Lispの初期に提案された構文でした。この表記法は言語に実装されることはなく、そのため最終決定されることはありませんでした。[ 1 ]
ジョン・マッカーシーは、マサチューセッツ工科大学の研究員であった1960年にLispに関する最初の論文を発表しました。その中で彼は、複雑な構造をリストとして表現できる記号式( S式)の言語について説明しました。次に、S式に対する一連の基本操作と、より複雑な操作を定義するために使用できるメタ式(M式)の言語を定義しました。最後に、メタ言語自体をS式で表現する方法を示し、自己ホスティング可能なシステムになる可能性を示しました。[ 2 ]この論文の草稿版は「AIメモ8」として知られています。[ 3 ]
マッカーシーは、言語構文としてM式、コンパイラの内部処理を記述するためにS式を使用する自動Lispコンパイラ(LISP 2 )を開発する計画を立てていた。スティーブン・R・ラッセルはこの論文を読み、S式の方がより便利な構文であると彼に提案した。マッカーシーはこの考えに反対したが、ラッセルと同僚のダニエル・J・エドワーズはS式を実行できるインタプリタプログラムを手作業でコーディングした。 [ 4 ]このプログラムはマッカーシーの研究グループに採用され、S式がLispの主要な形式として確立された。
マッカーシーは1979年にM式の運命について考察した。
M式を正確に定義し、コンパイルするか、少なくともS式に変換するプロジェクトは、完了もせず、明示的に放棄されることもなかった。それはただ漠然とした未来へと後退し、考案可能なFORTRANやALGOLのような記法よりも内部記法を好む新世代のプログラマーが現れた。[ 5 ]
— Lispの歴史
ジョン・アレン著の『Anatomy of LISP 』では、M式の定義を説明し、Lispとその実装を説明するために本書全体を通してM式を使用しています。[ 6 ]
apply関数とeval関数の定義は、Lisp 1.5マニュアルの13ページに記載されています。
apply[fn;x;a] = [atom[fn] → [eq[fn;CAR] → caar[x]; eq[fn;CDR] → cdar[x]; eq[fn;CONS] → cons[car[x];cadr[x]]; eq[fn;ATOM] → atom[car[x]]; eq[fn;EQ] → eq[car[x];cadr[x]]; T → apply[eval[fn;a];x;a]]; eq[car[fn];LAMBDA] → eval[caddr[fn];parlis[cadr[fn];x;a]]; eq[car[fn];LABEL] → apply[caddr[fn];x;cons[cons[cadr[fn];caddr[fn]];a]]]
eval[e;a] = [atom[e] → cdr[assoc[e;a]]; 原子[ケア[e]] → [eq[car[e],QUOTE] → cadr[e]; eq[car[e];COND] → evcon[cdr[e];a]; T → apply[car[e];evlis[cdr[e];a];a]]; T → apply[car[e];evlis[cdr[e];a];a]
S式に対してeval関数を使用する。
eval[(EQ (QUOTE A) (CAR (CONS (QUOTE A) (QUOTE (BCD)))));NIL]
MLispは、LispのM式のようなフロントエンドを実装するための、当時(1968~1973年)のプロジェクトでした。衛生的なマクロ、パターンマッチング、バックトラッキングなどのいくつかの追加機能が組み込まれました。最終的には、放棄されたLISP70ドラフトへと発展しました。1989年のM-LISP(MetaLISP)は、M式とSchemeを融合させる別の試みでした。[ 7 ]
Common Lispには「 AI Memo 8」M 式のパーサーがありますが、著者はマクロに対応できないという認識から、M 式に反対する例としてそれを意図しています。[ 8 ]
CGOL (1977)はMacLispで実装され、中置演算子を使用した Algol のような構文を導入するという同様の目標を掲げています。[ 7 ] Armed Bear Common Lispで動作することが知られています。[ 9 ]
より新しい(2003 年頃の)バリアントはI 式で、括弧を暗黙的に示すためにインデントを使用するため、ある意味では S 式と M 式の中間的なものです。I 式はScheme 実装要求49 でSchemeの補助構文として導入されましたが、広く採用されていません。[ 10 ]
さらに発展したのが「スイート」t式で、これは優先順位のない中置演算子を持つ。I式と同様に、t式はS式から単純な変換で得られるため、理論的にはどのLisp方言でも使用でき、マクロなどの機能と干渉しない。[ 11 ]
構文関連のその他の例としては、AppleのDylan(Algolのようなトークン)やClojureによるその他のリテラル構文の追加などが挙げられる。[ 7 ]
。初心者に実際に触らせて、どれほど実用的でないかを実感させましょう。例えば、マクロはもう使えません。マクロの構文はM式パーサーが認識する必要があるからです。