Proposal: NAME>INTERPRET wording
This proposal has been moved into this section. Its former address was: /standard/tools/NAMEtoINTERPRET
This page is dedicated to discussing this specific proposal
ContributeContributions
ruv [129] NAME>INTERPRET wordingProposal2020-02-20 09:55:14
Connection of xt with interpretation semantics
The spec says that "xt represents the interpretation semantics of the word nt". But by 2.1 Definitions of terms, execution token (xt) identifies not interpretation semantics but execution semantics.
Solution
Use a wording that is slightly better harmonized with the terms definitions.
The execution token xt identifies the execution semantics that performs the interpretation semantics for the word identified by the name token nt.
Meaning of 0
It seems that the spec implies that if NAME>INTERPRET
returns 0 then interpretation semantics is undefined for the corresponding word (by the premise: a specification should describe all possible variants; and the variant is only one in this case).
But actually, in some cases a Forth system just cannot provide an xt that performs the defined interpretation semantics for the corresponding word. Particularly, we can have this case when a "dual semantics" word is implemented as a STATE-dependent immediate word. Technically it is possible to return an xt (e.g. via generation of the corresponding definition on the fly), but a Forth system authors may choose to not implement such functionality.
NB: it is incorrect to return an xt that identifies STATE-depended execution semantics, when the interpretation semantics for the corresponding word don't specified as STATE-depended. Perhaps the NAME> ( nt -- xt|0 )
word from Forth-83 experimental proposals can be standardized to cover such cases. This word should return xt that identifies the execution semantics for the word identified by nt.
Solution
Explicitly mention the second meaning of 0.
If
NAME>INTERPRET
returns 0 then either interpretation semantics is undefined for the word identified by nt, or the system cannot provide an xt that preforms the defined interpretation semantics for this word.
ruv
Without updating the meaning of returned 0 for NAME>INTERPRET
, the only option for a Forth system that cannot, in some case, provide xt that performs the corresponding interpretation semantics, is to don't provide NAME>INTERPRET
word at all.
AntonErtl
I have drafted Proposal: Reword the term "execution token (latest version) to address the execution token issue.
The interpretation semantics of a STATE-dependent immediate word is STATE-dependent. It is trivial for NAME>INTERPRET to return that. In a classic single-xt+immediate-flag system NAME>INTERPRET will never return 0. 0 allows systems with compile-only flags where the text interpreter produces an error when it encounters such a word in interpretation state (e.g., gforth-0.7).
Your proposed change makes no sense; on the usage side, it would mean that a text interpreter that uses FIND-NAME and NAME>INTERPRET is not guaranteed to work. On the implementation side, NAME>INTERPRET does not know whether a word is STATE-dependent, so it cannot return 0 for such words anyway.
ruv
This proposal is not enough formal, it should be made more formal.
ruvNew Version: NAME>INTERPRET wording
Connection of xt with interpretation semantics
The spec says that "xt represents the interpretation semantics of the word nt". But by 2.1 Definitions of terms, execution token (xt) identifies not interpretation semantics but execution semantics.
Author
Solution
Use a wording that is slightly better harmonized with the terms definitions.
The execution token xt identifies the execution semantics that performs the interpretation semantics for the word identified by the name token nt.
Ruv
Change Log
Meaning of 0
2020-02-20 Initial comment for NAME>INTERPRET 2023-09-14 Make this proposal more formal
It seems that the spec implies that if NAME>INTERPRET
returns 0 then interpretation semantics is undefined for the corresponding word (by the premise: a specification should describe all possible variants; and the variant is only one in this case).
Problem
But actually, in some cases a Forth system just cannot provide an xt that performs the defined interpretation semantics for the corresponding word. Particularly, we can have this case when a "dual semantics" word is implemented as a STATE-dependent immediate word. Technically it is possible to return an xt (e.g. via generation of the corresponding definition on the fly), but a Forth system authors may choose to not implement such functionality.
Currently the specification for name>interpret
says that returned "xt represents the interpretation semantics of the word nt".
NB: it is incorrect to return an xt that identifies STATE-depended execution semantics, when the interpretation semantics for the corresponding word don't specified as STATE-depended. Perhaps the NAME> ( nt -- xt|0 )
word from Forth-83 experimental proposals can be standardized to cover such cases. This word should return xt that identifies the execution semantics for the word identified by nt.
Solution
But actually, in some cases a Forth system cannot provide an xt that performs the defined interpretation semantics for the corresponding word regardless of the STATE
.
Explicitly mention the second meaning of 0.
Particularly, when the words like s"
or to
are implemented as STATE-dependent immediate words. Technically it is possible to return a correct xt according to the current specification (e.g. via generation of the corresponding definition on the fly), but it can be too burden.
If
NAME>INTERPRET
returns 0 then either interpretation semantics is undefined for the word identified by nt, or the system cannot provide an xt that preforms the defined interpretation semantics for this word.
Another minor problem is that it's not clear what the word represent means. According to the language of the standard, xt identifies some semantics.
Solution
The specification for name>interpret
can be adjusted to solve the mentioned problem.
There are two options:
Allow to return
0
if the system cannot return xt that identifies the interpretation semantics for the word identified bynt
Allow to return state-dependent xt, which performs interpretation semantics in interpretation state only.
Proposal
Replace the following phrase in the section 15.6.2.1909.20 NAME>INTERPRET:
xt represents the interpretation semantics of the word nt. If nt has no interpretation semantics,
NAME>INTERPRET
returns 0.
by the following phrase:
xt identifies the execution semantics for the word identified by nt. When this xt is executed in interpretation state, the interpretation semantics for the word is performed. If the system does not provide execution semantics for the word,
NAME>INTERPRET
returns 0.
ruvNew Version: NAME>INTERPRET wording
Author
Ruv
Change Log
2020-02-20 Initial comment for NAME>INTERPRET 2023-09-14 Make this proposal more formal
- 2020-02-20 Initial comment for
NAME>INTERPRET
- 2023-09-14 Make this proposal more formal
- 2023-09-19 Add rationale, better wording, fix some typos
Problem
Currently the specification for name>interpret
says that returned "xt represents the interpretation semantics of the word nt".
Currently the specification for name>interpret
says that returned "xt represents the interpretation semantics of the word nt".
But actually, in some cases a Forth system cannot provide an xt that performs the defined interpretation semantics for the corresponding word regardless of the STATE
.
But actually, in some cases a Forth system cannot provide an xt that performs the defined interpretation semantics for the corresponding word regardless of STATE
.
Particularly, when the words like s"
or to
are implemented as STATE-dependent immediate words. Technically it is possible to return a correct xt according to the current specification (e.g. via generation of the corresponding definition on the fly), but it can be too burden.
Particularly, when a word like s"
or to
is implemented as STATE-dependent immediate word. Technically it is possible to return a correct xt according to the current specification (e.g. via generation of the corresponding definition on the fly), but it can be too burden.
Another minor problem is that it's not clear what the word represent means. According to the language of the standard, xt identifies some semantics.
Another minor problem is that it's not clear what the term represent means. According to the language of the standard, xt identifies some semantics.
Rationale
It should be clear from the specification how, having an nt, to perform the very behavior that a Forth system performs when the Forth text interpreter encounters, in interpretation state, the name of a word identified by this nt.
Namely, to perform this behavior, must the xt returned from name>interpret
be executed only interpretation state, or it may be also executed in compilation state.
Solution
The specification for name>interpret
can be adjusted to solve the mentioned problem.
There are two options:
- Allow to return
0
if the system cannot return xt that identifies the interpretation semantics for the word identified bynt
- Allow to return
0
if the system cannot return xt that identifies the interpretation semantics for the word identified bynt
(see also the clarification re execution tokens).- Probably, in this case we have to introduce a word like
name>
(experimental in Forth-83), which returns xt that identifies the execution semantics of the word identified bynt
. Since otherwise a user-defined Forth text interpreter is impossible without correctfind
.
- Probably, in this case we have to introduce a word like
- Allow to return state-dependent xt, which performs interpretation semantics in interpretation state only.
- Allow to return state-dependent xt, which performs the interpretation semantics for the word in interpretation state only.
In this proposal I stick with the second option.
If anyone prefers the first option of has other objections, please feel free to share your ideas in a comment.
Proposal
Replace the following phrase in the section 15.6.2.1909.20 NAME>INTERPRET:
xt represents the interpretation semantics of the word nt. If nt has no interpretation semantics,
NAME>INTERPRET
returns 0.
by the following phrase:
xt identifies the execution semantics for the word identified by nt. When this xt is executed in interpretation state, the interpretation semantics for the word is performed. If the system does not provide execution semantics for the word,
NAME>INTERPRET
returns 0.
xt identifies the execution semantics of the word identified by nt. When this xt is executed in interpretation state, the interpretation semantics for the word are performed. If a Forth system does not provide such execution token for the word,
NAME>INTERPRET
returns 0.
ruvNew Version: NAME>INTERPRET wording
Author
Ruv
Change Log
- 2020-02-20 Initial comment for
NAME>INTERPRET
- 2023-09-14 Make this proposal more formal
- 2023-09-19 Add rationale, better wording, fix some typos
- 2023-09-21 Add rationale re system-defined semantics, and declare an ambiguous condition
Problem
Currently the specification for name>interpret
says that returned "xt represents the interpretation semantics of the word nt".
But actually, in some cases a Forth system cannot provide an xt that performs the defined interpretation semantics for the corresponding word regardless of STATE
.
Particularly, when a word like s"
or to
is implemented as STATE-dependent immediate word. Technically it is possible to return a correct xt according to the current specification (e.g. via generation of the corresponding definition on the fly), but it can be too burden.
Particularly, when a word like s"
or to
is implemented as a STATE-dependent immediate word. Technically, it is possible to return a correct xt according to the current specification (e.g. via generation of the corresponding definition on the fly), but it can be too burden.
Another minor problem is that it's not clear what the term represent means. According to the language of the standard, xt identifies some semantics.
Rationale
How to perform interpretation semantics
It should be clear from the specification how, having an nt, to perform the very behavior that a Forth system performs when the Forth text interpreter encounters, in interpretation state, the name of a word identified by this nt.
Namely, to perform this behavior, must the xt returned from name>interpret
be executed only interpretation state, or it may be also executed in compilation state.
System-defined semantics
If the standard does not define interpretation semantics for a word, a Forth system may provide system-defined interpretation semantics for the word (see A.3.4.3.2).
The same is true for execution semantics — if the standard does not define them for a word, a Forth system may provide system-defined execution semantics for the word. But, due to 6.1.0070, performing these execution semantics in interpretation state must be always equivalent to performing interpretation semantics for the word (regardless whether they are standard-defined or system-defined).
Solution
The specification for name>interpret
can be adjusted to solve the mentioned problem.
There are two options:
Allow to return
0
if the system cannot return xt that identifies the interpretation semantics for the word identified bynt
(see also the clarification re execution tokens).- Probably, in this case we have to introduce a word like
name>
(experimental in Forth-83), which returns xt that identifies the execution semantics of the word identified bynt
. Since otherwise a user-defined Forth text interpreter is impossible without correctfind
.
- Probably, in this case we have to introduce a word like
Allow to return state-dependent xt, which performs the interpretation semantics for the word in interpretation state only.
In this proposal I stick with the second option.
In this proposal I stick to the second option.
If anyone prefers the first option of has other objections, please feel free to share your ideas in a comment.
If anyone prefers the first option or has other objections, please feel free to share your ideas in a comment.
Proposal
Replace the following phrase in the section 15.6.2.1909.20 NAME>INTERPRET:
Replace the following paragraph in the section 15.6.2.1909.20 NAME>INTERPRET:
xt represents the interpretation semantics of the word nt. If nt has no interpretation semantics,
NAME>INTERPRET
returns 0.
by the following phrase:
by the following paragraphs:
xt identifies the execution semantics of the word identified by nt. When this xt is executed in interpretation state, the interpretation semantics for the word are performed. If a Forth system does not provide such execution token for the word,
NAME>INTERPRET
returns 0.
An ambiguous condition exists in any of the following conditions:
- interpretation semantics for the word are not defined by this standard and xt is executed;
- execution semantics of the word are not defined by this standard and xt is executed in compilation state;
ruvNew Version: NAME>INTERPRET wording
Author
Ruv
Change Log
- 2020-02-20 Initial comment for
NAME>INTERPRET
- 2023-09-14 Make this proposal more formal
- 2023-09-19 Add rationale, better wording, fix some typos
- 2023-09-21 Add rationale re system-defined semantics, and declare an ambiguous condition
- 2023-09-22 Require xt if interpretation semantics for the word are defined by the standard
Problem
Currently the specification for name>interpret
says that returned "xt represents the interpretation semantics of the word nt".
But actually, in some cases a Forth system cannot provide an xt that performs the defined interpretation semantics for the corresponding word regardless of STATE
.
Particularly, when a word like s"
or to
is implemented as a STATE-dependent immediate word. Technically, it is possible to return a correct xt according to the current specification (e.g. via generation of the corresponding definition on the fly), but it can be too burden.
Another minor problem is that it's not clear what the term represent means. According to the language of the standard, xt identifies some semantics.
Rationale
How to perform interpretation semantics
It should be clear from the specification how, having an nt, to perform the very behavior that a Forth system performs when the Forth text interpreter encounters, in interpretation state, the name of a word identified by this nt.
Namely, to perform this behavior, must the xt returned from name>interpret
be executed only interpretation state, or it may be also executed in compilation state.
System-defined semantics
If the standard does not define interpretation semantics for a word, a Forth system may provide system-defined interpretation semantics for the word (see A.3.4.3.2).
The same is true for execution semantics — if the standard does not define them for a word, a Forth system may provide system-defined execution semantics for the word. But, due to 6.1.0070, performing these execution semantics in interpretation state must be always equivalent to performing interpretation semantics for the word (regardless whether they are standard-defined or system-defined).
Connection with Tick
It we want ticking any word for which interpretation semantics are defined by the standard, name>interpret
cannot return 0 for these words.
Forth systems in which name>interpret
returns 0 for such a word are unknown to the author.
Solution
The specification for name>interpret
can be adjusted to solve the mentioned problem.
There are two options:
Allow to return
0
if the system cannot return xt that identifies the interpretation semantics for the word identified bynt
(see also the clarification re execution tokens).- Probably, in this case we have to introduce a word like
name>
(experimental in Forth-83), which returns xt that identifies the execution semantics of the word identified bynt
. Since otherwise a user-defined Forth text interpreter is impossible without correctfind
.
- Probably, in this case we have to introduce a word like
Allow to return state-dependent xt, which performs the interpretation semantics for the word in interpretation state only.
In this proposal I stick to the second option.
If anyone prefers the first option or has other objections, please feel free to share your ideas in a comment.
Proposal
Replace the following paragraph in the section 15.6.2.1909.20 NAME>INTERPRET:
xt represents the interpretation semantics of the word nt. If nt has no interpretation semantics,
NAME>INTERPRET
returns 0.
by the following paragraphs:
xt identifies the execution semantics of the word identified by nt. When this xt is executed in interpretation state, the interpretation semantics for the word are performed. If a Forth system does not provide such execution token for the word,
NAME>INTERPRET
returns 0.
xt identifies the execution semantics of the word identified by nt. When this xt is executed in interpretation state, the interpretation semantics for the word are performed.
If and only if interpretation semantics for the word are not defined by this standard and the Forth system does not provide the execution token for the word,
NAME>INTERPRET
returns 0.
An ambiguous condition exists in any of the following conditions:
- interpretation semantics for the word are not defined by this standard and xt is executed;
- execution semantics of the word are not defined by this standard and xt is executed in compilation state;
ruv
If we can't assume that compile,
is equivalent to lit, ['] execute compile,
, then instead of the phrase:
xt is executed
we should use the phrase:
the execution semantics identified by xt are performed
I want to stick to the short wording, and assume this equivalency.
ruvNew Version: NAME>INTERPRET wording
Author
Ruv
Change Log
- 2020-02-20 Initial comment for
NAME>INTERPRET
- 2023-09-14 Make this proposal more formal
- 2023-09-19 Add rationale, better wording, fix some typos
- 2023-09-21 Add rationale re system-defined semantics, and declare an ambiguous condition
- 2023-09-22 Require xt if interpretation semantics for the word are defined by the standard
- 2023-09-28 Add a clause re STATE-dependent execution semantics in Problem, add a section re execution of xt meaning in Rationale, better wording and formatting in some places
Problem
Currently the specification for name>interpret
says that returned "xt represents the interpretation semantics of the word nt".
- It's currently unclear from the specification for
name>interpret
how to perform the interpretation semantics for the word identified by nt — namely, how to perform the behavior that a Forth system performs when the Forth text interpreter, while in interpretation state, encounters the name of a word identified by this nt (see also Rationale below).
But actually, in some cases a Forth system cannot provide an xt that performs the defined interpretation semantics for the corresponding word regardless of STATE
.
- The specification for
name>interpret
says that returned "xt represents the interpretation semantics of the word nt". But actually, in some cases a Forth system cannot provide an xt that performs the interpretation semantics for the corresponding word regardless ofSTATE
.
Particularly, when a word like s"
or to
is implemented as a STATE-dependent immediate word. Technically, it is possible to return a correct xt according to the current specification (e.g. via generation of the corresponding definition on the fly), but it can be too burden.
Particularly, when nt is for a word whose execution semantics depends on STATE, or for a word like s"
or to
, if it is implemented as an immediate word. Technically, it is possible to return a correct xt according to the current specification (e.g. via generation of the corresponding definition on the fly), but it can be too burden.
Another minor problem is that it's not clear what the term represent means. According to the language of the standard, xt identifies some semantics.
- A minor problem is that it's not clear what the term represent means. According to the language of the standard, xt identifies some semantics.
Rationale
How to perform interpretation semantics
It should be clear from the specification how, having an nt, to perform the very behavior that a Forth system performs when the Forth text interpreter encounters, in interpretation state, the name of a word identified by this nt.
It should be clear from the specification how, having an nt, to perform the very behavior that a Forth system performs when the Forth text interpreter, while in interpretation state, encounters the name of a word identified by this nt.
Namely, to perform this behavior, must the xt returned from name>interpret
be executed only interpretation state, or it may be also executed in compilation state.
Namely, in the general case, to perform this behavior, must the xt returned from name>interpret
be executed only in interpretation state, or it may be also executed in compilation state.
Execution of xt
In this proposal, the author assumes that compile,
is equivalent to lit, ['] execute compile,
, and therefore "xt is executed" means "the execution semantics identified by xt are performed" — no matter how — via execute
directly, or as a part of execution semantics of another definition, in any nesting, when this part is appended by applying compile,
to this xt.
NB: one consequence from this equivalence is that the words that operate on the return stack cannot be defined as ordinary words (see a corresponding discussion).
System-defined semantics
If the standard does not define interpretation semantics for a word, a Forth system may provide system-defined interpretation semantics for the word (see A.3.4.3.2).
The same is true for execution semantics — if the standard does not define them for a word, a Forth system may provide system-defined execution semantics for the word. But, due to 6.1.0070, performing these execution semantics in interpretation state must be always equivalent to performing interpretation semantics for the word (regardless whether they are standard-defined or system-defined).
The same is true for execution semantics — if the standard does not define them for a word, a Forth system may provide system-defined execution semantics for the word. But, due to 6.1.0070, performing these execution semantics in interpretation state must always be equivalent to performing the interpretation semantics for the word (regardless whether they are standard-defined or system-defined).
Connection with Tick
It we want ticking any word for which interpretation semantics are defined by the standard, name>interpret
cannot return 0 for these words.
Forth systems in which name>interpret
returns 0 for such a word are unknown to the author.
Solution
The specification for name>interpret
can be adjusted to solve the mentioned problem.
There are two options:
Allow to return
0
if the system cannot return xt that identifies the interpretation semantics for the word identified bynt
(see also the clarification re execution tokens).- Probably, in this case we have to introduce a word like
name>
(experimental in Forth-83), which returns xt that identifies the execution semantics of the word identified bynt
. Since otherwise a user-defined Forth text interpreter is impossible without correctfind
.
- Probably, in this case we have to introduce a word like
Allow to return state-dependent xt, which performs the interpretation semantics for the word in interpretation state only.
In this proposal I stick to the second option.
If anyone prefers the first option or has other objections, please feel free to share your ideas in a comment.
Proposal
Replace the following paragraph in the section 15.6.2.1909.20 NAME>INTERPRET:
xt represents the interpretation semantics of the word nt. If nt has no interpretation semantics,
NAME>INTERPRET
returns 0.
by the following paragraphs:
xt identifies the execution semantics of the word identified by nt. When this xt is executed in interpretation state, the interpretation semantics for the word are performed.
If and only if interpretation semantics for the word are not defined by this standard and the Forth system does not provide the execution token for the word,
NAME>INTERPRET
returns 0.An ambiguous condition exists in any of the following conditions:
- interpretation semantics for the word are not defined by this standard and xt is executed;
- execution semantics of the word are not defined by this standard and xt is executed in compilation state;
ruv
In the ways of execution an xt the word catch
should be mentioned.
The word find
(according to the proposed clarification) allows the program to check whether a word is ordinary (i.e., for which default interpretation semantics and default compilation semantics are defined): if and only if find
, in interpretation state, returns -1
at the top, then the word is ordinary.
At the moment, the set of words find-name
, name>interpret
and name>compile
does not provide a ways to check whether a word is ordinary.
Perhaps name>compile
could be tightened up so that analysis its result and the results of name>interpret
allows the program to conclude whether the word is ordinary.
ruv
name>interpret
is allowed to return 0
if interpretation semantics for the word are not defined by the standard.
But in fact, the result of 0
does not give programs any additional information, since for the same word the result can be zero in one system and non-zero in another system.
So, programs won't loose anything, and will only become simpler, if name>interpret
never returns zero (i.e., if it's required to return some xt in all cases) — since programs will not need to analyze the result (e.g. before compile or execute it). Well, in some rare cases an error report shown by programs will be carried over from compile time to runtime in some systems due to this change, but anyway this report is generated at compile time only in some systems — i.e., this is a system dependent behavior that programs cannot rely on.
Suppose we changed the specification for name>interpret
so that this word will require to return a system-dependent xt if interpretation semantics for the word are not defined by the standard. This change does not affect programs at all. But it affects systems — they need to be updated to comply with the new specification and new programs (which relies on the new specification).
The question is: is it acceptable to change name>interpret
specification in this way, or is it better to introduce a new word for this?
The new word can be defined as follows:
: name> ( nt -- xt )
name>interpret dup if exit then drop [: -14 throw ;]
;
Or name>interpret
can be redefined in this way in a polyfill.