Можете ли вы назвать языки с проверкой статического типа (например, Java) и где код - это данные (например, в LISP)? Я имею в виду обе вещи на одном языке.
Знаете ли вы язык с проверкой статического типа, где Code является данными?
Ответ 1
Qi - это статически типизированный диалект Lisp. Кроме того, многие другие диалоги Lisp имеют (необязательный) статический ввод.
Сама Java имеет очень ограниченные возможности такого рода.
Интересный вопрос заключается не столько в том, можно ли метапрограммировать и статично печатать, будь то динамическое метапрограммирование может быть статически безопасным по типу.
Существует шаблон Haskell, который выполняет метапрограммирование и безопасен по типу, но это статическое метапрограммирование.
В настоящий момент я не могу представить ни одного языка, который, как я знаю, позволяет динамически метапрограммировать и динамическое метапрограммирование статически безопасно. Ци, возможно, будет кипеть, чтобы сделать это, но я не уверен.
Ответ 2
Racket (ранее PLT-схема) имеет статически типичный диалект, который предназначен для работы с идиомами Scheme - включая макросы. (Он работает по типу проверки результатов расширения.)
Ответ 3
F # имеет Котировочные выражения. На странице MSDN:
// typed
let e : Expr<int> = <@ 1 + 1 @>
// untyped
let e' : Expr = <@@ 1 + 1 @@>
// splicing with %
// similar to Lisp unquote-splicing, but type-checked:
// you can only splice expressions of the appropriate type
<@ 1 + %e @>
Я думаю, что они доступны в С#, но (1) я не знаю, что такое синтаксис (2) структуры данных разные.
Эти языки позволяют использовать код как данные во время компиляции, например макросы Lisp:
- Haskell имеет Шаблон Haskell.
- Boo имеет macros.
- O'Caml имеет camlp5, который представляет собой сложный препроцессор.
Отказ от ответственности: я действительно не использовал ни одного из них. Насколько мне известно, все они намного сложнее, чем Lisp quote
.
Однако 90% данных "Код как данные" с использованием quote
может быть выполнено с помощью закрытий, поскольку они также задерживают оценку. Многие языки имеют удобный синтаксис для закрытия (С#, Clojure, Scala и Ruby особенно приходят на ум) и не нуждаются в quote
. Даже в Scheme, который является окончательным Lisp, преобладающий стиль способствует передаче функций над написанием макросов.
Ответ 4
Шаблон Haskell является статически типизированным, но позволяет вам манипулировать кодом как данные, так называемое метапрограммирование. Связанные языки включают MetaML и MetaOCaml. Посмотрите работу Тима Шейра.
Ответ 5
Если вы просто ищете возможность динамического выполнения кода на статически типизированном языке, то сама Java может это сделать:
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
Если вам нужно больше (нужны методы и классы как объекты первого класса и т.д.), тогда вы захотите использовать что-то вроде Haskell или С# (как упоминалось в других ответах).
Ответ 6
Возможно Strongtalk или Zero, которые являются отражающими системы a la Smalltalk, но статически типизированы.