Чому я повинен вчитися Ліспу? [зачинено]


125

Я дійсно відчуваю, що мені слід навчитися Ліспу, і там є багато хороших ресурсів, які допомагають мені це зробити.

Мене не відкладає складний синтаксис, але де в «традиційному комерційному програмуванні» я знайду місця, було б доцільно використовувати його замість процедурної мови.

Чи є там комерційний додаток-вбивця, написане в Ліспі?


5
Важко відстрочити те, чого там немає.
Каз

Прочитайте резюме Філіпа Грінспуна . Це насичено справжніми роботами Lisp.
Каз

1
Також тут . Greenspun працював над моделюванням пакетної комутації, дизайном DSP, дизайном процесора, компонуванням VLSI, автоматикою машинобудування, автоматизацією переміщення Землі та вмиканням і все, використовуючи Lisp або залучаючи Lisp. Він допоміг розробити архітектуру PA-RISC Hewlett Packard за допомогою інструментів, розроблених на машині Lisp.
Каз

Ось кілька програм, розроблених у Lisp - Emacs, G2, AutoCad, Igor Engraver та Yahoo Store
Arulx Z

Відповіді:


55

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

Два семестри тому я використав схему (мова, заснована на Ліспі), щоб написати інтерактивну програму, яка імітувала Ебботта та розпорядку Костелло "Хто на першому". Введення даних від користувача було узгоджене з деякими досить складними структурами даних (схожими на карти іншими мовами, але набагато гнучкішими), щоб вибрати відповідний відповідь. Я також написав процедуру розв’язання слайдів 3х3 слайдів (алгоритм, який легко можна було б розширити на більші головоломки).

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


5
Чому ти кажеш, що Лісп корисний лише для ШІ? Крім того, це багатопарадигмічна мова. Функціонал є лише однією з декількох парадигм, які він дозволяє.
Луїс Олівейра

6
Я не сказав, що його застосовують лише для ШІ, я сказала, що одне з основних напрямків використання - AI. Ви це читали?
Джастін Беннетт

32
"Будь ласка, не вважайте, що звичайний Lisp корисний лише для баз даних, блок тестових рамок, фільтри спаму, ID3-парсери, веб-програмування, сервери Shoutcast, інтерпретатори покоління HTML та компілятори HTML покоління лише тому, що це єдині речі, які траплялися впроваджені в книга Практичний CL "
Мікаель Янссон

23
@JustinBennett так, ти це сказав. Тут: "Підсумовуючи, навчання Лісп (або Схеми) може не дати багато практичних застосунків поза ШІ". Я ненавиджу, коли люди конфронтуються, коли помиляються.
Лука Рамішвілі

127

Lisp - це велика і складна мова з великим і складним режимом виконання для її підтримки. З цієї причини Lisp найкраще підходить для великих і складних проблем.

Тепер складна проблема не така, як складна . Комплекс проблем є один з великою кількістю дрібних деталей, але не складно. Написання системи бронювання авіакомпаній - складна справа, але з достатньою кількістю грошей та програмістів це не важко. Отримайте різницю?

Складна проблема, яка є перекрученою, та проблема, коли традиційний поділ і перемога не спрацьовує. Управління роботом або робота з даними, які не є табличними (наприклад, мовами), або дуже динамічними ситуаціями.

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

У своїй знаменитій книзі PAIP Норвіг говорить, що Лісп ідеально підходить для дослідницького програмування. Тобто програмування рішення проблеми, яка не повністю зрозуміла (на відміну від системи он-лайн бронювання). Іншими словами: Складні проблеми.

Крім того, навчання Лісп нагадає вам про щось фундаментальне, що було забуто: Різниця між Нейманом та Тьюрінгом. Як відомо, модель обчислення Тьюрінга є цікавою теоретичною моделлю, але марною як модель для проектування комп'ютерів. Фон Ньоманн, з іншого боку, створив модель виконання комп'ютерів та обчислень: Модель Фон Ноймана. Центральне в моделі Фон Неймана - це те, що у вас є лише одна пам'ять, і ви зберігаєте там і ваш код, і свої дані. Уважно зауважте, що програма Java (або C #, або що завгодно) є проявом моделі Тьюрінга. Ви встановлюєте свою програму конкретно, раз і назавжди. Тоді ви сподіваєтесь, що зможете опрацювати всі дані, які потрапляють на них.

Лісп підтримує модель Фон Неймана; немає різкої, заздалегідь визначеної межі між кодом і даними. Програмування в Lisp відкриває ваш погляд на силу моделі Фон Неймана. Програмування в Lisp змушує бачити старі концепції в новому світлі.

Нарешті, будучи інтерактивним, ви навчитесь взаємодіяти зі своїми програмами під час їх розробки (на відміну від компіляції та запуску). Це також змінить спосіб програмування та спосіб перегляду програмування.

За допомогою цього вступу я нарешті можу запропонувати відповідь на ваше запитання: чи знайдете ви місця, де воно перекриває "традиційні" мови?

Якщо ви просунутий програміст, вам потрібні вдосконалені інструменти. І не існує інструменту, більш просунутого, ніж Lisp. Або, іншими словами: відповідь "так", якщо ваші проблеми важкі. Ніяк інакше.


30
"але з достатньою кількістю грошей і програмістів це не важко", - сказати, якщо достатньо багато програмістів, це стає неможливим ;-)
Йонас Келькер,

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

@centaurian_slug: Так, абсолютно. Це частина сили. Будь-яка версія, яка не була навмисно скалічена, матиме свій компілятор / інтерпретатор під час виконання. Так, наприклад, розробник може увійти в спеціальне з'єднання на своєму веб-сервері, зробити деяку налагодження, оновити деякі визначення класів і функцій і, можливо, перекомпілювати все, що покладається на ці визначення, якщо це потрібно. Все, поки сервер працює і працює. Напевно, це не законно на підприємстві, що переживає за відповідність SOX, але це одна з причин, що галузі використовують такі мови, як Java та C #
James


46

складний синтаксис ??

Синтаксис lisp неймовірно простий .

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

Але ви повинні навчитися лайп тільки якщо ви хочете , і ви ніколи не зможете використовувати на роботі ніколи, але це все-таки приголомшливо.

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


@Justin: Напевно, варто відзначити, що ядро ​​emacs написано на C. Але це лише вибирання ниток - всі команди написані вручну.
Бернард

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

Практично справедливо сказати, що частина C emacs - це клей-код.
Лука Рамішвілі

Згідно довідкового посібника Emacs, "Більшість команд редагування в Emacs написані в Lisp; кілька винятків можна було записати в Lisp, але використовувати C замість цього для ефективності". gnu.org/software/emacs/manual/html_mono/emacs.html#Intro
dpritch

25

Я не можу відповісти з власних досвіду, але ви повинні прочитати те, що написав Пол Грем на Ліспі . Щодо частини "вбивця-додаток", читайте " Збивання середніх" .


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 Box, яка працює на роботі, і я написала невеликі DSL-файли для допиту баз даних SQL-сервера та генерування шарів даних тощо в C #. Весь код моєї котлової пластини тепер записаний у макросах lisp, які виводяться на C #. Я генерую HTML, XML, всілякі речі з ним. Хоча я хочу, щоб я міг використовувати Lisp для щоденного кодування, Lisp може принести практичну користь.


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

5

Будь-яка мова виглядає набагато складніше, коли не використовується загальних умовних відступів мови. Коли за ними слідує Лісп, ви бачите, як він виражає структуру дерева синтаксису досить легко (зауважте, це не зовсім правильно, оскільки попередній перегляд лежить небагато; r повинен відповідати fns в рекурсивному аргументі quicksort):

(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і використовувати a defunна початку функції, щоб визначити, fnяк вона не змінюється.
Аарон Робсон

4
@FerretallicA На якій основі ви визначаєте, чи є щось "легко зрозумілим для людини" чи "самоописаним"? Схожість з англійською? Чи китайський "легко читабельний"? Що з математичним позначенням? Це "не легко читається людиною"? Такий аргумент дратує гнучкості, оскільки його приховане повідомлення: "Це не схоже на те, як я вперше навчився міркувати".

3
Більше схоже на ваше "спростування" звучить як "Побіг". Спробуйте тест нюху мови програмування. Візьміть когось, хто раніше не програмував, і покажіть їм сторінку VB-коду та сторінку коду Lisp. Я з радістю буду робити ставку на свій лівий гайку, на якому з двох випадкових спостерігачів буде легше зробити важливі спостереження.
nathanchere

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

4

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


Це тому, що ти хороший програміст. Погані програмісти, замість того, щоб впливати на старі навички новими знаннями, думають уже відомими мовами, пишучи нові. Але чому ви використовуєте Java після lisp? :) Java найважче використовувати після Lisp, imo.
Лука Рамішвілі

4

Якщо вам доведеться запитати себе, чи варто вам вчитися ліспі, вам, мабуть, цього не потрібно.


8
Я б сказав протилежне: якщо ви вже розумієте lisp, оскільки у вас є досвід подібної мови, то, мабуть, це не потрібно. Якщо ви не розумієте, що може запропонувати lisp, то ви можете отримати користь від експозиції.
Містер Фооз

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

Залежно від ваших цілей. Якщо ви хочете померти, вам не потрібно дихати. Але це не означає, що ви не повинні.
міморалія

4

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

Лише через два десятиліття, коли я знову виявив інтерес до lisp, я почав "отримувати" те, що робить Lisp цікавим - для мене все одно. Якщо вам вдасться навчитися лайп, не подумавши про закриття та макроси, то ви, мабуть, пропустили суть.


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

4

Вивчення LISP / схеми може не дати вам більше простору додатків, але це допоможе вам краще зрозуміти функціональне програмування, його правила та винятки.

Варто витратити час, щоб дізнатись про різницю в красі шести вкладених чистих функцій та кошмарі шести вкладених функцій із побічними ефектами.


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 і Daxter, яка в значній мірі написана на доменному діалекті Lisp Naughty Dog, винайденому під назвою GOAL, чий компілятор написаний у загальному Lisp; і Roomba, автономний робот-пилосос, програмне забезпечення якого написано на L, сумісному підмножині Common Lisp. Можливо, ще більш показовим є зростання веб-сайту Common-Lisp.net, на якому розміщені проекти з відкритим кодом Common Lisp, та кількість локальних груп користувачів Lisp, що виникли за останні кілька років.


4

"Ліспу варто навчитися глибокому досвіду просвітництва, який ти матимеш, коли нарешті здобудеш його; цей досвід зробить тебе кращим програмістом до кінця твоїх днів, навіть якщо ти ніколи фактично не використовуєш сам Lisp багато".

- Ерік С. Реймонд, "Як стати хакером"

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


3

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

Але якщо ви збираєтеся це навчитися ... будь-якими шляхами читайте On Lisp


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

3

Навчання Lisp покладе Javascript у зовсім іншому світлі! Лісп дійсно змушує вас зрозуміти як рекурсію, так і цілу "функцію як об'єкти першого класу" -парадигму. Дивіться чудову статтю Crockfords про схему проти Javascript . Javascript - це, мабуть, найважливіша мова сьогодні, тому розуміння його краще надзвичайно корисно!


1
Найважливіша мова? Я думаю, що ні, сер.
TraumaPony

7
Що ж, він доступний майже на будь-якому пристрої, який має веб-браузер (і, мабуть, декілька, у якого немає), тому що стосується мов для запуску програм кінцевих користувачів, це, мабуть, найбільше проникнення будь-якої мови програмування на планеті. . Очевидно, що ви можете мати зовсім іншу думку щодо важливого. Чи буде його використовувати для лікування раку? Напевно, ні. Але, подобається це чи ні, це буде одним із наріжних каменів розробки (веб) додатків на довгі роки.
Ерленд Халворсен

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


3

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


2

Складний синтаксис? Краса lisp полягає в тому, що він має смішно простий синтаксис. Це просто список, де кожен елемент списку може бути або іншим списком, або елементарним типом даних.

Варто навчитися тому, як це розширює вашу здатність кодування думати і використовувати функції як просто інший тип даних. Це покращиться від способу кодування імперативною та / або об'єктно-орієнтованою мовою, оскільки це дозволить вам бути ментальніше гнучкими в структурі вашого коду.


2

Щоб додати до інших відповідей:

Оскільки курс SICP (відео доступні тут ) є приголомшливим: навчаєш Ліппа та багато іншого !


2

Додаток-вбивця? Franz Inc. має довгий список історій успіху , але цей список включає лише користувачів AllegroCL ... Мабуть, є й інші. Моя улюблена історія про Naughty Dog , оскільки я був великим шанувальником ігор Crash Bandicoot.

Для вивчення Common Lisp я рекомендував практичний Common Lisp . Це практичний підхід, який, принаймні, для мене зробив це простіше, ніж інші книги, які я переглянув.


2

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

Бувають випадки, коли сама мова Java перешкоджає написанню тестів на код Java (включаючи "традиційне комерційне програмування"). (Я не маю на увазі, що як обвинувачення на Яві - інші мови страждають від тієї самої проблеми - але це факт. Оскільки тема, а не Java, я не буду деталізувати. Будь ласка, не соромтеся почати нову тему, якщо хтось хоче це обговорити.) Клуджур усуває багато з цих перешкод.


2

Lisp можна використовувати в будь-якому місці традиційного програмування. Це не так інакше, він просто потужніший. Написати веб-додаток? ви можете це зробити на Lisp, написавши настільний додаток? Ви можете це робити на Lisp, як би там не було, можливо, ви можете це зробити на 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.