Deutsch   English   Français   Italiano  
<vbc9l4$bfnc$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <Nobody447095@here-nor-there.org>
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=
Bytes: 3835

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)]))