You are right that you can't `call` a dynamic quotation but you can `get call( -- )` it just fine. The issue is knowing the implied stack effect of the quotation being called. If you provide it then the caller will get the value of the symbol and check the desired stack effect matches before calling it.
I think your last version is wrong because the parse-lines-interactive seems to no longer return a quotation? > On Aug 23, 2016, at 4:07 PM, Alexander Ilin <ajs...@yandex.ru> wrote: > > Hello! > > Why is it that I can't just store any with-... combinator in a SYMBOL, then > use `SYMBOL get call`? > I get it that we want to check the stack effects, but doesn't it break the > idea of concatenativity? > The fact that we inline all the with-... combinators -- is there a way > around it? > > You'll want a use case, so I'll make one up. > > Let's say we have a hypothetical word, call it parse-lines-interactive: > > : parse-lines-interactive ( lines -- quot/f ) > [ [ parse-lines ] with-ctrl-break > ] with-compilation-unit ; > > And let's say we have another completely made up piece of code that does > this: > > read-quot [ > '[ [ datastack _ with-datastack ] with-ctrl-break ] > [ call-error-hook datastack ] > recover > ] [ return ] if* > > In both cases we use the `with-ctrl-break` combinator, which is `inline`. > > Let's say we have two implementations of it, which we want to dynamically > switch. We begin by creating the two implementations and a SYMBOL like so: > > : with-ctrl-break ( quot -- ) > enable-ctrl-break > [ disable-ctrl-break ] [ ] cleanup ; inline > > : with-no-ctrl-break ( quot -- ) > call( -- ) ; inline > > SYMBOL: break-handler > [ with-no-ctrl-break ] break-handler set-global > > You can see that both `with-ctrl-break` and `with-no-ctrl-break` have the > same stack effect: they consume one quotation. > > Now we update the code to dispatch on the SYMBOL: > > : parse-lines-interactive ( lines -- quot/f ) > [ [ parse-lines ] break-handler get call( quot -- ) > ] with-compilation-unit ; > > read-quot [ > '[ [ datastack _ with-datastack ] break-handler get call( quot -- > ) ] > [ call-error-hook datastack ] > recover > ] [ return ] if* > > Amazingly, this no longer works! Now, I'm asking you: where's the > concatenativity in that? > > ---=====--- > Александр > > ------------------------------------------------------------------------------ > _______________________________________________ > Factor-talk mailing list > Factor-talk@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/factor-talk ------------------------------------------------------------------------------ _______________________________________________ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk