LINUX.ORG.RU

Преимущества лиспа на наглядных примерах


0

0

В литературе по лиспу довольно часто (обычно в предисловии) расписывают как крут лисп - позволяет "создавать язык программирования под конкретную задачу", существенно облегчает доработку имеющегося кода и т. д. А нет ли где-нибудь набора конкретных примеров, иллюстрирующих все эти преимущества? В стиле "вот задача, на c/python/что-то ещё она решается вот так, а на лиспе вот так"?

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

★★
Ответ на: комментарий от val-amart

> потом думаю изучить CL, и посмотреть easyextend (макросы для питона) и вообще попробовать сделать из питона лисп. в общем, любопытно, что вы об этом думаете?

Скооперируйся с den73, он тебе накидает кучу всего, что хотелось бы от easyextend (он уже спрашивал про eval-when). Вообще мне кажется при достаточном допиливании получится что-то вполне по фичам аналогичное лиспу. Как насчет readtable?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Karapuz

>Неужели есть такие никому ненужные фичи, которые даже через 50 лет никто не удосужился реализовать? Ну и зачем тогда они в лиспе, если они никому не нужны?

реквестирую список ООП-языков, поддерживающих мультиметоды :)

jtootf ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>Того, что циклон не развивается, и ЕМНИП даже баги остались все еще.

твоя логика круче моей :) я так не умею

jtootf ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

> Как насчет readtable?
Насколько я понял, в еasyextend есть возможность расширять лексер. ИМХО расширяемый лексер - это лучше, чем readtable. Поскольку буковок мало, а слов - много. readtable - не шибко масштабируемая вещь. Также ipython с его ! и ? можно считать примерами аналогичного подхода.

Пример с разбоксингом - давай.

den73 ★★★★★
()
Ответ на: комментарий от jtootf

>> что вы об этом думаете?
> что тебе стоит посмотреть на Dylan

спасибо, читаю

val-amart ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

> Скооперируйся с den73, он тебе накидает кучу всего, что хотелось бы от easyextend (он уже спрашивал про eval-when). Вообще мне кажется при достаточном допиливании получится что-то вполне по фичам аналогичное лиспу. Как насчет readtable?
да, обязательно. только лисп сначала выучу, а то что такое eval-when и чем он отличается от eval в питоне не знаю ж)

val-amart ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>Вечером попробую накатать красиво на шаблонах

во-первых, Александреску это уже в своё время делал. думаешь, красивей получится?

а во-вторых, в форме (a, b)->f() всё равно не сделаешь ведь :)

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

> реквестирую список ООП-языков, поддерживающих мультиметоды :)

Nice, например. http://nice.sourceforge.net/visitor.html Правда, его развитие уже прекратилось, а разработчики советуют пользоваться Scala.

Между тем, сам Мартин Одерски говорит, что мультиметоды еще недостаточно поработанная область, чтобы добавлять ее в Scala (http://www.artima.com/scalazine/articles/goals_of_scala.html).

eao197 ★★★★★
()
Ответ на: комментарий от jtootf

> во-первых, Александреску это уже в своё время делал. думаешь, красивей получится?

Какую форму он избрал?

> а во-вторых, в форме (a, b)->f() всё равно не сделаешь ведь :)

можно попробовать $(a, b)->f() (да, ж++-специфик).

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от val-amart

В-общем-то, да. Питон - это тоже лисп. Это лисп, из которого вырезаны некоторые ключевые вещи и взамен этого добавлен пуд синтаксического сахара. Вырезано:
- скорость (уж в 10 раз он точно замедлился).
- макросы
- полноценность ФП
- специальные переменные вроде тоже вырезаны?
- code=data
- непринуждённая сериализация-десериализация базовых типов и структур
- restarts
- списки (список в питоне - это, как я понял, вектор, а консов в питоне нет)
В общем, почти весь изюм из лиспа выбросили. Похоже на то, что автор питона - человек, не отягощённым излишним пониманием сути лиспа.

Добавлено:
- обращение к членам через a.b
- инфиксная нотация

На самом-то деле, всё это было бы несложно сделать и в лиспе. Я думаю, мне хватило бы трёх месяцев, чтобы сделать из лиспа язык, настолько же вкусный по синтаксису, как питон, и при этом быстрый, как лисп. Наверное, даже вместе с модой, подобной ipython. Но этот язык будет никому не нужен. Лисп не имеет до сих пор нормально работающих open-source реализаций с тредами под офтопик. (хотя, когда я читаю про треды в питоне, мне хочется икать). И, самое главное, библиотеки. Кто бы что ни говорил, но нет нормального биндинга к современным GUI библиотекам, кроме tk. Это достаточно плохо и решает вопрос против лиспа. Хотя, честно говоря, у меня до сих пор есть определённые мысли о том, что такая работа заслуживает быть сделанной и будет весьма перспективна. Есть и проект "питон в лиспе", правда, он находится в зачаточном состоянии.

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

Взгляните на эти величественные руины и постарайтесь представить Рим в пору его могущества :)

den73 ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>Какую форму он избрал?

под рукой книги нет, увы

у Яакко Ярви на пару со Страуструпом (если я не ошибаюсь) был proposition насчёт двумерной vtbl для бинарных мультиметодов

http://portal.acm.org/citation.cfm?id=1289971.1289993

тут что-то другое, но на ту же тему - той статьи что-то сходу не найду

>можно попробовать $(a, b)->f() (да, ж++-специфик).

ну попробовать можно. а вообще, конечно, нехорошо - specific он и в Африке specific, кому ж он такой сдался?

jtootf ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>> во-первых, Александреску это уже в своё время делал. думаешь, красивей получится?

>Какую форму он избрал?

Предложил несколько вариантов от автогенерации брутфорсовой лесенки if-else по rtti до многомерной vtbl.

Absurd ★★★
()
Ответ на: комментарий от eao197

>говорит, что мультиметоды еще недостаточно поработанная область

никто не спорит, что с ними всё сложно. однако в CL они есть, а в большинстве мейнстримных языков их нет - при том, что тенденции к "проработке и добавлению" имеются; вполне обоснованные тенденции, надо полагать

а про Nice не слышал, спасибо за ссылку

jtootf ★★★★★
()
Ответ на: комментарий от den73

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

> (хотя, когда я читаю про треды в питоне, мне хочется икать)

да, это большая проблема... и ГИЛ

> И, самое главное, библиотеки.

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

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

>у лиспа нет возможности вызывать функции из сишных библиотек?

есть

>возможность дергать сишные либы - жирный плюс для питона

и для Tcl. и для Haskell. и даже для C++ ;)

jtootf ★★★★★
()
Ответ на: комментарий от val-amart

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

> да, это большая проблема... и ГИЛ

Что такое ГИЛ?

>> И, самое главное, библиотеки.

> гм. у лиспа нет возможности вызывать функции из сишных библиотек?

А что, wxPython - это чисто SWIG-обёртки? Мне всегда казалось, что для подобных вещей одного SWIG недостаточно и нужен ещё какой-то слой в целевом языке. Например, чтобы согласовать разные модели управления памятью.

den73 ★★★★★
()
Ответ на: комментарий от den73

> Что такое ГИЛ?

global interpreter lock, большая ручка тормоза, которая постоянно дёргается.

mv ★★★★★
()
Ответ на: комментарий от den73

> А что, wxPython - это чисто SWIG-обёртки? Мне всегда казалось, что для подобных вещей одного SWIG недостаточно и нужен ещё какой-то слой в целевом языке. Например, чтобы согласовать разные модели управления памятью.
про wxpython не скажу, а вот pyqt - это чисто свиг, точнее, его допиленная версия

val-amart ★★★★★
()
Ответ на: комментарий от jtootf

> а тебе-то чем Dylan не угодил?
Я его просто не знаю. А разве им кто-то пользуется? Библиотеки?
В своё время я его не стал смотреть из-за гигиеничных макросов. Сейчас смотрю - вроде нет такой проблемы. Ну, что сказать... Надо поглядеть подробнее.

den73 ★★★★★
()
Ответ на: комментарий от jtootf

>>у лиспа нет возможности вызывать функции из сишных библиотек?
>есть

ну тогда в чем проблема-то? почему никто еще не написал lisp-qt?

>>возможность дергать сишные либы - жирный плюс для питона

>и для Tcl. и для Haskell. и даже для C++ ;)

да я ж не спорю ;) просто обсуждение было в контексте python-lisp

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

>ну тогда в чем проблема-то? почему никто еще не написал lisp-qt?

ну как бы Qt - это не C. честно говоря, Qt - это даже не C++

а привязка CL к GTK+ давно есть, и вполне себе работает:
http://dmitry-vk.livejournal.com/16164.html
http://dmitry-vk.livejournal.com/16582.html
http://dmitry-vk.livejournal.com/17804.html

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>>ну тогда в чем проблема-то? почему никто еще не написал lisp-qt?
>ну как бы Qt - это не C. честно говоря, Qt - это даже не C++

хм. я писал три варианта ответа, по мере того, как просвещался ж)
так вот, swig умеет генерировать интерфейсы из CL для С и С++

val-amart ★★★★★
()
Ответ на: комментарий от den73

> А что, wxPython - это чисто SWIG-обёртки?
таки да, чистый свиг. он есть на странице списка проектов, использующих свиг

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

> ...swig умеет генерировать интерфейсы из CL...
а также Allegro CL, CFFI, UFFI, mzSheme

val-amart ★★★★★
()
Ответ на: комментарий от tailgunner

>> swig умеет генерировать интерфейсы из CL для С и С++
> SWIG вообще очень тяжелая в использовании вещь.

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

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

>так вот, swig умеет генерировать интерфейсы из CL для С и С++

ну так вперёд же :)

но что-то мне подсказывает, что SWIG - сильно не серебрянная пуля; и что связать C++ и CL с его помощью ой как непросто

jtootf ★★★★★
()
Ответ на: комментарий от val-amart

>принципиальных препятствий нет

сложность в наше время ничуть не менее интересна, чем принципиальная возможность

принципиальных препятствий для создания ОС на BrainFuck нет. и что?

jtootf ★★★★★
()
Ответ на: комментарий от den73

>специальные
ди-на-ми-чес-ки-е

>но нет нормального биндинга к современным GUI библиотекам

1. Есть, и не одна.
2. Напиши, если надо

>хватило, чтобы питон стал весьма популярным

Нет, это тут не при чем.
Маркетинг.

>Почти любое преимущество питона

У него нет никаких преимуществ, кроме тех, которые он разделяет с VB.

guest-3484-2009
()
Ответ на: комментарий от val-amart

>даже не отталкивался от возможностей лиспа?
Видимо, он отталкивался от возможностей Бейсика. Ну, заметно.

>лиспа нет возможности вызывать функции из сишных библиотек?

Есть, на высшем уровне.
Более того - http://common-lisp.net/project/cffi/manual/html_node/Wrapper-generators.html#...

guest-3484-2009
()
Ответ на: комментарий от den73

> - скорость (уж в 10 раз он точно замедлился).

Поправят. Лисп в середине 70-х тоже скоростью не отличался.

> - непринуждённая сериализация-десериализация базовых типов и структур

Клевета :)

tailgunner ★★★★★
()
Ответ на: комментарий от jtootf

>связать C++ и CL с его помощью ой как непросто
Основная проблема это нейм-менглинг и указатели на методы, поскольку они не всегда бинарно совместимы с указателями на функции.

А так - никаких сложностей.

guest-3484-2009
()
Ответ на: комментарий от tailgunner

>> - непринуждённая сериализация-десериализация базовых типов и структур
> Клевета :)

В своё время здесь была про это тема :) Вот когда в питоне можно будет писать вот так:

(defstruct foo bar)
(let ((x #1=#S(foo :bar #1#))) (eq x (foo-bar x)))

тогда это будет клеветой. Для тех, кто не знает лисп, здесь определяется структурный тип foo c одним полем bar. Далее мы читаем экземпляр этой структуры, у которой поле bar равно самой структуре и записываем в локальную переменную. Далее мы проверяем, что всё правильно считалось.

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

den73 ★★★★★
()
Ответ на: комментарий от guest-3484-2009

> >но нет нормального биндинга к современным GUI библиотекам
>1. Есть, и не одна.

>2. Напиши, если надо

Разговор соседок:
Во-первых, это не я сломала грабли. Во-вторых, они уже были сломаны. В-третьих, я их вообще не брала.

Прошу ссылку на работающий на linux, win32, macos пример биндинга к wx.

Мне некогда писать биндинги к GUI библиотекам. Это - трудоёмкое и муторное дело. Я пробовал ещё 8 лет назад с помощью SWIG сделать биндинг PltScheme/CormanLisp/Lispworks к Borland VCL. В теории - да, сделать можно. На практике, постоянно придётся разбирать всё новые и новые типы из windows.h и хренушки это получится полностью автоматизировать. Я не хочу этим заниматься, хочу уже готовое.

den73 ★★★★★
()
Ответ на: комментарий от guest-3484-2009

>> в середине 70-х

> Мощные компиляторы существовали уже в *начале* 70х.

Примеры?

tailgunner ★★★★★
()
Ответ на: комментарий от den73

И ещё.
Вот чем я занимался два часа назад.
Я прикручивал local-time к sql-odbc, чтобы видеть время, возвращаемое из SQL запроосов, в человеческом виде. В итоге:
- я не знаю, как получить число дней между двумя датами (в нормальных языках это легко)
- не существует переменной, которая управляла бы форматом даты по умолчанию. В том же дельфи есть 2 или 3 переменные, управляющие выводом даты-времени.
- для ввода даты используются readtable, конечно же, я не могу использовать @ как префикс даты, т.к. не уверен, что у меня нет идентификакторов, начинающися с @. Т.е., пока я не придумаю что-то, я не смогу читать read-ом даты.
- я за 10 минут не смог разобраться, как мне указать, что я нахожусь в поясе gmt+03. В итоге (слава Богу) я скопировал /etc/localtime на винду и теперь в винде лисп тоже знает, где я нахожусь.
- мне пришлось патчить код, чтобы не было ошибки в 70 лет при отображении текущей даты

Вот всем этим я вынужден был заниматься вместо решения производственных задач. Да, я это решил. Но деньги мне платят не за это, а за конечный результат. Типичный пример на тему "блеск и нищета лиспа". Теперь сравниваем это с трудоёмкостью биндингов к GUI библиотеки и становится ясно, что попытка использовать лисп в бизнесе имеет смысл только для достаточно мощных команд и для огромных приложений, когда имеет смысл потратить 10-15% бюджета на поддержание лисповых библиотек. Я вот связался в своё время с лиспом и теперь уже жалею об этом, потому что подобный гемор происходит с каждой новой библиотекой.

den73 ★★★★★
()

*зевает* во скоко нафлеймили. Нужно понять одну простую вещь: быдлопрограммист - это программист который программирует В ТЕРМИНАХ ПАРАДИГМЫ.

В рамочку и на стену.

Macil ★★★★★
()
Ответ на: комментарий от den73

> Для тех, кто не знает лисп

Для нас еще скажи, что за функция foo-bar

> мы читаем экземпляр этой структуры

Откуда?

> у которой поле bar равно самой структуре и записываем в локальную переменную.

То есть весь вопрос - в закольцованности списка?

tailgunner ★★★★★
()
Ответ на: комментарий от Macil

>Нужно понять одну простую вещь: быдлопрограммист - это программист который программирует В ТЕРМИНАХ ПАРАДИГМЫ.

кошмар какой. а человек, неспособный понять, что сия истина вообще означает - это быдло в квадрате?

я вот, например, не могу. и программировать в терминах я тоже не умею. увы мне и ах

jtootf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.