|
From: | Ricardo Wurmus |
Subject: | Re: guile style |
Date: | Sat, 19 Jun 2021 13:17:02 +0200 |
User-agent: | mu4e 1.4.15; emacs 27.2 |
Hi Jerry,
I am fairly new to guile and scheme. People tell me that I should usea 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 mayoccur. #!/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
[Prev in Thread] | Current Thread | [Next in Thread] |