静的な型チェックを行う言語 (Java など) と、コードがデータである言語 (LISP など) の名前を教えてください。1 つの言語で両方のことを意味します。
6 に答える
Qi は静的に型付けされた Lisp 方言です。また、他の多くの Lisp 方言には (オプションの) 静的型付けがあります。
Java 自体には、この種の機能が非常に限られています。
興味深い問題は、メタプログラミングと静的型付けを使用できるかどうかではなく、動的メタプログラミングを静的にタイプセーフにすることができるかどうかです。
メタプログラミングを行い、タイプセーフなTemplate Haskell がありますが、それは静的なメタプログラミングです。
現時点では、動的メタプログラミングが可能であり、動的メタプログラミングが静的にタイプセーフであるという事実を知っている言語は考えられません。気はそれを行うことができるかもしれませんが、私にはわかりません。
Racket (以前の PLT Scheme) には静的に型付けされた方言があり、Scheme のイディオム (マクロを含む) とうまく連携するように設計されています。(展開結果を型チェックすることで機能します。)
テンプレート Haskellは静的に型付けされますが、コードをデータとして操作することができます (メタプログラミングとも呼ばれます) 。関連する言語には、MetaML と MetaOCaml があります。ティム・シェアードの作品を調べてください。
F# にはQuotation 式があります。MSDN ページから:
// typed
let e : Expr<int> = <@ 1 + 1 @>
// untyped
let e' : Expr = <@@ 1 + 1 @@>
// splicing with %
// similar to Lisp's unquote-splicing, but type-checked:
// you can only splice expressions of the appropriate type
<@ 1 + %e @>
これらはC#で使えると思いますが、(1)構文が何なのかわかりません(2)データ構造が違います。
これらの言語では、Lisp マクロのように、コンパイル時にコードをデータとして使用できます。
- Haskell にはTemplate Haskellがあります。
- Boo にはマクロがあります。
- O'Caml には、洗練されたプリプロセッサであるcamlp5があります。
免責事項: 私は実際にこれらのいずれも使用していません。私の知る限り、それらはすべて Lisp のものよりもはるかに複雑ですquote
。
ただし、「データとしてのコード」の使用の 90% はquote
クロージャーで達成できます。これは、クロージャーも評価を遅らせるためです。多くの言語には、クロージャーを作成するための便利な構文があり (C#、Clojure、Scala、Ruby が特に思い浮かびます)、quote
それほど多くは必要ありません。決定的なLispであるSchemeでさえ、一般的なスタイルはマクロを書くことよりも関数を渡すことを好む。
静的に型付けされた言語でコードを動的に実行する機能を単に探している場合は、Java 自体でそれを行うことができます。
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
それ以上のものが必要な場合 (メソッドやクラスをファーストクラス オブジェクトとして使用する場合など)、代わりに Haskell や C# などを使用することをお勧めします (他の回答で述べたように)。
たぶん、 StrongtalkまたはZeroは、 Smalltalk の反射システムですが、静的に型付けされます。