?

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:
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)
[User Picture]From: grundik
2011-01-16 01:26 pm (UTC)
Эммм... Зачем нужен софт, который ничего не делает? Ну то есть в файлы не пишет, ракеты не запускает? Это на тему "в колбасе потребности нет", ога.

По остальному комментировать не хочу, ибо жонглирование терминами таки не мой конёк.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-16 01:43 pm (UTC)
Само собой разумеется, что софт, который ничего не делает, не нужен.
Как не нужен и софт, который делает не то что надо, и запускает ракеты вместо записи в файл, а в файл пишет вместо запуска ракет.
Только писать в файл, запускать ракеты и вообще программировать императивно в деларативном языке можно, и состояние и последовательность выполнения всегда будет под контролем. А вот программировать декларативно на императивном языке нельзя. Как нельзя и контролировать состояние с последовательностью действий. Т.е. в императивном языке и возможностей работать с состоянием меньше, чем в декларативном.
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-16 03:38 pm (UTC)
Этот софт гарантировано корректно и правильно вычисляет необходимость записи в файл и запуска ракет.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-16 03:57 pm (UTC)
> Декларативность - это просто. Когда мы получаем один результат вне зависимости от пути редукции. В декларативном языке, например,
map f . map g == map (f . g)

Если map и . чистые (что гарантируется исключительно реализацией языка, хоть в хаскеле, хоть в лиспе) то это равенство будет выполняться, при условии, что вычисления энергичны и порядок выполнения аргументов фиксирован. Например, в Common Lisp оно выполняется.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-16 06:13 pm (UTC)
1)Ну а как вы гарантируете чистоту функций f и g?
2)Нет, не выполняется. Подумайте лучше.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-17 04:20 am (UTC)
> 1)Ну а как вы гарантируете чистоту функций f и g?

Я же говорю - они гарантируются реализацией. То есть дяди, которые писали эти функции, говорят "мамой клянусь, функции чистые". Никакой другой гарантии тут нет ни в лиспе, ни в хаскеле. В крайнем случае, эти функции используют некоторые функции, которые "мамой клянусь, чистые".

> 2)Нет, не выполняется. Подумайте лучше.

Выполняется, потому что порядок вычисления f и g в обеих частых равенства совпадает, а остальное - "чистое"..
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-17 09:34 am (UTC)
"дяди, которые писали эти функции, говорят "мамой клянусь, функции чистые". Никакой другой гарантии тут нет ни в лиспе, ни в хаскеле."

Да, в любом декларативном языке мы приходим к вызову каких-то внешних функций (на каком-нибудь С), про которые сказано "мамой клянусь, функции чистые". И программист и среда исполнения, что характерно, в это верит, а потому, если кто-то выдаст процедуру за чистую функцию - все будет работать неправильно. Вот такие гарантии.
В императивном языке нет не только другой гарантии, но и такой тоже нет. Там по умолчанию процедуры с сайд эффектами. Поэтому и среда выполнения и программист всегда руководствуются презумпцией "сайд эффекты есть, порядок имеет значение". Поэтому, если мы напишем чистую функцию - кому нам класться? Всем наплевать. И если мы начнем встраивать в императивный язык язык декларативный и клясться на каждой функции - мы вынуждены будем переписать весь мир. А для встраивания императивного языка в язык декларативный весь мир переписывать не надо. Поэтому и получается на практике, что в декларативном языке код требующий определенной последовательности выполняется в этой последовательности, а остальной в произвольной - и из этого можно извлечь выгоду. В императивном языке, даже написав чистую функцию, мы выгоды не извлечем, потому как все выполняется в определенной последовательности.

"порядок вычисления f и g в обеих частых равенства совпадает, а остальное - "чистое""

Ох, ну я же говорил, подумайте лучше. Порядок вычисления f и g не совпадает - в этом суть примера.
map f . map g -> gggfff
map (f . g) -> gfgfgf
если они чистые - нет разницы, если не чистые - разница есть и еще какая.
Реализатор map никак не может написать чистую функцию, потому что ее чистота зависит от чистоты функции, к которой она применяется. И в императивном языке не существует гарантий на эту самую приходящую из вне функцию, которые можно использовать на практике. И поэтому, на практике никто не будет, находясь в здравом уме, делать такое преобразование, потому что норма - сайд-эффект. А в декларативном будут - потому что там норма - чистая функция и от процедуры ее можно отличить. Вот и вся разница.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-18 09:23 am (UTC)
> В императивном языке нет не только другой гарантии, но и такой тоже нет.

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

> Ох, ну я же говорил, подумайте лучше. Порядок вычисления f и g не совпадает - в этом суть примера.
map f . map g -> gggfff
map (f . g) -> gfgfgf

А, я неверно понял пример.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-18 09:57 am (UTC)
"Если в спеках написано, что функция не совершает побочных эффектов - то это и есть пример подобной гарантии."

Как написать такой map, в который применяется к функциям в спеках которой написано, что она не совершает побочных эффектов, а к функциям, в спеках которых этого не написано - не применяется? Вот видите, значит это гарантии совсем не одного качества. Я же вроде бы подробно объяснил, что чистую функцию написать в императивном языке можно, но смысла в этом нет никакого, потому что использовать это на практике нельзя. В декларативном языке пользоваться чистотой можно. В этом и разница.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-18 02:54 pm (UTC)
> Как написать такой map, в который применяется к функциям в спеках которой написано, что она не совершает побочных эффектов, а к функциям, в спеках которых этого не написано - не применяется?

Не надо подменять понятия. Мы говорим о гарантиях чистоты map, а не о гарантиях чистоты ф-й, к которым применяется map. И эта гарантия одинакова - что в хаскеле, что в лисп. Просто в спеке написано "мап чистый". Кстати, на счет независимости от пути редукции.
map f x, где х имеет тип List (IO ...) - результат может быть любым.
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-18 08:57 pm (UTC)
>И эта гарантия одинакова - что в хаскеле, что в лисп.

Да ничего подобного.

f :: (Int -> Int) -> [Int] -> [Int]
f g = map g

f (+1) -- всё Ok.
f (\x -> do { putStrLn "пуск ракет!"; return (x+1) }) -- ошибка проверки типов.

В лиспе второе на раз.

Та чушь, что вы несёте, она совсем не прекрасна, стихов недостойна.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-19 04:17 am (UTC)
> Да ничего подобного.

Ну что же вы за бред снова несете? Я для особо одаренных повторю второй раз - речь о конкретно функциях map и . (ну или вообще о других базовых функциях), не чистоте тех ф-й, что вызывает map или чистоте каких-то других определенных через map вами лично. Указано у вас, что map - чистый, и эта чистота лежит на совести исключительно разработчиков компилятора. Разработчик говорит "все чисто" - и мы верим. Других гарантий не предоставляется. Кстати, а порядок вычисления map регламентируется? То есть тот факт, что сперва вычисляется первый элемент списка, потом второй, потом третий - но не вперемешку? Ну или если у нас рекурсивная реализация и там стоит map f (x:xs) = [f x] ++ (map f xs) - кто гарантирует, что сайдэффекты f будут вычислены до вызова map f xs?
(Reply) (Parent) (Thread) (Expand)
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
(no subject) - (Anonymous) Expand
From: (Anonymous)
2011-01-19 07:52 am (UTC)
"Не надо подменять понятия."

Ну и не подменяйте.

"Мы говорим о гарантиях чистоты map, а не о гарантиях чистоты ф-й, к которым применяется map"

Ну так map не чище функций к котором применяется. Поэтому о чистоте map имеет смысл говорить только в том случае, когда есть гарантия того, что применяется map только к чистой функции.

"И эта гарантия одинакова - что в хаскеле, что в лисп."

Ну повторите еще раз десять, думаете я что-то новое отвечу по сравнению с тем, что я уже на это ответил выше?

"map f x, где х имеет тип List (IO ...) - результат может быть любым."

Давайте вы не будете фантазировать, а прочтете что-нибудь про IO и попробуете сами, для этого даже хаскель устанавливать не нужно - можно в каком-нибудь codepad поэкспериментировать.
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-16 06:20 pm (UTC)
Вы подписывайтесь, пожалуйста. Страна должна знать своих героев.

Завести login в ЖЖ очень просто, а нам приятно будет говаривать между собой "А, опять N! Ну, с мы его по дискуссии в ru_lisp хорошо знаем."
(Reply) (Parent) (Thread)