Я действительно чувствую, что должен изучить Lisp, и есть много хороших ресурсов, которые помогут мне сделать это.
Меня не смущает сложный синтаксис, но где в «традиционном коммерческом программировании» я бы нашел места, где имеет смысл использовать его вместо процедурного языка.
Есть ли коммерческое приложение-убийца, написанное на Лиспе?
Одним из основных применений Lisp является искусственный интеллект. Мой друг в колледже прошел аспирантуру по искусственному интеллекту и для своего основного проекта написал программу « Lights Out » в Лиспе. Во многих версиях его программы использовались слегка отличающиеся процедуры ИИ, и тестирование на 40 или около того компьютерах дало довольно неплохие результаты (я бы хотел, чтобы это было где-то в Интернете, где я мог бы ссылаться, но я не думаю, что это так).
Два семестра назад я использовал Scheme (язык, основанный на Лиспе), чтобы написать интерактивную программу, которая имитировала процедуру Эбботта и Костелло «Кто на первом». Входные данные пользователя сравнивались с некоторыми довольно сложными структурами данных (напоминающими карты на других языках, но гораздо более гибкими), чтобы выбрать подходящий ответ. Я также написал процедуру для решения головоломки слайдов 3х3 (алгоритм, который можно легко распространить на головоломки больших слайдов).
Таким образом, изучение Lisp (или Схемы) может не дать много практических приложений, кроме AI, но это чрезвычайно ценный опыт обучения, как утверждают многие другие. Программирование на функциональном языке, таком как Lisp, также поможет вам рекурсивно мыслить (если у вас возникли проблемы с рекурсией на других языках, это может быть очень полезно).
сложный синтаксис ??
Синтаксис для LISP невероятно прост .
Приложение Killer написано на lisp: emacs . Lisp позволит вам расширять emacs по своему желанию, чтобы делать практически все, что вы можете себе представить, что может сделать редактор.
Но вы должны учить шепот только в том случае, если хотите , и вы никогда не сможете использовать его на работе, но он все еще потрясающий.
Кроме того, я хочу добавить: даже если вы найдете места, где lisp будет иметь смысл, вы, вероятно, не убедите кого-либо еще, что его следует использовать поверх java, c ++, c #, python, ruby и т. Д.
Я не могу ответить из личного опыта, но вы должны прочитать, что Пол Грэм написал на Лиспе . Что касается части "приложение-убийца", прочитайте Удар средних .
Я согласен, что Lisp - один из тех языков, которые вы никогда не сможете использовать в коммерческих целях. Но даже если вы этого не сделаете, его изучение определенно расширит ваше понимание программирования в целом. Например, я изучил Пролог в колледже и, хотя я никогда не использовал его после, я дал мне лучшее понимание многих концепций программирования и (иногда) большую оценку для языков, которые я использую.
Но если вы собираетесь изучать это ... непременно прочитайте On Lisp
Сложный синтаксис? Прелесть LISP в том, что он имеет смехотворно простой синтаксис. Это просто список, где каждый элемент списка может быть либо другим списком, либо элементарным типом данных.
Его стоит изучить, потому что он расширяет ваши возможности по кодированию, позволяя думать о функциях и использовать их как еще один тип данных. Это улучшит способ, которым вы кодируете на императивном и / или объектно-ориентированном языке, потому что это позволит вам быть более гибким с точки зрения структуры вашего кода.
Ладно, я могу быть странным, но мне очень не нравятся эссе Пола Грэма, и книга о Лиспе - очень трудная книга, если у вас уже нет общих знаний о Common Lisp. Вместо этого, я бы сказал, пойти на практический общий Лисп Siebel . Что касается «приложений-убийц», Common Lisp, похоже, находит свое место в нишевых магазинах, таких как ITA , поэтому, хотя нет приложения, синонимичного с CL, как Rails для Ruby, в индустрии есть места, которые его используют, если вы это делаете. немного копать
Синтаксис не имеет значения, читабельность нет!
Любой язык выглядит намного сложнее, если не использовать общие соглашения о отступах в языке. Когда вы следуете за ними по Лиспу, вы видите, как он довольно легко выражает структуру синтаксического дерева (обратите внимание, что это не совсем правильно, потому что предварительный просмотр немного ложится; 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))))))
let
и использовать defun
в начале функции, чтобы определить, fn
как она не меняется. Я профессионально программировал на Лиспе около года, и это определенно стоит изучить. У вас будет беспрецедентная возможность удалить избыточность из вашего кода, поскольку вы сможете заменить весь стандартный код функциями, где это возможно, и макросами, где нет. Вы также сможете получить беспрецедентную гибкость во время выполнения, свободно переводя между кодом и данными. Таким образом, в ситуациях, когда пользовательские действия могут вызвать необходимость динамического построения сложных структур, именно в этом и заключается сияние Lisp. Популярные расписания полетов авиакомпаний написаны на Лиспе, а в Лиспе также много CAD / CAM.
Я обнаружил, что изучение нового языка всегда влияет на ваш стиль программирования на языках, которые вы уже знаете. Для меня это всегда заставляло меня думать по-разному, чтобы решить проблему на моем основном языке, который является Java. Я думаю, что в целом, это просто расширяет ваш кругозор в плане программирования.
Если вам нужно спросить себя, следует ли вам изучать шепот, вам, вероятно, нет необходимости.
Изучение LISP поставит Javascript в совершенно ином свете! Lisp действительно заставляет вас понимать и рекурсию, и целые «функции как объекты первого класса» - парадигму. Смотрите отличную статью Crockfords на Scheme против Javascript . Javascript, пожалуй, самый важный язык сегодня, поэтому лучше понять его очень полезно!
Это тема, которую я сам обдумывал некоторое время, но на самом деле я не пришел к решению, как обычно, время - главная проблема ...;)
И так как я не могу найти эти ссылки в этом посте, я добавляю их для общественного интереса:
История успеха и неудач: Лиспинг в JPL
Действительно впечатляющая история успеха: Lisp используется в корпорации Orbitz
Сравнение и анализ использования ли Lisp вместо Java: Lisp как альтернатива Java
Если вам нравится программирование, вы должны изучать Lisp для удовольствия. XKCD прекрасно выражает интеллектуальное просвещение, которое следует. Изучение Lisp для программиста - это то же самое, что медитация для буддийского монаха (и я имел в виду это без всякой кощунственной коннотации).
Убийца приложение? Franz Inc. имеет длинный список историй успеха , но в этот список входят только пользователи AllegroCL ... Возможно, есть и другие. Мой любимый рассказ о Naughty Dog , так как я был большим поклонником игр Crash Bandicoot.
Для изучения Common Lisp я бы рекомендовал Практический Common Lisp . У этого есть практический подход, который по крайней мере для меня сделал это легче чем другие книги, на которые я смотрел.
Lisp очень полезен для создания маленьких DSL. У меня есть копия Lisp in a Box, работающая на работе, и я написал маленькие DSL для опроса баз данных SQL-сервера, генерации слоев данных и т. Д. В C #. Весь мой код котельной платы теперь написан в макросах lisp, которые выводятся на C #. Я генерирую HTML, XML, все виды вещей с ним. Хотя я хотел бы использовать Lisp для повседневного кодирования, Lisp может принести практическую пользу.
В восьмидесятые годы я учился в классе «Лиспа» в колледже. Несмотря на то, что я воплотил в жизнь все концепции, представленные в классе, я остался без какой-либо оценки того, что делает LISP великолепным. Я боюсь, что многие люди смотрят на lisp как на еще один язык программирования, и это то, что этот курс в колледже сделал для меня так много лет назад. Если вы видите, что кто-то жалуется на синтаксис lisp (или его отсутствие), есть большая вероятность, что он один из тех, кто не смог понять величие lisp. Я был одним из тех людей в течение очень долгого времени.
Лишь через два десятилетия, когда я снова начал разжигать свой интерес к шепоту, я начал «получать» то, что делает шутку интересной - в любом случае, для меня. Если вам удастся выучить шепот без утомления замыканий и макросов шуток, вы, вероятно, упустили смысл.
Lisp - это большой и сложный язык с большой и сложной средой выполнения для его поддержки. По этой причине Lisp лучше всего подходит для больших и сложных задач.
Теперь сложная проблема не такая, как сложная . Комплекс проблем является один с большим количеством мелких деталей, но не сложно. Написание системы бронирования авиабилетов - сложное дело, но с достаточными деньгами и программистами это не сложно. Получите разницу?
Сложная проблема - это запутанная проблема, в которой традиционные методы «разделяй и властвуй» не работают. Управление роботом или работа с данными, которые не являются табличными (например, языки), или с высокой динамичностью.
Lisp действительно хорошо подходит для задач, где решение должно быть расширяемым; классический пример - текстовый редактор emacs. Он полностью программируемый и, таким образом, сам по себе является средой программирования.
В своей знаменитой книге PAIP Норвиг говорит, что Lisp идеально подходит для исследовательского программирования. То есть программирование решения проблемы, которая не до конца понятна (в отличие от системы онлайн-бронирования). Другими словами: сложные проблемы.
Кроме того, изучение Lisp напомнит вам о чем-то фундаментальном, что было забыто: разница между фон Нейманом и Тьюрингом. Как мы знаем, модель вычислений Тьюринга представляет собой интересную теоретическую модель, но бесполезна в качестве модели для проектирования компьютеров. Фон Нейман, с другой стороны, разработал модель того, как должны выполняться компьютеры и вычисления: модель фон Неймана. Центральным в модели фон Неймана является то, что у вас есть только одна память, и вы храните там и ваш код, и ваши данные. Внимательно обратите внимание, что Java-программа (или C #, или что вам нравится) является проявлением модели Тьюринга. Вы устанавливаете свою программу в бетоне, раз и навсегда. Тогда вы надеетесь, что сможете справиться со всеми данными, которые ему выдаются.
Лисп поддерживает модель фон Неймана; нет четкой, заранее определенной границы между кодом и данными. Программирование на Лиспе открывает ваш разум для мощи модели фон Неймана. Программирование на Лиспе позволяет вам увидеть старые концепции в новом свете.
Наконец, будучи интерактивным, вы научитесь взаимодействовать со своими программами по мере их разработки (в отличие от компиляции и запуска). Это также изменит способ программирования и способ программирования.
С этим вступлением я, наконец, могу ответить на ваш вопрос: найдете ли вы места, в которых он затмевает «традиционные» языки?
Если вы опытный программист, вам нужны продвинутые инструменты. И нет более продвинутого инструмента, чем Lisp. Или, другими словами: ответ «да», если у вас серьезные проблемы. Нет иначе.
Сегодня вы можете использовать Clojure для написания тестов и сценариев поверх Java VM. Хотя в JVM реализованы и другие языки Lisp, я думаю, что Clojure лучше всего интегрируется с Java.
Временами сам язык Java мешает писать тесты для кода Java (включая «традиционное коммерческое программирование»). (Я не имею в виду, что в качестве обвинительного заключения о Java - другие языки страдают от той же проблемы - но это факт. Поскольку я не буду подробно останавливаться на этой теме, а не на Java. Пожалуйста, не стесняйтесь начинать новую тему, если кто-то хочет это обсудить.) Clojure устраняет многие из этих препятствий.
В ответ на @lassevk :
Не причина, но (тривиально) AutoCAD поддерживает LISP и DCL. Это удобный способ написания сложных макросов (включая автоматизацию ActiveX), если вы не хотите использовать VBA или их SDK для C ++ или .NET, или если выражение DIESEL не обрезает его.
Многие функции AutoCAD на самом деле являются процедурами LISP.
Скрипт-фу у Гимппа губный. Это приложение для фотошопа-убийцы.
Лисп можно использовать везде, где вы используете традиционное программирование. Это не так уж отличается, это просто более мощный. Написание веб-приложения? Вы можете сделать это на Лиспе, написав настольное приложение? Вы можете сделать это на Лиспе, что угодно, вы можете сделать это на Лиспе, или на Python, или любом другом универсальном программировании (есть несколько языков, которые подходят только для одной задачи).
Вероятно, самым большим препятствием будет принятие вашего босса, ваших коллег или ваших клиентов. Это то, что вам придется работать с ними. Вам может помочь выбор практичного решения, такого как Clojure, которое может использовать текущую базу установки инфраструктуры Java, от JVM до библиотек. Кроме того, если у вас есть Java-программа, вы можете создать плагин-архитектуру и написать для нее плагины Clojure, а в итоге написать половину кода в Clojure.
Изучение LISP / Scheme может не дать вам больше пространства для приложений, но поможет вам лучше понять функциональное программирование, его правила и исключения.
Стоит потратить время, чтобы узнать разницу в красоте шести вложенных чистых функций и кошмар шести вложенных функций с побочными эффектами.
Не говоря уже о том, что это убийственное приложение, но похоже, что оно может быть классным http://code.google.com/p/plop/
Убийца приложение? Поисковая система ITA Software - одна.
Что касается «почему», это, скорее всего, сделает вас лучшим разработчиком и, скорее всего, сделает вас хуже. Это может, однако, заставить вас предпочитать диалекты LISP другим языкам.
С 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, которая в значительной степени написана на предметно-ориентированном для Лиспа диалекте Naughty Dog, изобретенном под названием GOAL, чей компилятор написан на Common Lisp; и Roomba, автономный роботизированный пылесос, программное обеспечение которого написано на L, совместимом внизу подмножестве Common Lisp. Возможно, еще более показательным является рост веб-сайта Common-Lisp.net, на котором размещены проекты Common Lisp с открытым исходным кодом, и количество локальных групп пользователей Lisp, появившихся в последние пару лет.
«Lisp стоит изучать за глубокий опыт просветления, который вы получите, когда, наконец, получите его; этот опыт сделает вас лучшим программистом до конца ваших дней, даже если вы на самом деле никогда не будете использовать сам Lisp».
- Эрик С. Рэймонд, «Как стать хакером»