+ ,parser))
+ (hack-oplist (oplist)
+ (if (or (atom oplist) (atom (car oplist))) (values nil oplist)
+ (let ((binds nil) (ops nil))
+ (dolist (op oplist)
+ (if (and (consp op) (eq (car op) :op))
+ (destructuring-bind
+ (recog make-op &rest args) (cdr op)
+ (with-gensyms (var)
+ (push `(,var (,make-op ,@args)) binds)
+ (push `(seq ((nil ,recog)) ,var) ops)))
+ (push op ops)))
+ (values (nreverse binds) `(or ,@(nreverse ops)))))))
+ (multiple-value-bind (binvars binops) (hack-oplist binop)
+ (multiple-value-bind (prevars preops) (hack-oplist preop)
+ (multiple-value-bind (postvars postops) (hack-oplist postop)
+ `(let (,@binvars ,@prevars ,@postvars)
+ (parse-expression ,(wrap operand)
+ ,(wrap binops)
+ ,(wrap preops)
+ ,(wrap postops))))))))