| Deutsch English Français Italiano |
|
<v8ekea$1po8g$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Ruvim <ruvim.pinka@gmail.com>
Newsgroups: comp.lang.forth
Subject: Re: VALUE and TO implementation
Date: Thu, 1 Aug 2024 04:21:30 +0400
Organization: A noiseless patient Spider
Lines: 154
Message-ID: <v8ekea$1po8g$1@dont-email.me>
References: <a1aab44ee3b1b56c2f54f2606e98d040@www.novabbs.com>
<v8b04c$137lg$1@dont-email.me> <nnd$6e668a8e$712b1a09@1b1e479e823969fb>
<v8cuur$1go8k$1@dont-email.me>
<2af79ef5abcec71a1d42a461b6bc56b8@www.novabbs.com>
<v8dntr$1lcff$1@dont-email.me> <2024Jul31.193344@mips.complang.tuwien.ac.at>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 01 Aug 2024 02:21:30 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="d1be1ae417856d29403db8a5484ed461";
logging-data="1892624"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18QeysFwQR82NaU59rJTLtw"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:rigQ6Lh649urlVo8HV9n3I0NmHw=
In-Reply-To: <2024Jul31.193344@mips.complang.tuwien.ac.at>
Content-Language: en-US
Bytes: 5011
On 2024-07-31 21:33, Anton Ertl wrote:
> Ruvim <ruvim.pinka@gmail.com> writes:
>> A testcase:
>>
>> : apply-compiling(to) ( sd.name -- )
>> [: postpone to ;] execute-parsing
>> ;
>
> The standard says (in 6.2.2295):
>
> |An ambiguous condition exists if any of POSTPONE, [COMPILE], ' or [']
> |are applied to TO.
Yes, that is why I added the note below.
>> NB: "postpone" can be defined in a standard way via "find-name" so that
>> is apples to "to" [2].
>
> But FIND-NAME is not in Forth-2012.
Yes. But "find-name" has already been accepted, and, anyway, it can be
implemented via "get-order" and "traverse-wordlist".
> Maybe those who like this kind of
> TO implementation will make a proposal that means that you cannot
> POSTPONE TO with a user-defined POSTPONE.
How? Disallow obtaining the name token for "to"? That's a very weak
approach.
It seems, it is possible to test whether "to" is parsing, and if not,
redefine it to provide a parsing "to" in a standard system.
I came up with the following test:
0 value _v1 immediate
0 value _v2
: test(to)
1 1
[ 1 ] to _v1 _v2 [ ( 1 | 1 0 ) ?dup 2drop ]
( 1 | 1 0 ) ?dup 2drop
;
test(to) _v2 [if]
.( ["to" is not a parsing word] )
[else]
.( ["to" is a parsing word] )
[then]
Suddenly, compilation of "test(to)" failed in VfxForth, version
VFX Forth 64 5.43 [build 0199] 2023-11-09 for Linux x64
So, either this "test(to)" or VfxForth is not standard compliant.
I changed "test(to)" to make it compilable in VfxForth:
: ndrop ( i*x u.i -- ) 0 ?do drop loop ;
2 value _v1 immediate
0 value _v2
: test(to) ( -- )
depth >r 1
[ 0 1 ] to _v1 _v2 [ ( 0 | 0 1 | 0 1 2 ) ndrop ]
( | 1 | 1 0 ) depth r> - ndrop
;
\ in this point _v1 and _v2 shall be unchanged,
\ but _v1 is changed in VfxForth
_v1 2 <> [if]
.( [error, _v1 is changed during compilation] )
[then]
_v2 0 <> [if]
.( [error, _v2 is changed during compilation] )
[then]
\ Check what variable is changed by "test(to)"
0 to _v1
0 to _v2
test(to)
_v1 [if]
.( ["to" is a parsing word] )
[else]
_v2 [if]
.( ["to" is not a parsing word] )
[else] \ neither _v1 nor _v2 is changed
.( ["to" is implemented incorrectly] )
[then] [then]
In this test, VfxForth falls into third case, ["to" is implemented
incorrectly].
I redefined "to" in VfxForth as following:
: to ( "ccc<name>" -- ) ( run-time: x -- )
' ['] to ( xt.argument xt.to )
state @ if compile, compile, else execute execute then
; immediate
And it did not change anything in the above tests!
It looks like "compile," in VfxForth still violates the standard, having
unspecified detectable side effects.
> Note that FIND and SEARCH-WORDLIST are alreading in Forth-94,
> and TRAVERSE-WORDLIST is in Forth-2012.
As well as "name>compile" (to define "postpone").
Regarding "find" — it's possible to use "find" to implement "postpone"
only if "find" is implemented in such a way that the interpreter loop
from a single-xt+immediacy-flag system correctly works.
For example, the following "interpret":
: tt-xt ( i*x xt -- j*x )
state @ if compile, else execute then
;
: tt-word ( i*x xt flag.special -- j*x )
if execute exit then tt-xt
;
: interpret ( i*x -- j*x )
begin
bl word find dup if 1 =
tt-word
else drop count dup if \ try to recognize a number
\ ...
-13 throw
else 2drop exit then then
again
;
--
Ruvim