mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
[eguile-utilities] compact functions
* whitespace * move string-repeat to eguile-html-utilities where it's used
This commit is contained in:
parent
e3a695d0d4
commit
e506b7c332
@ -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)
|
||||
'()
|
||||
(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))
|
||||
(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))))
|
||||
;; 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).
|
||||
(export for)
|
||||
(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.
|
||||
(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 (<var> ...) in (<list> ...) do <expr> ...)
|
||||
(for-each (lambda (<var> ...) <expr> ...) <list> ...))
|
||||
; Single variable and list. e.g.:
|
||||
;
|
||||
; (for a in lst do (display a))
|
||||
|
||||
;; Single variable and list. e.g.: (for a in lst do (display a))
|
||||
((for <var> in <list> do <expr> ...)
|
||||
(for-each (lambda (<var>) <expr> ...) <list>))
|
||||
; Iterate over key & values in a hash. e.g.:
|
||||
;
|
||||
; (for key => value in hash do (display (* key value)))
|
||||
((for <key> => <value> in <hash> do <expr> ...)
|
||||
; 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 (<key> <value> accum) (begin <expr> ... accum)) *unspecified* <hash>))
|
||||
))
|
||||
(export for)
|
||||
(for-each (lambda (<var>) <expr> ...) <list>))))
|
||||
|
Loading…
Reference in New Issue
Block a user