Deutsch   English   Français   Italiano  
<2025Feb8.124132@mips.complang.tuwien.ac.at>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!fu-berlin.de!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: anton@mips.complang.tuwien.ac.at (Anton Ertl)
Newsgroups: comp.lang.forth
Subject: quotations (was: Back & Forth - Co-routines)
Date: Sat, 08 Feb 2025 11:41:32 GMT
Organization: Institut fuer Computersprachen, Technische Universitaet Wien
Lines: 191
Message-ID: <2025Feb8.124132@mips.complang.tuwien.ac.at>
References: <nnd$2fb29a8e$298ef3f8@23fe4f00fa62d734> <vnq10p$162l3$1@dont-email.me> <nnd$28e37865$1ff3c947@ec3118cc4d5fd42b> <874j1aycdt.fsf@nightsong.com> <nnd$68d49e22$0e1b270a@ce4705a037955a82> <3c3bdb056696f15c43fa512b5366002d@www.novabbs.com> <2025Feb6.135712@mips.complang.tuwien.ac.at> <3955434636b2a293c6a9c6d726ff6eae@www.novabbs.com> <ad7048513cca2117bb04396db85ef6196a257605@i2pn2.org> <2025Feb6.182051@mips.complang.tuwien.ac.at> <246bf746dbd7827c3e6edf3027f51ef8c416c39d@i2pn2.org>
Injection-Date: Sat, 08 Feb 2025 13:34:27 +0100 (CET)
Injection-Info: dont-email.me; posting-host="2c90fdc368a2af26c94e5211bb5d26be";
	logging-data="65979"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19qMtZFq1Al2ug0uXnzrp83"
Cancel-Lock: sha1:dPi3Ldqx7pQKxapCDsY+Hc3ybdc=
X-newsreader: xrn 10.11
Bytes: 8211

dxf <dxforth@gmail.com> writes:
>On 7/02/2025 4:20 am, Anton Ertl wrote:
>> dxf <dxforth@gmail.com> writes:
>>> On 7/02/2025 12:59 am, minforth wrote:
>>>> On Thu, 6 Feb 2025 12:57:12 +0000, Anton Ertl wrote:
>>> AFAIR 200x nested definitions were justified on the grounds named
>>> definitions were neither needed nor wanted
>> 
>> Really?  There's a proposal to eliminate named definitions?  That's
>> news to me.
>
>I didn't but clearly those that argued for quotations did.

They did what?  Make a proposal for eliminating named definitions?
Where can I find that proposal?  I was one of the proposers of
quotations, so I certainly argued for them, and I am completely
unaware of a proposal like you claim, neither from me, nor Alex
McDonald (the first proposer of quotations), nor of anybody else
arguing for quotations.  Please present evidence of such a proposal.

>There's a case for having NONAME: which has no name and must pass an xt.

Let's look at an example from the proposal:

: hex. ( u -- )
  base @ >r
  [: hex u. ;] catch
  r> base ! throw ;

There is no good way for replacing the quotation here with NONAME:, so
NONAME: is a red herring.

>But that's not the same as saying there's a need for definitions without
>names.

"There's a need for definitions without names" is something completely
different than "named definitions were neither needed nor wanted".

And certainly :NONAME is there because there is a use for colon
definitions without names.  Whether these uses constitute needs is the
question; they often can be replaced relatively easily by using named
definitions.  That's also the case for quotations.  One could replace
the definition above with:

: hex.-helper ( u -- )
  hex u. ;

: hex. ( u -- )
  base @ >r
  ['] hex.-helper catch
  r> base ! throw ;

But would the result be easier to read, write, understand, or consume
fewer resources?  No.

>This only strengthened my view forth quotations had nothing to offer but
>namelessness.

They also offer nesting.

>If want to hide names of definitions I no longer need to
>reference I have BEHEAD for that.

Let's see if this is ang better:

| : hex.-helper ( u -- )
  hex u. ;

: hex. ( u -- )
  base @ >r
  ['] hex.-helper catch
  r> base ! throw ;

Not at all.

>Interesting but what are you saying - that quotations as we have them
>are little more than a gimmick?

Let's see what that means; according to
<https://en.wikipedia.org/wiki/Gimmick>:

|A gimmick is a novel device or idea designed primarily to attract
|attention or increase appeal, often with little intrinsic value.[1][2]
|When applied to retail marketing, it is a unique or quirky feature
|designed to make a product or service "stand out" from its
|competitors.

It is certainly intended to increase the appeal, but not primarily.
It's not a unique or quirky feature, many other languages have nested
nameless definitions.

And Forth has had them too, and some posters love to present the use
of return-stack manipulations to turn code pieces into nameless
definitions that are then called in another context, without any
protest from you.  I think Hans Bezemer does it in the video that he
advertised in the start of this thread (at least that's what the gist
of the discussion here seems to indicate; I usually don't watch
videos).  One example is from the quotations proposal:

: foo bar list> bla blub ;

where the part after LIST> is a separate definition that is called
once for every element in the list.  There is even such a word in
standard Forth (since Forth-79):

: D A does> B ;

Here the "B ;" is a separate definition (it's even specified that way
in Forth-94 f.) that is called whenever another word C to which the
DOES> has been applied is called.

The LIST>-like definition splitting has several disadvantages:

1) It's not obvious when reading the code that some arbitrary word
   splits a definition in that way.

2) There is no way to continue the original definition after the
   LIST>-like word.  E.g., the proposal contains the example

  : dofield ( -- )
  does> ( name execution: addr1 -- addr2 )
      @ + ;
  
  : dozerofield ( -- )
      immediate
  does> ( name execution: -- )
      drop ;
  
  : field ( align1 offset1 align size "name" --  align2 offset2 )
      \ name execution: addr1 -- addr2
      2 pick >r \ this uglyness is just for optimizing with dozerofield
      create-field
      r> if \ offset<>0
        dofield
      else
        dozerofield
      then ;

   Here the need for the separate words DOFIELD and DOZEROFIELD comes
   from the fact that there is no standard way to return to the
   original definition after the DOES>.  The quotations proposal
   <http://www.forth200x.org/quotations.txt> contains a variant that
   encloses DOES> in quotations, but I find it even nicer to use
   SET-DOES> which takes an xt and makes C (the defined word) execute
   the xt.  With that the example becomes:

  : field ( align1 offset1 align size "name" --  align2 offset2 )
      \ name execution: addr1 -- addr2
      2 pick >r \ this uglyness is just for optimizing with dozerofield
      create-field
      r> if \ offset<>0
        [: @ + ;] set-does>
      else
        immediate ['] drop set-does>
      then ;

3) LIST> and similar words are implemented using return-address
   manipulation, which has problems with inlining and tail-call
   elimination.  Either you do not implement inlining and tail-call
   elimination, or implement them only in a restricted way (incurring
   complications for determining whether you can use them), or you
   replace the use of LIST> with ways that do not use return-address
   manipulations.

Users could have written the FOO example above as

: foo-helper bla blub ;

: foo bar ['] foo-helper map-list ;

since at least Forth-83, but apparently they found the need for an
out-of-line definition repulsing enough that they accepted the
disadvantages of going for LIST>.  With quotations, they can write
the helper inline without the disadvantages:

: foo bar [: bla blub ;] map-list ;

And we certainly have a lot of uses of [: in Gforth.

If you prefer to program without quotations, that's fine.  If you
don't want to implement them in your system, your system can still
be standard (if you care about that); quotations are optional.  But
I usually don't brake for deprived systems when I program.

========== REMAINDER OF ARTICLE TRUNCATED ==========