LINUX.ORG.RU

Главная Проблема Лиспа


1

7

Надо признать, я солидарен с вот этим постингом в том, какая проблема у лиспа(и у Common Lisp в частности) на текущий момент является ключевой, и какая отталкивает от него разработчиков.

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

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

Взять вот такую простенькую, даже тупую, программку - GUI-морда к БД. На C# написать ее не составило совершенно никакого труда, и заняло это пару часов от силы. Но если попытаться сделать то же самое на лиспе, окажется что сделать это не так уж и просто - будет очень не хватать WPF, очень не хватать Entity Framework, да и даже банального интерфейса к ОС(для того чтобы сделать программу синглтоном). И это не говоря уже про Visual Studio и прочие инструменты типа Expression Blend, которые очень сильно упрощают разработку GUI и подобного.

Так к чему этот постинг вообще? Пишите библиотеки для лиспа, вот к чему! Я вот твердо уверен, будь у CL столько же библиотек, как у .NET, или, тем более, Java, то последними бы никто почти не пользовался.

http://love5an.livejournal.com/366931.html

Ответ на: комментарий от iVS

> понятие «локальных» переменных как-то ближе.

Тем не менее, это всё же разные понятия.

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

> Для тех, кто не читал «Practical Common Lisp», понятие «локальных» переменных как-то ближе.

локальные и лексические - не совсем одно и то же.

anonymous
()
Ответ на: комментарий от provaton

Нормальный компактный пример в студию, плиз. Реально интересно.

CL-USER> (ql:system-apropos "pattern")
#<QL-DIST:SYSTEM cl-pattern / cl-pattern-20110730-git / quicklisp 2011-07-30>
#<QL-DIST:SYSTEM cl-pattern-benchmark / cl-pattern-20110730-git / quicklisp 2011-07-30>
#<QL-DIST:SYSTEM cl-pattern-test / cl-pattern-20110730-git / quicklisp 2011-07-30>
NIL
CL-USER> (ql:quickload "cl-pattern")
To load "cl-pattern":
  Load 1 ASDF system:
    alexandria
  Install 3 Quicklisp releases:
    cl-annot cl-pattern cl-syntax
; Fetching #<QL-HTTP:URL "http://beta.quicklisp.org/archive/cl-syntax/2011-04-18/cl-syntax-20110418-git.tgz">
; 2.56KB
==================================================
2,617 bytes in 0.00 seconds (2555.66KB/sec)
; Fetching #<QL-HTTP:URL "http://beta.quicklisp.org/archive/cl-annot/2011-04-18/cl-annot-20110418-git.tgz">
; 8.14KB
==================================================
8,333 bytes in 0.00 seconds (8137.70KB/sec)
; Fetching #<QL-HTTP:URL "http://beta.quicklisp.org/archive/cl-pattern/2011-07-30/cl-pattern-20110730-git.tgz">
; 5.03KB
==================================================
5,148 bytes in 0.00 seconds (5027.34KB/sec)
; Loading "cl-pattern"
[package alexandria.0.dev]........................
[package cl-annot.util]...........................
[package cl-annot.core]...........................
[package cl-annot.expand].........................
[package cl-annot.syntax].........................
[package cl-annot.helper].........................
[package cl-annot]................................
[package cl-annot.std]............................
[package cl-annot.eval-when]......................
[package cl-annot.doc]............................
[package cl-annot.class]..........................
[package cl-annot.slot]...........................
[package cl-syntax]...............................
[package cl-syntax-annot].........................
[package cl-pattern]..
("cl-pattern")

CL-USER> (pattern:match '(1 2)
           ((x y) (+ x y)))
3

CL-USER> (swank::macroexpand-all '(pattern:match '(1 2)
                                    ((x y) (+ x y))))
(LET ((#:VAR873062 '(1 2)))
  (IF (CONSP #:VAR873062)
      (LET ((#:CAR873063 (CAR #:VAR873062))
            (#:CDR873064 (CDR #:VAR873062)))
        (DECLARE (IGNORABLE #:CAR873063 #:CDR873064))
        (IF (CONSP #:CDR873064)
            (LET ((#:CAR873065 (CAR #:CDR873064))
                  (#:CDR873066 (CDR #:CDR873064)))
              (DECLARE (IGNORABLE #:CAR873065 #:CDR873066))
              (IF (NULL #:CDR873066)
                  (LET ((Y #:CAR873065))
                    (LET ((X #:CAR873063)) (+ X Y)))
                (CL-PATTERN::%MATCH-ERROR (LIST #:VAR873062)
                                          '(((X Y))))))
          (CL-PATTERN::%MATCH-ERROR (LIST #:VAR873062) '(((X Y))))))
    (CL-PATTERN::%MATCH-ERROR (LIST #:VAR873062) '(((X Y))))))

CL-USER> (pattern:match '(123 "hello")
           ((123 "hello") 'ok))
OK

CL-USER> (handler-case
             (pattern:match '(123 "hello")
               ((123 "world") 'ok))
           (pattern:match-error ()
             'error))
ERROR

CL-USER> (pattern:match '(123 "hello")
           ((123 "world") 'world)
           ((123 "hello") 'hello))
HELLO
anonymous
()
Ответ на: комментарий от anonymous
CL-USER> (pattern:match '(123 "mazafaka")
           ((123 "world") 'world)
           ((123 "hello") 'hello)
           ((_   _) 'what?))
WHAT?
anonymous
()
Ответ на: комментарий от anonymous

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

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

Просто вся красота паттерн-матчинга проявляется именно в работе с алгебраическими структурами

не обязательно алгебраическими. не знаю как в CL, но в Racket:

#lang racket

(struct foo (x y))
(struct bar (z))

(define (test)
  (match (foo 123 "mazafaka")
    ((foo 123 "world") 'world)
    ((foo 123 "hello") 'hello)
    ((bar 'something ) 'bar)
    ((foo _ _) 'what?)))

=>

> (test)
'what?
> 

думаю для CL тоже есть что-нибудь для структур + никто не мешает использовать вместо структур списки/векторы, в котороых первый элемент — символ-метка типа.

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

> никто не мешает использовать вместо структур списки/векторы,

в котороых первый элемент — символ-метка типа.


Отказаться от CLOS в пользу паттер-матчинка - это надо быть знатным извращенцем ))

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

> Отказаться от CLOS в пользу паттер-матчинка - это надо быть знатным извращенцем ))

ты мне это говоришь? не я просил паттерн-метчинга =)

впрочем CLOS с его интроспекцией тут может даже неплохо помочь, имхо =)

может это уже не совсем паттерн-матчинг будет, но вполне его «заменит»

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

> Да что в этом клосе такого хорошего? Он уже научился параметрический полиморфизм поддерживать?

интересно зачем? требую примера =)

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

> интересно зачем? требую примера =)

Не знаю. Та я сам питонщик, правда мечтаю написать что-то свое на лиспе или хаскелле, но до конца не выбрал еще. Вот поэтому внимательно слежу за всеми флеймами по ФП на ЛОРе, задаю вопросы и делаю выводы :)

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

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

> То есть, ничего принципиально нового разработка на Лиспе не даст

ты так говоришь, как буд-то ФП — что-то принципиально новое.

а фана лично мне в лиспах вполне хватает, поболе, чем в хаскелле

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

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

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

> Точнее, не навязывает

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

А вот фан будет, если реально в нем разберетесь и поработаете.

Я помню разбирался на втором курсе. Был курсач по дискретке, надо было создать машину тюринга, которая решала простенькую арифметическую задачку. Я написал на лиспе нечто подобобное компилятору - который преобразовывал лисповые выражения в куски машины тюринга. Это в частности позволяло дебажить в репле, что облегчило мне жизнь - в машине было около 2000 состояний, зубодробилка еще та. Ну плюс еще 7 лет опыта конфигурирования емакса. Так что, лисп для меня не нов, но если честно, потенциал фана мне кажется в нем уже для меня исчерпан. Фан только в динамизме, но после питона от динамизма тошнит уже, хочется строгости и предсказуемости.

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

> А в чем лично ты видишь фан лиспа?

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

да и вообще простой, «унифицированный» синтаксис не отягощает, взять тот же пример из SICP про моделирование электрических цепей — объектный подход (даже без макр) на одних лишь замыканиях и символах.

более жесткий, «сахарный» синтаксис, как бы напоминает о своем конкретном значении (вызов метода, декларация, и т.п.), а выразить новую форму часто просто не позволяет, в итоге приходится городить кучу повторяющегося кода, либо изобретать нетривиальные способы генерации этого кода.

конечно многие современные языки (Хаскелл, Руби, Ио и т.п.) достаточно удобны в этом плане, в основном благодаря поддержке простой абстракции — анонимной процедуры. но этого не всегда бывает достаточно.

как-то так.

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

> вранье

Та ладно, взгляни на любой лисповый код - одни лупы, прогны и сетфы. Нету никаких способов гарантировать referential transparency для функции. Нету вменяемого карринга. Знатоки хаскела, думаю, смогут дополнить этот список.

Наличие лямбды и функций высшего порядка ни разу не делают язык пригодным для работы в функциональном стиле.

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

> лупы

loop декларативен, а не императивен, так-то

прогны

ни разу не сталкивался

сетфы

тоже не часто

Нету никаких способов гарантировать referential transparency для функции.

есть способы сделать такие функции, но видимо никому не надо

Нету вменяемого карринга

это не имеет прямого отношения к ФП, а может и вообще никакого

Знатоки хаскела, думаю, смогут дополнить этот список

не думаю. более-менее определенных, явных особенностей ФП всего два, оба этих признака что CL, что Scheme могут удовлетворить при необходимости

Наличие лямбды и функций высшего порядка ни разу не делают язык пригодным для работы в функциональном стиле.

я этого и не утверждал, более того я сам не склонен относить наличие анонимных процедур к признакам ФП

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

> loop декларативен, а не императивен, так-то

с какой радости меганавороченная итерационная конструкция стала вдруг декларативной?

ни разу не сталкивался

каждый дефан - это неявный прогн, так-то

это не имеет прямого отношения к ФП, а может и вообще никакого

Прямого не имеет, но косвенно как бы намекает.

есть способы сделать такие функции, но видимо никому не надо

Так и запишем - никому не надо чистое ФП в лиспе.

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

> с какой радости меганавороченная итерационная конструкция стала вдруг декларативной?

с такой, что она описывает, какой результат нужно получить, а не как его получить

каждый дефан - это неявный прогн, так-то

а Вы постойнно делаете (macroexpand '(defun ...)) прежде чем его передать в REPL?

Прямого не имеет, но косвенно как бы намекает.

ни разу

Так и запишем - никому не надо чистое ФП в лиспе.

ну да, а зачем?

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

> с такой, что она описывает, какой результат нужно получить, а не как его получить

Я слабо помню синтаксис лупа, и желания вспоминать нету, поэтому больше спорить не буду об этом.

ну да, а зачем?

Ну вот и я говорю, что Лисп это ни разу не функциональный язык. По крайней мере Common Lisp. (Отсюда не следует что он не доставляет фан и тем более не нужен)

а Вы постойнно делаете (macroexpand '(defun ...)) прежде чем его передать в REPL?

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

Если вы лиспер, то зачем у вас аватарка с хаскелловским лого? :)

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

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

зачем? means of abstraction

Если вы лиспер, то зачем у вас аватарка с хаскелловским лого? :)

потому что оно мне нравится. и я не лиспер.

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

> мечтаю написать что-то свое на лиспе или хаскелле, но до конца не выбрал еще

Если не думать о языке оторванно от реальности, то нужно представлять предметную область, где вы будете применять свои навыки. Лисп - это Maxima, форки Axiom (актуально, если только интересны навыки в рамках тех или иных Term rewriting systems), Emacs (это Elisp, но сойдёт, если интересен опыт написания расширений), web-приложения (похоже, наибольшее внимание этому уделяет проект http://lisper.ru/).

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

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

Ну, и Коммон Лисп, и Хаскелл позиционируются как general purpose, так что предметная область не так критична. Наоборот, мне интересно выбрать предметную область не думая о языке, на котором я буду ее реализовывать, и потом уже проверить, насколько язык в этой области применим.

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

> Наоборот, мне интересно выбрать предметную область не думая о языке, на котором я буду ее реализовывать, и потом уже проверить, насколько язык в этой области применим.

По мне, подобный подход доверия не вызывает, к сожалению. Есть ли успехи в данном направлении? А то мне это видится как just for fun в чистейшем виде. Не будет ли предметная область навязывать свои условия, нивелируя достоинства языка и, наоборот, преумножая недостатки?

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

> А то мне это видится как just for fun в чистейшем виде.

Да, just for fun. Чем это плохо? Я не претендую ни на какие фундаментальные успехи, мне это интересно ради развлечения, хобби. Я выше описывал подробно свою мотивацию.

Есть ли успехи в данном направлении?

Пока только присматриваюсь.

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

> не будет ли предметная область навязывать свои условия, нивелируя достоинства языка и, наоборот, преумножая недостатки?

опять таки - если языке general purpose, то у них НЕТУ предметной области. Они должны подходить для всех.

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

> опять таки - если языке general purpose, то у них НЕТУ предметной области. Они должны подходить для всех.

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

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

опять таки - если языке general purpose, то у них НЕТУ предметной области.

Так можно докатиться и до тьюринг-полноты.

baverman ★★★
()

всё верно пишет.

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

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

olegsov
()
Ответ на: комментарий от provaton

>> с такой, что она описывает, какой результат нужно получить, а не как его получить

>Я слабо помню синтаксис лупа, и желания вспоминать нету, поэтому больше спорить не буду об этом.

Старый спор. Но я спорить тоже не буду. Просто выскажу свое мнение.

Многое очень сильно зависит от точки зрения. Для меня LOOP (как и ITERATE) очень декларативны. Часто устраняют необходимость в рекурсии. И я нисколько не смотрю на это, как на проявление императивности. Для меня это, прежде всего, декларативность. Мне неважно, что там будут в итоге SETF и BLOCK - это мне нисколько неинтересно.

Хаскельный код тоже переводится в череду императивных конструкций. И что, от этого map становится менее декларативным?

Хотя LOOP тоже разный бывает. Но всякие COLLECT, ALWAYS, THEREIS - вполне декларативны.

dave ★★★★★
()

Главная Проблема Лиспа — такие программисты как love5an

AST-PM-105
()
Ответ на: комментарий от provaton

> Да что в этом клосе такого хорошего? Он уже научился параметрический полиморфизм поддерживать?

Параметрический полиморфизм поддерживается в любом динамическом ЯП искаробки (точнее, на деле поддерживается некое надмножество параметрическго полиморфизма).

anonymous
()
Ответ на: комментарий от provaton

> Ну вот и я говорю, что Лисп это ни разу не функциональный язык.

Вы не путайте «функциональный» и «чисто функциональный».

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

Удобно любую конструкцию считать императивной. И помнить ничего не надо.

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

> Вы не путайте «функциональный» и «чисто функциональный».

Ну а что в нем такого функционального, чего нет, допустим в питоне или руби?

provaton ★★★★★
()
20 мая 2012 г.
Ответ на: комментарий от anonymous

Только Скала, только Акка!!!

anonymous
()
Ответ на: комментарий от thelonelyisland

(писать-через-тире (лучше (словосочетания)))

anonymous
()

Главная Проблема Лиспа

Главная Проблема Лиспа В Людях, Которые Пишут Все Слова С Большой Буквы.

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

Главная Проблема Лиспа В Людях, Которые Пишут Все Слова С Большой Буквы.

ЭтоКакРазНеПроблемаЛиспа.ВОтличиеОтНекоторых();

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

то_есть_вы_считаете_что_лучше_когда_слова_написаны_так?

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

(? (скобки (проблема (наверно (читаемость (плохо))))))

Лучше, чем паттерны в двадцать экранов.

anonymous
()

Самая большая проблема лиспа это пользователи лиспа - озлобленные на весь мир тупые фанатики. Если бы их не было, язык занял бы достойную нишу (на свалке истории). А с ними даже места на свалке не заслуживает.

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

DSL вообще должны быть графическими.

DSL должны быть текстовыми (что, конечно, не отменяет возможности написания визуализатора).

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