Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.forth > #40962

Re: RfD: Quotations

From Bernd Linsel <bl1@gmx.com>
Newsgroups comp.lang.forth
Subject Re: RfD: Quotations
Date 2015-07-30 14:00 +0200
Organization news.netcologne.de
Message-ID <mpd3la$6fk$1@newsreader4.netcologne.de> (permalink)
References (6 earlier) <mpb25r$fg4$1@dont-email.me> <mpbo6b$bkf$1@newsreader4.netcologne.de> <mpcm2n$gnf$1@dont-email.me> <mpcsv0$1hu$1@newsreader4.netcologne.de> <mpcto9$bkg$1@dont-email.me>

Show all headers | View raw


Am 30.07.2015 um 12:21 schrieb Alex McDonald:> on 30/07/2015 11:06:25, 
Bernd Linsel wrote:
 >> For every child in the call chain of a function, the local variables
 >> of the functions above (invoked before) seem to be global, as all
 >> children are accessing the same instance of that
 >> parent's/grandparent's/grand-... local variable.
 >> (Presuming dynamic scoping or nested definitions, like quotations)
 >
 > Dynamic scoping? That's not what you said.

Normally, scope (symbol visibilty) and extent (variable lifetime) in 
Forth don't impose great problems, because nested definitions are not 
allowed. However, when quotations that can be invoked outside the 
creating word's runtime, it must be considered.

Shortly outlined and drastically reduced:
- Static scope: Nested definitions have access to outer definitions' locals.
- Dynamic scope: Nested *invocations* have access to earlier invoked 
functions' locals.
- Global Forth variables have infinite extent (their value stays valid 
as long as the dictionary is not cleared).
- Local Forth variables have static extent (their value is valid from 
their definition/initialization until the containing word returns).

Quotations in Forth suddenly introduce nested definitions.
And if a quotation (q) has somehow access to the locals of the word it 
was defined in (p, for parent), you have a mix of static and dynamic 
scoping:

Static, because q's definition is nested in p's definition. As long as 
you call q from within p, q can just access p's locals stack frame.

But if p returns q (respectively an xt for q) and exits, then q is 
invoked later, p's locals stack frame ceased to exist. Any reference to 
p's locals is invalid. But in q's "history" there has been the 
invocation of p that created q. So now you have a kind of dynamic 
scoping -- iff there is a mechanism that keeps the locals of p alive in 
order to let q access them even after p returned.
This is not straightforward dynamic scoping after the schoolbook, but in 
the same category.

 > <quote>
 > To approximate this behaviour, I suggest making accessed parent's locals
 > static copies, or if you prefer, globals with special scope, just
 > visible withing the quotation.
 > </quote>
 >
 > and
 >
 > <quote>
 > - parent's locals become 'static locals' when accessed within the
 > quotation, mainly because of the effect of being able to store state
 > (what admittedly may equally be achieved by using globals).
 > </quote>
 >
 > Can you provide an example or two?
 >
 > On reading agan the post that these come from, I would also like an
 > example of the issues you raise there, since I don't understand it
 > either.
 >
 > <quote>
 > The suggested RfD lacks the possibility for a simple way to pass values
 > into the quotation at creation time (if the parameter stack is used as
 > compilation stack, as ISO 94 and 200x suggest / allow), and the
 > possibility to create aggregating quotations without a global variable
 > accessible and visible to the "outer world".
 > </quote>
 >
 > Thanks.
 >

#1 passing values into a quotation

The best example is currying, e.g. reducing the arity of a function by 
providing some (but not all) arguments to it, creating another 
"specialized" function:

: f ( x y -- z )
    dup *		\ x y²
    swap *		\ y² x²
    +
;

: curry { xt1 x -- xt2 }
    [: x   swap   xt1 execute :]  ( y -- z )
    ;


# 3 4 f .		\ =>   25 ok
# defer f3		\ =>   ok
# ' f 3 curry is f3	\ =>   ok	( f3 is the same as 3 ? f )
4 f3 .			\ =>   25 ok	( 4 f3 is the same as 3 4 f )


#2 storing state within a quotation

: begin-sum ( -- xt )
    0 { sum }			\ create local state variable for the sum
    [: sum +   dup   to sum :]	( n -- sum )
    ;

# defer sum-add		\ => ok
# begin-sum is sum-add	\ => ok
# 3 sum-add   .		\ => 3 ok
# 2 sum-add   .		\ => 5 ok
# 1 sum-add   drop	\ => ok	  ( sum=6 )
# 4 sum-add   drop	\ => ok	  ( sum=10 )
# 3 sum-add   .		\ => 13 ok

and...

# begin-sum is sum-add	\ => ok		( new instance, sum=0 )
# : test
#    10 0 do
#      i sum-add   drop
#    loop
#    0 sum-add ;	\ => ok
# test .		\ => 45 ok


#3 passing value into the quotation's definition

: begin-sum-with-start	{ sum -- xt }	\ initial value not null but 
provided by caller
   [: sum +   dup   to sum :]		( n -- sum )
   ;

# 8 begin-sum-with-start is sum-add
# 1 sum-add   drop
# 2 sum-add   drop
# 3 sum-add   .		\ => 14 ok



Got the point?

--
Best regards,
Bernd

Back to comp.lang.forth | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-28 21:22 +0100
  Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-29 07:35 +0000
    Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 14:20 +0100
  Re: RfD: Quotations Ron Aaron <rambamist@gmail.com> - 2015-07-29 13:44 +0300
    Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 13:42 +0100
  Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-29 05:35 -0700
    Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-29 13:34 +0000
      Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-29 07:35 -0700
        Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-29 15:05 +0000
        Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 16:19 +0100
          Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-07-29 21:48 +0100
      Re: RfD: Quotations mhx@iae.nl - 2015-07-29 11:13 -0700
        Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-30 13:04 +0000
    Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 15:07 +0100
      Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-29 07:44 -0700
        Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-29 15:12 +0000
        Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 16:18 +0100
          Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-29 18:37 +0200
            Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 17:55 +0100
              Re: RfD: Quotations "Elizabeth D. Rather" <erather@forth.com> - 2015-07-29 19:51 -0500
                Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 03:31 +0200
                Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-29 19:30 -0700
                Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-29 21:19 -0700
                Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-29 21:37 -0700
                Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-30 11:45 +0000
                Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-30 08:07 -0700
                Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-31 10:54 +0000
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 12:48 +0100
                Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-31 05:40 -0700
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 14:46 +0100
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 14:50 +0100
                Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-31 14:46 +0000
                Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-31 13:16 -0700
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 21:49 +0100
                Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-29 22:42 -0700
                Re: RfD: Quotations "Elizabeth D. Rather" <erather@forth.com> - 2015-07-30 08:46 -0500
                Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-29 21:40 -0700
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 10:01 +0100
                Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 12:00 +0200
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 11:10 +0100
                Re: RfD: Quotations Coos Haak <chforth@hccnet.nl> - 2015-07-30 16:35 +0200
            Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-29 16:53 +0000
          Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-29 19:03 +0200
            Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 18:24 +0100
              Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 01:38 +0200
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 09:10 +0100
                Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 12:06 +0200
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 11:21 +0100
                Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 14:00 +0200
                Re: RfD: Quotations franck.bensusan@gmail.com - 2015-07-30 06:59 -0700
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 10:53 +0100
            Re: RfD: Quotations Paul Rubin <no.email@nospam.invalid> - 2015-07-29 10:35 -0700
              Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 01:45 +0200
                Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 03:17 +0200
                Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-29 19:21 -0700
                Re: RfD: Quotations Paul Rubin <no.email@nospam.invalid> - 2015-07-29 23:04 -0700
                Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 12:38 +0200
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 12:09 +0100
                Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 13:26 +0200
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 09:47 +0100
                Re: RfD: Quotations Raimond Dragomir <raimond.dragomir@gmail.com> - 2015-07-31 02:51 -0700
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 11:21 +0100
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 09:11 +0100
            Re: RfD: Quotations Paul Rubin <no.email@nospam.invalid> - 2015-07-29 11:36 -0700
              Re: RfD: Quotations Paul Rubin <no.email@nospam.invalid> - 2015-07-29 11:37 -0700
            Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-30 13:07 +0000
              Re: RfD: Quotations Bernd Linsel <bl1@gmx.com> - 2015-07-30 16:25 +0200
          Re: RfD: Quotations mhx@iae.nl - 2015-07-29 11:16 -0700
            Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 20:27 +0100
              Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-07-29 21:57 +0100
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-29 22:48 +0100
                Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-07-31 12:34 +0100
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 13:00 +0100
                Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-31 14:31 +0000
                Re: RfD: Quotations mhx@iae.nl - 2015-07-31 11:32 -0700
              Re: RfD: Quotations mhx@iae.nl - 2015-07-29 21:42 -0700
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 09:57 +0100
          Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-29 17:21 -0700
            Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 09:56 +0100
              Re: RfD: Quotations franck.bensusan@gmail.com - 2015-07-30 04:15 -0700
                Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 12:30 +0100
                Re: RfD: Quotations franck.bensusan@gmail.com - 2015-07-30 05:04 -0700
                Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-30 13:07 -0700
  Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-29 16:52 -0700
    Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 09:53 +0100
  Re: RfD: Quotations Bernd Paysan <bernd.paysan@gmx.de> - 2015-07-30 21:45 +0200
    Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-30 13:25 -0700
      Re: RfD: Quotations Julian Fondren <ayrnieu@gmail.com> - 2015-07-30 15:11 -0700
        Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 09:11 +0100
          Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-07-31 12:04 +0100
    Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-30 22:51 +0100
      Re: RfD: Quotations hughaguilar96@gmail.com - 2015-07-30 22:38 -0700
        Re: RfD: Quotations "Rod Pemberton" <boo@fasdfrewar.cdm> - 2015-07-31 02:10 -0400
        Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 09:01 +0100
          Re: RfD: Quotations hughaguilar96@gmail.com - 2015-08-01 14:59 -0700
            Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-08-01 23:36 +0100
              Re: RfD: Quotations Bernd Paysan <bernd.paysan@gmx.de> - 2015-08-02 01:19 +0200
                Re: RfD: Quotations hughaguilar96@gmail.com - 2015-08-01 18:27 -0700
                Re: RfD: Quotations hughaguilar96@gmail.com - 2015-08-09 14:34 -0700
  Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-07-31 08:52 +0000
    Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 11:57 +0100
  Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-07-31 21:42 +0100
    Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-07-31 22:25 +0100
      Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-07-31 23:39 +0100
        Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-08-01 10:59 +0100
    Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-08-01 14:18 +0000
      Re: RfD: Quotations Bernd Paysan <bernd.paysan@gmx.de> - 2015-08-01 22:10 +0200
        Re: RfD: Quotations anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2015-08-02 05:36 +0000
          Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-08-03 16:40 +0100
            Re: RfD: Quotations "Alex McDonald" <blog@rivadpm.com> - 2015-08-03 18:02 +0100
              Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-08-03 20:22 +0100
            Re: RfD: Quotations Coos Haak <chforth@hccnet.nl> - 2015-08-04 02:10 +0200
              Re: RfD: Quotations Gerry Jackson <gerry@jackson9000.fsnet.co.uk> - 2015-08-04 08:49 +0100
  Re: RfD: Quotations hughaguilar96@gmail.com - 2015-08-01 15:15 -0700

csiph-web