aboutsummaryrefslogtreecommitdiff
path: root/qklib
diff options
context:
space:
mode:
Diffstat (limited to 'qklib')
-rw-r--r--qklib/infix.scm28
1 files changed, 15 insertions, 13 deletions
diff --git a/qklib/infix.scm b/qklib/infix.scm
index 4715a3a..473aed5 100644
--- a/qklib/infix.scm
+++ b/qklib/infix.scm
@@ -82,19 +82,21 @@
expr))
(define (infix->prefix-1 expr ops)
- (let ->prefix ((expr (replace-operators expr ops))) ;; all new conses
- (define op (minimum-precedence expr))
- (cond ((operator? op)
- (if (operator-left? op)
- (let ((rev-expr (reverse! expr)))
- (let-values (((rev-lst op+rev-rest) (break! (cut operator=? op <>) rev-expr)))
- (let-values (((op rev-rest) (car+cdr op+rev-rest)))
- (list (operator-symbol op) (->prefix (reverse! rev-rest)) (->prefix (reverse! rev-lst))))))
- (let-values (((lst op+rest) (break! (cut operator=? op <>) expr)))
- (let-values (((op rest) (car+cdr op+rest)))
- (list (operator-symbol op) (->prefix lst) (->prefix rest))))))
- ((single? expr) (car expr))
- (else expr))))
+ (if (not (pair? expr))
+ expr
+ (let ->prefix ((expr (cons (car expr) (replace-operators (cdr expr) ops)))) ;; all new conses
+ (define op (minimum-precedence (cdr expr)))
+ (cond ((operator? op)
+ (if (operator-left? op)
+ (let ((rev-expr (reverse! expr)))
+ (let-values (((rev-lst op+rev-rest) (break! (cut operator=? op <>) rev-expr)))
+ (let-values (((op rev-rest) (car+cdr op+rev-rest)))
+ (list (operator-symbol op) (->prefix (reverse! rev-rest)) (->prefix (reverse! rev-lst))))))
+ (let-values (((lst op+rest) (break! (cut operator=? op <>) expr)))
+ (let-values (((op rest) (car+cdr op+rest)))
+ (list (operator-symbol op) (->prefix lst) (->prefix rest))))))
+ ((single? expr) (car expr))
+ (else expr)))))
(define (single? x)
(and (not (null? x))