Зачем мне изучать Лисп?

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

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

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

Ответов (25)

Решение

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

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

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

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

Синтаксис не имеет значения, удобочитаемость - нет!

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

Скрипт-фу GIMP на губах. Это приложение-убийца фотошопа.

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

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

В ответ на @lassevk :

альтернативный текст

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

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

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

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

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

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

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

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

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

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

Любой язык выглядит намного сложнее, если не использовать общепринятые в языке соглашения об отступах. Если следовать за ними в Лиспе, можно увидеть, как он довольно легко выражает структуру синтаксического дерева (обратите внимание, это не совсем верно, потому что предварительный просмотр немного нечеткий; 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))))))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Не говорю, что это убийственное приложение, но похоже, что это могло бы быть круто http://code.google.com/p/plop/

С 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. Возможно, еще более показательным является рост Web-сайта Common-Lisp.net, на котором размещены проекты Common Lisp с открытым исходным кодом, и количество локальных групп пользователей Lisp, появившихся за последние пару лет.

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

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

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