Почему большинство языков S-выражения с динамическим контролем типов?

Каким образом большинство Шепелявит, и Схемы с динамическим контролем типов? Разве статический контроль типов не смешивается с некоторыми их типичными функциями?

25
задан keiter 1 June 2010 в 20:38
поделиться

3 ответа

Типизацию и s-выражения можно заставить работать вместе, см. типизированную схему .

Отчасти это историческое совпадение, что языки s-выражений динамически типизируются. Эти языки, как правило, больше полагаются на макросы , а простота синтаксического анализа и сопоставления с образцом в s-выражениях значительно упрощает обработку макросов. Большинство исследований сложных макросов проводится на языках s-выражений.

Типизированные гигиенические макросы сложны.

16
ответ дан 28 November 2019 в 21:32
поделиться

Когда Лисп был изобретен в 1958-1960 годах, он привнес много особенностей как в язык, так и в реализацию (сборка мусора, самодостаточный компилятор, ...). Некоторые возможности были унаследованы (с некоторыми улучшениями) от других языков (обработка списков, ...). Язык реализовал вычисления с помощью функций. s-выражения были скорее деталью реализации (в то время), чем особенностью языка. Система типов не была частью языка. Использование языка в интерактивном режиме также было одной из ранних особенностей реализации.

В то время еще не были изобретены полезные системы типов для функциональных языков. До сегодняшнего дня также относительно сложно использовать статически типизированные языки в интерактивном режиме. Существует много реализаций статически типизированных языков, которые также предоставляют некоторый интерактивный интерфейс - но в основном они не предлагают такого же уровня поддержки интерактивного использования, как типичная система Лисп. Программирование в интерактивной системе Lisp означает, что многие вещи могут быть изменены на лету, и может быть проблематично, если изменения типа должны распространяться через целые программы и данные в такой интерактивной системе Lisp. обратите внимание, что некоторые схемотехники имеют другой взгляд на эти вещи. R6RS - это в основном пакетный язык, в общем, не очень-то в духе Лиспа...

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

13
ответ дан 28 November 2019 в 21:32
поделиться

Статическая типизация является лексической, это означает, что вся информация о типах может быть выведена из чтения исходного кода без оценки каких-либо выражений или вычисления каких-либо вещей, наиболее важными здесь являются условия. Язык со статической типизацией разработан таким образом, что это может произойти, лучшим термином было бы "лексически типизированный", т.е. компилятор может доказать, читая исходный текст, что ошибок типа не произойдет.

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

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

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

Поэтому я осмелюсь сказать, что это полностью и абсолютно неосуществимо.

5
ответ дан 28 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

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