chicken-users
[Top][All Lists]
Advanced

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

Re: [Chicken-users] nested loop over lists


From: Jinsong Liang
Subject: Re: [Chicken-users] nested loop over lists
Date: Thu, 14 Jul 2016 14:11:13 -0400

Hi Kevin,

Thank you for your suggestions! It is good to know the "big 3".  I will read the SRFI 1 documentation.

Jinsong

On Thu, Jul 14, 2016 at 1:55 PM, Kevin Wortman <address@hidden> wrote:

Another perspective, if you're new to Scheme, I'd recommend getting in the habit of using higher-order procedures before loops. The principle is that looping is an error-prone (e.g. infinite loops) low level operation, so it's best to factor that out and use an established and tested library procedure instead of writing new iteration logic each time.

The big 3 are filter, fold, and map in SRFI 1 ( http://wiki.call-cc.org/man/4/Unit%20srfi-1 ).

I'd actually implement your pseudocode with

(for-each (lambda (i)
        (for-each (lambda (j)
            (for-each (lambda (k)
                    (print (+ i j k)))
                  '(7 8 9)))
              '(4 5 6)))
      '(1 2 3))

You mentioned "calculation" so I wager you'll actually want to use fold, not for-each.

Regards,
Kevin Wortman


On Thu, Jul 14, 2016 at 7:04 AM Jinsong Liang <address@hidden> wrote:
Wow, this is amazing! Thanks a lot Christian!

Jinsong

On Thu, Jul 14, 2016 at 3:05 AM, Christian Kellermann <address@hidden> wrote:
* Jinsong Liang <address@hidden> [160714 04:26]:
> Hi,
>
> I want to do nested loops over three lists like the following pseudo code:
>
> for i in '(1 2 3)
>     for j in '(4 5 6)
>         for k in '(7 8 9)
>           //do calculation using i, j, and k. The three lists are not
> related.
>         end
>     end
> end
>
> What is the best way to do this in Chicken? I can use (for-each ...) or (do
> ...) but it seems neither is straightforward.

Without knowing the purpose of this it's hard to say.  However scheme
is flexible enough to allow an almost verbatim translation using
foof-loop:

(use foof-loop)

(loop ((for i (in-list '(1 2 3))))
      (loop ((for j (in-list '(4 5 6))))
                  (loop ((for k (in-list '(7 8 9))))
                                    (print "Magic " i "+" j "+" k " = " (+ i j k)))))

HTH,

Christian

--
May you be peaceful, may you live in safety, may you be free from
suffering, and may you live with ease.

_______________________________________________
Chicken-users mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/chicken-users


reply via email to

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