あなたが話している本を読んでいないので、私は本当に推測していますが、SML関数のセットとしていくつかの言語のセマンティクスをエンコードする慣行について言及しているのではないかと思います. これにより、煩雑なフロントエンドおよびバックエンドのコンパイラーまたはインタープリターのアーティファクトをすべて実装する必要なく、実行可能な設定で言語のセマンティクスをすばやく簡単に試すことができます。例えば:
datatype value = Int of int
| String of string
datatype ast = Seq of ast * ast
| Print of ast
| Value of value
| Assign of string * ast
| Variable of string
fun value_printer (Int i) = print (Int.toString i)
| value_printer (String s) = print s
fun execute env (Seq (a, b)) = (execute env a; execute env b)
| execute env (Print a) = value_printer (execute env a)
| execute env (Value _) = ()
| execute env (Assign (s, a)) = ...
etc, etc.
基本的に、抽象構文ツリーを表すデータ型を定義してから、この AST で書き換えを実行する (または AST サブツリーをvalue
言語で値を表すデータ型に縮小する) 関数を定義します。
execute
関数が漠然と見慣れているように見える場合、それは教科書で見られるより伝統的なセマンティック定義に似ているためです。構文がおかしいだけです。
「ラピッド プロトタイピング」環境 (たまたま SML) から移動する必要なく、この設定で型チェッカー、静的解析、または最適化を構築するための実験を行うことができると想像できます。SML は、このような種類のタスクに非常に適しています。これが (私が思うに) あなたが読んだ本がこのアプローチを提案している理由です。