?

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:
From: (Anonymous)
2011-01-17 05:09 am (UTC)
Кстати, еще хотелось бы узнать - что за бред вы несете на счет спецформ? Языков без спецформ не существует, даже в обычном лямбда-исчислении есть спецформа - сама лямбда. И у вас в хаскеле полно спецформ - do, let, class, type etc., причем их больше чем в лиспе, и никого не возмущает, что они не передаются в функцию. Спецформа ничем не отличается от кейворда в обычном языке.
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-17 08:42 am (UTC)
>Спецформа ничем не отличается от кейворда в обычном языке.

Она выглядит, как функция.

Как и макрос.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-18 09:40 am (UTC)
Во-первых - какие проблемы с тем, что она выглядит как функция?
Во-вторых - в хаскеле тоже так, вот "type a = b" это выглядит в точности как определение функции type с одним аргументом: "f a = b"
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-18 10:15 am (UTC)
"Во-вторых - в хаскеле тоже так, вот "type a = b" это выглядит в точности как определение функции type с одним аргументом: "f a = b""
Malformed head of type or class declaration
Может вам составить какое-то представление о хаскеле сначала? Это может положительным образом сказаться на уровне дискуссии.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-18 03:05 pm (UTC)
> Может вам составить какое-то представление о хаскеле сначала?

f x = 5
type T = Char

все работает, чяднт?
(Reply) (Parent) (Thread)
[User Picture]From: migmit
2011-01-19 05:57 am (UTC)
Профессиональное заболевание лисперов: неспособность отличать заглавные буквы от строчных.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-19 12:22 pm (UTC)
Вот вы и добрались до сути. В хаскеле функции не называют с заглавной буквы. А в лиспе функции не называют if.
(Reply) (Parent) (Thread)
[User Picture]From: migmit
2011-01-19 12:33 pm (UTC)
Да мы до неё давно добрались. Вот, допустим, у меня в проекте есть DO-ON-EXTERNAL-MESSAGE, используемое примерно как
(DO-ON-EXTERNAL-MESSAGE (IGNORE-EVERYTHING-AND-DIE-SILENTLY ()))

Что это такое, по-вашему?
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-20 03:42 am (UTC)
Ну если спецформы DO-ON-EXTERNAL-MESSAGE нет, то это или макрос или функция.
(Reply) (Parent) (Thread)
[User Picture]From: migmit
2011-01-20 06:09 am (UTC)
Так макрос - или функция? Можно эту штуку подставить куда-нибудь аргументом, или нет? Вам, собственно, об этом всё время и говорят.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-20 03:58 pm (UTC)
> Так макрос - или функция?

Или то - или другое.

> Можно эту штуку подставить куда-нибудь аргументом, или нет?

Если функция - можно, если макрос - нельзя.

> Вам, собственно, об этом всё время и говорят

О чем? Из того что для понимания выражения нужен контекст? По-моему, это очевидно.
f в хаскеле - можно поставить аргументом или нет? может можно, а может нет - зависит от типа f, и от выражения, в которое ставим. Нам компилятор скажет, правильно мы поставили или неправильно. Так и тут, если попробуем форму передать в функцию, то компилятор скажет, можно было или нельзя.
(Reply) (Parent) (Thread)
[User Picture]From: migmit
2011-01-21 06:11 am (UTC)
> Или то - или другое.

Так макрос - или функция?

> Из того что для понимания выражения нужен контекст?

Контекст-то нужен, но речь не о том.

> f в хаскеле - можно поставить аргументом или нет?

Можно. Не ко всему, но можно. И в любом случае, семантика f известна; это - некоторое значение.

А F - нельзя. Это не значение.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-21 08:29 am (UTC)
> Контекст-то нужен, но речь не о том

А о чем?

> Можно. Не ко всему, но можно. И в любом случае, семантика f известна; это - некоторое значение.

Вот и в лиспе любую форму аргументом поставить можно. Не ко всему - но можно. И в любом случае семантика формы известна - это некоторое значение.
А теперь объясните, в чем отличия от хаскеля?

> А F - нельзя. Это не значение.

И if нельзя - это не функция. Дальше что?
(Reply) (Parent) (Thread)
[User Picture]From: migmit
2011-01-21 08:37 am (UTC)
(устало) Да забудьте вы про этот if. Если бы было штук десять "исключений", никто бы особо не возражал.

А так у вас есть два широко используемых вида символов, которые выглядят абсолютно одинаково, но ведут себя принципиально по-разному.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-22 06:49 am (UTC)
Так а в чем проблема с этим вы так и не объяснили? Ну ежели хотите - называйте макросы с большой буквы. Вы создаете проблему там, где ее нет. Если бы кому-то было нужно, чтобы было различие, то это было бы сделано - тем более, что делается это тривиально. А если не сделано - значит никаких проблем это не вызывает. Доказано практикой, понимаете?
(Reply) (Parent) (Thread)
[User Picture]From: migmit
2011-01-22 10:01 am (UTC)
> Ну ежели хотите - называйте макросы с большой буквы.

Блин. Мне не нужны ограничения для МЕНЯ. Мне нужны ограничения для моих коллег, пишущих другие части системы. Мне нужны ограничения для программистов, пишущих библиотеки, которыми я пользуюсь.

Или вы всегда закат солнца вручную делаете, причём в одиночку?
(Reply) (Parent) (Thread) (Expand)
From: (Anonymous)
2011-01-22 01:33 pm (UTC)
Да, это просто ниипательски сложно:
> (module test racket
      (provide (except-out (all-from-out racket) 
                           define-syntax-rule)
               (rename-out [my-syntax-rule define-syntax-rule]))
    
    (define-syntax (my-syntax-rule stx)
      (syntax-case stx ()
        [(_ (name args ...) body) (if (not (char-upper-case? (string-ref (symbol->string (syntax->datum #`name)) 0)))
                                      (raise-syntax-error (syntax->datum #`name) "bad macros name" stx)
                                      #`(define-syntax-rule (name args ...) body))])))
> (module m 'test
    (provide f)
    (define-syntax-rule (f a b) (+ a b)))
. . f: bad macros name in: (define-syntax-rule (f a b) (+ a b))
> (module m 'test
    (provide F)
    (define-syntax-rule (F a b) (+ a b)))
> (require 'm)
> (F 1 2)
3
> 

Суем туда все макро-формы (их не более десятка) и проблема решена.
Да, и вы пропустили, видимо, ту часть, где я говорил о проверке практикой.
(Reply) (Parent) (Thread)
(no subject) - (Anonymous) Expand
From: (Anonymous)
2011-01-21 08:30 am (UTC)
> И if нельзя - это не функция.

имелось в виду "А в лиспе if нельзя".
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-18 08:51 pm (UTC)
>Во-вторых - в хаскеле тоже так, вот "type a = b" это выглядит в точности как определение функции type с одним аргументом: "f a = b"

Как я понимаю, вы не знаете Хаскель вообще никак.

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

Эта область обещает быть чрезвычайно плодовитой. Её основание, положенное учеником Колмогорова Мартином Пером Лёфом, не содержит противоречий, в отличии от систем типов большинства языков программирования (и Хаскеля в том числе). Используя её, я могу заставить программиста доказать существование определённого объекта, чтобы он построил доказательство его существования, написав программу. Я говорю "заставить" потому, что у него не будет шансов допустить ошибку.

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

Так что, если не хотите всю жизнь писать "type a = b" в спорах "Лисп супротив Хаскеля, Лисп играет белыми", посмотрите на Coq или Agda2 (или на Qi, он на Лиспе, но на последний не советую - фигня-с, судя по всему). Эти языки могут сэкономить кучу времени при создании действительно сложных систем.

Как сейчас мне экономит время Хаскель, но ещё лучше.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-19 03:13 am (UTC)
> Как я понимаю, вы не знаете Хаскель вообще никак.

Да не надо вертеться-то. Я привел два конкретных примера, когда спецформы в хаскеле синтаксически неразличимы с аппликацией, прямо как в лиспе. Не надо писать в ответ простыни нерелевантного текста, про системы типов я знаю, Мартина Лефа читал, но к рассматриваемому вопросу они никакого отношения не имеют - мы говорим о синтаксисе использования спецформ в языке, к чему было приплетать типы, coq или агду? Просто признайте уже конкретный факт, что все, что вы говорили о спецформах в лиспе - чистый бред. Опуская уже всякое отсутствие аргументации в вашем предположении о том, что единый синтаксис для функций и спецформ - плохо (если ВАМ это не нравится, то так и следует говорить: "а мне не нравится"), это присутствует практически в любом языке (в том числе вашем любимом хаскеле, см. примеры).
(Reply) (Parent) (Thread)
[User Picture]From: thesz
2011-01-19 07:52 am (UTC)
>Я привел два конкретных примера, когда спецформы в хаскеле синтаксически неразличимы с аппликацией, прямо как в лиспе.

Это если не обращать внимания на то, что это разный синтаксис.

Но да, типы в Хаскеле - подмножество лямбда-исчисления.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-19 12:26 pm (UTC)
еще раз:
f x = 5
f x y 5
первое - спецформа
второе - аппликация
(if x y z)
(f x y z)
первое - спецформа
второе - аппликация

в чем разница?
и там и там различие между формами совершенно одинаково - в хаскеле это невозможность аргументу называться "=", а в лиспе - невозможность ф-и называться "if".
(Reply) (Parent) (Thread)
[User Picture]From: freiksenet
2011-01-18 11:53 am (UTC)
Вообще существует. Например kernel language.
(Reply) (Parent) (Thread)
From: (Anonymous)
2011-01-18 03:10 pm (UTC)
И еще комбинаторное исчисление. Но мы же говорим о чем-то, что можно практически использовать? кстати, само определение функции в хаскеле - тоже спецформа, которая синтаксически не отличается от аппликации. f x = 5 - применяем функцию f к аргументам x, =, 5.
(Reply) (Parent) (Thread)
[User Picture]From: freiksenet
2011-01-18 09:43 pm (UTC)
Ну kernel language, если бы у него был рабочая имплементация, вполне был бы юзабельным.
(Reply) (Parent) (Thread)