summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2014-01-28 17:44:22 -0500
committerMark H Weaver <mhw@netris.org>2014-01-28 17:44:22 -0500
commit4dc4b86e858d391d20d0ea2551614a89fa3bd4d1 (patch)
treece8f35a6223248e88fa654f7ab5f8538e6b2c279
parentca5e0414e96886177d883a249edd957d2331db65 (diff)
downloadguile-4dc4b86e858d391d20d0ea2551614a89fa3bd4d1.tar.gz
Primitive expand numerical comparisons with more than 2 arguments.
* module/language/tree-il/primitives.scm (chained-comparison-expander): New procedure. (*primitive-expand-table*): Add primitive expanders for '<', '>', '<=', '>=', and '='.
-rw-r--r--module/language/tree-il/primitives.scm20
1 files changed, 20 insertions, 0 deletions
diff --git a/module/language/tree-il/primitives.scm b/module/language/tree-il/primitives.scm
index f140eeca2..e9fd0e968 100644
--- a/module/language/tree-il/primitives.scm
+++ b/module/language/tree-il/primitives.scm
@@ -491,6 +491,26 @@
(define-primitive-expander f64vector-set! (vec i x)
(bytevector-ieee-double-native-set! vec (* i 8) x))
+(define (chained-comparison-expander prim-name)
+ (case-lambda
+ ((src) (make-const src #t))
+ ((src a) #f)
+ ((src a b) #f)
+ ((src a b . rest)
+ (make-conditional src
+ (make-application src
+ (make-primitive-ref src prim-name)
+ (list a b))
+ (make-application src
+ (make-primitive-ref src prim-name)
+ (cons b rest))
+ (make-const src #f)))))
+
+(for-each (lambda (prim-name)
+ (hashq-set! *primitive-expand-table* prim-name
+ (chained-comparison-expander prim-name)))
+ '(< > <= >= =))
+
;; Appropriate for use with either 'eqv?' or 'equal?'.
(define maybe-simplify-to-eq
(case-lambda