?

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: grundik
2011-01-16 10:50 am (UTC)
Ты сам проверь ;)

Алан Кей, конечно, имеет авторитет, но его область применения инструментов, условия его работы, и, главное, его background сильно отличается от моего.

Ну и это, ты опять троллишь :) А именно выдаёшь свою интерпретацию слов Кея за его слова. А он ведь не говорил того, что Хаскель проще Лиспа в семантике.

Плюс товарищ Кей говорит про Лисп-2, при этом не обращая внимания на то, что есть (хотя, возможно, в то время его не было) Лисп-1 (это к вопросу о том, насколько критики Лиспа вообще в нём разбираются). Опять же, называть лисп функциональным языком есть ошибка (или сознательный троллинг). Лисп мультипарадигменен, и функционален он не больше, чем императивен или ООП-шен.

И последнее. Судя по всему, Кей говорит не про Common Lisp, а про какой-то другой лисп. Это тоже распространённый fail в спорах о лиспе, ибо лиспов дохренища, и между собой они заметно отличаются. И часто те недостатки, что есть в Common Lisp, отсутствуют, например, в scheme (или в Racket).
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-16 11:06 am (UTC)
>Ну и это, ты опять троллишь :) А именно выдаёшь свою интерпретацию слов Кея за его слова. А он ведь не говорил того, что Хаскель проще Лиспа в семантике.

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

Правильно ли я интерпретирую его слова сейчас?

Будешь ли ты утверждать, что специальные формы и макросы не имеют отношения к семантике Лиспа?
(Reply) (Parent) (Thread)
[User Picture]From: grundik
2011-01-16 12:16 pm (UTC)
0. По-моему он просто сказал, что не понимает, зачем необходимо иметь два порядка вычислений в одном языке.
1. Я не вижу в этом серьёзного упрощения (плюс не забываем об обратной стороне, а именно о сложности компилятора). Более того, если решать со стороны receiver-а, то некоторые трюки перестают работать (это когда в процессе вычисления аргументов происходят сайд-эффекты). Ну то есть это другой язык получается уже.
2. Даже если согласиться с Кеем, из этого не следует, что сейчас Лисп сложнее Хаскеля в понимании.


PS: не сказать бы, что я не согласен с Кеем, вообще очень всё логично он говорит, но раз ты за него, то я буду против, да :)
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-16 12:29 pm (UTC)
>Более того, если решать со стороны receiver-а, то некоторые трюки перестают работать (это когда в процессе вычисления аргументов происходят сайд-эффекты). Ну то есть это другой язык получается уже.

Прошу показать, как это получается.
(Reply) (Parent) (Thread) (Expand)
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
From: (Anonymous)
2011-01-16 03:41 pm (UTC)
> Вообще-то, он сказал, что упрощение Лиспа со всеми его макросами и специальными формами возможно за счёт изменения порядка вычислений на ленивый.

При всем уважении к Алану Кею - мало ли, что он сказал? Вот если бы он предоставил научную работу с семантикой lazy-lisp, из которой четко следует, что, ага, все стало проще - был бы другой разговор, а пока это только пустопорожний треп о том, что ему показалось. Да, пару спецформ можно было бы исключить, что упростило бы семантику, но это все. Семантика макросов в данном случае никак не упрощается, как и семантика оставшихся спецформ, зато вот некоторые вещи были бы очень веселыми. Например (let ...)-формы. В ряде диалектов let выражается через lambda, если биндинги в let обрабатываются лениво, то поведение формы будет совершенно алогичным, значит надо что? Правильно - вводить let-спецформой, отлично, хорошо, годно упростили семантику, спецформы не было - пришлось ввести, и это только один тривиальный пример.
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-16 03:46 pm (UTC)
>Семантика макросов в данном случае никак не упрощается, как и семантика оставшихся спецформ, зато вот некоторые вещи были бы очень веселыми.

Дело в том, что в этом случае макросов, как таковых, и не было бы.

В той же Agda2 if определён, как функция:
-- подчёркиваниями обозначаются места для аргументов.
if_then_else_ : {A : Set} -> Bool -> a -> a -> a
if True t e = t
if False t e = e

Макрос строит выражение на основе выражения и окружения. Это отлично выражается в большей части случаев функциями высших порядков.
(Reply) (Parent) (Thread) (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
[User Picture]From: thesz
2011-01-16 03:47 pm (UTC)
И вдогонку.

Супротив высказывания grundik мнение Алана Кея пойдёт. Если бы сюда пришёл SPJ и сказал, что ленивый Лисп фигня (а он говорил про то, что "следующий Хаскель" будет энергичным), мне бы пришлось писать статью.
(Reply) (Parent) (Thread) (Expand)
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
[User Picture]From: thesz
2011-01-16 11:07 am (UTC)
>И последнее. Судя по всему, Кей говорит не про Common Lisp, а про какой-то другой лисп. Это тоже распространённый fail в спорах о лиспе, ибо лиспов дохренища, и между собой они заметно отличаются. И часто те недостатки, что есть в Common Lisp, отсутствуют, например, в scheme (или в Racket).

А вот теперь ты уводишь разговор в сторону.

Присутствует ли указанный Кеем недостаток в Scheme, CL и других известных тебе Лиспах? Присутствуют ли там макросы и специальные формы?
(Reply) (Parent) (Thread)
[User Picture]From: grundik
2011-01-16 12:09 pm (UTC)
Если честно, я вообще не понял, что конкретно не нравится Кею, кроме того, что по записи (qwe a b c) нельзя сказать, что такое qwe и когда будут вычисляться a, b и с - до передачи в qwe или после.

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

Итого, отвечая на твой вопрос - ленивые лиспы существуют, да. Например, Lazy Racket. Судя по документации, реализовано как раз так, как спрашивает Кей.


Но вообще, конечно, можешь это моё замечание засчитать за демагогию/троллинг, ога. Но напомню, у меня там оно не одно.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-16 11:10 am (UTC)
То, что лисп мультипарадигменный - заблуждение, если только не считать способы декомпизиции (функциональная, объектная и т.д.) парадигмами, ну а тогда все языки мультипарадигменные. Парадигма там одна - императивное программирование. Декларативно в лиспе писать нельзя (нет, в теории можно встроить декларативный язык, но на практике никто так не делает и делать не будет, потому как все библиотеки императивные и вообще инфраструктура не способствует), а вот Хаскель поддерживает обе парадигмы.
(Reply) (Parent) (Thread)
[User Picture]From: grundik
2011-01-16 11:48 am (UTC)
Ээээ... На лиспе можно писать так, как хочется.
Декларативно - это как, по-вашему? Как в прологе? Lisa работает, я проверял.

Но в общем неважно. Важно, что лисп не функциональный язык.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-16 12:36 pm (UTC)
"Ээээ... На лиспе можно писать так, как хочется."
Ну понятно, настоящий коммунизм - сегодня в колбасе потребности нет, сегодня декларативно писать в лиспе не хочется.

Декларативность - это просто. Когда мы получаем один результат вне зависимости от пути редукции. В декларативном языке, например,
map f . map g == map (f . g)
В императивном - так может быть в зависимости от везения и фазы луны, но в общем случае, разумеется:
map f . map g != map (f . g)
Потому что f и g не функции и процедуры и могут изменять глобальные переменные, читать файлы, запускать межконтинентальные ракеты.

И, конечно, это не как в Прологе. Пролог - императивный, хоть и имеет декларативное подмножество. Но помимо этого красные каты, императивные как бы предикаты, да там можно из "базы знаний" викидывать и добавлять предикаты прямо во время выполнения - о какой декларативности вообще разговор.

"Важно, что лисп не функциональный язык."
Не всякий. Коммон лисп, конечно, не функциональный. А схема - функциональный, но императивный. Как СМЛ или, ха-ха, сишарп.
(Reply) (Parent) (Thread) (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
[User Picture]From: love5an
2011-01-17 03:43 pm (UTC)
ой, блядь.
ну вот это такая хуйня, что я пройти мимо не могу.

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

Так вот макросы позволяют настолько декларативно писать, что никакие хаскели и рядом не лежали.

Кроме того, см. хотя бы в википедию на тему того, что такое "парадигма программирования" - http://en.wikipedia.org/wiki/Programming_paradigm
чтобы не нести больше такого бреда
(Reply) (Parent) (Thread) (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)