summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-03-21 22:12:11 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-03-21 22:12:11 -0700
commit7995694f138ccef0113ac0494790eb0461f5d44e (patch)
treef47a065ff5bf1b50d024c0b0a9f388549bd15051
parent1cdc46ddad07b2b9eadabad81a7321f6037452bf (diff)
downloadtxr-7995694f138ccef0113ac0494790eb0461f5d44e.tar.gz
txr-7995694f138ccef0113ac0494790eb0461f5d44e.tar.bz2
txr-7995694f138ccef0113ac0494790eb0461f5d44e.zip
compiler: recognize ignore and use functions
We want the ignore function to go away; but if variables are mentioned, to suppress unused warnings on them. * stdlib/compiler.tl (%functional-funs%): Remove nilf from list since we are handling it specially. (compiler comp-fun-form): Recognize (ignore ...) and (nilf ...) forms, transforming them into (progn .... nil). In the case of ignore, walk the arguments: if any look like variables, mark them used. Also, add the use function to the pattern which handles identity, since it is a synonym.
-rw-r--r--stdlib/compiler.tl11
1 files changed, 9 insertions, 2 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl
index 2ba6626b..0b271cfd 100644
--- a/stdlib/compiler.tl
+++ b/stdlib/compiler.tl
@@ -350,7 +350,7 @@
(defvarl %functional-funs%
'(chain chand juxt andf orf notf iff iffi dup flipargs if or and
- progn prog1 prog2 retf apf ipf callf mapf tf nilf umethod uslot))
+ progn prog1 prog2 retf apf ipf callf mapf tf umethod uslot))
(defvarl %functional% (hash-list %functional-funs% :eq-based))
@@ -1390,7 +1390,14 @@
(set form (rlcp ^(,bin ,a ,b) form)))
((- @a)
(set form (rlcp ^(neg ,a) form)))
- ((@(or identity + * min max logior logand) @a)
+ ((@(or ignore nilf) . @args)
+ (if (eql sym 'ignore)
+ (each ((a args))
+ (if (bindable a)
+ env.(lookup-var a t))))
+ (return-from comp-fun-form me.(compile oreg env
+ ^(progn ,*args nil))))
+ ((@(or identity use + * min max logior logand) @a)
(return-from comp-fun-form me.(compile oreg env a)))))
(when (plusp olev)