Вы знаете о языке со Статическим Типом, проверяющим, где Кодом являются Данные? [закрытый]

17
задан Community 31 May 2014 в 15:35
поделиться

6 ответов

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, преобладающий стиль отдает предпочтение передаче функций над написанием макросов.

4
ответ дан 30 November 2019 в 12:13
поделиться

Ци - это статически типизированный диалект Лиспа. Кроме того, многие другие диалекты Lisp имеют (необязательно) статическую типизацию.

Сама Java имеет очень ограниченные возможности такого рода.

Интересный вопрос не столько в том, можете ли вы использовать метапрограммирование и статическую типизацию, сколько в том, можете ли вы сделать динамическое метапрограммирование статически типобезопасным .

Существует Template Haskell, который выполняет метапрограммирование, а является типобезопасным, но является статическим метапрограммированием.

На данный момент я не могу придумать ни одного языка, который я знаю на самом деле, допускающего динамическое метапрограммирование и , где динамическое метапрограммирование является статически типобезопасным. Ци может быть непростой задачей, но я не уверен.

14
ответ дан 30 November 2019 в 12:13
поделиться

Racket (ранее PLT Scheme) имеет статически типизированный диалект , который разработан для удобной работы с идиомами Scheme, включая макросы. (Он работает путем проверки типов результатов раскрытия.)

11
ответ дан 30 November 2019 в 12:13
поделиться

Шаблонный Haskell статически типизирован, но позволяет манипулировать кодом как данными, он же метапрограммирование. К родственным языкам относятся MetaML и MetaOCaml. Посмотрите работы Тима Ширда.

4
ответ дан 30 November 2019 в 12:13
поделиться

Если вы просто ищете возможность динамически выполнять код на языке со статической типизацией, то сама Java может это сделать:

http://www.javaworld.com/javaworld /jw-06-2006/jw-0612-dynamic.html

Если вам нужно больше (хотите, чтобы методы и классы были объектами первого класса и т. д.), тогда вы захотите использовать что-то вроде Haskell или C #. (как упоминалось в других ответах) вместо этого.

0
ответ дан 30 November 2019 в 12:13
поделиться

Возможно, Strongtalk или Zero, которые являются отражающей системой a la Smalltalk, но статически типированы.

0
ответ дан 30 November 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: