diff --git a/gnucash/report/report-system/eguile-utilities.scm b/gnucash/report/report-system/eguile-utilities.scm index 25a91d8603..0e536212f6 100644 --- a/gnucash/report/report-system/eguile-utilities.scm +++ b/gnucash/report/report-system/eguile-utilities.scm @@ -33,7 +33,6 @@ (gnc:module-load "gnucash/report/report-system" 0) (gnc:module-load "gnucash/app-utils" 0) - (define-public (fmtnumber n) ;; Format a number (integer or real) into something printable (number->string (if (integer? n) @@ -46,28 +45,18 @@ (define-public (gnc-monetary-neg? monetary) ; return true if the monetary value is negative - (gnc-numeric-negative-p (gnc:gnc-monetary-amount monetary))) - -(define-public (string-repeat s n) - ;; return a string made of n copies of string s - ;; (there's probably a better way) - (let ((s2 "")) - (do ((i 1 (1+ i))) ((> i n)) - (set! s2 (string-append s2 s))) - s2)) + (negative? (gnc:gnc-monetary-amount monetary))) ;; 'Safe' versions of cdr and cadr that don't crash ;; if the list is empty (is there a better way?) (define-public (safe-cdr l) - (if (null? l) - '() - (cdr l))) + (if (null? l) '() + (cdr l))) (define-public (safe-cadr l) - (if (null? l) - '() - (if (null? (cdr l)) - '() - (cadr l)))) + (cond + ((null? l) '()) + ((null? (cdr l)) '()) + (else (cadr l)))) (define-public (find-file fname) ;; Find the file 'fname', and return its full path. @@ -75,40 +64,27 @@ ;; Then look in Gnucash's standard report directory. ;; If no file is found, returns just 'fname' for use in error messages. ;; Note: this has been tested on Linux and Windows Vista so far... - (let* ((userpath (gnc-build-userdata-path fname)) - (syspath (gnc-build-report-path fname))) - ; make sure there's a trailing delimiter - (if (access? userpath R_OK) - userpath - (if (access? syspath R_OK) - syspath - fname)))) + (let ((userpath (gnc-build-userdata-path fname)) + (syspath (gnc-build-report-path fname))) + ;; make sure there's a trailing delimiter + (cond + ((access? userpath R_OK) userpath) + ((access? syspath R_OK) syspath) + (else fname)))) ; Define syntax for more readable for loops (the built-in for-each requires an ; explicit lambda and has the list expression all the way at the end). -(define-syntax for - (syntax-rules (for in => do hash) - ; Multiple variables and equal number of lists (in - ; parenthesis). e.g.: - ; - ; (for (a b) in (lsta lstb) do (display (+ a b))) - ; - ; Note that this template must be defined before the - ; next one, since the template are evaluated in-order. - ((for ( ...) in ( ...) do ...) - (for-each (lambda ( ...) ...) ...)) - ; Single variable and list. e.g.: - ; - ; (for a in lst do (display a)) - ((for in do ...) - (for-each (lambda () ...) )) - ; Iterate over key & values in a hash. e.g.: - ; - ; (for key => value in hash do (display (* key value))) - ((for => in do ...) - ; We use fold to iterate over the hash (instead of - ; hash-for-each, since that is not present in guile - ; 1.6). - (hash-fold (lambda ( accum) (begin ... accum)) *unspecified* )) - )) (export for) +(define-syntax for + (syntax-rules (for in do) + ;; Multiple variables and equal number of lists (in + ;; parenthesis). e.g.: + ;; (for (a b) in (lsta lstb) do (display (+ a b))) + ;; Note that this template must be defined before the + ;; next one, since the template are evaluated in-order. + ((for ( ...) in ( ...) do ...) + (for-each (lambda ( ...) ...) ...)) + + ;; Single variable and list. e.g.: (for a in lst do (display a)) + ((for in do ...) + (for-each (lambda () ...) ))))