Подтвердить что ты не робот

Знаете ли вы язык с проверкой статического типа, где Code является данными?

Можете ли вы назвать языки с проверкой статического типа (например, Java) и где код - это данные (например, в LISP)? Я имею в виду обе вещи на одном языке.

4b9b3361

Ответ 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, но статически типизированы.