Зачем мне изучать Лисп? [закрыто]


125

Я действительно чувствую, что должен изучить Лисп, и есть много хороших ресурсов, которые помогут мне в этом.

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

Есть ли коммерческое приложение-убийца, написанное на Лиспе?


5
Трудно оттолкнуть то, чего нет.
Kaz

Прочтите резюме Филипа Гринспана . Он изобилует настоящей работой на Лиспе.
Kaz

1
Также здесь . Гринспан работал над моделированием сети с коммутацией пакетов, проектированием DSP, проектированием процессоров, компоновкой VLSI, автоматизацией машиностроения, автоматизацией землеройных работ и т.д. Он помогал разрабатывать архитектуру PA-RISC Hewlett Packard, используя инструменты, разработанные на Lisp-машине.
Kaz

Вот некоторые приложения, разработанные на Lisp - Emacs, G2, AutoCad, Igor Engraver и Yahoo Store
Arulx Z

Ответы:


55

Одно из основных применений Лиспа - это искусственный интеллект. Мой друг из колледжа прошел дипломный курс по искусственному интеллекту, и для своего основного проекта он написал решатель " Lights Out " на Lisp. В нескольких версиях его программы использовались несколько разные процедуры искусственного интеллекта, и тестирование на 40 или около того компьютерах дало неплохие результаты (хотелось бы, чтобы это было где-нибудь в Интернете, чтобы я мог ссылаться на него, но я не думаю, что это так).

Два семестра назад я использовал Scheme (язык, основанный на Lisp), чтобы написать интерактивную программу, которая имитировала подпрограмму Эббота и Костелло «Кто первым». Ввод от пользователя сопоставлялся с некоторыми довольно сложными структурами данных (напоминающими карты на других языках, но гораздо более гибкими), чтобы выбрать подходящий ответ. Я также написал процедуру для решения головоломки со слайдами 3x3 (алгоритм, который можно легко распространить на большие головоломки со слайдами).

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


5
Почему вы говорите, что Lisp хорош только для ИИ? Кроме того, это мультипарадигмальный язык. Функциональность - это только одна из нескольких парадигм, которые она позволяет.
Луис Оливейра,

6
Я не сказал, что он используется только для ИИ, я сказал, что одним из основных его применений является ИИ. Вы это читали?
Джастин Беннетт,

32
«Не думайте, что Common Lisp полезен только для баз данных, платформ модульного тестирования, фильтров спама, парсеров ID3, веб-программирования, серверов Shoutcast, интерпретаторов генерации HTML и компиляторов генерации HTML только потому, что это единственное, что было реализовано в книга Практический CL »
Микаэль Янссон

23
@JustinBennett, да, ты это сказал. Здесь: «Таким образом, изучение Лиспа (или Схемы) может не дать многих практических приложений, помимо ИИ». Я ненавижу, когда люди противостоят, когда они ошибаются.
Лука Рамишвили

127

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

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

Сложная проблема - это запутанная проблема, в которой традиционный принцип «разделяй и властвуй» не работает. Управление роботом или работа с данными, которые не являются табличными (например, языки), или очень динамичными ситуациями.

Lisp действительно хорошо подходит для задач, решение которых должно быть расширяемым; классический пример - текстовый редактор emacs. Он полностью программируемый и, следовательно, самостоятельная среда программирования.

В своей знаменитой книге PAIP Норвиг говорит, что Lisp идеально подходит для исследовательского программирования. То есть программирование решения проблемы, которая до конца не изучена (в отличие от системы онлайн-бронирования). Другими словами: сложные проблемы.

Более того, изучение Лиспа напомнит вам кое-что фундаментальное, о чем уже забыли: разницу между фон Нейманом и Тьюрингом. Как мы знаем, модель вычислений Тьюринга - интересная теоретическая модель, но бесполезная в качестве модели для проектирования компьютеров. Фон Нейман, с другой стороны, разработал модель того, как компьютеры и вычисления должны выполняться: модель фон Неймана. Центральным элементом модели фон Неймана является то, что у вас есть только одна память, и вы храните в ней свой код и данные. Обратите внимание, что программа на Java (или C #, или как вам нравится) является проявлением модели Тьюринга. Вы устанавливаете конкретную программу, раз и навсегда. Тогда вы надеетесь, что сможете справиться со всеми данными, которые ему попадают.

Лисп поддерживает модель фон Неймана; между кодом и данными нет четкой заранее определенной границы. Программирование на Лиспе открывает вам возможности модели фон Неймана. Программирование на Лиспе позволяет увидеть старые концепции в новом свете.

Наконец, будучи интерактивным, вы научитесь взаимодействовать со своими программами по мере их разработки (в отличие от компиляции и запуска). Это также меняет способ программирования и взгляд на программирование.

Этим вступлением я могу наконец предложить ответ на ваш вопрос: найдете ли вы места, где он затмевает «традиционные» языки?

Если вы продвинутый программист, вам нужны продвинутые инструменты. И нет более продвинутого инструмента, чем Лисп. Или, другими словами: да, если у вас серьезные проблемы. Нет иначе.


30
«но с достаточным количеством денег и программистов это не сложно» - при этом, учитывая достаточно много программистов, это становится невозможным ;-)
Йонас Кёлькер,

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

@centaurian_slug: Да, конечно. Это часть силы. Любая версия, которая не была намеренно повреждена, будет иметь свой компилятор / интерпретатор, доступный во время выполнения. Так, например, разработчик может войти в специальное соединение на своем веб-сервере, выполнить некоторую отладку, обновить некоторые определения классов и функций и, возможно, при необходимости перекомпилировать все, что полагалось на эти определения. Все время, пока сервер работает. Вероятно, незаконно на предприятии, которое беспокоится о соответствии SOX, но это одна из причин, по которой отрасли используют такие безумные языки, как Java и C #,
Джеймс,


46

сложный синтаксис ??

Синтаксис lisp невероятно прост .

Приложение-убийца, написанное на lisp: emacs . Lisp позволит вам по желанию расширять emacs, чтобы делать почти все, что вы можете придумать, что может сделать редактор.

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

Кроме того, я хочу добавить: даже если вы найдете места, где будет иметь смысл lisp, вы, вероятно, никого не убедите в том, что его следует использовать поверх java, c ++, c #, python, ruby ​​и т. Д.


@Justin: Вероятно, стоит отметить, что ядро ​​emacs написано на C. Но это просто придирка - все команды написаны на elisp.
Бернард,

3
или, скорее, основной синтаксис обычного lisp прост. defmacro позволяет расширить синтаксис, а некоторые встроенные макросы (например, defmacro) могут быть невероятно сложными; лямбда-списки, вложенные обратные кавычки и т. д.
Аарон,

Почти справедливо будет сказать, что C-часть emacs - это клей-код.
Лука Рамишвили

Согласно справочному руководству Emacs: «Большинство команд редактирования в Emacs написано на Лиспе; некоторые исключения могли быть написаны на Лиспе, но для повышения эффективности вместо этого использовался Си». gnu.org/software/emacs/manual/html_mono/emacs.html#Intro
dpritch

25

Я не могу ответить из первых рук, но вы должны прочитать, что Пол Грэм написал о Lisp . Что касается «убийственного приложения», прочтите « Превосходя средние» .


2
+1. В этом ответе следует упомянуть Yahoo Stores, первое веб-приложение, частично написанное на лиспе. Цитата из Википедии: В 1998 году Yahoo! Inc. приобрела Viaweb за 455 000 акций Yahoo! акции стоимостью около 49 миллионов долларов и переименовали ее в Yahoo! Хранить.
Стивен Лу

17

Я профессионально программировал на Лиспе около года, и его определенно стоит изучить. У вас будет беспрецедентная возможность избавиться от избыточности в вашем коде, заменив весь шаблонный код функциями там, где это возможно, и макросами, где нет. Вы также сможете получить доступ к беспрецедентной гибкости во время выполнения, свободно переводя между кодом и данными. Таким образом, в ситуациях, когда действия пользователя могут вызвать потребность в динамическом построении сложных структур, действительно выделяется Lisp. Популярные планировщики рейсов авиакомпаний написаны на Лиспе, и в Лиспе также есть много CAD / CAM.


9

Если вам нравится программировать, вы должны изучать Lisp для чистого удовольствия. XKCD прекрасно выражает интеллектуальное просвещение, которое следует за этим. Изучение Лиспа для программиста - это то же самое, что медитация для буддийского монаха (и я имел в виду это без какого-либо кощунственного подтекста).


9

Lisp очень полезен для создания небольших DSL. У меня есть копия Lisp in a Box, работающая на работе, и я написал небольшие DSL для опроса баз данных SQL-сервера и создания слоев данных и т.д. на C #. Весь мой код шаблона теперь написан в макросах lisp, которые выводятся на C #. Я генерирую с его помощью HTML, XML и все такое. Хотя я хотел бы использовать Лисп для повседневного кодирования, Лисп может принести практическую пользу.


Для этого я использую dotlisp.sourceforge.net/dotlisp.htm .
Марк Херд

5

Любой язык выглядит намного сложнее, если не использовать общепринятые в языке соглашения об отступах. Если следовать за ними в Лиспе, можно увидеть, как он довольно легко выражает структуру синтаксического дерева (обратите внимание, это не совсем верно, потому что предварительный просмотр немного скрыт; r должны совпадать с fns в аргументе рекурсивной быстрой сортировки):

(defun quicksort (lis) 
  (if (null lis) 
      nil
      (let* ((x (car lis)) 
             (r (cdr lis)) 
             (fn (lambda (a) 
                   (< a x))))
         (append (quicksort (remove-if-not fn 
                                           r)) 
                 (list x)
                 (quicksort (remove-if fn 
                                       r))))))

1
Я думаю, что в том, что вы говорите, есть справедливая критика. Я только хочу сказать, что «это выглядит намного сложнее, как вы его представили, и гораздо яснее, как это представлено здесь». Я думаю, вы должны согласиться с тем, что многие языки выглядят намного более запутанными, если их соглашения об отступах не соблюдаются. Кроме того, если мы сравним отступы, скажем, Java и Lisp, я бы сказал, что они обычно требуют примерно одинакового уровня знаний основных конструкций каждого языка для правильного отступа. Но будет справедливо, хотя и полностью субъективно, сказать, что это все же выглядит сложно.
Джон с вафлей

1
Чтобы сделать это немного проще, вы можете использовать стандарт letи использовать defunв начале функции, чтобы определить, fnпоскольку он не меняется.
Аарон Робсон,

4
@FerretallicA На каком основании вы определяете, является ли что-то «легко читаемым человеком» или «самоописывающимся»? Сходство с английским? Китайский язык «легко читается человеком»? А как насчет математической записи? Разве это «не легко читается человеком»? Подобные аргументы - раздражающая тарабарщина, потому что их скрытый посыл: «Это не похоже на то, как я сначала научился рассуждать».

3
Больше похоже на то, что ваше «опровержение» звучит как «Whinge whinge». Попробуйте снифф-тест языка программирования. Возьмите кого-нибудь, кто раньше не программировал, и покажите ему страницу кода VB и страницу кода Lisp. Я с радостью готов поспорить, что мой левый орех, какой из двух случайный наблюдатель сможет легче сделать значимые наблюдения.
nathanchere

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

4

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


Потому что ты хороший программист. Плохие программисты вместо того, чтобы влиять на старые навыки новыми знаниями, думают на уже известных языках, а пишут на новых. Но почему вы используете Java после lisp? :) Ява труднее всего использовать после Лиспа, имо.
Лука Рамишвили

4

Если вам нужно спросить себя, следует ли выучить шепелявку, вам, вероятно, не нужно.


8
Я бы сказал обратное: если вы уже понимаете шепелявый, потому что у вас есть опыт работы с похожим языком, то, вероятно, в этом нет необходимости. Если вы не понимаете, что может предложить шепелявый, то вы можете извлечь выгоду из разоблачения.
Mr Fooz

@MrFooz не существует подобных языков, которые могут избавить от необходимости изучать лиспи-часть lisp. Основные возможности lisp отсутствуют ни в одном языке. Хотя большинство из них.
Лука Рамишвили

В зависимости от ваших целей. Если вы хотите умереть, вам не нужно дышать. Но это не значит, что нельзя.
mimoralea

4

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

Только два десятилетия спустя, когда я возродил свой интерес к шепелявости, я начал «понимать» то, что делает шепелявость интересной - по крайней мере для меня. Если вам удастся выучить шепелявку, не думая о замыканиях и макросах шепелявости, вы, вероятно, упустили главное.


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

4

Изучение LISP / Scheme может не дать вам увеличенного пространства приложения, но поможет вам лучше понять функциональное программирование, его правила и исключения.

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


4

С http://www.gigamonkeys.com/book/introduction-why-lisp.html

Один из наиболее часто повторяемых мифов о Лиспе - это то, что он «мертв». Хотя это правда, что Common Lisp не так широко используется, как, скажем, Visual Basic или Java, кажется странным называть язык, который продолжает использоваться для новых разработок и который продолжает привлекать новых пользователей, «мертвым». Некоторые недавние истории успеха Lisp включают Viaweb Пола Грэма, который стал Yahoo Store, когда Yahoo купила его компанию; Система ценообразования и покупки авиабилетов ITA Software, QPX, используемая продавцом билетов онлайн Orbitz и другими; Игра Naughty Dog для PlayStation 2, Jak and Daxter, которая в основном написана на доменно-ориентированном диалекте Lisp, изобретенном Naughty Dog и названном GOAL, компилятор которого сам написан на Common Lisp; и Roomba, автономный робот-пылесос, программное обеспечение которого написано на L, нисходящем подмножестве Common Lisp. Возможно, еще более показательным является рост веб-сайта Common-Lisp.net, на котором размещены проекты Common Lisp с открытым исходным кодом, и количество локальных групп пользователей Lisp, появившихся за последние пару лет.


4

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

- Эрик С. Реймонд, «Как стать хакером»

http://www.paulgraham.com/avg.html


3

Я согласен с тем, что Lisp - один из тех языков, которые нельзя использовать в коммерческих целях. Но даже если вы этого не сделаете, его изучение обязательно расширит ваше понимание программирования в целом. Например, я изучал Пролог в колледже, и, хотя я никогда не использовал его после, я дал мне лучшее понимание многих концепций программирования и (временами) большую признательность за языки, которые я использую.

Но если вы собираетесь его изучить ... обязательно прочтите On Lisp


Небольшое примечание: о Лиспе не подходит для введения в Лисп, сначала прочтите что-нибудь еще. Я рекомендую Практический Common Lisp.
Луис Оливейра,

3

Изучение Lisp представит Javascript в совершенно ином свете! Лисп действительно заставляет вас воспринимать и рекурсию, и целые «функции как объекты первого класса» - парадигму. См. Отличную статью Crockfords о Scheme vs Javascript . Javascript, пожалуй, самый важный язык на сегодняшний день, поэтому лучше понять его очень полезно!


1
Самый важный язык? Я не думаю, сэр.
TraumaPony

7
Что ж, он доступен практически на любом устройстве с веб-браузером (и, вероятно, на некоторых, у которых его нет), поэтому, что касается языков для запуска приложений конечных пользователей, он, вероятно, имеет самое высокое проникновение среди всех языков программирования на планете. , Очевидно, у вас могло быть совершенно другое мнение о том, что важно. Будет ли он использован для лечения рака? Возможно нет. Но, нравится вам это или нет, это будет одним из краеугольных камней разработки (веб) приложений на долгие годы.
Эрленд Халворсен,

1
Я пошел тем же путем! Хотя я уже использовал функциональные возможности Javascript и возможности создания прототипов, после изучения Lisp Javascript, тем не менее, был для меня новым языком.
Лука Рамишвили


3

Ладно, я могу показаться странным, но мне действительно не очень нравятся эссе Пола Грэма, а книга по Лиспу - действительно грубая книга, если вы еще не понимаете Common Lisp. Вместо этого я бы посоветовал перейти на Практический Common Lisp от Siebel . Что касается "приложений-убийц", Common Lisp, похоже, находит свое место в нишевых магазинах, таких как ITA , поэтому, хотя нет приложения, синонимичного CL, как Rails для Ruby, есть места в отрасли, которые его используют, если вы это делаете. немного покопался.


2

Сложный синтаксис? Прелесть лиспа в том, что у него смехотворно простой синтаксис. Это просто список, где каждый элемент списка может быть либо другим списком, либо элементарным типом данных.

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


2

Чтобы добавить к другим ответам:

Потому что курс SICP (видео доступны здесь ) великолепен: научит вас Lisp и многому другому !


2

Убийственное приложение? Franz Inc. имеет длинный список историй успеха , но в этот список входят только пользователи AllegroCL ... Возможно, есть и другие. Мне больше всего нравится история о Naughty Dog , так как я был большим поклонником игр Crash Bandicoot.

Для изучения Common Lisp я бы рекомендовал Практический Common Lisp . В нем есть практический подход, который, по крайней мере, для меня сделал его проще, чем другие книги, которые я просматривал.


2

Сегодня вы можете использовать Clojure для написания тестов и сценариев поверх виртуальной машины Java. Хотя в JVM реализованы и другие языки Lisp, я считаю, что Clojure лучше всех интегрируется с Java.

Бывают случаи, когда сам язык Java мешает написанию тестов для кода Java (включая «традиционное коммерческое программирование»). (Я не имею в виду это обвинение в адрес Java - другие языки страдают от той же проблемы, но это факт. Поскольку эта тема, а не Java, я не буду вдаваться в подробности. Пожалуйста, начните новую тему, если кто-то хочет это обсудить.) Clojure устраняет многие из этих препятствий.


2

Lisp можно использовать везде, где вы используете традиционное программирование. Ничего особенного, он просто более мощный. Пишете веб-приложение? вы можете сделать это на Лиспе, написав настольное приложение? вы можете сделать это на Лиспе, где угодно, вы, вероятно, можете сделать это на Лиспе, или на Python, или на любом другом универсальном программировании (есть несколько языков, которые подходят только для одной задачи).

Самым большим препятствием, вероятно, будет признание вашего начальника, коллег или клиентов. Вам придется с ними поработать. Вам может помочь выбор прагматичного решения, такого как Clojure, которое может использовать текущую базу установки инфраструктуры Java, от JVM до библиотек. Кроме того, если у вас есть программа на Java, вы можете создать архитектуру подключаемых модулей и написать для нее подключаемые модули Clojure, в результате чего половина кода будет написана на Clojure.


1

Не причина, но (тривиально) AutoCAD поддерживает среду выполнения LISP и DCL. Это удобный способ написания сложных макросов (включая автоматизацию ActiveX), если вы не хотите использовать VBA или их C ++ или .NET SDK или если выражение DIESEL его не сокращает.

Многие функции AutoCAD на самом деле являются подпрограммами LISP.


1

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

И поскольку я не могу найти эти ссылки в этом посте, я добавляю их в общественных интересах:

История успеха и неудачи: шепение в JPL

Действительно впечатляющая история успеха: Lisp используется в корпорации Orbitz

Сравнение и анализ использования Lisp вместо Java: Lisp как альтернатива Java




0

Убийственное приложение? Система поиска авиабилетов ITA Software - одна из них.

Что касается «почему», то, скорее всего, это сделает вас лучшим разработчиком и крайне маловероятно, что сделает вас хуже. Однако это может заставить вас предпочесть шепелявые диалекты другим языкам.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.