~ chicken-core (chicken-5) 3a8da718bf4c6b71ced0fb60bee2bd84a2f2321d
commit 3a8da718bf4c6b71ced0fb60bee2bd84a2f2321d Author: Felix <bunny351@gmail.com> AuthorDate: Wed Oct 14 14:59:13 2009 +0200 Commit: Felix <bunny351@gmail.com> CommitDate: Wed Oct 14 23:28:05 2009 +0200 Added optional argument to grep function in regex unit [suggested by Tony Sidaway] diff --git a/manual/Unit regex b/manual/Unit regex index 5c21e75f..23b78e56 100644 --- a/manual/Unit regex +++ b/manual/Unit regex @@ -21,7 +21,7 @@ just use normal Scheme lists, with quasiquote if you like. === grep - [procedure] (grep REGEX LIST) + [procedure] (grep REGEX LIST [ACCESSOR]) Returns all items of {{LIST}} that match the regular expression {{REGEX}}. This procedure could be defined as follows: @@ -31,6 +31,11 @@ Returns all items of {{LIST}} that match the regular expression (filter (lambda (x) (string-search regex x)) lst) ) </enscript> +{{ACCESSOR}} is an optional accessor-procedure applied to each +element before doing the match. It should take a single argument +and return a string that will then be used in the regular expression +matching. {{ACCESSOR}} defaults to the identity function. + === glob->regexp diff --git a/regex.scm b/regex.scm index fab3e9d2..79c37972 100644 --- a/regex.scm +++ b/regex.scm @@ -295,17 +295,17 @@ ;;; Grep-like function on list: (define grep - (let ([string-search string-search]) - (lambda (rx lst) + (let ((string-search string-search)) + (lambda (rx lst #!optional (acc (lambda (x) x))) (##sys#check-list lst 'grep) - (let loop ([lst lst]) - (if (null? lst) - '() - (let ([x (car lst)] - [r (cdr lst)] ) - (if (string-search rx x) - (cons x (loop r)) - (loop r) ) ) ) ) ) ) ) + (let loop ((lst lst)) + (if (null? lst) + '() + (let ((x (##sys#slot lst 0)) + (r (##sys#slot lst 1)) ) + (if (string-search rx (acc x)) + (cons x (loop r)) + (loop r) ) ) ) ) ) ) ) ;;; Escape regular expression (suggested by Peter Bex):Trap