Было нефиг делать и just for lulz написал такую байду:
Теперь в своём любимом 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)
Я уверен, что сейчас набегут люди, которые будут восхищаться мощностью коммон лиспа. Но мы, трезвые люди, должны знать что любые новые ридер макросы совершенно неюзабельны, а их применение выдает в кодере пионера вроде лавсана