?

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: love5an
2011-01-17 06:13 pm (UTC)
Декларативность это независимость не только от порядка вычислений, но и от вида вычислений, от структур данных, в вычислениях используемых, и так далее. Это вообще независимость от вычислений.

Декларативная конструкция - описание, спецификация объекта предметной области.

Хаскель не декларативен. CL, в базовой форме - тоже. Но, в отличие от хаскеля, CL позволяет вводить декларативные конструкции, макросами. Хаскель же ограничен теми сущностями, которыми он оперирует. Типами, монадами, функциями, туплами, списками и так далее. Если подумать, хаскель намного более императивен, чем CL.

Лямбда-исчисление тоже дофига императивно. Описывает процесс вычислений потому что.
(Reply) (Parent) (Thread)
From: ext_55374
2011-01-17 10:08 pm (UTC)
> Но, в отличие от хаскеля, CL позволяет вводить декларативные конструкции, макросами.

Толку с этих конструкций, если решение всё равно надо руками набивать?

> Хаскель же ограничен теми сущностями, которыми он оперирует.

Бггг. Лисп, наверное, може оперировать даже теми сущностями, которыми он не оперирует? :)
(Reply) (Parent) (Thread)
[User Picture]From: love5an
2011-01-17 11:30 pm (UTC)
>Бггг. Лисп, наверное, може оперировать даже теми сущностями, которыми он не оперирует? :)

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

>Толку с этих конструкций, если решение всё равно надо руками набивать?

Дак в том и фишка, что не надо.

Яркий пример - ASDF. Она вводит макрос defsystem, декларативную спецификацию модуля, т.е. грубо говоря, набора исходников, которые надо скомпилировать и/или загрузить в лисп-систему и/или протестировать в определенном порядке.

И потом, мы просто говорим (asdf:load-system :system-name), например, и безо всяких дополнительных телодвижений получаем скомпилированный код, подгруженный в лисп-систему.

Другой пример - моя библиотека Virgil - библиотека для маршалинга структур данных из лиспа в сишку(ну, просто в неуправляемую память) и обратно, и для вызова сишных функций.

Так вот, для определения сишных функций, которые отображаются в лисп нам не надо описывать руками процесс перевода байтов из памяти в лисп и назад - мы просто описываем функцию, ее типы, в декларативной форме, и получаем готовую лисповую функцию, которую можно использовать с лисповыми же объектами - никакого ручного маршалинга, все автоматически, и причем, код для маршалинга генерируется достаточно эффективный - так как анализ типов происходит во время компиляции - никакого диспатча в рантайме.
(Reply) (Parent) (Thread)
From: ext_55374
2011-01-18 12:14 am (UTC)
> Common Lisp может абстрагировать от примитивов языка(функций, структур данных, типов, и так далее). Хаскель - нет.

Что это значит и как выглядит на практике?

> Она вводит макрос defsystem, декларативную спецификацию модуля, т.е. грубо говоря, набора исходников, которые надо скомпилировать и/или загрузить в лисп-систему и/или протестировать в определенном порядке.

Честно говоря, так и не понял, чем это от import blabla отличается. Да и набор исходников упомянутый не из воздуха появляется.

> Другой пример - моя библиотека Virgil

Ага, значит таки библиотека. Библиотеку руками писали, или декларировали «хочу, чтоб всё было в шоколаде»?

И чем это отличается от

import MyModules.Pizdato

main = make_pizdato ("put/your/function/here", tralivali)

?
(Reply) (Parent) (Thread)
[User Picture]From: love5an
2011-01-18 12:42 am (UTC)
>Что это значит и как выглядит на практике?

Это значит, еще раз, что для получения чего-там нужного нам, нам не надо ручками описывать процесс получения этого чего-то там. Мы просто пишем:
(хочу-такую-вот-штуку :вот-с-такими-то-свойствами (с-таким-то и-еще-вот-с-таким) :можно-и-не-одну-кстати)

>Честно говоря, так и не понял, чем это от import blabla отличается. Да и набор исходников упомянутый не из воздуха появляется.

Это и не только import, это еще и аналог make. Оно, кстати, может не только лисповые сорцы компилировать, в теории, но и сишные и так далее. Но самая фишка в том, что изначально в языке этого не было - это библиотека просто, расширение языка.

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

>Ага, значит таки библиотека. Библиотеку руками писали, или декларировали «хочу, чтоб всё было в шоколаде»?

Это вот эта библиотека как раз позволяет писать "хочу чтоб було все в шоколаде"!

Я ее использую например, в другой своей библиотеке - Doors(биндинги к winapi в лисподружественной форме).
Я там пишу просто:
(надо-вот-такую-то-сишную-функцию-приделать-к-лиспу
        с-таким-вот-именем (конвенция-вызова-вот-такая-то из-такой-то-библиотеки)
        (возвращает-значение-такого-вот-типа)
        ...а-типы-аргументов-у-нее-вот-такие...)

Вот тут примеры можно посмотреть: https://github.com/Lovesan/doors/blob/master/system/console.lisp

И вообще, у меня в ЖЖ по тегу doors
и вот тут еще http://love5an.wordpress.com/
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-18 09:50 am (UTC)
"Декларативная конструкция - описание, спецификация объекта предметной области"

Вы все упорствуете, а ведь ваше определение бессодержательно. Получается что foo.money - это декларативно, а foo.getMoney() императивно. Но тогда декларативно можно писать вообще на всех языках.

На перл про ограничение сущностями, которыми оперирует уже тут рядом указали.

"Хаскель не декларативен."

Он декларативен, потому как это типизированное лямбда-исчисление без cell и с чистым IO.

"Если подумать, хаскель намного более императивен, чем CL"

Полагаю, вы так думаете потому, что вы фанат лиспа. Императивность/декларативность это не вопрос добра или зла, но вы кинулись защищать свой лисп, а смысл - кого он волнует? Если бы кто-нибудь написал "в замкнутой системе импульс сохраняется", то вы бы, наверное, бросились во имя великой справедливости писать, что "если подумать, импульс сохраняется в замкнутой системе намного хуже, чем ЛИСП". А чем хуже? Да очевидно же: чем ЛИСП.

"Лямбда-исчисление тоже дофига императивно. Описывает процесс вычислений потому что."

Мощное заявление. Давайте ссылку на опровержение доказательства теоремы Черча-Россера.
(Reply) (Parent) (Thread)