cl-ds / data /repos /cl-flow /src /flow.lisp
j14i's picture
3375 CL macro transformation examples from 85 libraries
43203b4 verified
Raw
History Blame Contribute Delete
1.67 kB
(cl:in-package :cl-flow)
(defun parse-atomic-block-args (args)
(loop for (opt . body) on args by #'cddr
until (listp opt)
collecting opt into opts
collecting (first body) into opts
finally (return (list opts opt body))))
(defmacro %flow-lambda ((flow-context) &body body)
`(lambda (,flow-context)
(declare (type flow-context ,flow-context)
#.+optimize-form+)
,@body))
(defmacro flow-lambda-macro ((flow-context) &body body)
`(with-gensyms (,flow-context)
`(%flow-lambda (,,flow-context)
,,@body)))
(defmacro %with-flow-function ((fu-name fu-lambda-list &body fu-body) &body body)
(let* ((destructuring-ll (car fu-lambda-list))
(destructured-p (and destructuring-ll (listp destructuring-ll)))
(arg (gensym)))
(unless (or destructured-p (null (cdr fu-lambda-list)))
(error "Flow block can accept single argument only, but got ~A" fu-lambda-list))
`(flet ((,fu-name (,arg)
(declare (ignorable ,arg))
(,@(cond
(destructured-p
`(destructuring-bind ,destructuring-ll ,arg))
((not (null fu-lambda-list))
`(let ((,destructuring-ll ,arg))))
(t '(progn)))
,@fu-body)))
,@body)))
(defmacro with-flow-function-macro ((fu-name fu-lambda-list fu-body) &body body)
`(with-gensyms (,fu-name)
`(%with-flow-function (,,fu-name ,,fu-lambda-list ,@,fu-body)
,,@body)))
(defmacro with-flow-let-macro ((var flow) &body body)
`(with-gensyms (,var)
`(let ((,,var (list ,@,flow)))
,,@body)))