Я стараюсь учить себя новому языку программирования через равные промежутки времени. Недавно я прочитал, что Lisp и его диалекты находятся на совершенно противоположном конце спектра от языков, подобных C / C ++, что сделало меня достаточно любопытным, чтобы узнать больше об этом. Однако мне неясны две вещи, и я ищу рекомендации по ним:
LISP все еще практикуется / используется в современном мире, или это унаследованный язык, такой как FORTRAN / COBOL? Я имею в виду, помимо поддержки существующего кода, он вообще используется в новых проектах?
Какой диалект наиболее широко используется? Я встретил Scheme и Common Lisp как два самых распространенных диалекта и хотел узнать ваше мнение о том, какой из них наиболее предпочтительный / полезный для изучения - и был бы очень рад, если бы вы могли предложить любые ресурсы для начинающего ранга.
Желая выучить язык, который принципиально отличается от процедурных языков, к которым я привык, я не хочу вкладывать чрезмерные усилия во что-то, если оно полностью устарело - я бы все равно выучил его, если бы он был профессионально «мертвым», но только с академической точки зрения ...
Ответы:
Мне скорее нравится Scheme, если вы хотите работать с JVM, вы должны проверить Clojure, который является списком, предназначенным для работы в JVM. И да, Лисп все еще стоит научиться видеть, насколько мощным может быть такой минимальный дизайн! Люди, которые создали LISP, правильно поняли некоторые вещи. Удивительно, как много классных новых возможностей современных языков появилось в 1960-х годах!
Для встроенной схемы попробуйте guile: http://www.gnu.org/s/guile/
источник
В ответ на вопрос 2 «Наиболее широко используемый диалект»:
Зависит от того, как вы интерпретируете «Наиболее широко используемый». Вот некоторая салфетка математика для нижних оценок на сколько использования каждые из нескольких выбранных диалектов получить.
Написан самый сырой код
Победитель: Схема или Общий Лисп. Слишком много неизвестных.
Самый производственный код
Победитель: Я предполагаю, что Common Lisp . Я думаю, что мы можем ответить «Да» на вопрос 1, основываясь на использовании Common Lisp и Clojure.
Большинство конечных пользователей
Победитель: Схема имеет лучший нижнюю границу здесь, так как есть цифры продаж на Uncharted, но это весьма спорно.
Заключение
В заключение я нахожу, что большие яблоки.
источник
Да, это так, но вы должны знать, где искать. Люди, которые используют LISP, обычно не кричат об этом слишком громко, но есть несколько примеров того, как несколько высококлассных стартапов использовали его с большим эффектом за последние 20 лет. Он также очень популярен среди небольших компаний в Европе.
Это правильный вопрос, но на него нелегко ответить. Это также может быть не очень полезным, чтобы ответить: многие реализации имеют конкретную направленность, поэтому их лучше выбирать, если они соответствуют вашей конкретной проблеме, а не исходя из того, насколько широко она используется иным образом. Вместо этого я расскажу вам немного о ваших возможностях, и вы сами решите.
LISP - это семейство языков, и каждый из этих языков имеет семейство диалектов и реализаций. В широком смысле диалекты делятся на два лагеря «LISPs» и «Schemes».
LISP: до недавнего времени Common LISP был королем. Это была попытка объединить все разрозненные LISP и, не будучи недобрым, была "C ++" LISP. То есть это был ОГРОМНЫЙ язык. Там было все. За последние несколько лет появился Clojure. Clojure - это LISP, который работает на виртуальной машине Java и пытается внедрить себя в философию функционального программирования. Традиционно, другие LISP были строго мультипарадигмы. Clojure интересен тем, что получает как самые лучшие, так и самые худшие результаты как для LISP, так и для JVM. Все еще много подробностей языков на основе Java, и они были довольно бесплатны и просты с синтаксисом, так что у него есть множество кнопок и кнопок для разных вещей, но у них есть некоторые действительноинтересные идеи вокруг типов данных, особенно некоторые из практических способов, которые они придумали для применения идей из функционального программирования.
Схемы: Схемы являются строгим подмножеством LISP. Схема была изобретена Стилом и Суссманом и в молодости отличалась тем, что использовалась в курсе лекций MIT Computing 101. Схема определена в «Пересмотренном отчете по алгоритмической языковой схеме (RnRS)». Да, у них там есть математическая шутка. Схема является стандартизированным языком в отличие от других LISP. Это очень помогает в переносимости между реализациями, но это не серебряная пуля. Усилия по стандартизации имели тенденцию быть консервативными, а инновации в реализациях, особенно в таких вещах, как модули, имели тенденцию быть разрозненными. Существует также ряд SRFI (запросов схемы для реализации), которые аналогичны процессу RFC IETF. Люди используют его, чтобы стандартизировать мелочи по мере необходимости.
Схемы отличаются от LISP тем, что у них есть набор жестких требований, которым они должны удовлетворять, одним из которых является «оптимизация хвостового вызова», которая помогает сделать рекурсию эффективной. Следовательно, рекурсивные стили программирования гораздо более популярны в Scheme, чем в LISP. Схема, также, не будучи недоброй, как "C" LISP. То есть это небольшие языки, и вы должны иметь возможность хранить все это в своей голове сразу.
В настоящее время существует два семейства схем: основанные на 5-й версии (R5RS) и основанные на 6-й версии (R6RS). Сложность R6RS была значительно выше, чем у любого из его предшественников, и поэтому многие реализации R5RS решили его пропустить, надеясь, что R7RS будет больше похож на R5RS, чем R6RS. Процесс стандартизации R7RS в настоящее время продолжается и попытался включить как желания разработчиков R5RS, так и желания людей R6RS, стандартизировав небольшой базовый язык в их первой рабочей группе, а затем поручив вторую рабочую группу стандартизировать более крупные функции. Это позволит языку иметь эффективные и полезные реализации как на крошечном встроенном оборудовании, так и на более мощных машинах.
Теперь я буду более конкретным:
PicoLisp - это действительно классный LISP. Это крошечный! Автор написал это для себя, и, насколько я понимаю, он зарабатывает на жизнь этим с 1980-х годов. Если вам когда-нибудь удастся посетить его выступление, вам следует сделать это: он действительно интересен и действительно знает свое дело, и вы не услышите ни малейшего нюха мейнстрима или скучного.
Я не знаком с реализациями Common Lisp, поэтому я не буду комментировать их дальше.
Guile - это официальная схема GNU.
Racket - это схема R6RS, но в последнее время она, похоже, расширила сеть и пытается «служить платформой для создания, проектирования и реализации языка».
Цыпленок стремится быть практической схемой. Он основан на R5RS и компилируется до C. Это оказывается действительно очень важным преимуществом, поскольку делает использование тривиальных библиотек C абсолютно тривиальным. Поэтому Chicken, вероятно, является наиболее полезной схемой для замены Perl, Python, Ruby и т. Д. В качестве повседневного языка сценариев. Есть несколько человек, которые использовали его исключительно для всех своих нужд в течение нескольких лет. Он имеет интерактивный REPL, а также компилятор. Сообщество (как в списке рассылки, так и в IRC) хорошо осведомлено, дружелюбно и полезно.
Ищите реализацию с большим количеством модулей: это показывает, что она широко применима и означает, что у нее, вероятно, есть что-то, что поможет в решении поставленной задачи.
Ищите реализацию с компилятором или, по крайней мере, что-то, не основанное исключительно на IDE или REPL. Многие реализации, предназначенные для обучения, очень сложно использовать для сценариев общего назначения.
Я бы порекомендовал курицу, так как это то, что я использую. Я использовал это в своих личных проектах, и я использовал это (и в настоящее время использую это) профессионально.
Схема не профессионально мертва, но вам, возможно, придется пойти на все, чтобы использовать ее в этом контексте. Что-то вроде Chicken - это нечто большее, чем просто академическое занятие, и оно может легко охватить практически все основы языков высокого уровня, которые вы используете в настоящее время.
источник
На самом деле не могу говорить за все Лиспс, но Clojure - определенно горячий и актуальный язык в настоящее время. В лондонской группе пользователей Clojure, в которую я ходил ранее на этой неделе, было более 100 участников ....
Я нашел, что это был очень поучительный опыт изучения Lisp в форме Clojure за последний год (после большого опыта работы с Java и C #). Основными причинами этого являются:
Это также представляется практическим выбором для реального использования по следующим причинам:
Я лично знаю людей, использующих Clojure в паре инвестиционных банков и стартапов. Я также выбрал Clojure в качестве основного языка разработки для своего собственного стартапа, так что я готов положить свои деньги туда, где я говорю :-)
источник
В настоящее время я также изучаю Lisp (и мне это нравится). Я использую Common Lisp, но я также возился с SBCL , Arc (обратите внимание, что это версия Lisp Пола Грэма, которая, как упомянул Витор Брага, создал магазин Yahoo / Viaweb) и Allegro CL, которая похожа на Visual Studio для Lisp (может создавать графические интерфейсы, однако, я никогда не использовал его).
Что касается использования, Lisp часто использовался в искусственном интеллекте, но я буду честен, я не уверен, сколько других «общих» применений для Lisp. Многие веб-сайты, которые были созданы в Лиспе, изначально были переписаны на других языках, поэтому трудно сказать, что он используется в веб-разработке (не говоря уже о том, что это не так, но более крупные сайты, которые его используют, больше не делают ). После быстрого поиска (очень быстрого) вот список программного обеспечения, написанного на Common Lisp из Википедии .
[РЕДАКТИРОВАТЬ] Что касается профессионального использования Lisp, есть рабочие места, которые позволят вам использовать Lisp. Их не так много, как, скажем, Java или C #, но они существуют. Я думаю, что Lisp - один из тех языков, который используется для внутренних приложений и может дать конкурентное преимущество, от которого компании не хотят отказываться, рекламируя, что они используют Lisp. Я помню, как увидел пост на P.SE, в котором говорилось, что Smalltalk похож на финансовую арену.
Кроме того, возможность показать, что вы способны изучать различные парадигмы, может открыть больше дверей, даже если вы не используете Лисп в своей работе.
[/РЕДАКТИРОВАТЬ]
источник
Если вы хотите изучать Lisp сегодня, я бы посмотрел на любую ракетку, которая представляет собой быструю реализацию схемы (ну, на самом деле она немного отошла от схемы, так что теперь это ее собственный диалект), или clojure, которая извлекает выгоду из JVM, на которой он работает (таким образом, доступны десятки миллиардов библиотек, плюс вы можете заставить его взаимодействовать с вашим собственным кодом Java).
Даже если вы не научитесь использовать его на самом деле, изучение его всегда полезно: вы изучаете новые способы думать и решать проблемы, даже на других языках, как только вы на некоторое время сосредоточились на Лиспе.
источник
Значительная часть бэкэнда Amazon раньше была на Лиспе, но теперь была переписана на C ++, или я так слышал (должен признать, у меня нет надежного источника для этого).
Yahoo! Stores - один из классических примеров веб-приложений Lisp. От Yahoo! Магазины славы вы, возможно, слышали о Пол Грэм . Грэм является одним из самых известных сторонников Лиспа и подробно пишет на эту тему. Вы могли бы хотеть прочитать его сайт, чтобы знать его пункты.
AutoCAD имел обыкновение иметь диалект Lisp для своей макросистемы. Я не знаю, так ли это до сих пор.
Схема это чистый язык и очень элегантная. Вероятно, это мой любимый язык программирования, поэтому я могу быть предвзятым. Если бы я собирался написать прямо сейчас основное приложение, я бы, вероятно, написал скелетное приложение на C, расширил бы и определил бизнес-правила в Scheme. Это позволяет мне использовать Scheme и использовать C - для скорости и для полной доступности библиотек практически для всего.
источник
Я знаю нескольких парней, которые делают Lisps в некоторых стартапах в Силиконовой долине, и я знаю, что Amazon.com использует Lisp с самого начала (хотя я слышал, что они почему-то заменяют его на C ++?)
Но одной компанией, за которой нужно следить, является Naughty Dog . Все их игры написаны на диалекте Лисп. Первоначально они катились самостоятельно, но они используют MZScheme в серии Uncharted.
Держу пари, что Common Lisp, Clojure, Scheme и Emacs Lisp являются четырьмя наиболее широко используемыми диалектами, и я подозреваю, что Scheme является наиболее распространенным. У меня нет ничего, чтобы подтвердить это, конечно. :)
Я предпочитаю SICP и Little Schemer, как предлагали другие, но я бы также предложил Land of Lisp , что довольно интересное чтение. :)
источник
Я думаю, что это частично зависит от того, что вы хотите с ним сделать - если вы хотите углубить свое понимание различных концепций программирования и сделать себя лучшим программистом, то я бы сказал, что стоит изучить хотя бы немного Lisp. Если вы ищете еще один язык для добавления в свое резюме, чтобы получить работу с этим языком, вы, вероятно, захотите поискать в другом месте. Там не так много рабочих мест на Лиспе.
Лично я пытаюсь использовать SBCL или, в последнее время, Clojure (и некоторые Emacs Lisp, но htat потому, что я длительный пользователь Emacs - я бы попытался изучить Emacs Lisp, когда я пытаюсь изучить Lisp). Теперь все, что мне нужно сделать, - это найти время, чтобы поиграть с этими языками ...
источник
Я не знаю, что есть много рабочих мест в LISP, я, конечно, не могу их видеть. Но я помню, как долгое время читал о каком-то зонде НАСА, где они запускали LISP и могли вставлять новый код с Земли.
Также в Нью-Йорке огромная группа встреч. Я предполагаю, что если вам интересно и вы пойдете в свою группу встречи clojure, вы можете найти возможности пообщаться и найти работу (не рабочие места clojure, а такие вещи, как Java / C ++ / etc.). В нью-йоркском районе это кажется огромным, другие районы могут отличаться.
Также LISP - это другой способ мышления. Кроме того, LISP и SQL приводят к использованию множества вложенных выражений. Я использовал SQL тонну, а затем заметил, что LISP имеет больше смысла. Но если у вас возникнут проблемы с привыканием SQL к супер вложенным скобкам и выражениям при использовании LISP, то, вероятно, значительно упростит понимание выражений SQL.
Классический пример - как реализовать MAX (a, b, c). Вы можете сделать замысловатую функцию с кучей операторов if. Или вы могли бы просто сказать
МАКС (МАКС (а, б), в)
и использовать два простых вложенных вызова из двух элементов MAX, которые для меня легче читать. Хотя, если производительность является проблемой, вы можете захотеть сделать это и другим способом, я не стал подсчитывать количество сравнений при использовании каждого метода ... Также, если вы реализуете MAX с помощью макроса C или другого метода, который оценивает выражения несколько раз, вы можете не получить ожидаемый результат, так как выражение может оцениваться несколько раз, так что следите за побочными эффектами ...
источник
MAX(MAX(a b) c)
Два дополнительных пункта:
Во-первых, Lisp - отличный язык для написания кода, в котором взаимодействия между функциями или данными часто бывают сложными. Во многих популярных языках, если вы не понимаете, почему ваша программа делает то, что делает, вы должны написать специальные функции, которые позволят вам исследовать внутреннее состояние программы по мере ее продвижения. На некоторых языках вам придется ждать, пока ваш код перекомпилируется. Конечно, могут быть такие инструменты, как отладчики, которые помогают с этим. Однако в Лиспе все, что вам нужно, это способ остановить программу, и тогда, как правило, у вас есть доступ ко всему в Лиспе. В Common Lisp иногда я просто набираю ^ C или вызываю
error
в одну функцию (это единственная вещь, которая должна быть перекомпилирована, и вам не нужно ничего делать, чтобы перекомпилировать ее). Как только я остановил программу, меня сразу же бросили в отладчик - но отладчик дает мне все возможности Lisp, и я могу выйти из отладчика, вызвать определенные функции и т. Д. Я легко могу исследовать любую из структур данных в моей программе. Большинство схем должны разрешать подобные практики. Lisp не уникален в этом отношении, но то, что он предлагает, выходит за рамки того, что предлагают многие популярные языки.Второе: если вы собираетесь экспериментировать с любым диалектом Лиспа, я бы не сделал этого без (а) использования редактора, соответствующего скобкам, и (б) изучения правильного отступа в Лиспе. Было бы неплохо использовать редактор, который также приблизит вас к правильному отступу. Форматирование кода в стиле C / C ++ / Java разработано для языков с меньшим количеством скобок / скобок / скобок, чем в Lisp. Прекрасный стиль печати Lisp работает хорошо, как только вы его освоите, и вы не запутаетесь в скобках и не тратите половину своего пространства, помещая по одной закрывающей скобке на строку.
источник
Прямо сейчас у меня складывается впечатление, что Lisp в основном используется в консалтинговых магазинах (не то, что консалтинговые магазины используют его в основном).
Это считается немного неприличным для практического программного обеспечения. В основном потому, что люди к этому не привыкли.
Традиционно Scheme является довольно академическим диалектом Lisp, а Common Lisp был отраслевым диалектом.
Lisp особенно полезен для символических манипуляций и возможностей отражения.
В качестве примера, код, который я написал для изучения Lisp, был программой, которая создавала случайные лямбда-функции, оценивала их, а затем оперировала ими, пытаясь минимизировать разницу функции с целевой функцией. Все это было прямым манипулированием. В таком языке, как C ++ или Java, мне пришлось бы изобрести представление для функций, которыми компьютер будет манипулировать.
источник
Я хотел бы добавить некоторые соображения о Common Lisp и Scheme. Я избежал замыкания из-за JVM, поэтому у меня нет особой перспективы.
Схема - это красивый лаконичный, четко определенный язык. Он принял много решений, которые CL должен был принять из-за унаследованного, и использовал более чистый подход. Например, переменные и функции находятся в одном пространстве имен. Язык по умолчанию меньше и более лаконичен, что хорошо подходит для обучения тем вещам, в которых хорошо работает lisp, например, он требует использования рекурсии вместо итерации, поскольку по умолчанию он не имеет итерационных циклов и требует оптимизации хвостовых вызовов , Схема имеет очень интересную гигиеническую макросистему, которая имеет большое значение для обучения. Но IMO, я бы рекомендовал сначала изучить негигиенические макросы в стиле CL, из которых большинство (?) Диалектов схемы предлагают хотя бы одну реализацию, даже если это не является частью спецификации. Поскольку кажется, что вы хотите выучить язык ради обучения, я
Сказав это, сообщество Scheme фрагментировано, и, за исключением нескольких небольших карманов, кажется, в основном посвящено исследованиям по выполнению реальной работы ... Например, каждый диалект имеет свой собственный менеджер пакетов, и пакеты чаще всего не переносимы через диалекты, что является огромной проблемой в сообществе схемы.
Common Lisp, с другой стороны, кажется гораздо более прагматичным подходом к разработке языка. Стандарт таков, что многие lisp-коды переносимы между реализациями, многие компиляторы работают быстро и хорошо оптимизированы. Существует большой набор пакетов, многие из которых переносимы между реализациями. И, похоже, на языке создается (сравнительно) большое количество реальных продуктов. И, скажем, quicklisp, это управление пакетами чувствует себя довольно близко к тому, что вы получили бы в современном сообществе, как, например, Ruby или Node. CL, однако, не лишен недостатков, на данный момент имеет очень большую спецификацию по сравнению со схемой, и даже объектная система CLOS, которая традиционно пишется как библиотека на Лиспсе, является частью спецификации IIRC. И вы можете чувствовать наследие, укоренившееся в большом количестве системы.
В противном случае я сказал, что не могу говорить о clojure, и Emacs Lisp, безусловно, является подходящим выбором, если ваша цель состоит в написании расширений Emacs, и, очевидно, не является подходящим выбором для другого программного обеспечения.
TLDR; Если ваша цель - учиться, я рекомендую Схему. Однако, если вы хотите создавать программное обеспечение, я бы порекомендовал Common Lisp из двух основных вариантов lisp.
источник
Я многому научился из ответов. Спасибо всем, кто внес свой вклад в этот поучительный разговор.
Я должен упомянуть newLISP . Хотя он немного отличается от CL и Scheme, он реализует много очень полезных функций. Я считаю, что http-сервер, функции многопроцессорной обработки (Cilk) и функции удаленной оценки очень чисты и просты в использовании.
Единственный исполняемый файл небольшой, быстрый и включает в себя множество классных батарей.
источник
Другим фактором, который следует учитывать при выборе диалекта языка Лисп, может быть количество и качество реализаций. Если у диалекта есть только одна или две реализации, то вы застряли с их недостатками, пока эти недостатки не будут исправлены, и всегда есть шанс, что люди перестанут совершенствовать реализацию. Само по себе это не причина не использовать диалект Lisp с одной реализацией, но это то, что нужно учитывать. Преимущество Scheme и Common Lisp в том, что существует множество реализаций этих диалектов. Оба языка имеют опубликованные стандарты, поэтому относительно недавние реализации, скорее всего, будут выполнять один и тот же код. Некоторые из этих реализаций существуют уже давно, но все еще находятся в стадии активной разработки: сейчас они являются высококачественными реализациями, и они все еще находятся в стадии совершенствования.
источник