From Newsgroup: comp.lang.lisp
B. Pym wrote:
Lars Brinkhoff wrote:
use LOOP to collect random integers into a list until the sum of that list exceeds a constant (say 50).
(loop for x = (random 10) collect x sum x into y until (> y 50))
Gauche Scheme
(use srfi-27 :only (random-integer))
(define random random-integer)
Not too efficient.
(collect-till (_ z) (random 10) (> (apply + z) 50))
Given:
(define-syntax collect-till
(syntax-rules ()
[ (collect-till (x bag) expr test)
(collect-till (x bag) expr test #f) ]
[ (collect-till (x bag) expr test include-ender)
(let go ((bag '()))
(let ((x expr))
(if test
(if include-ender
(reverse (cons x bag))
(reverse bag))
(go (cons x bag))))) ]
[ (collect-till x expr test)
(collect-till (x bag) expr test) ]
[ (collect-till x expr test include-ender)
(collect-till (x bag) expr test include-ender) ] ))
--- Synchronet 3.21a-Linux NewsLink 1.2