(define (factorial n)
[if (zero? n)
1
(* n (factorial (- n 1 ] )
Perhaps it's clearer? But the reader has to know the syntax in any case.> (define (regex-all EXP STR OPT ALL)
(let ((i 0)
(move-i (fn (X) (setq i (+ (X 1) (if ALL 1 (X -1)))) X)))
(collect (if (regex EXP STR OPT i) (move-i $it)))))
> (setq a "AAAaBAAAABcADccAAAB")
> (regex-all "[A]{3}" a 0)
(("AAA" 0 3) ("AAA" 5 3) ("AAA" 15 3))
> (regex-all "[A]{3}" a 0 true)
(("AAA" 0 3) ("AAA" 5 3) ("AAA" 6 3) ("AAA" 15 3))
(define (regex-all regexp str all)
"Find all occurrences of a regex in a string"
(let ( (out '()) (idx 0) (res nil) )
(setq res (regex regexp str 64 idx))
(while res
(push res out -1)
(if all
(setq idx (+ (res 1) 1)) ; contiguos pattern (overlap)
(setq idx (+ (res 1) (res 2)))) ; no contiguos pattern
(setq res (regex regexp str 64 idx)))
out))
(setq a "AAAaBAAAABcADccAAAB")
(regex "[A]{3}" a)
;-> ("AAA" 0 3)
(regex-all "[A]{3}" a)
;-> (("AAA" 0 3) ("AAA" 5 3) ("AAA" 15 3))
(regex-all "[A]{3}" a true)
;-> (("AAA" 0 3) ("AAA" 5 3) ("AAA" 6 3) ("AAA" 15 3))
define : factorial n
if : zero? n
. 1
* n : factorial : - n 1
(define (factorial n )
(if (zero? n)
1
(* n (factorial (- n 1)))))