Simpler implementation with R7RS parameters?
Adam Nelson
(27 Apr 2020 20:50 UTC)
|
||
(missing)
|
||
Re: Simpler implementation with R7RS parameters?
Adam Nelson
(04 Jun 2020 18:13 UTC)
|
||
Re: Simpler implementation with R7RS parameters?
Marc Nieper-Wißkirchen
(04 Jun 2020 18:16 UTC)
|
||
Re: Simpler implementation with R7RS parameters?
Shiro Kawai
(05 Jun 2020 01:05 UTC)
|
||
Re: Simpler implementation with R7RS parameters? Marc Nieper-Wißkirchen (05 Jun 2020 06:16 UTC)
|
||
Re: Simpler implementation with R7RS parameters?
Shiro Kawai
(05 Jun 2020 07:07 UTC)
|
||
Re: Simpler implementation with R7RS parameters?
Marc Nieper-Wißkirchen
(05 Jun 2020 07:37 UTC)
|
||
Re: Simpler implementation with R7RS parameters?
Shiro Kawai
(05 Jun 2020 09:14 UTC)
|
||
Re: Simpler implementation with R7RS parameters?
Marc Nieper-Wißkirchen
(28 Apr 2020 06:27 UTC)
|
||
Re: Simpler implementation with R7RS parameters?
Marc Nieper-Wißkirchen
(05 May 2020 14:56 UTC)
|
Am Fr., 5. Juni 2020 um 03:05 Uhr schrieb Shiro Kawai <xxxxxx@gmail.com>: > > I agree with the rationale of using identifier syntax, but is it _allowed_ to implement it as an ordinary variable? > It does make the optimization described in srfi difficult, but functionally it works the same in ordinary use cases. > Currently the srfi states yield to be bound to syntax, so it excludes such choice, though. A variable reference *is* syntax, so this doesn't preclude `yield' bound to a variable instead of a transformer. > Here's my take. It works with the examples and tests. > > https://github.com/shirok/Gauche/blob/master/lib/srfi-190.scm > > Are there any use cases that reveal the difference between variable and syntax implementations? It is the lexical scoping that doesn't work if you replace `syntax-parameterize' with `parameterize'. As replacing lexical with dynamic scoping often simply works (especially, when there are no higher-order procedures involved), your solution will mostly work. But not always: (define-coroutine-generator f (yield (lambda () (yield 1)))) (define-coroutine-generator g (yield (let ((x (f))) (if (proc? x) (x) x))))) (g) ;=> 1 This won't work with dynamic scoping of `yield'. (One can probably think of a much simpler example.) For most uses cases, though, dynamic scoping does not seem to make a difference (only in efficiency). However, it is probably better to implement syntax parameters (maybe a bit of work; I don't know Gauche's syntax expander) and identifier syntax (trivial to implement) in Gauche. Alternatively, one may try to implement `yield' with unhygienic macros instead of syntax parameters (which is exactly why syntax parameters are so great because they make the dangerous examples of unhygienic macros unnecessary; see [1]). Marc [1] http://scheme2011.ucombinator.org/papers/Barzilay2011.pdf