Sujet : Re: Lisp newbie needs help
De : Nobody447095 (at) *nospam* here-nor-there.org (B. Pym)
Groupes : comp.lang.lisp comp.lang.schemeDate : 29. Aug 2024, 11:29:31
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vapf1m$3tr94$1@dont-email.me>
References : 1
User-Agent : XanaNews/1.18.1.6
B. Pym wrote:
(defun my-test ()
(loop for number = (1+ (random 6))
as sum = number then (+ sum number)
until (= number 1)
do (format t "~&~D thrown. Sum: ~D" number sum)
finally (format t "~&One thrown.")))
Gauche Scheme
(use srfi-1) ;; unfold
(use srfi-27) ;; random-integer
(define (my-test)
(fold
(^(n sum) (print n " thrown. Sum: " (inc! sum n)) sum)
0
(cdr (unfold zero? ($ + 1 $) (^_ (random-integer 6)) -1)))
(print "One thrown."))
gosh> (my-test)
2 thrown. Sum: 2
2 thrown. Sum: 4
6 thrown. Sum: 10
One thrown.
gosh> (my-test)
One thrown.
Explanation of "unfold":
Function: unfold end-test key gen-next-seed seed :optional tail-gen
(unfold zero? (lambda(n) (+ 800 n)) (lambda(n) (- n 1)) 7)
===>
(807 806 805 804 803 802 801)
(unfold zero? (lambda(n) (+ 800 n)) (lambda(n) (- n 1)) 7
(lambda(n) (list "The number" n "ended the unfolding.")))
===>
(807 806 805 804 803 802 801 "The number" 0 "ended the unfolding.")
Using "do" is a bit tricky, but the result is shorter.
(define (my-test)
(do ((n #f (+ 1 (random-integer 6)))
(sum 0))
((eqv? 1 n) (print "One thrown."))
(if n (print n " thrown. Sum: " (inc! sum n)))))