LINUX.ORG.RU
ФорумTalks

Выразительность лиспа - миф или реальность?


1

4

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

Решил переписать последний свой достаточно длинный код (решение этой задачи: http://www.e-olimp.com/problems/2697) на Scheme в максимально функциональном стиле. Т.к. со схемой до этого не сталкивался, то там в коде может быть много фейлов. Но вот, что вышло:

http://pastebin.com/Bny09d5m

Код короче, чем плюсовый (на ЛОРе плюсовый можно найти в девелопменте). Но ИМХО он лишь немного читабельнее ассемблера :)

Почему? Я что-то сделал не так? У меня неправильное представление о читабельности? Или читабельность лиспа - миф?

Deleted

Или читабельность лиспа - миф?

Синтаксис лиспа — не для людей

fang
()

Лисп нужен чтобы писать на нём очередную версию лиспа :}

Deleted
()

дающий самый читабельный код

Лол. Ты чё, впервые слышу такое. Это только в качестве троллинга может быть. :)
Чаще можно услышать другое: «Ууууу... Скобочи, скобочки, какой ужос».

немного читабельнее ассемблера

Имхо да, так и есть, лисп схож с ассемблером своей подробностью.

Bad_ptr ★★★★★
()
                (list #t (floor (/ (* (cadr n-val) c) (car n-val)))
                        (floor (/ (* (caddr n-val) c) (car n-val)))
                        (car n-val))

Я так подозреваю что код можно смело укоротить на треть.

urxvt ★★★★★
()

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

Кстати, посмотрите, например, как пишут APL-щики на C (в сорцах J или Kona), выглядит адски, но когда привыкнешь — очень удобно.

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

У меня расширенный алгоритм Евклида. Простой я так и пишу, как по ссылке.

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

А иногда и грустно((((

Нифига. Всегда должно сохраняться равновесие скобочек!
Исключение, правда, когда они, например, часть строки :(

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

Выпилить car, cadr, caddr и убрать повторяющееся действие? В данной задаче не принципиально, да и получилось бы еще большее говно в плане читабельности?

Deleted
()

Или читабельность лиспа - миф?

Всё достаточно просто. Если более-менее часто имеешь дело с кодом на лиспе - читается достаточно легко. Если редко работаешь с лиспом или вообще видишь его впервые, то смотрится жутковато (а если ещё с предубеждением подойти, то ещё хуже будет).

PS: Ты временно анонимусов замещаешь что ли? :)

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

В треде ДоктораСинуса про анонимусокапец (в l-o-r) кто-то сказал что-то вроде: «Ну всё - капец и лиспосрачам на ЛОРе». %)

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

Создал тред как раз с ожиданием тех самых лиспофанбоев, которые в каждом третьем треде девелопмента отмечались :) Как-то не обращал внимания, что часто это анонимусы.

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

часто это анонимусы.

Половина, как минимум. Но здесь ты их не дождёшься. По понятным причинам. :)

Да их и в девелопменте пока тоже нет. Обещали починить, но что-то не торопятся. Может быть, модеры «ыкспырымент» проводят - «ЛОР без анонимусов»?

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

Я не ферштейн в ФП. Но после прочтения сотни страниц SICP'а мне кажется что не достаточно абстрагировал данные от логики, и потому везде видна сложность струтур данных. Как-то так мне кажется.

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

Да, есть такое дело. Там тогда нужно распотрошить список в локальные переменные, заюзав для этого let.

Deleted
()

<humor>

Да. Мало того, что обезяна сама себя фотнула. У нее 2 звезды и теперь она пишет на Лиспе. Думаю мы проиграли

</humor>

demmsnt
()

я не схемер, но мне видятся такие улучшения:

- больше использовать let(у тебя ни одного) и выносить повторяющийся код в отдельные дефайны

- использовать встроенные функции, а не свои велосипеды

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

например вот такой кусок


(define (divides? a b)
  (= 0 (remainder a b)))

(define (integer-floor a b)
  (floor (/ a b)))

(define (diof-solve a b c)
  (define (make-ret-val n-val)
    (let ((g (car n-val)))
          (if (divides? c g)
              (list #t (integer-floor (* (cadr n-val) c) g)
                    (integer-floor (* (caddr n-val) c) g)
                    g)
              (list #f 0 0 0))))

  (cond ((and (= a 0) (= b 0))
         (list (= c 0) 0 0 0))
        ((= a 0)
         (let* ((p (divides? c b))
                (q (if p (integer-floor c b) 0)))
           (list p 0 q 0)))
        ((= b 0)
         (let* ((p (divides? c a))
                (q (if p (integer-floor c a) 0)))
           (list p q 0 0)))
        (else (make-ret-val (gcd a b)))))

переменные названы от балды, ессесна

lazyklimm ★★★★★
()

Если хочешь писать в функциональном стиле - пиши именно в функциональном стиле, а не в императивном, как ты написал.

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

(- скобочки (это (очень (позитивно))))
поправил для Ъ

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

Серьезно? К ЭТОМУ можно привыкнуть? Честное слово, я думал, это они так обфусцировали исходники перед передачей в GPL - чисто посмеяться. Даже думал спросить у них в рассылке, издеваются они или как - но, судя по трафику в j-dev, все верно.

Писать на J, как на APL - это понятно и логично, языки-то сильно схожи, но писать на C, как на APL - это адский п-ц.

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

Кстати, посмотрите, например, как пишут APL-щики на C (в сорцах J или Kona), выглядит адски, но когда привыкнешь — очень удобно.

Даже если к этому вымороженному кошмару можно привыкнуть, остается вопрос - стоит ли. То же относится и к Лиспам.

tailgunner ★★★★★
()
  • это не функциональный стиль
  • на Scheme так не пишут
  • открой для себя let и let*
  • забудь о cadddr
power
()

очередной тред-детектор неосиляторов.

ymn ★★★★★
()

ИМХО тебе стоит попробовать язык с паттерн-матчингом. Хаскель, например.

Miguel ★★★★★
()

Lisp - это язык для инопланетян

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

Посмотрите на любой вид спорта. Для новичка техника кажется ужасной. Однако, не стоит даже думать о больших результатах до тех пор, пока не освоишь ее :)

buddhist ★★★★★
()

offtopic

Ужас, в песстбины постят рекламу

nCdy
()

Perl выразительнее.

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

не о спортивном. А об оптимальности.

То, как пишут J - это песец. Это не оптимально. Это может быть спортом, может быть понтами или еще чем-нибудь, но это не оптимальный стиль написания программ на Си.

tailgunner ★★★★★
()

(Народная этимология.) Возможно, проблемы лиспа как-то связаны с фефектами фикции. Был, например, такой диалект, как R-Lisp с опциональностью S-выражений:

procedure delete(x, u);
if null u then nil
else
    if car u = x then cdr u
    else car u . delete(x, cdr u)
Но в народ не пошёл (нагугливаются две публикации).

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

Есть же вроде стандартная функция nth.

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

Legioner ★★★★★
()

Интересно, а те, кто тут заявляют о крутизне лиспа сами работают на нем? Я имею в виду ради $ или just for fun. Можно увидеть результаты?

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

Интересно, а те, кто тут заявляют о крутизне лиспа сами работают на нем? Я имею в виду ради $ или just for fun. Можно увидеть результаты?

у archimag и lovesan есть репы на гитхабе

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