On Wed, Feb 12, 2025 at 08:14:04AM +0100, Alexander Burger wrote:
> If a problem is a linear operation, like traversing a list, a loop is
> more natural for me. For traversing a tree, recursion is better of
> course.

Hmm, it seems that I begin to detect some advantages in tco/tc :)

For example, in pil64 I had a function calculating the digits of pi ad
infinitum:

   # Print next digit of PI
   (de piDigit ()
      (job '((Q . 1) (R . 0) (S . 1) (K . 1) (N . 3) (L . 3))
         (while (>= (- (+ R (* 4 Q)) S) (* N S))
            (mapc set '(Q R S K N L)
               (list
                  (* Q K)
                  (* L (+ R (* 2 Q)))
                  (* S L)
                  (inc K)
                  (/ (+ (* Q (+ 2 (* 7 K))) (* R L)) (* S L))
                  (+ 2 L) ) ) )
         (setq
            Q (* 10 Q)
            R (* 10 (- R (* N S))) )
         (swap 'N M) ) )

   # Print all digits of PI
   (prin (piDigit) ".")
   (loop
      (prin (piDigit))
      (flush) )

We see, it has a 'while' loop using 'set' and 'list' to get an atomic
assignment of the six variables.


Now, here tco/tc come in handy, as it *is* a loop with atomic
assignment! :)

   # Print next digit of PI
   (de piDigit ()
      (job '((Q . 1) (R . 0) (S . 1) (K . 1) (N . 3) (L . 3))
         (tco (Q R S K N L)
            (if (>= (- (+ R (* 4 Q)) S) (* N S))
               (tc
                  (* Q K)
                  (* L (+ R (* 2 Q)))
                  (* S L)
                  (inc K)
                  (/ (+ (* Q (+ 2 (* 7 K))) (* R L)) (* S L))
                  (+ 2 L) )
               (setq
                  Q (* 10 Q)
                  R (* 10 (- R (* N S))) )
               (swap 'N M) ) ) ) )

   # Print all digits of PI
   (prin (piDigit) ".")
   (loop
      (prin (piDigit))
      (flush) )

Looks more clean!

   3.14159265358979323846264338327950288419716939937510582097494459230781640...

☺/ A!ex

-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe

Reply via email to