?

Log in

Почему 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: permea_kra
2011-01-14 09:43 am (UTC)
>у действительно продвинутых калькуляторов
Это которые?
>вылезает IO
Prelude.interact .
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-14 12:02 pm (UTC)
> Это которые?

Mathematica, например.

> Prelude.interact .

Как буд-то interact спасет от йобли с тайпчекером, когда попытаешься что-то написать с ио. Вот банальный пример - считать сперва длину списка, а потом список соответствующей длины. У нас этот список будет IO (LIST ...), и теперь чтобы с ним работать тебе обеспечена либо do-нотация, либо mapM и прочее говно, либо вообще >>=/>>/return руками. Очень низкий порог вхождения, очень.
(Reply) (Parent) (Thread)
[User Picture]From: permea_kra
2011-01-14 09:45 pm (UTC)
>>Mathematica
Никогда не имел дела. Из всего этого общался только с маткадом, и показал он себя... говно-говном, в общем-то, хотя графики рисует красиво.

>Как буд-то interact спасет от йобли с тайпчекером
С тайпчекером ебуться только извращенцы. Он используется для проверки контрактов операций. IO - такой контракт, достаточно простой. И таки да, если стоит задача избежать 'ебли с тайпчекером' по поводу IO, то в случае говноподелки-фильтра - спасает.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-15 04:41 am (UTC)
> Из всего этого общался только с маткадом, и показал он себя... говно-говном

Да-да. Маткад - говно-говном, а вот ghci - предел совершенства. Даже не смешно, в самом-то деле.

> С тайпчекером ебуться только извращенцы.

Я всегда знал, что все, кто пишет на хаскеле - извращенцы.

> И таки да, если стоит задача избежать 'ебли с тайпчекером' по поводу IO, то в случае говноподелки-фильтра - спасает.

Не спасает. Ты не понимаешь очевидного - если ты пишешь даже простейшую программу с ИО, то это ИО туда можно ввести сотней различных способов, и вероятность того, что человек, который впервые пишет на лиспе, сможет из этой сотни способов выбрать тот, в котором количество йобли минимально - ноль. Потому хаскель и является языком с одним из самых высоких порогов вхождения - здесь даже для того, чтобы понять, как работает хелловорд, надо разбираться в системе типов, знать сотню функций из стандартной библиотеки для работы с монадами/функторами, знать во что раскрывается do-нотация и так далее.
(Reply) (Parent) (Thread)
[User Picture]From: permea_kra
2011-01-15 06:22 am (UTC)
>Маткад - говно-говном, а вот ghci - предел совершенства.
Да нет, в общем-то. Но всякие штуки с последовательностями проще считать в ghci.

>если ты пишешь даже простейшую программу с ИО, то это ИО туда можно ввести сотней различных способов,
interact :: (String -> String) -> IO ()
The interact function takes a function of type String->String as its argument. The entire input from the standard input device is passed to this function as its argument, and the resulting string is output on the standard output device. (c) Prelude
Это, если че, стандартная библиотека, которая
а) стандартизирована
б) описывается первым делом.

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

Короче, все отмазы про еблю с тайпчекером - гнилые. Лень ещё один язык учить - ну так и признайтесь.
(Reply) (Parent) (Thread)
From: ext_55374
2011-01-15 11:14 pm (UTC)
> Откуда ей там взяться?

Я думаю, автор имеет в виду это:

Prelude Data.List> let t = readFile "/tmp/1"
Prelude Data.List> t
"Hello world\n"
Prelude Data.List> :t t
t :: IO String
Prelude Data.List> words t

:1:6:
Couldn't match expected type `String'
against inferred type `IO String'
In the first argument of `words', namely `t'
In the expression: words t
In the definition of `it': it = words t
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-15 10:57 am (UTC)
>знать сотню функций из стандартной библиотеки для работы с монадами/функторами

Слабо перечислить необходимые для Hello, world функции?
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-15 12:21 pm (UTC)
Очевидно же, что имелся в виду не конкретно хелловорд, а любая достаточно простая программа. В любом случае, функторы/монады в хаскеле - это базовая вещь, без них именно что только и можно print "Hello, World!" написать, а если что-то сложнее - надо разбираться.
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-15 01:59 pm (UTC)
>Очевидно же, что имелся в виду не конкретно хелловорд, а любая достаточно простая программа.

Как вы думаете, сколько монад и функторов было в моей модели процессора MIPS с внеочередной выдачей команд? Сколько вообще монадического кода (в процентах) было в этой большой программе?

Функторов - ни одного. Монад - две штуки, в разборе ассемблера и в области выдачи команд (о чём я позже пожалел и другие блоки делал в обычном функциональном стиле). Процент монадического кода в самой модели - менее 20% (а если бы я не использовал State монаду, то вообще было бы процентов 5).

Так вот, на основе моего опыта самостоятельной работы с Хаскелем и опыта выдачи заданий написать/расширить программу на Хаскеле другим программистам разного опыта, я могу утверждать, что для программирования на Хаскеле знания монад не требуется. Как выполнять ввод-вывод - требуется знать, всё остальное - аксиомы, куда и во что разворачивается do-запись - нет.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-15 02:28 pm (UTC)
У меня такое чувство, что вы не следите за ходом разговора. Речь шла о пороге вхождения, то есть о том, что у человека, впервые увидевшего хаскель, есть миллион способов превратить программу в кучу монадического говнокода. Безусловно, есть способы не превращать - но их намного меньше.

> Функторов - ни одного.

Учитывая, что в хаскеле практически все - инстанс функтора, я предположу, что вы лукавите. Хотя я допускаю, что такая ситуация могла возникнуть в силу специфики задачи.

> Как выполнять ввод-вывод - требуется знать, всё остальное - аксиомы, куда и во что разворачивается do-запись - нет.

Безусловно, вы сможете без знания этого всего что-то написать, но после первой же ошибки в типах - конец всему веселью. Без полного понимания того, как работают >>=/>>, и во что разворачивается do-нотация, никакая отладка программы невозможна - сообщения компилятора об ошибках типов будут для вас полнейшей абракадаброй и исправлять вы их сможете исключительно методом научного тыка. Это - строгий минимум, еще неплохо было бы знать, как работает алгоритм тайп инференса, а то автовывод типов без контроля программиста тоже весьма чреват.
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: thesz
2011-01-15 02:39 pm (UTC)
>У меня такое чувство, что вы не следите за ходом разговора.

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

Вы столкнулись с человеком, пишущим на Хаскеле уже 12 лет, зарабатывающим на жизнь Хаскелем, вот уже на двух работах, и выдававшим задания "написать программу на Хаскеле" другим людям. Будьте добры, учитывайте это впредь.

>Речь шла о пороге вхождения

Не такой уж он и высокий.

>то есть о том, что у человека, впервые увидевшего хаскель, есть миллион способов превратить программу в кучу монадического говнокода. Безусловно, есть способы не превращать - но их намного меньше.

Будьте добры, не говорите глупости. "Порог вхождения" не является эквивалентом "миллиону способов превратить программу".

>Учитывая, что в хаскеле практически все - инстанс функтора, я предположу, что вы лукавите.

Судя по всему, вы вообще не знаете Хаскеля.

Простой вопрос: имеет ли тип Bool реализацию Functor? А операция case?

>Без полного понимания того, как работают >>=/>>, и во что разворачивается do-нотация, никакая отладка программы невозможна - сообщения компилятора об ошибках типов будут для вас полнейшей абракадаброй и исправлять вы их сможете исключительно методом научного тыка.

Какая глупость. Я проводил опыты над ничего не подозревающими людьми, это совсем не так.

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

И тут то же самое.

Кстати, а не затруднит ли вас представиться? Чтобы страна знала своих героев.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-14 12:05 pm (UTC)
Ах, да, еще ошибки типа "где-то в вашем коде вместо типа %простыня_текста% тип %другая_простыня_текста%, вы хам и пидорас, месье, я не стану компилировать вашу программу" тоже очень снижают порог вхождения.
(Reply) (Parent) (Thread)
[User Picture]From: permea_kra
2011-01-14 09:47 pm (UTC)
В общем, да. Поскольку, в отличии от перла, не приходиться чесать в затылке и искать, где ты забыл скобки поставить.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-15 04:35 am (UTC)
> Поскольку, в отличии от перла, не приходиться чесать в затылке и искать, где ты забыл скобки поставить.

Ну так и надо говорить, что код на хаскиле просасывает по читабельности у всего, за исключением разве что перловских однострочников. Хотя, кстати, ложь - тайпчекер от ошибок вида "забыл поставить скобки" не спасает, например f x+y - чекер скушает, а оказывается, что ведь надо было f (x+y)...
(Reply) (Parent) (Thread)
[User Picture]From: permea_kra
2011-01-15 06:16 am (UTC)
>Ну так и надо говорить, что код на хаскиле просасывает по читабельности у всего, за исключением разве что перловских однострочников.

С какой стати мне врать? Мне неизвестно языка, имеющий хотя бы отдаленно сравнимый с хаскелем по читабельности код. Факт в другом - поскольку пишут на этом языке зачастую высоколобые с исследовательскими целями, они порой используют, эээ, нетривиальные подходы в дизайне.

>например f x+y - чекер скушает, а оказывается, что ведь надо было f (x+y)...
Смотря в каком контексте. В не-дегенеративных случаях такие штуки тайпчекером различаются.

(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-15 12:35 pm (UTC)
> Смотря в каком контексте.
В любом контексте чекер скушает, потому что результат `+` - это number, и если f можно применить к (x + y), то к x ее тоже можно будет применить.

> С какой стати мне врать? Мне неизвестно языка, имеющий хотя бы отдаленно сравнимый с хаскелем по читабельности код.

Да куча языков, в котором нету такого количества синтаксического сахара. + всякий арт из разряда <*> (опять ипаные функторы, ага, ну кому пришло в голову, что ((+) <$> [1,2] <*> [3,4]) читабельнее, чем (map + `(1 2) `(3 4))?), которые приходится пихать вместо банальной аппликации, добавить к этому отсутствие скобок (учим таблицу приоритета инфиксных операций, которых овер 9000) и принудительный карринг - в результате приходится парсить - а что к чему тут вообще применяется? Дело ведь в чем - после некоторой привычки глаз все эти вещи уже сам "цепляет" и все понятно. Но мы же о пороге вхождения говорим? То есть о том, как это выглядит для человека, у которого взгляд еще не привык. Ах, это я, кстати, еще point-free головного мозга не упомянул.
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-15 02:42 pm (UTC)
>учим таблицу приоритета инфиксных операций, которых овер 9000

Это ваши личные проблемы, если что. Типы ограничивают возможности применения.

К тому же инфиксная запись привычней и понятней любой другой. Это к вопросу о пороге вхождения.
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-15 02:46 pm (UTC)
>кому пришло в голову, что ((+) <$> [1,2] <*> [3,4]) читабельнее, чем (map + `(1 2) `(3 4))?

Тому, кто видит не только списки.

Как честный человек не могу не упомянуть о более привычной форме определения функции в виде таблицы сравнения с образцом или охраняющих условий. Если сравнивать пороги вхождения, опять же.
(Reply) (Parent) (Thread)
[User Picture]From: permea_kra
2011-01-15 05:26 pm (UTC)
>>В любом контексте чекер скушает, потому что результат `+` - это number, и если f можно применить к (x + y), то к x ее тоже можно будет применить.

не в любом. Если f :: a -> b

то \x y -> f x + y :: Num b => a -> b -> b,

но \x y-> f (x+y) :: Num a => a -> a -> b

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

>Да куча языков, в котором нету такого количества синтаксического сахара.
Сахаром можно пересластить любое блюдо. Это не повод выкидывать его с кухни нахрен. Если же сахара нет, приходиться страшно извращаться, чтобы без него обойтись.

>>добавить к этому отсутствие скобок
Не будем. Они есть и их можно использовать.

>>учим таблицу приоритета инфиксных операций, которых овер 9000
Не учим. Если что-то надо, всегда можно подсмотреть в ghci или поставить скобки.

>>((+) <$> [1,2] <*> [3,4])
Ну так перепишите как положено, а не как восторженный неофит функторов: zipWith (+) [1,2] [3,4] .


>>Но мы же о пороге вхождения говорим?
Порог вхождения - нулевой. Не обязательно ползоваться ВСЕМИ возможностями языка, чтобы иметь все его плюшки.






(Reply) (Parent) (Thread)
From: ext_55374
2011-01-15 11:29 pm (UTC)
>>((+) <$> [1,2] <*> [3,4])
> Ну так перепишите как положено, а не как восторженный неофит функторов: zipWith (+) [1,2] [3,4] .

Ващета

> (+) <$> [1,2] <*> [3,4]
[4,5,5,6]
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: voidex
2011-01-16 01:20 am (UTC)
liftM2 (+)
(Reply) (Parent) (Thread)
[User Picture]From: max630
2011-01-15 10:13 pm (UTC)
> хаскиле просасывает по читабельности

пардон, это ru_lisp?
(Reply) (Parent) (Thread)
From: ext_55374
2011-01-15 10:56 pm (UTC)
How to patch Gnome under AIX, да.
(Reply) (Parent) (Thread)
[User Picture]From: max630
2011-01-15 10:14 pm (UTC)
ну, строго говоря, довольно часто причиной такой ситуации становится именно непроставленная скобка
(Reply) (Parent) (Thread)
[User Picture]From: vanja_y
2011-01-15 09:48 pm (UTC)
Matematica на которую ссылается аноним штука на мой взгляд уродливая и громоздкая, но очень раскручена среди прикланых математиков в университетах. По идее она являтся разновидностью векторного языка с нотацией максимально приближенной к математической. Я со своей колокольни предпочитаю J от jsoftware.
(Reply) (Parent) (Thread)