LINUX.ORG.RU

Влажные мечты лавсана. List comprehension just for lulz в CL

 


0

2

Было нефиг делать и just for lulz написал такую байду:

http://pastebin.com/PpFfsqzm

Теперь в своём любимом Common Lisp наш друг лавсан сможет написать и получить такое:

*  (all [(* 2 x), x|(loop for i below 6 collect i)])

(0 2 4 6 8 10)

или

* (all [(list x y), x|'(0 1 2), y|'(#\a #\b #\c)])

((0 #\a) (1 #\b) (2 #\c))

Или даже так

* (all [x, x|'(1 2 3 4 5 6), (evenp x), (> x 2)])

(4 6)

Для тех, кто не понял: в [] пункты разделяются запятой. Первый пункт всегда то, что возвращаем. Пункты вида varname|list связывают varname с элементами списка. Просто выражения - условия. Пункты вида ^ expr - побочные эффекты. Например ^ (print x)

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

Я писал LC, кстати гораздо более читаемые (в синтаксисе типа как у loop) когда ты еще не знал что такое CL.

Тоже мне достижение.

lovesan ★★
()

А нафига оно вообще в CL? Ну, если изначально там не было - значит и не нужно особо...

eagleivg ★★★★★
()

List comprehension just for lulz в CL

Зачем, когда есть loop?

(all [(list x y), x|'(0 1 2), y|'(#\a #\b #\c)])

Какое же убожество. Пользуясь моментом, можно ли в лиспе сделать человеческий pattern matching, который не будет выглядеть подобным образом?

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

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

turtle_bazon ★★★★★
()

Размялся, молодец. Теперь надо бы пару полезных проектов запилить. А уже потом вернуться к этому вопросу ещё раз.

turtle_bazon ★★★★★
()

Тем временем в нормальных лиспах LC давно уже есть

Welcome to Racket v6.1.
> (for/list ([i '(1 2 3)])
    (* i i))
'(1 4 9)

> (for/list ([i "abc"])
    i)
'(#\a #\b #\c)

> (for/list ([i 4])
    i)
'(0 1 2 3)
x4DA ★★★★★
()
Ответ на: комментарий от turtle_bazon

Теперь надо бы пару полезных проектов запилить

LISP
полезные проекты
LISP
полезные проекты

/0.

anonymous
()

Разработчик: (пишет ОС, СУБД, КИС, разрабатывает приложения для десктопов, серверов и мобильных устройств, программирует для науки, инженерии, энергетики, логистики, обороны, промышленности, медицины, искусства...)
Лиспер: (срется на форуме из-за list comprehension)

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

Лиспер: (срется на форуме из-за list comprehension)

Судя по ентой классификации, вы таки лиспер.

heilkitty ★★
()

Теперь в своём любимом Common Lisp наш друг лавсан сможет написать и получить такое

Жалкое подобие хаскелевских генераторов списков. Они хотя бы ленивые? :3

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

Где-то в соседних тредах срачи из-за возведения чисел в квадрат и конкатенации строк.

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

Пользуясь моментом, можно ли в лиспе сделать человеческий pattern matching

https://github.com/m2ym/optima вот универсальный, расшираемый паттерн матчинг.

loz ★★★★★
()

В хаскелле я могу сделать так:

>>> [x | Just x <- [Just 1, Nothing, Just 2, Just 3, Nothing]]
[1,2,3]

Как это будет выглядеть в ваших лиспах?

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

уже сделано давно

> (match '(1 2 3)
    [(list a b c) (list c b a)])
'(3 2 1)

> (match '(1 2 3)
    [(list 1 a ...) a])
'(2 3)

> (match '(1 2 3)
    [(list 1 a ..3) a]
    [_ 'else])
'else

> (match '(1 2 3 4)
    [(list 1 a ..3) a]
    [_ 'else])
'(2 3 4)

> (match '(1 2 3 4 5)
    [(list 1 a ..3 5) a]
    [_ 'else])
'(2 3 4)

> (match '(1 (2) (2) (2) 5)
    [(list 1 (list a) ..3 5) a]
    [_ 'else])
'(2 2 2)
x4DA ★★★★★
()
Ответ на: комментарий от loz

Объекты и прочие кастомные штуки можно в схемке матчить

Разумеется:

(define-struct tree (val left right))

> (match (make-tree 0 (make-tree 1 #f #f) #f)
    [(struct* tree ([val a]
                    [left (struct* tree ([right #f] [val b]))]))
     (list a b)])

'(0 1)

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

когда ты еще не знал что такое CL.

Попизди мне тут

niemand
() автор топика
Ответ на: комментарий от turtle_bazon

Руки до нормального не доходят. Хочу вот vorbis декодер к своей библиотеке

niemand
() автор топика

Не похоже как-то. В CL есть loop, представь себе. Википедия говорит, что это специальный синтаксис для компактной записи обработки списков. А где у тебя особый синтаксис?

niemand
() автор топика

Немного переделал синтаксис, переделал код, в который раскрывается макрос и добавил новый пункт.

http://pastebin.com/gLYGxv9Q

(all [(list x y), x <- '(1 2 3), y == (* 2 x)])

((1 2) (2 4) (3 6))

Теперь лавсан окончательно обзавидуется, а я уже уймусь с этой дурацкой затеей

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

А где у тебя особый синтаксис?

Особый - это без скобочек? А зачем? Вот в общелиспе есть loop без скобочек, и именно по этой причине вместо него используют няшный iterate, где скобочки есть.

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

Немного переделал синтаксис

Вырвиглазно. Поменяй на как-то так:

(all ((list x y) (x '(1 2 3)) (== y (* 2 x))))

И реализация проще будет, и синтаксис человеческий, не возникнет проблем с кодогенерацией.

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

Там вообще был представлен какой-то for/list. А есть там фильтры, скажем? Если последовательно применять map и filter, то это будет обычная конструкция языка, а не list comprehension. Тот же loop подходит на эту роль больше, но он более универсален. Можно запилить обычный скобчатый макрос со своим синтаксисом, но это не так весело. Я всё же для лулзов делал

niemand
() автор топика
Ответ на: комментарий от x4DA

Да не ленивый он у него ясное дело:

(test (equal (all [(* x y), x <- '(0 1 1), y <- '(2 1 4)]) '(0 1 4)))
то есть из all возвращается обычный энергичный '(0 1 4) иначе бы тест не прошел.

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

А есть там фильтры, скажем?

да, есть

 #:when 

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

Ну в принципе да, любой аналог common lisp'ового loop с collect прокатят

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

Потому что all делает список. А форма [] делает замыкание. При вызове ты считаешь новый элемент

* (defparameter *a* [x, x <- (let ((a (list 1 2 3))) (nconc a a))])

*A*
* (loop repeat 30 collect (funcall *a*))

(1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3)
niemand
() автор топика

Хочу пригласить в тему regexp_regexp и узнать его мнение

niemand
() автор топика

которые будут восхищаться мощностью коммон лиспа

Да, а нахрена этот огород, если в CL уже есть (loop ...) который может всё тоже самое, но гораздо нагляднее?

no-such-file ★★★★★
()
Ответ на: комментарий от x4DA

Что ещё можно ожидать от x4DA?

«Паста» намного лучше книг, туториалов, докладов да и вообще мозгов!

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