New Scheme string routines
Derek Atkins
warlord at MIT.EDU
Thu Jun 5 12:29:13 EDT 2008
Maybe create a new file in src/scm and then you can cause
it to get loaded by main.scm? I don't think main.scm
is the right place for these procedures.
-derek
Quoting Charles Day <cedayiv at gmail.com>:
> To support multi-byte account separators in the QIF importer I have had to
> write several new Scheme string manipulation routines. They are pretty
> useful variations on some of the standard routines. I have them working in
> the QIF importer, but is there a better place to stick them so that they can
> be used from other modules, such as reports? Perhaps in main.scm?
>
> -Charles
>
> P.S. For example, here are a three of the Scheme procedures I have written.
> There are a few more, but this will give you a good idea. If you happen to
> see any room for performance improvement, let me know.
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;; string-rcontains
> ;;
> ;; Like string-contains, but searches from the right.
> ;;
> ;; Example: (string-rcontains "foobarfoobarf" "bar") returns 9.
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
> (define (string-rcontains s1 s2)
> (let ((s2len (string-length s2)))
> (let loop ((i (string-contains s1 s2))
> (retval #f))
> (if i
> (loop (string-contains s1 s2 (+ i s2len)) i)
> retval))))
>
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;; substring-count
> ;;
> ;; Similar to string-count, but searches for a substring rather
> ;; than a single character.
> ;;
> ;; Example: (substring-count "foobarfoobarf" "bar") returns 2.
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
> (define (substring-count s1 s2)
> (let ((s2len (string-length s2)))
> (let loop ((i (string-contains s1 s2))
> (retval 0))
> (if i
> (loop (string-contains s1 s2 (+ i s2len)) (+ 1 retval))
> retval))))
>
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;; substring-split
> ;;
> ;; Similar to string-split, but the delimiter is a string
> ;; rather than a single character.
> ;;
> ;; Example: (substring-split "foobarfoobarf" "bar") returns
> ;; ("foo" "foo" "f")
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
> (define (substring-split s1 s2)
> (let ((i (string-contains s1 s2)))
> (if i
> (cons (substring s1 0 i)
> (substring-split (substring s1 (+ i (string-length s2))) s2))
> (list s1))))
> _______________________________________________
> gnucash-devel mailing list
> gnucash-devel at gnucash.org
> https://lists.gnucash.org/mailman/listinfo/gnucash-devel
>
--
Derek Atkins, SB '93 MIT EE, SM '95 MIT Media Laboratory
Member, MIT Student Information Processing Board (SIPB)
URL: http://web.mit.edu/warlord/ PP-ASEL-IA N1NWH
warlord at MIT.EDU PGP key available
More information about the gnucash-devel
mailing list