Sujet : Avoid treating the stack as an array [Re: "Back & Forth" is back!]
De : buzz_mccool (at) *nospam* yahoo.com (Buzz McCool)
Groupes : comp.lang.forthDate : 30. Aug 2024, 17:04:58
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vasqjd$icjm$1@dont-email.me>
References : 1
User-Agent : Mozilla Thunderbird
On 8/10/2024 3:57 AM, Hans Bezemer wrote:
After explaining why Forth is so hard, I'm explaining what reasons there could be to use it. With a little personal journey put in as a side note.
https://www.youtube.com/watch?v=MXKZPGzlx14
I looked through a few of these videos and found them interesting, thank you Hans for going to the trouble of making them.
I found Hans' recommendation on one of the videos (if I'm paraphrasing it correctly) to avoid using the stack for more than two or three values as treating the stack as an array makes for incomprehensible code, enlightening.
I am trying to follow this recommendation, but am running into trouble when trying to pass parameters into a loop. I'm trying to avoid using the stack as a large array but what I came up by injecting a parameter with a variable doesn't seem right.
Does anyone have suggestions on a better approach when you have several parameters and loop counts to deal with?
(Trivial Example)
: AreaOfCir 2.0e f** pi f* ; \ w/ radius on stack,
\ compute area (radius^2 * pi)
: VolOfCyl AreaOfCir f* ; \ w/ height & radius on stack,
\ compute vol (height * area)
1.0e AreaOfCir fe.
3.1416E0
2.0e 1.0e VolOfCyl fe.
6.2832E0
fvariable radius \ create a floating point variable
1.0e radius f! \ store 1.0 into radius
radius f@ fe. \ fetch and print radius
1.0000E0
: CylVolLoop
cr ." Radius " radius f@ fe. \ print a new line and then fetch and print radius
1 \ start counter from a cyl height of 1
begin dup 20 <= \ duplicate counter to see if counter <= end value
while \ while true (i.e. counter is <= to 20)
dup \ duplicate counter
s>f \ convert counter (height) to floating point
fdup \ duplicate height to print and use to compute vol
cr ." Height " fe. \ print a new line and then print height
radius f@ \ fetch radius
VolOfCyl \ compute volume
." Volume " fe. \ print volume
1 + \ add one to counter
repeat \ repeat the test at the "begin" word
drop ; \ remove the leftover loop counter value
CylVolLoop \ Execute CylVolLoop word
Radius 1.0000E0
Height 1.0000E0 Volume 3.1416E0
Height 2.0000E0 Volume 6.2832E0
...
Height 19.000E0 Volume 59.690E0
Height 20.000E0 Volume 62.832E0