Module Checkpi { Module FindPi(Digits){ Digits++ n=Int(3.32*Digits) PlusOne=Lambda N=0% -> { =N N++ } PlusTwo=Lambda N=1% -> { =N N+=2 } Dim A(n)<{ Print x; Chars++ If fl then Print "." : Print " "; : fl=false : Chars=0 : exit If Chars=50 then { Print Print " "; Chars=0 Refresh } else.if (Chars mod 5)=0 then { Print " "; Refresh } \\ explicitly refresh output layer, using Fast ! mode of speed } Print "Pi="; While Digits { NextDigit(&CallBack, &Digits) } print Refresh Sub NextDigit(&f, &D) CarrierOver=0 For k=n-1 to 1 { Ten(k)=Remainder(k)*10% CarrierOver(k)=CarrierOver Sum(k)=Ten(k)+CarrierOver(k) q=Sum(k) div B(k) Remainder(k)=Sum(k)-B(k)*q CarrierOver=A(k)*q } Ten(0)=Remainder(0)*10% CarrierOver(0)=CarrierOver Sum(0)=Ten(0)+CarrierOver(0) q=Sum(0) div 10% Remainder(0)=Sum(0)-10%*q if q<>9 and q<>10 then { Stack Predigits { While not empty { Call f(Number) if D>0 then D-- If D=0 then flush ' empty stack } Push q } } else.if q=9 Then { Stack Predigits { Data q } } else { Stack Predigits { While not empty { Call f((Number+1) mod 10) if D>0 then D-- If D=0 then flush ' empty stack } Push 0 } } End Sub } \\ reduce time to share with OS \\ Need explicitly use of refresh output layer (M2000 console) \\ Slow for a screen refresh per statement and give more time to OS Rem Set Slow \\ Fast is normal screen refresh, per Refresh time, and give standard time to OS Rem Set Fast \\ Fast ! use Refresh for screen refresh, and give less time o OS than standard \\ Esc key work when Refresh executed (and OS get little time) Set Fast ! FindPi 4 FindPi 28 Print Pi ' pi in M2000 is Decimal type with 29 digits (1 plus 28 after dot, is same as FindPi 28) Refresh FindPi 50 } Flush ' empty stack of values CheckPi List ' no variables exist Modules ? ' current module exist Stack ' Stack of values ' has to be empty, we didn't use current stack for values.