summaryrefslogtreecommitdiffstats
path: root/stdlib/compiler.tl
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/compiler.tl')
-rw-r--r--stdlib/compiler.tl26
1 files changed, 14 insertions, 12 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl
index 504d3ea8..c5d00612 100644
--- a/stdlib/compiler.tl
+++ b/stdlib/compiler.tl
@@ -2609,15 +2609,17 @@
(@else (error "~s: cannot compile ~s" 'compile else))))
(defmacro usr:with-compile-opts (:form form . clauses)
- (with-gensyms (co)
- ^(let* ((,co (copy *compile-opts*))
- (*compile-opts* ,co))
- ,*(collect-each ((cl clauses))
- (match-case cl
- ((@(as op @(or nil t :warn :error)) . @syms)
- (each ((s syms))
- (unless (member s %warning-syms%)
- (compile-error form "~s isn't a recognized warning option" s)))
- ^(set ,*(mappend (ret ^((qref ,co ,@1) ,op)) syms)))
- (@(or @(atom) (@(not @(keywordp)) . @nil)) cl)
- (@nil (compile-error form "unrecognized clause syntax: ~s" cl)))))))
+ (match-case clauses
+ (() ())
+ (((@(as op @(or nil t :warn :error)) . @syms) . @rest)
+ (each ((s syms))
+ (unless (member s %warning-syms%)
+ (compile-error form
+ "~s isn't a recognized warning option" s)))
+ ^(compiler-let ((*compile-opts* (let ((co (copy *compile-opts*)))
+ (set ,*(mappend (ret ^(co.,@1 ,op))
+ syms))
+ co)))
+ ,*(if rest ^((with-compile-opts ,*rest)))))
+ ((@first . @rest)
+ ^(progn ,first ,*(if rest ^((with-compile-opts ,*rest)))))))