Есть ли в Лиспе какие-либо специальные функции, которые НЕ были приняты другими языками программирования?
Под Лиспом я подразумеваю все языки программирования Лисп в целом. Мне рассказали, как прекрасен Лисп, и я знаю, что многие языки были вдохновлены Лиспом. Но есть ли в Лиспе эксклюзивная функция дизайна, которую просто невозможно сделать ни на каком другом языке?
Причина, по которой я задал этот вопрос, заключается в том, что недавно, будучи программистом-любителем, я начал изучать Clojure просто для удовольствия, и в результате я нашел много постов и комментариев, связанных с Лиспом, говоря только одно: «Лисп уникален ", но другие современные языки программирования уже приняли и украли много идей из Lisp, таких как условные выражения, рекурсия и функции первоклассного гражданина. И даже метапрограммирование может быть сделано многими языками.
Я что-то упустил, и Лисп все еще другой?
Или мне повезло, потому что другие современные языки украли все хорошие части из Lisp, так что нет необходимости копаться в скобках мира Lisp , и "Lisp был другим".
Ответы:
Каноническая ссылка на этот тип вопроса - « Что отличало Лисп от Пола» . Согласно этой статье на момент ее написания, две оставшиеся ключевые функции Lisp, которые не были широко доступны:
Комментарий обращается к каждой точке и называет популярные языки, где эта функция доступна.
Обратите внимание, что эта статья была в последний раз пересмотрена в 2002 году, и за последние 11 лет появилось большое количество новых языков, некоторые из которых могут включать все эти функции Lisp в свой дизайн.
источник
eval
или похожи, и многие могут выполнять метапрограммирование, например, Haskell Template Haskell. (Возможно) уникальная вещь в Lisp заключается в том, что представление данных, кода и метакода одинаково - не только в синтаксисе, но и в действительности одно и то же.На этот вопрос сложно ответить, так как кто-то должен был бы знать все языки, чтобы знать, что ни у кого другого нет особой функции, доступной в Лиспе, поэтому следующее основано на языках, с которыми я имею опыт работы.
Сверх того, условия - это то, чего я не видел ни на одном другом языке. Подумайте об «исключениях», но в тех случаях, когда стек вызовов не разматывается, и когда вызывающая сторона может отправлять значение восстановления на сайт исключений, но не нарушая стек вызовов между обработчиком и источником исключения. Если честно, это на самом деле просто специальное применение продолжений, поэтому Ruby и Scheme (по крайней мере) могут это сделать.
Макросистема Лиспа извлекает выгоду из регулярности / гомоиконичности, но Scala планирует включить их в качестве стабильной функции в 2.12, и Template Haskell претендует на аналогичные функции. Я бы сказал, что они будут более сложными по синтаксису, чем с Lisp, но генерация кода во время компиляции существует независимо.
Если задуматься, то прямое построение форм - это всего лишь один вид макросов, доступных в Лиспе: я не видел ни одного эквивалента макросов компилятора или читателя где-либо еще.
Способность некоторых диалектов (например, SBCL ) сохранять законченный, восстанавливаемый образ процесса - это круто, но, опять же, это не уникально: Smalltalk делал это десятилетиями.
Многие другие языки допускают деструктуризацию присваивания при возврате массивов, но подход # 'values и #' множественные-значения-привязки / let-values по-прежнему специфичен для Common Lisp и Scheme (которые все еще могут выполнять «обычную» деструктуризацию). ). 'Wantarray' в Perl позволяет функции определять, вызывается ли она в скалярном, списочном или пустом контексте, поэтому она может корректировать свое возвращаемое значение аналогичным (-ish) способом, но я не видел "истинных" множественных возвращаемых значений вне Схемы / кл.
Что касается языковых возможностей, то, вероятно, Лисп не так много может сделать, чего не могут другие языки (полнота Тьюринга - это то, чем он является). Что это , однако, является языком , где код выражается в терминах своих собственных структур данных, что делает большую идею ™ -Вот коды данных то , что относительно легко работать.
источник
После стольких десятилетий я не думаю, что в Lisp есть что-то эксклюзивное. Но даже сегодня есть много интересных вещей, которые трудно найти за пределами Лиспа. Несколько вещей, которые приходят на ум:
Наконец, у Lisp можно многому научиться, но не о самом языке, а о том, что стало частью истории Lisp и затерялось во времени. Например INTERLISP, Symbolics Роды и т.д ... если вы никогда не кладите руки на Роды, увидеть эту comp.lang.lisp нить , где Кент Питмэн описывает , как «Emacs является лишь бледной тенью Zmacs Роды в» - который все обеспечиваемых имея мощную систему Lisp, частью которой был Zmacs, которая работала на машине Lisp.
источник
Это не обязательно определенная особенность . Это весь внешний вид и то, как определенные наборы функций работают вместе.
JavaScript или Java имеют много функций Lisp (виртуальная машина, компилятор / оценщик, сборщик мусора и т. Д.). Но, например, в JavaScript отсутствует часть символьного программирования, ему не хватает математических возможностей (внутренне он имеет только плавающие значения), ему не хватает обработки ошибок и т. Д.
Многие системы Common Lisp оптимизированы для способа разработки, при котором каждый постепенно расширяет новое программное обеспечение, расширяя язык Lisp в различных измерениях, используя различные методы метапрограммирования - без перезапуска программного обеспечения в течение длительного времени. Таким образом, он должен быть гибким и расширяемым, но в то же время он должен быть надежным. Изменение языка (макросы - это, по сути, способ расширения компилятора для пользователя) без сбоя программы.
Теперь что-то вроде JavaScript также используется для расширения программы, обычно это веб-браузер. Но большую часть времени никто не занимается метапрограммированием на JavaScript - кроме некоторого хакерства ООП .
Пример:
Можно реализовать общее продвинутое математическое программное обеспечение для области компьютерной алгебры в основном двумя способами: написать движок на C со специализированным языком наверху (например, Mathematica ) или на более продвинутом диалекте Lisp. Macsyma / Maxima в Common Lisp, Сокращение в Standard Lisp, Аксиома в Common Lisp.
(Есть также один или несколько написано на Python.)
Существует не так много систем, которые предлагают набор функций чего-то вроде Axiom , который работает поверх Common Lisp.
Что делает Лисп привлекательным для приложений такого типа, так это сочетание функций: продвинутых базовых математических функций (bignums, ratios, ...), символьных вычислений, интерактивного компилятора и т. Д. Вполне возможно получить эти вещи, реализовав их в Уровень языка. Таким образом, будет реализовано 50% или более типичной системы Lisp.
источник
Не настолько, насколько я знаю. Forth легко так же динамичен, как Lisp, возможно, тем более, поскольку динамический код в Forth выглядит как обычный код Forth, в то время как макросы Lisp, как правило, используют функции, отличные от обычного кода Lisp ( по крайней мере, в Clojure я никогда не использовал синтаксические кавычки вне макроса) и в результате они выглядят действительно отличающимися от обычного кода на Лиспе. В качестве примера того, насколько динамичен Forth, вот способ реализации комментариев в Forth :
источник
Лисп имеет много диалектов, и каждый из них имеет свой набор функций. Моя любимая особенность, которая вряд ли будет принята на любом другом языке - это «стек спагетти» от Interlisp .
Стек спагетти похож на укупорку, но на стероидах. Он сохраняет не только текущую функцию, но и весь контекст до верха стека. Что-то вроде подпрограммы , за исключением того, что вы можете создавать их произвольно, что приводит к иерархии стековых контекстов.
источник