Чи все ще LISP корисний у сучасному світі? Яка версія найбільше використовується?


117

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

  1. Чи все-таки LISP практикується / застосовується в сучасному світі, чи це застаріла мова на зразок FORTRAN / COBOL? Я маю на увазі, окрім підтримки наявного коду, він взагалі використовується для нових проектів?

  2. Який найпоширеніший діалект? Я натрапив на схему та Common Lisp як на два найпоширеніші діалекти, і хотів, щоб ваша думка про те, який найбільш прихильний / корисний для вивчення - була б дуже задоволена, якщо ви можете запропонувати будь-які ресурси для початківця ранжу.

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


10
Мене це питання дуже цікавить. Раз у раз, коли у мене є час, я вирішую взяти на себе студію, коли навчаюсь Лісп. І кожного разу мене турбують однакові питання та невизначеності, про які ти тут задаєшся. Яку версію Lisp я повинен вивчити? Чи справді хтось (окрім Пола Грема) використовує Lisp? Чи варто вивчати Lisp або одну з нових функціональних мов програмування, як Haskell? Які переваги Lisp над схемою тощо, тощо.
Channel72


Практичний звичайний Lisp: gigamonkeys.com/book
Joe Internet

"ще"? (Я жартую!)
поштовх

Я тільки що знайшов цей інший, пов'язаний потік на SO: stackoverflow.com/q/1614724/212942
TCSGrad

Відповіді:


59

Мені більше подобається схема, якщо ви хочете працювати з JVM, ви повинні перевірити Clojure, який є лісом, який призначений для роботи в JVM. І так, Лісп все-таки варто навчитися бачити, наскільки потужним може бути такий мінімальний дизайн! Люди, які створили lisp, зрозуміли, що це справді правильно. Дивовижно, скільки нових класних особливостей сучасних мов Лісп мали в 1960-х!

Для вбудованої схеми спробуйте guile: http://www.gnu.org/s/guile/


Чи є діалект, який добре працює з C / C ++, бо я в першу чергу хлопець C ++? Не могли б ви також згадати деякі ресурси для початківця, який почав вивчати цей діалект?
TCSGrad

10
Найкращі схеми для вивчення книг - "Маленький шемер" та " SICP " mitpress.mit.edu/sicp . Існує ряд реалізацій схем, які можна вбудувати в c / c ++, але я не знаю, які з них хороші в наші дні, тому вам, можливо, доведеться зробити гуглінг.
Захарій К

1
Слід зазначити, що схема дуже проста! ви навчитеся приблизно 90% мови за 2 години. Звичайно, це не означає, що ви її освоїли, просто ви дізнаєтесь, як працює синтаксис.
Захарій К

5
@ shan23 Схема була розроблена для навчання. Це, без сумніву, можна було б навчити першокурсника програмувати, тому я не сумніваюся, у вас не буде проблем із його навчанням. Якщо ви хочете інтегрувати C або C ++, подивіться на Guile ( en.wikipedia.org/wiki/GNU_Guile ).
Vitor Py

1
Книга мови програмування Кента Дібвіга, можливо, не така відома, але дуже приємна книга. Схема.com/tspl4 Якщо ви використовуєте Emacs, то вивчення деяких Lisp зручно.
блиспр

68

Відповідаючи на питання 2, "Найпоширеніший діалект":

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

Більшість написаних необроблених кодів

  • Можливо, схема (усі діалекти) через навчальні програми
    • 270 шкіл ... Згадаймо 50 учнів / рік, 500 рядків коду / студент, 10 років працює. 1 000 000+ ліній на основі математики серветки.
    • 500 000 рядків Ракетки в самій Ракетці та її інструменти.
  • Можливо, звичайний Lisp через AI і цілу купу відкритого коду та виробничого коду (Див. Виробничий код).
  • Можливо, Emacs Lisp через ...
    • Сам Emacs: понад 1 000 000 рядків
    • Обсяг Emacs lisp, написаний публічно - 237 модулів, приблизно 200 рядків / модулів - це 40 000+ рядків лише на EmacsWiki, ймовірно, набагато більше в ELPA
    • Плюс додатки, написані в Emacs Lisp, файли .emacs тощо.
  • Clojure
    • Важко оцінити. Переважно менші точки. Може бути багато.

Переможець: схема або звичайний Lisp. Занадто багато невідомих.

Більшість "виробничих" кодів

Переможець: Я здогадуюсь, Common Lisp . Я думаю, що ми можемо відповісти "Так" на питання 1 на основі використання звичайних Lisp та Clojure.

Більшість кінцевих користувачів

  • Звичайний Лисп
    • Клієнти програмного забезпечення ITA, включаючи Orbitz, Bing Travel і Kayak.com - Можливо, мільйони.
  • Clojure
    • Citigroup (без деталей), Akamai (немає деталей), simple.com, багато інших. Напевно, мільйони.
  • Схема
    • Студенти CS, дослідники та любителі. Менше ніж мільярд.
    • Серія Uncharted - понад 5 мільйонів
  • Emacs Lisp - В основному програмісти, переважно на платформах Unix. Може бути мільйон.

Переможець: Схема має найкращу нижню межу тут, оскільки на Uncharted є номери продажів, але це досить дискусійно.

Висновок

На закінчення я вважаю, що великі яблука.


4
Не маленькі апельсини? Або пурпурні лимони?
Ватін

Дійсно, схема - especailly racket схема - здається, є найсучаснішим діалектом нахабства. Професійні інструменти та бібліотеки.
Bikal Lem

@Bikal Я хотів би, щоб підтримка OpenGL не була настільки датованою, але тоді прямий режим - не найбільша вина мого ракетного коду ...
Jesse Millikan

Не знав, що Орбіт використовує CL ... Я знаю, де шукати наступну роботу: D
Rig

2
У Ракетці було написано багато більше 100 тис. LOC. Стандартна бібліотека / інструменти IDE / Racket становить понад 500 тис., Плюс вона використовується в таких компаніях, як SET, Boeing та Naughty Dog.
Сем Тобін-Хохштадт

43

Чи все-таки LISP практикується / використовується в сучасному світі, чи це застаріла мова

Так, є, але ви повинні знати, де шукати. Люди, які використовують LISP, не схильні кричати про це занадто голосно, але є приклад декількох гучних стартапів, які використовували його для великих ефектів протягом останніх 20 років. Він також дуже популярний серед невеликих компаній Європи.

Який найпоширеніший діалект?

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

LISP - це сім'я мов, і кожна з цих мов має сімейство діалектів та реалізацій. Широко діалекти потрапляють у два табори "LISPs" та "Schemes".

LISP: До недавнього часу загальний LISP був королем. Це була спроба об'єднати всі розрізнені LISP, і, не будучи доброзичливою, була "C ++" LISP. Тобто це була ВЕЛИЧЕЗНА мова. У ньому було все. За останні кілька років з'явився Clojure. Clojure - це LISP, який працює на віртуальній машині Java і намагається вкоренитися у філософії функціонального програмування. Традиційно інші LISP суворо мульти парадигми. Clojure цікавий тим, що отримує як найкращі, так і найгірші як LISP, так і JVM. Існує ще багато багатослівних мов на основі Java, і вони були досить вільними і легкими з синтаксисом, так що в них багато ручок і кнопок для різних речей, але вони мають справдіцікаві ідеї навколо типів даних, особливо деякі практичні способи їх застосування для застосування ідей функціонального програмування.

Схеми: Схеми є суворим набором LISP. Схему винайшли Стіл і Суссман, і в ранньому житті він був відомий тим, що використовувався в лекційному курсі MIT Computing 101. Схема визначена у "Переглянутому ^ n звіті про алгоритмічну мовну схему (RnRS)". Так: вони там жартують з математики. Схема - це стандартизована мова таким чином, що не є іншими LISP. Це чудово допомагає при переносимості між реалізаціями, але це не срібна куля. Намагання зі стандартизації мають тенденцію бути консервативними, і нововведення у впровадженні, особливо навколо таких речей, як модулі, мають тенденцію до розбіжності. Існує також серія SRFI (Scheme Requests for Implementation), яка подібна до RFC-процесу IETF. Люди використовують його для стандартизації дрібних речей за потребою.

Схеми відрізняються від LISP тим, що вони мають набір жорстких вимог, яким вони повинні задовольнятись, однією з яких є "оптимізація хвостових викликів", яка допомагає зробити рекурсію ефективною. Тому рекурсивні стилі програмування набагато популярніші в Scheme, ніж у LISP. Схема, також не є доброзичливою, як "C" LISP. Тобто це невеликі мови, і ви повинні мати можливість тримати все це в голові відразу.

В даний час є дві сім'ї схем: версії на основі 5-ї версії (R5RS) та такі, що базуються на 6-й версії (R6RS). Складність R6RS була дико більшою, ніж у будь-якого з його попередників, і так багато реалізацій R5RS вирішили пропустити його, сподіваючись, що R7RS буде більше схожим на R5RS, ніж на R6RS. Процес стандартизації R7RS в даний час триває і намагався включити як бажання реалізаторів R5RS, так і такі, як народ R6RS, стандартизувавши невелику основну мову в їхній першій робочій групі, а потім ввівши в експлуатацію другу робочу групу для стандартизації великих функцій. Це дозволить мові мати ефективні та корисні реалізації як на крихітному вбудованому обладнання, так і на більш спроможних машинах.

Зараз я буду більш конкретним:

PicoLisp - це дійсно класний LISP. Це крихітно! Це автор написав це для себе, і, як я розумію, він заробляє на це життя з 1980-х. Якщо ви коли-небудь отримаєте можливість взяти участь у бесіді від нього, тоді вам слід це зробити: він дійсно цікавий і справді знає свої речі, і ви не отримаєте навіть найменшого нюху чимось основного чи нудного.

Я не знайомий із звичайними реалізаціями Lisp, тому більше не буду коментувати їх.

Guile - офіційна схема GNU.

Ракетка - це схема R6RS, але останнім часом, здається, вона розширила мережу і намагається "слугувати платформою для створення, розробки та впровадження мови".

Курка має на меті бути практичною схемою. Він заснований на R5RS і збирається до C. Це виявляється справді, дійсно, важливою перевагою, оскільки робить абсолютно тривіальним використання існуючих бібліотек C. Тому курка, мабуть, є найбільш корисною схемою заміни Perl, Python, Ruby тощо, як вашої щоденної мови сценаріїв. Є кілька людей, які використовували його виключно для всіх своїх потреб протягом декількох років. Він має інтерактивну REPL, а також компілятор. Спільнота (як у списку розсилки, так і в IRC) є обізнаною, доброзичливою та корисною.

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

Шукайте реалізацію за допомогою компілятора або, принаймні, чогось, що не базується лише на IDE чи REPL. Багато реалізацій, призначених для навчання, дуже важко використовувати для сценаріїв загального призначення.

Я б рекомендував курку, як саме це я використовую. Я використовував це в своїх особистих проектах і використовував (і зараз його використовую) професійно.

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

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


3
Ракетка не є схемою R6RS; є одна з мов, яку надає дистрибутив Racket. Фактична мова ракетки - це схема, яка відхиляється від RnRS низкою важливих способів (щодо яких у мене змішані почуття).
JasonFruit

27

Не можу насправді розмовляти на всіх Lisps, але Clojure - це, безумовно, гаряча та актуальна мова в даний час. Група користувачів Лондона Clojure, до якої я пішов на початку цього тижня, мала понад 100 відвідувачів ....

Ми вважали, що за останній рік (після великого досвіду роботи з Java та C #) дуже цікавим є навчання Ліспу у формі Clojure. Основні причини цього:

  • Він робить досить сильний акцент на функціональному програмуванні (тим більше, ніж у більшості інших Lisps). Автор та BDFL Rich Hickey часто цитував Haskell як одне з його натхненників для мовного дизайну, що означає, що ви отримуєте такі речі, як повністю незмінні структури даних та ліниві нескінченні послідовності тощо.
  • Метапрограмування макросу - філософію Ліспа "код - це дані" важко зрозуміти, якщо ви насправді цього не пережили, але це одна з причин того, що Ліпс настільки виразний і продуктивний
  • Фантастична підтримка багатоядерної одночасності - я фактично вважаю Clojure найкращою мовою для одночасного програмування. Дивіться http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey для просвітницької презентації про це

Це також представляється практичним вибором для реального використання виробництва з наступних причин:

  • Запуск на JVM з дуже простою інтероперабільністю Java надає вам доступ до всіх бібліотек та інструментів екосистеми Java
  • Це динамічна мова за замовчуванням, що робить її дуже зручною для розробки та швидкого складання прототипів майже з будь-якою панеллю котлів. Однак ви можете додати підказки статичного типу, щоб отримати досить хороші показники там, де вам це потрібно.

Я особисто знаю людей, які використовують Clojure в парі інвестиційних банків та стартапів. Я також вибрав Clojure як основну мову розвитку для мого власного запуску, тому я готовий покласти гроші туди, де є рот :-)


9

Зараз я також навчаюсь Ліспу (і мені це подобається). Я використовую Common Lisp, але я також заплутався з SBCL , Arc (зауважте, що це версія Ліспа Пола Грема, який, як згадував Вітор Брага, створив магазин Yahoo / Viaweb) та Allegro CL, що схоже на Visual Studio для Lisp (може створювати графічні інтерфейси, однак я ніколи його не використовував).

Що стосується використання, Lisp багато використовувався в Штучному інтелекті, але, чесно кажучи, я не впевнений, скільки інших "загальних" застосувань для Lisp. Багато веб-сайтів, які були спочатку побудовані в Ліспі, були переписані іншими мовами, тому важко сказати, що він використовується у веб-розробці (не кажучи, що це не так, але більші сайти, які використовують його, більше не роблять ). Після швидкого пошуку (дуже швидкого) ось перелік програмного забезпечення, написане у Common Lisp з Вікіпедії .

[EDIT] Що стосується професійного використання Lisp, там є завдання, які дозволять вам використовувати Lisp. Вони не такі численні, як, скажімо, завдання Java або C #, але вони існують. Я думаю, що Lisp - це одна з тих мов, яка використовується для внутрішніх додатків і може забезпечити конкурентну перевагу, якої компанії не хочуть відмовлятися рекламою, якою вони користуються. Я пам'ятаю, як бачив публікацію на P.SE, в якій говорилося, що Smalltalk був подібний на фінансовій арені.

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

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

[/ EDIT]


7
FWIW, SBCL є реалізацією Common Lisp, а також Allegro CL.
Ватін

@Vatine - ти будеш прав. Якби червоніло обличчя, я б зараз це зробив. Я не знаю, чому я припускав, що вони різні. Дурний мені інший компілятор! = Різний діалект :) Спасибі!
Джетті

@Jeff: Ну, вони обидва розширюють мову в різних напрямках, залишаючи "ядро CL" сумісним.
Ватін

@Jetti Що ти в першу чергу використовував?
Марк C

Я вважаю, що я використовував CLISP, саме на зображенні VM я більше не мав. Я думаю, що моє невігластво змусило мене повірити, що це БУДЬ звичайна ляска. Принаймні зараз я знаю краще.
Jetti

8

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

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


3
Проблема зі схемою полягає в тому, що коли ви починаєте займатися з нею, ви не хочете повертатися до інших мов. Я щойно почав реалізовувати потоки (можливо, нескінченні, ліниво оцінені, незмінні послідовності) в C ++, і це набагато більше коду, ніж у схемі! Мене справді здивувало поєднання схеми простоти та потужності.
Джорджіо

++ для Ракетки. Це дійсно неймовірно ПОВНО, що є однією з критичних характеристик інших схем. І це вище, ніж те, що може зробити схема створення власних мов.
Скотт Кларенбах

7

Значна частина бэкенду Amazon раніше була в Ліспі, але тепер була переписана на C ++, або я так чув (я мушу визнати, що у мене немає надійного джерела для цього).

Yahoo! Магазини - один із класичних прикладів веб-додатків Lisp. З Yahoo! Магазини слави ви, можливо, чули про Пола Грехема . Грехем - один з найвідоміших прихильників Ліспа і багато пише про цю тему. Ви можете прочитати його сайт, щоб знати його моменти.

AutoCAD використовував діалект Lisp для своєї макросистеми. Я не знаю, чи це все-таки є.

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


Що б ви порадили як початкову книгу / компілятор для Схеми? Я використовую Linux, тому якщо є який-небудь редактор, який явно корисний для новачків (як, наприклад, Kile для LaTex), дайте мені знати ...
TCSGrad

1
@ shan23 Маленький Схемер ( ccs.neu.edu/home/matthias/BTLS ) - найкраща ставка. Я вважаю, що emacs є найпоширенішим редактором для Scheme, але для його звикання потрібен певний час.
Vitor Py

1
Редактор lisp, просто, користуйтеся emacs. Це написали хлопці lisp, і в Lisp.
Захарій К

Ви також можете використовувати ID Racket IDE ( racket-lang.org ); він схожий на Emacs, але має автоматичне форматування та взаємодію з інтерпретатором схеми.
Єремія Вілкок

Lispbox ( common-lisp.net/project/lispbox ) працює нестандартно (корисний досвід emacs). Він заснований на ccl ( ccl.clozure.com ), див. Також gigamonkeys.com/book/…
Giorgio

4

Чи все-таки LISP практикується / застосовується в сучасному світі, чи це застаріла мова на зразок FORTRAN / COBOL? Я маю на увазі, окрім підтримки наявного коду, він взагалі використовується для нових проектів?

Я знаю кількох хлопців, які роблять Lisps в деяких стартапах в Силіконовій долині, і я знаю, що Amazon.com використовує Lisp з самого початку (хоча я чув, що вони чомусь замінюють його C ++?)

Але одна компанія, на яку слідкувати, - Naughty Dog . Усі їх ігри написані на діалекті Лісп. Спочатку вони прокатували своє, але вони використовують MZScheme в серії Uncharted.

Який найпоширеніший діалект? Я натрапив на схему та Common Lisp як на два найпоширеніші діалекти, і хотів, щоб ваша думка про те, який найбільш прихильний / корисний для вивчення - була б дуже задоволена, якщо ви можете запропонувати будь-які ресурси для початківця ранжу.

Я б зробив ставку, що Common Lisp, Clojure, Scheme і Emacs Lisp - це чотири найпоширеніші діалекти, і з них я б підозрював, що схема є найбільш розповсюдженою. Я, звичайно, не маю нічого, що б це підкріпити. :)

Мені більше подобається SICP і Маленький Схемер, як пропонують інші, але я також пропоную Землю Лісп , яка є досить цікавим читанням. :)


Дійсно, Земля Ліса - це дивовижне читання.
Хірон

@ 4bu3li Y u no upvote?
Марк C

1
Про Naughty Dog: Це не зовсім правильно, їх PS2-ігри були написані в цілі GOAL, мовою, що нагадує ліс ... Але після переходу на PS3 вони перейшли на використання C ++. MZScheme використовується здебільшого як макропроцесор, написаний в рядку з C ++ і використовується для певної обробки активів, а деякі їх сценарії записуються в S-exps. Але жоден код MZScheme насправді не працює на PS3.
Арелій

2

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

Я особисто намагаюся використовувати або SBCL, або останнім часом Clojure (і деякі Emacs Lisp, але htat's, тому що я є довгостроковим користувачем Emacs - я б намагався навчитися Emacs Lisp, коли я намагаюся вивчити Lisp). Тепер все, що мені потрібно зробити, це знайти час, щоб насправді грати з цими мовами ...


1
Це здебільшого перше ... як це досить очевидно, що якщо мені це вдасться, це, звичайно, зовсім не зашкодить моєму резюме :). Але якщо серйозно, я хочу поглянути на різні "стилі" програмування, щоб у мене було гарне уявлення, який саме використовувати в різних сценаріях (не хочу потрапляти в ситуацію, що оснащується лише молотком, Я маю ставитися до всіх проблем як до нігтів !!)
TCSGrad

2

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

Крім того, у Нью-Йорку величезна група зустрічей clojure. Я здогадуюсь, що якщо ви зацікавитесь та перейдете до своєї групи зустрічі clojure, ви можете знайти можливості для мережевого пошуку та пошуку роботи (не для роботи в clojure, а таких як Java / C ++ / тощо). У Нью-Йорку це здається абсолютно величезним, інші райони можуть відрізнятися.

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

Класичний приклад - як реалізувати MAX (a, b, c). Ви можете зробити складні функції з купою тверджень if. Або ви могли просто сказати

MAX (MAX (a, b), c)

і використовувати два прості вкладені дзвінки двох елементів MAX, які мені легше читати. Хоча, якщо продуктивність - це проблема, ви, можливо, захочете це зробити і іншим способом, я не намагався рахувати кількість порівнянь під час використання кожного методу ... Також якщо ви реалізуєте MAX за допомогою макросу C або іншого методу, що оцінює вирази кілька разів, можливо, ви не отримаєте очікуваного результату, оскільки вираз може бути оцінено кілька разів, тому будьте уважні з побічними ефектами ...


3
Насправді ви можете спростити MAX відMAX(MAX(a b) c)
Андреа

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

2
Проектом NASA став Deep Space 1: flownet.com/gat/jpl-lisp.html
Френк Шірар

2

Два додаткові пункти:

По-перше, Lisp - це чудова мова для написання коду, в якій взаємодія між функціями або даними часто є складною. У багатьох популярних мовах, якщо вас бентежить питання, чому ваша програма робить те, що робить, вам потрібно написати спеціальні функції, які дозволять вам вивчити її внутрішній стан програми. У деяких мовах вам доведеться чекати, коли ваш код буде перекомпільований. Звичайно, можуть бути такі інструменти, як налагоджувачі, які допомагають у цьому. Однак у Lisp все, що вам потрібно, - це спосіб зупинити програму, і тоді, як правило, у вас є доступ до всього, що є в Lisp. У Common Lisp іноді я просто набираю ^ C або кидаю дзвінок наerrorв єдину функцію (це єдине, що потрібно перекомпілювати, і вам не потрібно нічого робити, щоб її перекомпілювати). Як тільки я зупиняю програму, мене негайно кидають у налагоджувач - але налагоджувач дає мені всю силу Lisp, і я можу вийти з налагоджувача, викликати конкретні функції тощо. Я можу легко вивчити будь-яку структуру даних в моїй програмі. Більшість схем повинні допускати подібні практики. Лісп не є унікальним у цьому плані, але те, що він пропонує, виходить за рамки багатьох популярних мов.

По-друге: Якщо ви збираєтесь експериментувати з будь-яким діалектом Lisp, я б не обійшвся без (a) використання редактора, який відповідає дужкам, і (b) вивчення правильного відступу Lisp. Було б непогано використовувати редактор, який також буде приблизним до належного відступу для вас. Форматування коду в стилі C / C ++ / Java розроблено для мов із меншою кількістю дужок / дужок / дужок, ніж у Lisp. Стиль друку в стилі Lisp добре працює, коли ви ознайомилися з ним, і ви не заплутаєтеся в дужках або витрачаєте половину місця, розміщуючи по одному дужці, що закриваються, на рядок.


1

Зараз у мене складається враження, що Lisp в основному використовується в консалтингових магазинах (не те, що консалтингові магазини в основному використовують його).

Вважається, що це практичне програмне забезпечення. Переважно тому, що люди до цього не звикли.

Традиційно Scheme є досить академічним діалектом Lisp, а Common Lisp - промисловим діалектом.

Lisp особливо корисний для символічних можливостей маніпулювання та рефлексії.

Як приклад, кодом, який я написав, щоб дізнатися Лісп, була програма, яка будувала випадкові лямбда-функції, оцінювала їх і потім діяла над ними, намагаючись мінімізувати різницю функції від цільової функції. Все це було прямою маніпуляцією. Такою мовою, як C ++ або Java, мені довелося б винайти уявлення про функції, якими комп'ютер маніпулює.


Цікавий момент, який ви зробили щодо відмінностей між Scheme / Common Lisp - чи могли б ви детальніше розповісти про те, чому / як це?
TCSGrad


1

Я хотів би додати деяку точку зору щодо спільних Lisp та Scheme. Я уникав клоджура через JVM, тому не маю великої точки зору на це.

Схема - прекрасна лаконічна, чітко визначена мова. Було прийнято багато рішень, які CL довелося прийняти завдяки спадщині, і прийняв більш чистий підхід. Наприклад, змінні та функції знаходяться в одному просторі імен. Мова за замовчуванням менша та більш лаконічна, що добре допомагає навчати вас різним речам, у яких гарне копіювання, наприклад, тисне використання рекурсії замість ітерації, оскільки за замовчуванням не має ітеративних циклів, і вимагає оптимізації виклику хвоста. . Схема має дуже цікаву гігієнічну макросистему, яка має велике значення для навчання. Але IMO, я б рекомендував спочатку вивчити негігієнічні макроси стилю CL, з яких більшість діалектів (?) Пропонують принаймні одну реалізацію, навіть якщо це не частина специфікації. Оскільки здається, що ви хочете вивчити мову заради навчання, я '

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

З іншого боку, звичайний Лісп, здається, є набагато більш прагматичним підходом до розробки мови. Стандарт такий, що багато lisp-коду переноситься між реалізаціями, багато компілятори швидко і добре оптимізовані. Існує великий набір пакетів, багато з яких є портативними між реалізаціями. І, здавалося б, (порівняно) велика кількість реальної продукції створюється мовою. І якщо сказати quicklisp, управління пакетами відчуває себе досить близьким до того, що ви отримаєте в сучасному співтоваристві, як, наприклад, Ruby або Node. CL, однак, не має недоліків, він має дуже велику специфікацію на даний момент у порівнянні зі схемою, і навіть це об'єктна система CLOS, що традиційно записується як бібліотека в Ліпсі, є частиною специфікації IIRC. І ви можете відчути, що спадщина закріпилася через велику кількість системи.

Інакше я сказав, що не можу говорити про clojure, і Emacs Lisp - це явно правильний вибір, якщо ваша мета - написати розширення Emacs, і, очевидно, не є відповідним вибором для іншого програмного забезпечення.

TLDR; Якщо ваша мета - навчитися, я рекомендую схему. Однак, якщо ви хочете створити програмне забезпечення, я рекомендую Common Lisp з двох основних варіантів lisp.


BTW, PLT Racket - це мова, яка більше схожа на схему і спочатку від спільноти схем, яка, схоже, намагається бути корисною для реальної роботи. Якби я сьогодні писав код у схемі, це, мабуть, або PLT, або схема курки, але пізніше це може бути пов’язано з м'яким плямою в моєму серці.
Арелій

0

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

Слід зазначити новийLISP . Хоча він трохи відрізняється як від CL, так і від схеми, він реалізує безліч дуже корисних функцій. Я вважаю, що http-сервер, функція багатообробної обробки (Cilk) та функції віддаленої оцінки дуже чисті та зручні у використанні.

Один виконуваний файл невеликий, швидкий і включає в себе безліч класних акумуляторів.


Це, мабуть, справедливо згадати, але я б точно не рекомендував його ... Ні лексичного обстеження, ні модулів, наприклад - серйозно? Я не дуже розумію, що намагається досягти newLISP.
cji

2
Ви маєте рацію - це інакше. Він використовує контексти та динамічне масштабування, і з мого досвіду модулі та контексти взаємопов'язані. Це не намагається бути іншим CL або Scheme. Читання сторінки про те, як вона відрізняється ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) проливає світло на проблеми дизайну. Так само я б не рекомендував його тим, хто хоче отримати CL або Scheme. Але для деяких випадків використання це може бути прийнятним вибором. Ось така краса екосистеми з відкритим кодом - багато вибору!
CyberFonic

0

Ще одним фактором, який слід врахувати при виборі того, який діалект Lisp вивчити, може бути кількість та якість реалізацій. Якщо в діалекті є лише одна або дві реалізації, то ви дотримуєтесь їх недоліків, поки ці вади не виправляться, і завжди є шанс, що люди перестануть вдосконалювати реалізацію. Це само по собі не є причиною не використовувати діалект Lisp з одною реалізацією, але це щось врахувати. Перевагою Scheme та Common Lisp є те, що існує багато реалізацій цих діалектів. Обидві мови опублікували стандарти, тому порівняно недавні реалізації, швидше за все, мають запускати один і той же код, в основному. Деякі з цих реалізацій існують вже давно, але все ще знаходяться в активному розвитку: вони зараз високоякісні, і вони все ще вдосконалюються.


Ну, відповідно до цих тестів Clojure робить не надто погано в порівнянні з SBCL: benchmarksgame.alioth.debian.org/u32/…
AndreasScheinert

Спасибі Андреас. Ти правий. Показує, скільки я знаю про JVM - не так багато. Частково мене ввели в оману ABCL, відносно повільний, але в іншому випадку приємний CL на базі JVM.
Марс

Я б заперечував, якщо ви хочете Lisp на JVM, ідіть на Clojure. Це не ідеально, але це справжня насолода (IMHO)
AndreasScheinert
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.