On Thu, Feb 13, 2025 at 07:38:10AM +0100, Alexander Burger wrote:
> When I built the tco version yesterday, I experimended with both
> versions, and somehow the 'M' code was lost :(

OK, I will settle with this version:

   # Print next digit of PI
   (de digit (Env)
      (job Env
         (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) ) )
            (prog1 N
               (let M (- (/ (* 10 (+ R (* 3 Q))) S) (* 10 N))
                  (setq Q (* 10 Q)  R (* 10 (- R (* N S)))  N M) ) ) ) ) )

   # Print 'N' or all digits of PI
   (de pi (N)
      (let E (env 'Q 1  'R 0  'S 1  'K 1  'N 3  'L 3)
         (prin (digit E) ".")
         (do (or N T)
            (prin (digit E))
            (flush) ) )
      (prinl) )

The 'job' environment is factored out of 'digit' so that 'pi' can be
restarted like:

   $ ./pil misc/pi.l +
   : (pi 7)
   3.1415926
   -> NIL

   : (pi 30)
   3.141592653589793238462643383279
   -> NIL

   : (pi)
   
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669...

☺/ A!ex

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

Reply via email to