diff options
Diffstat (limited to '')
-rw-r--r-- | module/util.scm | 11 | ||||
-rw-r--r-- | module/util/tree.scm | 20 |
2 files changed, 20 insertions, 11 deletions
diff --git a/module/util.scm b/module/util.scm index 97483222..2a995777 100644 --- a/module/util.scm +++ b/module/util.scm @@ -9,7 +9,8 @@ catch-multiple quote? tree-map let-lazy) - #:replace (let* set! define-syntax)) + #:replace (let* set! define-syntax + when unless)) ((@ (guile) define-syntax) define-syntax (syntax-rules () @@ -141,6 +142,14 @@ +(define-syntax-rule (when pred body ...) + (if pred (begin body ...) '())) + +(define-syntax-rule (unless pred body ...) + (if pred '() (begin body ...))) + + + ;; Allow set to work on multiple values at once, ;; similar to Common Lisp's @var{setf} ;; @example diff --git a/module/util/tree.scm b/module/util/tree.scm index 8d3e7805..474dc272 100644 --- a/module/util/tree.scm +++ b/module/util/tree.scm @@ -11,12 +11,12 @@ ;; Has thee form @var{(node left-subtree right-subtree)}. A leaf has ;; both it's children equal to @var{null}. (define (make-tree pred? lst) - (if (null? lst) '() - (let* ((head tail (partition (lambda (el) (pred? (car lst) el)) - (cdr lst)))) - (list (car lst) - (make-tree pred? head) - (make-tree pred? tail))))) + (unless (null? lst) + (let* ((head tail (partition (lambda (el) (pred? (car lst) el)) + (cdr lst)))) + (list (car lst) + (make-tree pred? head) + (make-tree pred? tail))))) (define (left-subtree tree) (list-ref tree 1)) @@ -34,7 +34,7 @@ (length-of-longst-branch (right-subtree tree))))) (define (tree-map proc tree) - (if (null? tree) '() - (list (proc (car tree)) - (tree-map proc (left-subtree tree)) - (tree-map proc (right-subtree tree))))) + (unless (null? tree) + (list (proc (car tree)) + (tree-map proc (left-subtree tree)) + (tree-map proc (right-subtree tree))))) |