15 lines
354 B
Common Lisp
15 lines
354 B
Common Lisp
(defun nest (l)
|
|
(if (cdr l)
|
|
`(,@(car l) ,(nest (cdr l)))
|
|
(car l)))
|
|
|
|
(defun desugar-listc-form (form)
|
|
(if (string= (car form) 'for)
|
|
`(iter ,form)
|
|
form))
|
|
|
|
(defmacro listc (expr &body (form . forms) &aux (outer (gensym)))
|
|
(nest
|
|
`((iter ,outer ,form)
|
|
,@(mapcar #'desugar-listc-form forms)
|
|
(in ,outer (collect ,expr)))))
|