diff options
Diffstat (limited to 'module/util.scm')
-rw-r--r-- | module/util.scm | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/module/util.scm b/module/util.scm index 14b6cfde..9a816cee 100644 --- a/module/util.scm +++ b/module/util.scm @@ -6,6 +6,7 @@ for-each-in for define-quick-record mod! sort* sort*! + mod/r! set/r! find-min catch-multiple) #:replace (let* set! define-syntax) @@ -20,6 +21,8 @@ ((_ otherwise ...) ((@ (guile) define-syntax) otherwise ...)))) +(define-public unspecified (if #f #f)) + (define-public upstring->symbol (compose string->symbol string-upcase)) @@ -95,6 +98,9 @@ + + + ;; Replace let* with a version that can bind from lists. ;; Also supports SRFI-71 (extended let-syntax for multiple values) ;; @lisp @@ -164,10 +170,8 @@ ;; Still requires all variables to be defined beforehand. (define-syntax set! (syntax-rules () - ((_ field expr) - (let ((val expr)) - ((@ (guile) set!) field val) - val)) + ((_ field val) + ((@ (guile) set!) field val)) ((_ field val rest ...) (begin ((@ (guile) set!) field val) (set! rest ...))))) @@ -179,9 +183,11 @@ ((_ field proc) (set! field (proc field)))) ) + ;; Like set!, but applies a transformer on the already present value. (define-syntax mod! (syntax-rules (=) + ((_) unspecified) ((_ field = proc) (modf% field = proc)) @@ -194,6 +200,21 @@ ((_ field proc rest ...) (begin (modf% field proc) (mod! rest ...))))) +(define-syntax-rule (set/r! args ... final) + (let ((val final)) + (set! args ... val) + val)) + +(define-syntax mod/r! + (syntax-rules (=) + ((_ args ... field = (proc pargs ...)) + (begin (mod! args ...) + (set/r! field (proc field pargs ...)))) + ((_ args ... ffield fproc) + (begin (mod! args ...) + (set/r! ffield (fproc ffield)))))) + + ;; This function borrowed from web-ics (calendar util) (define* (sort* items comperator #:optional (get identity)) "A sort function more in line with how python's sorted works" |