Parenscript-tagbody-go PROPOSE FIX BUG #1, PROPOSE FIX BUG #2
Andrew Easton
Andrew at Easton24.com
Sun Jan 29 03:09:41 UTC 2023
Hello everyone,
How’s it going?
Firstly, bug #1 was triaged incorrectly by me. The main issue was handling of the “preamble”.
BUG #1 and BUG #2 are the same bug. Going by the triage, BUG #1 turned out to be a duplicate of BUG #2.
From a communications perspective it seems better to document that BUG #2 was a duplicate of BUG #1
and amend the triage of BUG #1.
There is a proposed solution to BUG #1 and BUG #2 at "https://dapperdrake.neocities.org/faster-loops-javascript#h2-revision-history <https://dapperdrake.neocities.org/faster-loops-javascript#h2-revision-history>" .
The code now comes as a .tar.gz and as a .zip suitable for unpacking and placing in #p”~/quicklisp/local-projects/“.
This makes (ql:quickload :parenscript-tagbody-go) work as expected and also pulls parenscript in as a dependency.
Keyword :parenscript-tagbody-go is pushed to *features*.
A defpsmacro for cl:tagbody is established by parenscript-tagbody-go.
This means, that (ps* ‘(tagbody (go x) (alert “hi”) x)) should now work as expected.
Cheers,
Andrew
> On Jan 28, 2023, at 06:19, Andrew Easton <Andrew at easton24.com> wrote:
>
> Hi Jason,
>
> Thank you very much for raising the preamble issue.
> It seems like it is fixable, see below. The idea of a “preamble” will probably be removed.
> Fix still needs to be implemented by me.
>
> The blog post has been amended to document this bug. Search for “TODO BUG #2”.
>
>
> ;; TODO BUG #2 2023-02-28
>
>
> (parenscript:ps*
> '(defun bar () (tagbody (go x) (alert "hi") x)))
>
> #|
> returns
>
> "defun(bar, null, (function () {
> go(x);
> alert('hi');
> var switchVar295 = 1;
> while (true) {
> switch (switchVar295) {
> case 1:
> 'tagbody-go-tag: X';
> };
> __PS_MV_REG = [];
> return;
> };
> })());”
> |#
>
>
> This output is incorrect.
> There should be no "go(x);" under any relevant circumstances
> as by the CLHS definition of (tagbody ...) and (go ...) .
>
> The problem seems to be that the search for the
> "preamble" only checks for go-tags and not for
> (go ...) forms. This seems to be easily fixable
> by amending the preamble search to terminate upon
> encountering a top-level (go ...) form.
> Problem: (tagbody (funcall (lambda () (go x))) (alert "hi") x)
> still has the same behaviour, *without* involving
> a (go ...) form at the top level of the (tagbody ...).
>
> Alternative proposal:
> Do away with the preamble and instead add a
> dummy gensymmed jump tag at the beginning
> of the (tagbody ...). That jump-tag should,
> conceptually, be unreachable. All (go ...)
> forms are then affected by the (macrolet ((go ...)) ...)
> wrappers being placed already.
> Then the preamble analysis becomes dead code and can
> be removed.
>
> See Jason Miller's first bug reported on 2023-01-27
> for current problems with wrapping (go ...) forms
> inside of (lambda ...) forms.
>
>
> Cheers,
> Andrew
>
>
>
>> On Jan 27, 2023, at 15:16, Jason Miller <jason at milr.com <mailto:jason at milr.com>> wrote:
>>
>> (parenscript:ps (defun bar () (tagbody (go x) (alert "hi") x)))
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/parenscript-devel/attachments/20230128/d47b4d58/attachment-0001.html>
More information about the parenscript-devel
mailing list