guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: guile style


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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]