?

Log in

No account? Create an account
Почему LISP? - Жить не можем без проблем! [entries|archive|friends|userinfo]
Жить не можем без проблем!

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Почему LISP? [Jan. 13th, 2011|02:05 pm]
Жить не можем без проблем!

ru_lisp

[aralex]

Как говорил Ворошилов, вопрос к Знатокам (к знатокам LISP-а в данном случае)! Почему таки LISP? Или, если конкретнее, вопроса три:

  1. Для каких именно задач LISP подходит больше, чем другие языки?
  2. За счёт чего для них он подходит больше?
  3. В чём именно выражается его преимущество?

Если не в лом, приведите, pls, коротенькие иллюстрации на LISP-е (или ссылочку на них). Заранее благодарен!

Исходно данный пост был размещён в сообществе ru_programming, но там Знатоков, способных ответить внятно и по сути, увы, не нашлось :(

linkReply

Comments:
[User Picture]From: freiksenet
2011-01-13 07:11 pm (UTC)
Во-первых писать LISP прописными буквами - плохо. Если вы имеете ввиду лиспоподобные языки - пишите lisp.

Во-вторых, языка "lisp" нет. Есть много языков, которые относят к лиспу. Какой именно лисп вас интересует? Common Lisp, Scheme, Clojure, Arc, newLISP, Kernel? Три первых можно считать "актино используемыми" лиспами и все три разные. Даже Dylan и Ruby иногда к лиспам относят.
(Reply) (Thread)
[User Picture]From: freiksenet
2011-01-13 07:13 pm (UTC)
Еще Emacs Lisp забыл, из активно юзаемых.
(Reply) (Parent) (Thread)
(no subject) - (Anonymous) Expand
[User Picture]From: zhectjahsik
2011-01-13 07:25 pm (UTC)
Так, для размышления:
1. Десятое правило Гринспена (http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%81%D1%8F%D1%82%D0%BE%D0%B5_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_%D0%93%D1%80%D0%B8%D0%BD%D1%81%D0%BF%D0%B5%D0%BD%D0%B0)
2.Почитайте SICP (http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B8_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D1%80%D0%B5%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC). Разве это не может не будоражить ум и воображение?
Добавьте синтаксического сахара и у Вас объектно-ориентированная программа, добавьте еще и у Вас программа, управляемая данными, еще чуть чуть и у Вас чистый функциональный язык... Вы мультипарадигмальны, но вы не программируете на монстре типа Ada или PL/I. Но с приходом большой власти наступает большая ответственность
3. Это один самых языков (наравне с фортраном), который жив и поныне
4. Создатель "хребта" с++ -- библиотеки STL Александр Степанов со товарищи изначально реализовал свои идеи обобщенного программирования в виде большой библиотеки компонентов на Scheme. (http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BF%D0%B0%D0%BD%D0%BE%D0%B2,_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%BE%D0%B2%D0%B8%D1%87)
5. Внутри EMACS есть диалект языка Lisp
6. На самом деле это чисто математический язык для символьных вычислений (символьного дифференцирования). Просто в умелых руках он оказался годен на гораздо большие подвиги

p.s. ни одного коммерческого проекта на Lisp у меня в портфолио нет, так что можно меня закидывать шапками.
(Reply) (Thread)
[User Picture]From: zhectjahsik
2011-01-13 07:27 pm (UTC)
3. ... старых ...
(Reply) (Parent) (Thread)
[User Picture]From: zupernintendo
2011-01-13 07:32 pm (UTC)
говорят для подсчета факториалов весьма неплох.
(Reply) (Thread)
From: (Anonymous)
2011-01-13 09:13 pm (UTC)
lisp не нужен
haskell лучше подходит для факториалов
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-13 08:22 pm (UTC)
1,2,3. Для создания eDSL(embedded DSL) - специализированных языков которые очень близко описывают проблемную область. Лучше всего - за счет того что программа на лиспе - по сути, абстрактное синтаксическое дерево, и генерировать код становится очень просто.

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

Другое мнение : полезен тем что расширяет кругозор, в нем есть большое количество интересных идей, которые не встретиш в мейнстримовых языках.
(Reply) (Thread)
[User Picture]From: aralex
2011-01-13 09:19 pm (UTC)
Понятно. Язык, возникший на стыке программирования и философии :)
(Reply) (Parent) (Thread) (Expand)
(no subject) - (Anonymous) Expand
[User Picture]From: kit1980ukr
2011-01-13 08:53 pm (UTC)
Для задач, где непонятно, что именно делать (http://en.wikipedia.org/wiki/Exploratory_programming)
При этом можно добиться хорошего быстродействия.
Пример - победитель недавно прошедшего Google AI Challenge использовал именно Lisp.
(Reply) (Thread)
[User Picture]From: aralex
2011-01-13 09:21 pm (UTC)
Ну, быстродействие — это очень важно! Особенно в задачах с неопределённой целью ;)
(Reply) (Parent) (Thread) (Expand)
From: saugust
2011-01-13 09:19 pm (UTC)

Хой-нэн

Представьте, что вы упали с обрыва со связанными руками и зацепились зубами за куст. А сверху кто-то любопытный свешивается и спрашивает: "Почему Лисп?". Что бы вы ответили?
(Reply) (Thread)
[User Picture]From: aralex
2011-01-13 09:22 pm (UTC)

Re: Хой-нэн

А что, положение lisp-программистов столь плачевно? ;)
(Reply) (Parent) (Thread)
[User Picture]From: gaidam
2011-01-13 09:21 pm (UTC)
Мне нравится диалект newLISP. Это такой упрощенный, в чем-то игрушечный Lisp, идея которого была в том, чтобы совместить простоту скриптового языка и любимые "фишки" Лиспа. Девиз всего этого дела: "Put fun back to lisp". Я на нем исполнил пару веб-приложений. Могу сказать, что прежде всего, на нем работать получается очень быстро, не спотыкаешься на деталях. Особенно когда освоишь до автоматизма связки всяких hi-order function типа map-filter-apply: это рождает другой уровень абстракции, ты практически не думаешь, как написать цикл, какой взять счетчик и все эти мелочи, рождающие ошибки, а оперируешь сразу функциями преобразования потоков данных, в основном, представленных в виде иерархических списков. Цена такого скоростного программирования -- не всегда оптимальные решения. Как гласит известный афоризм, программист на лиспе знает, как вычислить всё, но ничему не знает цену, или что-то в этом роде, -- это правда. Оптимизацию, правда, никто не отменял, и при желании прекрасно все разгоняется, если, к примеру, где-то началось "торможение". Итак, сфера применения: прикладные приложения, в особенности, когда надо написать быстро прототип. Пола Грэма почитйте. И ради бога, не рекламируйте никому лисп, пусть программистов на нём будет мало. Ведь это наше секретное оружие! :)
(Reply) (Thread)
[User Picture]From: freiksenet
2011-01-13 10:57 pm (UTC)
newLISP это полный, абсолютный пиздец. Там даже область видимости динамическая.
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: pufpuf
2011-01-13 10:23 pm (UTC)
Lisp — это наиболее удобный язык для системного программирования, сочетающий в себе динамичность с возможностью наложить при необходимости сколь угодно строгие ограничения. Кроме того, за счет своей метапрограммной природы он обладает максимальной гибкостью, что позволяет сочетать в рамках одного языка и среды исполнения разные подходы и парадигмы (в других системах это обычно делается путем сочетания нескольких языков. Простой пример: веб-приложение, написанное на Ruby-on-Rails, задействует Ruby, JavaScript, HTML + какой-то кастомный язык шаблонов, SQL, YAML, Shell и, возможно, еще что-то, о чем я не подумал. В Lisp'е же такое приложение может быть написано полностью в рамках одного языка и рантайма, из которого методом кодогенерации будет создаваться код для целевых сред).
Также, верно замечено, что Lisp отлично подходит для любой исследовательской дейтельности, благодаря наилучшими на данный момент возможностями для интерактивной разработки и, опять же, гибкости.
В принципе, 10 основных технологий современного Lisp'а хорошо описаны в этом комиксе: http://landoflisp.com/ (листайте вниз по стрелке)
(Reply) (Thread)
From: acefsm
2011-01-13 11:22 pm (UTC)
>Lisp — это наиболее удобный язык для системного программирования

что вы понимаете под системным программированием?
приведите примеры таких системных программ/драйверов
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: love5an
2011-01-13 10:28 pm (UTC)
Common Lisp(когда говорят просто "лисп" - обычно имеют ввиду именно его) - мощный мультипарадигмальный язык программирования.

В нем доступны парадигмы функционального программирования, ООП(причем объектная система CL - на порядок более продвинутая, чем таковые в мейнстримных языках), и, конечно, метапрограммирования(это вообще особенность семейства языков "лисп", но в CL метапрограммирование на самом высшем уровне - макросы позволяют менять язык(и синтаксис, и семантику) совершенно произвольным образом под любую задачу).

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

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

В нем присутствует совершенно офигительная система обработки исключений, похожая на Windows SEH или синхронные сигналы Unix - намного более продвинутая, чем системы обработки исключений из мейнстримных языков.

Вообще говоря, он подходит лучше всех других мейнстримных(да и не только мейнстримных) языков для подавляющего большинства задач - от простенького скриптинга, от gui или web приложений-морд-к-БД до написания крупных интеллектуальных систем разнообразного характера.

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

У меня в жж есть тег lisp - посмотрите там по нему.

Единственный возможный недостаток - в силу относительно небольшого размера сообщества и относительно небольшой популярности, открытых библиотек для CL меньше, чем для других языков, особенно таких популярных, как Python или Java(впрочем, это отчасти решаемо - существуют библиотеки-интерфейсы к сишным библиотекам, к платформе Java или к .NET или для интероперабельности с COM).
(Reply) (Thread)
[User Picture]From: 13_49
2011-01-14 01:47 am (UTC)
Лисп-машины, для которых 100% софта было написано на лиспе, не согласны, что низкоуровневое программирование - не удел лиспа.
(Reply) (Parent) (Thread) (Expand)
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
From: dmzlj
2011-01-14 05:39 am (UTC)
А зачем нужен язык X? Все, что можно на нем написать, можно с тем же успехом написать на языке Y
(Reply) (Thread)
[User Picture]From: gabriel_irk
2011-01-14 06:42 am (UTC)
Вот насчёт "того же успеха" и возникают споры и препирательства. Едва ли существуют в природе два языка, на которых ЛЮБУЮ задачу можно решить с ОДНАКОВЫМ успехом (или геморроем).
(Reply) (Parent) (Thread) (Expand)
From: va_sav
2011-01-14 08:23 am (UTC)
При некотором понимании и опыте - необычайно компактный код для обработки сложно-структурированных данных. Что безусловно упрощает написание нетривиальных программ для обработки сложных данных. Хотя те, кто не в теме, в такой программе увидят лишь Lots of Idiotic Silly Parenthesis. И это верно для всех версий Lisp'а и большинства других функциональных языков.

Плюс в CommonLisp все бонусы, обычно связываемые с "мультипарадигменностью".

Почему именно Lisp? Он давно есть, на нем много что написано. Это как в Фортране - проще написать компилятор Фортрана, чем переписать рабочие библиотеки на какой-нибудь CXX. А при всех достоинствах Haskell - пока на нем в основном примеры из учебников.

(Reply) (Thread)
[User Picture]From: aralex
2011-01-14 08:32 am (UTC)
Спасибо! Когда переварю всё прочитанное, буду задавать вопросы более конкретные :)
(Reply) (Parent) (Thread)
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(Deleted comment)
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
From: (Anonymous)
2011-01-14 01:37 pm (UTC)
Кстати, еще аналог CL в некотором смысле можете посмотреть язык Factor http://factorcode.org/
(Reply) (Thread)
[User Picture]From: aralex
2011-01-14 02:40 pm (UTC)
Спасибо!
(Reply) (Parent) (Thread) (Expand)
(no subject) - (Anonymous) Expand
From: (Anonymous)
2011-01-14 02:37 pm (UTC)

Почему LISP?

The Right Tool For The Job:

http://sds.podval.org/tool.html
(Reply) (Thread)
[User Picture]From: aralex
2011-01-14 02:40 pm (UTC)

Re: Почему LISP?

Спасибо!
(Reply) (Parent) (Thread)
From: acefsm
2011-01-14 09:47 pm (UTC)
кста пытаясь найти для себя ответ на вопрос из топика нашел
http://danweinreb.org/blog/complaints-im-seeing-about-common-lisp
(Reply) (Thread)
[User Picture]From: pingback_bot
2011-01-15 09:12 pm (UTC)

Что интересно.

User thesz referenced to your post from Что интересно. saying: [...] Ветка [...]
(Reply) (Thread)
[User Picture]From: pingback_bot
2011-01-15 10:57 pm (UTC)

Пришло по Хаскель-кафе.

(Reply) (Thread)
[User Picture]From: galereya_art
2011-01-16 08:38 am (UTC)
Благодарю предыдущего оратора, то что нужно
(Reply) (Thread)