F # имеет цитатные выражения . Со страницы 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:
Заявление об ограничении ответственности: я действительно не использовал какие-либо из них. Насколько мне известно, все они намного сложнее, чем цитата из Lisp
.
Однако 90% «Код как данные» с использованием цитаты
могут быть выполнены с помощью замыканий, поскольку они также задерживают оценку. Многие языки имеют удобный синтаксис для создания замыканий (особенно приходят на ум C #, Clojure, Scala и Ruby), и они не нуждаются в цитате
. Даже в Scheme, который является окончательным Lisp, преобладающий стиль отдает предпочтение передаче функций над написанием макросов.
Ци - это статически типизированный диалект Лиспа. Кроме того, многие другие диалекты Lisp имеют (необязательно) статическую типизацию.
Сама Java имеет очень ограниченные возможности такого рода.
Интересный вопрос не столько в том, можете ли вы использовать метапрограммирование и статическую типизацию, сколько в том, можете ли вы сделать динамическое метапрограммирование статически типобезопасным .
Существует Template Haskell, который выполняет метапрограммирование, а является типобезопасным, но является статическим метапрограммированием.
На данный момент я не могу придумать ни одного языка, который я знаю на самом деле, допускающего динамическое метапрограммирование и , где динамическое метапрограммирование является статически типобезопасным. Ци может быть непростой задачей, но я не уверен.
Racket (ранее PLT Scheme) имеет статически типизированный диалект , который разработан для удобной работы с идиомами Scheme, включая макросы. (Он работает путем проверки типов результатов раскрытия.)
Шаблонный Haskell статически типизирован, но позволяет манипулировать кодом как данными, он же метапрограммирование. К родственным языкам относятся MetaML и MetaOCaml. Посмотрите работы Тима Ширда.
Если вы просто ищете возможность динамически выполнять код на языке со статической типизацией, то сама Java может это сделать:
http://www.javaworld.com/javaworld /jw-06-2006/jw-0612-dynamic.html
Если вам нужно больше (хотите, чтобы методы и классы были объектами первого класса и т. д.), тогда вы захотите использовать что-то вроде Haskell или C #. (как упоминалось в других ответах) вместо этого.
Возможно, Strongtalk или Zero, которые являются отражающей системой a la Smalltalk, но статически типированы.