Почему большинство языков S-Expression динамически типизируются? - PullRequest
24 голосов
/ 02 июня 2010

Почему большинство Лиспов и Схем имеют динамическую типизацию? Разве статическая типизация не смешивается с некоторыми из их общих особенностей?

Ответы [ 3 ]

15 голосов
/ 02 июня 2010

Печатание и s-выражения можно заставить работать вместе, см. набранная схема .

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

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

13 голосов
/ 02 июня 2010

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

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

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

5 голосов
/ 09 июня 2010

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

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

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

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

Так что я смею сказать, что это совершенно и совершенно невозможно реализовать.

...