Hi Jerry,
I am fairly new to guile and scheme. People tell me that I
should use
a functional style.
I have 3 solutions for project euler problem #1. The first is
functional, the second is imperative and the third is written in
"Little Schemer" style.
I was hoping other guile users would comment on preferences or
the
"correct way". Sorry in advance for any wrapping problems that
may
occur.
#!/usr/local/bin/guile -s
!#
(use-modules (srfi srfi-1) (jpd stdio)) ;; for folds
(define N 1000)
(define ans
(fold + 0
(filter
(lambda (x) (or (= 0 (modulo x 3)) (= 0 (modulo x 5))))
(iota N))))
(print ans)
This is fine, though instead of (= 0 …) you could use (zero? …).
Using “fold” is good because it is a common higher-order
abstraction, so it is easy to read and understand at a glance.
(define ans 0)
(for i N
(if (or (= 0 (modulo i 3)) (= 0 (modulo i 5))) (set! ans (+
ans i))))
(print ans)
This is not idiomatic for two reasons: it uses SET! and a
single-branched IF. I have never before encounter FOR in Guile
code. A “named let” (as in your next variant) is much more
common.
(define ans
(let loop ((i 1) (ans 0))
(cond
((>= i N) ans)
((or (= 0 (modulo i 3)) (= 0 (modulo i 5))) (loop (1+ i)
(+ ans i)))
(else (loop (1+ i) ans)) )))
This is explicit, which is fine, but for routine tasks like
accumulation of results a fold is easier to understand at a
glance.
--
Ricardo