Sysop: | Amessyroom |
---|---|
Location: | Fayetteville, NC |
Users: | 28 |
Nodes: | 6 (1 / 5) |
Uptime: | 45:10:38 |
Calls: | 422 |
Calls today: | 1 |
Files: | 1,024 |
Messages: | 90,304 |
On 16-04-2025 23:26, Anton Ertl wrote:
OTOH, Forth is worse suited to deal with dial-your-language-version
options: C uses separate compilation, so if the main program uses some
version of the standard, and a library uses a different version,
that's typically no problem, because they are both compiled with
different compiler calls (which may have different options).
Forth, OTOH, compiles all the sources in one compilation run, and any
choices you dial at one point tend to affect all the rest of the
compilation, even if it compiles some independently developed library.
One could dream up ways to deal with that problem, but given past
experience, I doubt such ideas would find enough support; some would
call that "WIBNI"s, while others would point out that Chuck Moore did
not bring these ideas down from the mountain.
- anton
I don't think so. Using K&R prototypes is significantly different from
ANSI prototypes. That must have broken quite some code - unless specific >measures were taken to allow "old format" codes as well.
restrict,
nullptr, inline, bool - the list of added keywords is endless.
BTW, so
is the list of deprecated keywords, like "_Bool" with was replaced by
the far less ugly "bool" in 2023.
And I don't think the argument that "Forth compiles in one go" holds up
as an argument to avoid cleaning up historical clutter. The different >versions of a "keyword" could be created as their names, followed by a >postfix of the standard, e.g. DO_79, DO_82, DO_94. Let's call 'em
"version words".
One could dream up ways to deal with that problem, but given past
experience, I doubt such ideas would find enough support
There could be special words like [FORTH78], [ANSFORTH] - which would no >nothing but:
- Either hiding words in the dictionary that should be disabled;
- Activating words that are part of this standard;
- Assigning the proper "version" words to trampolines or DEFERs.
But I think maybe, just maybe the same effect could be achieved by using >wordsets.
So, if we compile an external library using a mix of Forth-79, ANS Forth
and Forth 2012, it could be as simple as:
INCLUDE a.fs
INCLUDE b.fs
[FORTH2012]
a.fs:
[FORTH79]
...
b.fs:
[ANSFORTH]
...
That's much like setting the radix.
So - why couldn't this work?
One way to keep backwards compatibility with the current common
practice would be to require having a word FORTH-2030-FP-SYNTAX (or
maybe just FORTH-2030) in every file that uses the new FP syntax
before the use of that syntax. If that word does not appear in that
file, "1.0" would still be non-standardized.
Next: "1.". If we had such declarations, we could even support "1." >(standardized as double-cell in Forth-94 and Forth-2012) as FP number.--
The alternative would be to treat "1." as double-cell and 1.0 as FP
value, which IMO is even worse than requiring an "e" in every FP
value.
But back to the dial-a-standard things: I have never seen such a
proposal that limits the dialing to one file. Instead, the proposals
and existing practice is to dial for the rest of text interpretation
(or until somthing else is dialed). That would mean that previously
working files might no longer work when included after dialing the new
FP syntax. E.g., all versions of the recognizer proposal have been
along these lines, and Bernd Paysan has actually proposed allowing to
treat "1." as FP value by swapping the integer and FP recognizer in
the recognizer order, which would have exactly this effect. And Bernd
Paysan is not the only one: Among other dialing features that all are
not limited to the file, VFX supports disabling the recognition of
"1." as double, which then leads to its recognition as FP number; but
that disabling is not limited to a file, but extends to the rest of
the text interpretation.
Here's the example for VFX:
',' dp-char 1+ c! ok
1. ok F:-1
f. 1. ok
So you could try to propose a word like FORTH-2030-FP-SYNTAX, but I
expect that the reactions would be along the following lines (in the >community and in the standardization committee):
1) A number of people consider this completely unnecessary, and
actually heretical, because Chuck Moore came down from the mountain
with doubles, not floats, so that's the way it was always meant to
be. Some would argue that treating "1.0" or "1." as FP number is
proposed just to cater to C programmers, and that Forthers should
take pride in deviating from the beaten path.
2) A number of people would argue against the limitation to a specific
file because of "complexity" (meaning implementation complexity),
"WIBNI", or because Chuck Moore came down from the mountain without
that idea, and that Chuck Moore has argued against libraries, that
he has argued against saving and restoring state, and instead has
argued for always setting it. And that the common practice (e.g.,
in VFX) is to just set the state, and never
3) And if you changed your proposal to just affect the rest of text
interpretation (and include another word FORTH-2012-FP-SYNTAX or
somesuch to switch back), some people (including me) would argue
that this variant of FORTH-2030-FP-SYNTAX would break existing
code, and that introducing FORTH-2012-FP-SYNTAX is a poor and
error-prone substitute for defining FORTH-2030-FP-SYNTAX properly.
Word counters would dislike this variant because it introduces an
additional word, and the people who argue 1) would also dislike the
proposal.
The bottom line is that the proposal would probably not find a
consensus and would not be accepted by the committee. The bottom line
is:
One could dream up ways to deal with that problem, but given past
experience, I doubt such ideas would find enough support
And the bottom line of that is that proposals for incompatible changes
have little chance of being accepted.
There could be special words like [FORTH78], [ANSFORTH] - which would no >>nothing but:
- Either hiding words in the dictionary that should be disabled;
- Activating words that are part of this standard;
Interestingly, Forth-79 includes a word 79-STANDARD, and Forth-83
includes a word FORTH-83, but Forth-94 and Forth-2012 do not include
such words. We had a discussion whether we should have Forth-94 and >Forth-2012 versions of environmental queries for wordsets in
Forth-2012, but the committee decided against that.
In any case, if you want to support including libraries written for a >different standard, the effect of such words should be limited to a
specific file. If the standards are incompatible and you want
libraries, and you do not provide this kind of dialing, you can take a
look at the Python 3 transition pain (or worse, what happened with
Perl6) to see what happens. The Python community has learned from
that experience not to introduce such incompatible changes again.
- Assigning the proper "version" words to trampolines or DEFERs.
That's exactly the wrong thing to do. You want to statically bind the
name to the word with the right version. E.g. if you have a Forth-83 program
forth-83
100 load ( includes a library written in Forth-79)
: foo ( ... -- ... )
... not ... ;
and the library contains
79-standard
: bar ( ... -- ... )
... not ... ;
you want the use of NOT in FOO to be statically bound to (what
Forth-94 calls) INVERT and the NOT in BAR to be statically bound to
0=; you usually don't want BAR or FOO to change its behaviour
depending on which standard is selected.
But I think maybe, just maybe the same effect could be achieved by using >>wordsets.
I assume you mean wordlists. Yes, the effect of switching between the >Forth-83 NOT and the Forth-79 NOT can be achieved by having a wordlist >containing the Forth-79 words and a wordlist containing the Forth-83
words, and putting it in the search order.
So, if we compile an external library using a mix of Forth-79, ANS Forth >>and Forth 2012, it could be as simple as:
INCLUDE a.fs
INCLUDE b.fs
[FORTH2012]
a.fs:
[FORTH79]
...
b.fs:
[ANSFORTH]
...
There is 79-STANDARD, but there is no word equivalent to [FORTH2012]
or [ANSFORTH]. So a program that contains "[FORTH2012]" without first >defining it is not Forth-2012-compliant. And a program that contains >[ANSFORTH] without first defining it is not Forth-94 compliant.
That's much like setting the radix.
BASE is one of the misfeatures of Forth, and demonstrates the
disadvantage of having a state for the rest of the text
interpretation, and the Chuck Moore approach to . Do you start every
file with DECIMAL or HEX? Looking at SwiftForth (where one might
expect the most Chuck Moore influence), I see 26 occurences of DECIMAL
and 16 occurences of HEX, and usually not before the first occurence
of an integer with several digits. As an example, the file that
contains the definition
: DECIMAL ( -- ) 10 BASE ! ;
does not contain an invocation of DECIMAL before this use of "10".
So - why couldn't this work?
As mentioned, there is no [FORTH2012] and no [ANSFORTH].
Moreover, this general approach does not work for BASE: If the next
standard required that systems start out in, say, octal, I am sure
that a lot of the existing source files would fail unless you invoked
DECIMAL before the INCLUDE. BASE only works (and only so-so) because
every sane system defaults to DECIMAL, and that does not change
between standard versions.
- anton
--
M. Anton Ertl http://www.complang.tuwien.ac.at/anton/home.html >comp.lang.forth FAQs: http://www.complang.tuwien.ac.at/forth/faq/toc.html
New standard: https://forth-standard.org/
EuroForth 2023 proceedings: http://www.euroforth.org/ef23/papers/
EuroForth 2024 proceedings: http://www.euroforth.org/ef24/papers/
That's much like setting the radix.
BASE is one of the misfeatures of Forth, and demonstrates the
disadvantage of having a state for the rest of the text
interpretation, and the Chuck Moore approach to . Do you start every
file with DECIMAL or HEX? Looking at SwiftForth (where one might
expect the most Chuck Moore influence), I see 26 occurences of DECIMAL
and 16 occurences of HEX, and usually not before the first occurence
of an integer with several digits. As an example, the file that
contains the definition
: DECIMAL ( -- ) 10 BASE ! ;
does not contain an invocation of DECIMAL before this use of "10".
So - why couldn't this work?
As mentioned, there is no [FORTH2012] and no [ANSFORTH].
Moreover, this general approach does not work for BASE: If the next
standard required that systems start out in, say, octal, I am sure
that a lot of the existing source files would fail unless you invoked
DECIMAL before the INCLUDE. BASE only works (and only so-so) because
every sane system defaults to DECIMAL, and that does not change
between standard versions.
: DECIMAL ( -- ) 10 BASE ! ;
does not contain an invocation of DECIMAL before this use of "10".
anton@mips.complang.tuwien.ac.at (Anton Ertl) writes:
: DECIMAL ( -- ) 10 BASE ! ;
does not contain an invocation of DECIMAL before this use of "10".
: DECIMAL ( -- ) 5 5 + BASE ! ;
should usually work.
Perhaps it's been updated since as the SwiftForth file I have has:
: DECIMAL ( -- ) $0A BASE ! ;
Really annoying was LMI which on error switched to DECIMAL ...
On 20/04/2025 6:18 pm, Paul Rubin wrote:
anton@mips.complang.tuwien.ac.at (Anton Ertl) writes:
: DECIMAL ( -- ) 10 BASE ! ;
does not contain an invocation of DECIMAL before this use of "10".
: DECIMAL ( -- ) 5 5 + BASE ! ;
should usually work.
Perhaps it's been updated since as the SwiftForth file I have has:
: DECIMAL ( -- ) $0A BASE ! ;
Closest thing to a BASE issue I've encountered was invoking the
screen editor while in HEX. After doing that a few times I fixed
the editor!
Really annoying was LMI which on error switched to DECIMAL ...
Out of curiosity what was the conversion method?
On 22/04/2025 12:19 am, sjack wrote:[..]
dxf <dxforth@gmail.com> wrote:
16 base ! 10 cvd decimal . 10 ok
2 base ! 10 cvd decimal . 10 ok
36 base ! -10 cvd decimal . -10 ok
Why not store the number as text in this case?
What is the advantage? As a user I still need
to know the BASE (unless it is assumed to be
always 10).
mhx <mhx@iae.nl> wrote:[..]
CVD is not for user to switch base when he intends so.
On 21-04-2025 09:38, dxf wrote:
On 21/04/2025 6:34 am, albert@spenarnc.xs4all.nl wrote:
In article <757e2ced7a6ff4b73d9fa4531d29ff611dc72e10@i2pn2.org>,
dxf <dxforth@gmail.com> wrote:
On 20/04/2025 6:18 pm, Paul Rubin wrote:
anton@mips.complang.tuwien.ac.at (Anton Ertl) writes:
: DECIMAL ( -- ) 10 BASE ! ;
does not contain an invocation of DECIMAL before this use of "10".
: DECIMAL ( -- ) 5 5 + BASE ! ;
should usually work.
Perhaps it's been updated since as the SwiftForth file I have has:
: DECIMAL ( -- ) $0A BASE ! ;
Closest thing to a BASE issue I've encountered was invoking the
screen editor while in HEX. After doing that a few times I fixed
the editor!
Really annoying was LMI which on error switched to DECIMAL ...
They had it half right. All error numbers should be printed in
decimal. First aid read the paragraphs in de documentation
pertaining to this error.
I notice I did that for THROW numbers that don't have a message - after which it reverts to the current BASE. I should document thatsomewhere...
To force myself to add messages to THROWs (especially in libs with
special conditions) I added THROW" - it works like a combination of
ABORT" and THROW. You need to specify a THROW code, you need to specify
a flag and you need to specify a message.
Hans Bezemer--
What happens in the case of CATCH - what's left on the stack?
Although it's wonderful to list in detail what might have caused the
error - and how to fix it - sometimes all you need is a clue to
hang a picture on.
AFAIK on most forth systems exceptions generate either an error code or an error message (the latter via ABORT" or caught code). In short, what good
is having both a msg and a code?
On 1 May 2025 at 03:23:53 CEST, "dxf" <dxforth@gmail.com> wrote:
AFAIK on most forth systems exceptions generate either an error code or an >> error message (the latter via ABORT" or caught code). In short, what good >> is having both a msg and a code?
THROWs are defined to be defined by their throw number. Whether or not a message is associated with the throw number is a factor of the Forth implementation.
In VFX, the return to the text interpreter looks for a message associated with
the throw number and displays it if found.
There are three benefits of this.
1) it is less code to reuse a THROW by number rather than by text,
2) I can change the text in one place only for all uses,
3) Internationalisartion is much easier.
Stephen
In VFX, the return to the text interpreter looks for a message associated with >the throw number and displays it if found.
There are three benefits of this.
1) it is less code to reuse a THROW by number rather than by text,
2) I can change the text in one place only for all uses,
3) Internationalisartion is much easier.
On 01-05-2025 03:23, dxf wrote:
On 30/04/2025 11:58 pm, Hans Bezemer wrote:specify a THROW code, you need to specify a flag and you need to specify a message.
On 30-04-2025 04:37, dxf wrote:
On 30/04/2025 2:50 am, Hans Bezemer wrote:
...
To force myself to add messages to THROWs (especially in libs with special conditions) I added THROW" - it works like a combination of ABORT" and THROW. You need to
Surprise, surprise - THROW" calls THROW (actually, it inlines the whole shebang). So - what do you think?
What happens in the case of CATCH - what's left on the stack?
For ABORT" the string is suppressed and only the code (-2) is left.
Is that what THROW" does with the string?
AFAIK on most forth systems exceptions generate either an error code or an >> error message (the latter via ABORT" or caught code). In short, what good >> is having both a msg and a code?
In 4tH, ABORT is really abort. It does what the label says. It can't be >caught. If you want to abort, I assume you want to abort. If you wanna
catch it, use THROW. C'mon. I designed it as a man's language ;-)
Hans Bezemer
In article <nnd$1667d791$2eba7243@d7216ffec373a0d9>,
Hans Bezemer <the.beez.speaks@gmail.com> wrote:
On 01-05-2025 03:23, dxf wrote:ABORT" and THROW. You need to
On 30/04/2025 11:58 pm, Hans Bezemer wrote:
On 30-04-2025 04:37, dxf wrote:
On 30/04/2025 2:50 am, Hans Bezemer wrote:
...
To force myself to add messages to THROWs (especially in libs with >special conditions) I added THROW" - it works like a combination of
specify a THROW code, you need to specify a flag and you need tospecify a message.
whole shebang). So - what do you think?Surprise, surprise - THROW" calls THROW (actually, it inlines the
What happens in the case of CATCH - what's left on the stack?
For ABORT" the string is suppressed and only the code (-2) is left.
Is that what THROW" does with the string?
AFAIK on most forth systems exceptions generate either an error code or an >>> error message (the latter via ABORT" or caught code). In short, what good >>> is having both a msg and a code?
In 4tH, ABORT is really abort. It does what the label says. It can't be >>caught. If you want to abort, I assume you want to abort. If you wanna >>catch it, use THROW. C'mon. I designed it as a man's language ;-)
ABORT is at least kind of an exception. But look at QUIT.
Actually QUIT is the READ-EVALUATE-PRINT-REPEAT loop of
Forth. How can this ever be considered an exception or
"caught".
I struggled with giving a meaning to QUIT and ABORT.
I arrived at
QUIT initialises both stacks and goes interpreting.
ABORT only initialises the return stack and goes interpreting.
(if there is an exception system, both must initialise that too.--
I can't think of a QUIT that can be caught and at the same time
initialises the exceptions.)
Hans Bezemer
Groetjes Albert
--
Temu exploits Christians: (Disclaimer, only 10 apostles)
Last Supper Acrylic Suncatcher - 15Cm Round Stained Glass- Style Wall
Art For Home, Office And Garden Decor - Perfect For Windows, Bars,
And Gifts For Friends Family And Colleagues.
On 2/05/2025 10:16 pm, albert@spenarnc.xs4all.nl wrote:
...
I struggled with giving a meaning to QUIT and ABORT.
Me too.
I arrived at
QUIT initialises both stacks and goes interpreting.
ABORT only initialises the return stack and goes interpreting.
(if there is an exception system, both must initialise that too.
I can't think of a QUIT that can be caught and at the same time
initialises the exceptions.)
Technically both end an application distinguished only by the fact
QUIT lets you examine what was on the stack. Presumably this was
for debugging purposes. For reasons known only to ANS (and maybe
Mitch Bradley) both were assigned exception codes and thus CATCHable.
As I wanted a fool-proof way of ending a turnkey app for any reason
I let QUIT do that. That it may leave stuff on the data stack is of
no consequence to a turnkey. A QUIT is considered by the OS as a
'success' whereas as an uncaught ABORT (or other exception) means
'failure'.