Rocksolid Light

News from da outaworlds

mail  files  register  groups  login

Message-ID:  

No violence, gentlemen -- no violence, I beg of you! Consider the furniture! -- Sherlock Holmes


comp / comp.lang.scheme / Re: iterative-version for computing a Fibonacci number

SubjectAuthor
o Re: iterative-version for computing a Fibonacci numberB. Pym

1
Subject: Re: iterative-version for computing a Fibonacci number
From: B. Pym
Newsgroups: comp.lang.lisp, comp.lang.scheme
Organization: A noiseless patient Spider
Date: Thu, 5 Sep 2024 12:54 UTC
Path: eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Nobody447095@here-nor-there.org (B. Pym)
Newsgroups: comp.lang.lisp,comp.lang.scheme
Subject: Re: iterative-version for computing a Fibonacci number
Date: Thu, 5 Sep 2024 12:54:00 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 80
Message-ID: <vbc9l4$bfnc$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Thu, 05 Sep 2024 14:54:00 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="76f95d5b05e6d11ad292fc2b60a074b6";
logging-data="376556"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1++Ymx3MjL91kZSIagDRqA4"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:aCwYKCWay3k6UVdfDpQA72DtzFw=
View all headers

Raffael Cavallaro wrote:

> > Hi, perhaps someone can help me translate my Python version?
>
> (defun fib (x)
> (do ((a 0 b) ;; do loop variable a is initially 0, then b
> (b 1 (+ a b)) ;;loop variable b is initially 1 then a + b
> (i 1 (1+ i))) ;;loop index incremented by 1 each go round
> ((> i x) a))) ;;termination condition - when index passes x stop
> ;; and return a
>
> (defun fib-evens (limit)
> "find the sum of all the even fibonacci numbers less than 1 million"
> (loop for i from 1 ;;loop index starts at 1 implicitly incremented by 1
> as current = (fib i) ;;compute fib of the current index
> while (< current limit) ;;stop if index exceeds limit
> when (evenp current) sum current)) ;;sum all the even fibs and
> return this sum
>
> CL-USER> (time (fib-evens 1000000)) ;; time the sum of all the even
> fibs less than a million
> Evaluation took:
> 0.0 seconds of real time
> 8.e-6 seconds of user run time ;;; took about one
> onehundredthousandth of a second
> 1.e-6 seconds of system run time
> 0 page faults and
> 0 bytes consed.
> 1089154 ;; here's your answer

Gauche Scheme

(define (sum-even-fibs limit)
(loop (a 1 b 1 sum 0)
(:till (>= a limit))
(if (even? a) (inc! sum a))
(sset! a b b (+ a b))))

(sum-even-fibs 999999)
===>
1089154

Given:

(define-syntax sset!-aux
(syntax-rules ()
[(sset!-aux (var val more ...) (pairs ...))
(sset!-aux (more ...) (pairs ... (var val)))]
[(sset!-aux () ((var val) ...))
(set!-values (var ...) (values val ...))]))
(define-syntax sset!
(syntax-rules ()
[(sset! x ...) (sset!-aux (x ...) ())]))

(define-syntax loop-aux
(syntax-rules (:till :=)
[(loop-aux (var val more ...) (good ...) stuff ...)
(loop-aux (more ...) (good ... (var val)) stuff ...)]
[(loop-aux (var) (good ...) stuff ...)
(loop-aux () (good ... (var '())) stuff ...)]
[(loop-aux lets goodlets (stuff ... (:till what result)) (seen ...) go)
(loop-aux lets goodlets (stuff ...)
((if what result (begin seen ...))) go)]
[(loop-aux () (pairs ... (k v)) (stuff ... (:till what)) (seen ...) go)
(loop-aux () (pairs ... (k v)) (stuff ... (:till what k)) (seen ...) go)]
[(loop-aux lets goodlets (stuff ... (:till what)) (seen ...) go)
(loop-aux lets goodlets (stuff ...) ((unless what seen ...)) go)]
[(loop-aux lets goodlets (stuff ... (x := z)) (seen ...) go)
(loop-aux lets goodlets (stuff ...) ((let ((x z)) seen ...)) go)]
[(loop-aux lets goodlets (stuff ... last) (seen ...) go)
(loop-aux lets goodlets (stuff ...) (last seen ...) go)]
[(loop-aux lets goodlets () (seen ...) go)
(let* goodlets
(let go ()
seen ...)) ]))

(define-syntax loop
(syntax-rules ()
[(loop lets things ...)
(loop-aux lets () (things ...) ((go)) go)]))

1

rocksolid light 0.9.8
clearnet tor