@avadakeda

Существует ли статически типизированный гомоиконный язык программирования?

Интересуют языки с богатой и развитой экосистемой, например основанные на JVM, .NET или javascript. Мне понравился язык Julia, но там не настоящая типизация, т.е. не на этапе написания делаются проверки. Единственный такой язык, который я смог найти - Typed Racket, но там маленькая экосистема.

Если других языков не найти, то можно ли самому разработать версию популярного статически типизированного языка со свойством homoiconic, для меня важно чтобы код можно было представлять как данные и наоборот, данные как код. Какой популярный статически типизованный язык тогда проще будет модифицировать?
  • Вопрос задан
  • 260 просмотров
Пригласить эксперта
Ответы на вопрос 4
xez
@xez
TL Junior Roo
В статье, которую вы сами и приводите, указан Clojure.

https://clojure.org/
https://ru.wikipedia.org/wiki/Clojure
https://clojurecourse.by/
Ответ написан
В F# и Scala есть возможность сохранить AST в переменную.
Ответ написан
Комментировать
gdt
@gdt
Программист
Найдите какой-нибудь список и пройдитесь по нему, проверьте каждый язык на поддержку того, что вам нужно. Я нашёл вот такой:
rnxb-rpqv11edjmdnkckpnlpuzk.png
Ответ написан
mikhanoid
@mikhanoid
Компилятор или интерпретатор любого языка представляет код, как данные, в процессе обработки. Но не всегда эти данные доступны программисту для свободной работы с ними. Гомоиконность означает всего лишь то, что код и данные "выглядят" одинаково. Поэтому, вопрос: вам для чего гомоиконность?

Если, чтобы была, тогда надо смотреть на языки семейства Lisp. Если для практических каких-то целей, вроде написания макросов, то можно смотреть на Rust, Haskell или Scala, в которых такие возможности есть в некотором виде, или на любой другой язык программирования и думать, как вытащить представление кода на этапе компиляции для программиста. Не такая простая задача для классического статически типизированного языка, потому что надо как-то убеждаться, что преобразования кода не сломают типы.

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

Julia примерно так и устроен. Компилятор является частью среды исполнения, поэтому сложно сказать, статическая типизация у Julia или нет. В любом случае, скомпилированный код работает быстро, порой даже быстрее аналогичного кода на Си.

Typed Racket сделан поверх Racket, как набор макросов, и система типов там не обычная, а occurence typing - намного более сложная штука, чем традиционные системы статической типизации. Есть ещё Typed Clojure, сделанный по мотивам Typed Scheme, которая тоже из этой категории.

Наконец, есть относительно сырой, но относительно работоспособный Lisp со статической типизацией: carp-lang. В котором тоже приходится, фактически, иметь два языка: динамический язык для работы с макросами, и статический основной язык. Выглядят они одинаково, но семантика разная.

Может быть, Вы что-нибудь придумаете на этот счёт. Удачи в изысканиях!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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