aboutsummaryrefslogtreecommitdiff
path: root/qklib/infix/rule-set.scm
diff options
context:
space:
mode:
authorMasaya Tojo <masaya@tojo.tokyo>2024-09-06 16:12:23 +0900
committerMasaya Tojo <masaya@tojo.tokyo>2024-09-06 16:12:23 +0900
commit6f443590d345b82a40dc0c8cfd824ec3166f82e1 (patch)
treebe125d85e2b96ac870d4504e313a38378650a2c0 /qklib/infix/rule-set.scm
parent2ff3339146b1212e26277980d5afd891e2ad1982 (diff)
Update infix->prefix and prefix->infix
Diffstat (limited to 'qklib/infix/rule-set.scm')
-rw-r--r--qklib/infix/rule-set.scm48
1 files changed, 28 insertions, 20 deletions
diff --git a/qklib/infix/rule-set.scm b/qklib/infix/rule-set.scm
index 5d8908a..f867786 100644
--- a/qklib/infix/rule-set.scm
+++ b/qklib/infix/rule-set.scm
@@ -24,6 +24,7 @@
operator-prefix-symbol
operator-precedence
operator-left?
+ operator-right?
operator-prefix
operator-unit
@@ -36,7 +37,7 @@
prefix
prefix?
prefix-symbol
- prefix-fix?)
+ prefix-binary-only?)
(import (scheme base)
(scheme case-lambda)
(only (srfi 128) make-eqv-comparator))
@@ -82,46 +83,53 @@
(hashmap-ref/default (rule-set-prefix-hashmap rule-set) key #f))
(define-record-type <operator>
- (make-operator symbol precedence left? unit prefix)
+ (make-operator symbol precedence assoc unit prefix)
operator?
(symbol operator-symbol)
(precedence operator-precedence)
- (left? operator-left?)
+ (assoc operator-assoc)
(unit operator-unit)
(prefix operator-prefix))
(define operator
(case-lambda
- ((symbol)
- (operator symbol 0))
- ((symbol precedence)
- (operator symbol precedence 'left))
- ((symbol precedence left-or-right)
- (operator symbol precedence left-or-right #f))
- ((symbol precedence left-or-right unit)
- (operator symbol precedence left-or-right unit #f))
- ((symbol precedence left-or-right unit prefix)
- (unless (or (eq? 'left left-or-right)
- (eq? 'right left-or-right))
- (error "operator: The 3rd argument must be 'left or 'right" left-or-right))
- (make-operator symbol precedence (eq? 'left left-or-right) unit prefix))))
+ ((symbol precedence assoc)
+ (operator symbol precedence assoc #f))
+ ((symbol precedence assoc unit)
+ (operator symbol precedence assoc unit #f))
+ ((symbol precedence assoc unit prefix)
+ (unless (or (eq? 'left assoc)
+ (eq? 'right assoc)
+ (eq? 'both assoc))
+ (error "operator: The 3rd argument must be 'left or 'right or 'both" assoc))
+ (make-operator symbol precedence assoc unit prefix))))
+
+ (define (operator-left? x)
+ (let ((a (operator-assoc x)))
+ (or (eq? a 'left)
+ (eq? a 'both))))
+
+ (define (operator-right? x)
+ (let ((a (operator-assoc x)))
+ (or (eq? a 'right)
+ (eq? a 'both))))
(define (operator-prefix-symbol op)
(cond ((operator-prefix op) => prefix-symbol)
(else (operator-symbol op))))
(define-record-type <prefix>
- (make-prefix symbol fix?)
+ (make-prefix symbol binary-only?)
prefix?
(symbol prefix-symbol)
- (fix? prefix-fix?))
+ (binary-only? prefix-binary-only?))
(define prefix
(case-lambda
((symbol)
(prefix symbol #f))
- ((symbol fix?)
- (make-prefix symbol fix?))))
+ ((symbol binary-only?)
+ (make-prefix symbol binary-only?))))
(define-record-type <unit>
(make-unit value inv? unary?)