[parenscript-devel] Should implicit return in PS mean always explicitly returning null in JS?

Vladimir Sedach vsedach at gmail.com
Thu Jan 7 02:35:37 UTC 2010


I pushed a fix for this.

2010/1/4 Daniel Gackle <danielgackle at gmail.com>:
> < I just pushed a patch; let me know if that breaks anything. >
>
> Thanks for this patch. It has the astonishing effect of reducing our total
> JS size by almost 10K, so we're obviously very pleased with the change.
>
> We did find one breakage, involving inappropriate fall-through in switch
> statements:
>
> (defun blah ()
>     (case foo
>       (123 (when (bar) t))
>       (345 (blah))))
>
> =>
>
> function blah() {
>     switch (foo) {
>     case 123:
>         if (bar()) {
>             return true;
>         };
>     case 345:
>         return blah();
>     };
> };
>
> Clearly, there needs to be a "return null" in the case that bar() is false,
> to prevent the bug of falling into case 345 inappropriately.
>
> Thanks again,
> Daniel
>
>
> On Sat, Jan 2, 2010 at 2:39 PM, Vladimir Sedach <vsedach at gmail.com> wrote:
>>
>> That makes sense. I just pushed a patch; let me know if that breaks
>> anything.
>>
>> Vladimir
>>
>> 2009/12/3 Daniel Gackle <danielgackle at gmail.com>:
>> > I've now had a chance to systematically look at how our code fares under
>> > PS's implicit return. Thanks to Scott for being the guinea pig for the
>> > rest
>> > of us. I like it! I do have a few questions/issues. I'll send them in
>> > separate emails, I guess.
>> >
>> > PS now tries to insert a default "return null;" statement in functions
>> > that
>> > would formerly have returned nothing, i.e. whose return values would
>> > have
>> > been undefined. I am not convinced that this buys us much. We've always
>> > treated NULL and UNDEFINED as conveying the same information when
>> > returning
>> > from a function. I recognize not everyone would share this
>> > interpretation.
>> >
>> > The trouble with explicit "return null" is that you end up with things
>> > like
>> > the following example taken from our code (stripped-down for brevity):
>> >
>> > (defun blep (ss x y)
>> >       (when foo?
>> >         (awhen (bar)
>> >           (destructuring-bind (c r) it
>> >             (when (!null c r)
>> >               (awhen (baz)
>> >                 (when (blah it)
>> >                   (unless (blee)
>> >                     t))))))))
>> >
>> > =>
>> >
>> > function blep(ss, x, y) {
>> >     if (foowhat) {
>> >         var it = bar();
>> >         if (it != null && it !== false) {
>> >             var c = it[0];
>> >             var r = it[1];
>> >             if (c != null && r != null) {
>> >                 var it27537 = baz();
>> >                 if (it27537 != null && it27537 !== false) {
>> >                     if (blah(it27537)) {
>> >                         if (!blee()) {
>> >                             return true;
>> >                         } else {
>> >                             return null;
>> >                         };
>> >                     } else {
>> >                         return null;
>> >                     };
>> >                 } else {
>> >                     return null;
>> >                 };
>> >             } else {
>> >                 return null;
>> >             };
>> >         } else {
>> >             return null;
>> >         };
>> >     } else {
>> >         return null;
>> >     };
>> > };
>> >
>> > I wish PS would avoid generating all those "return null"s when the only
>> > thing we need is the "return true".
>> >
>> > Note also that PS is not *always* returning null; there are cases where
>> > the
>> > old undefined behavior still exists:
>> >
>> > (ps (defun foo () (dolist (a b) (blah a))))
>> > =>
>> > "function foo() {
>> >     for (var a = null, _js_idx27540 = 0; _js_idx27540 < b.length;
>> > _js_idx27540 += 1) {
>> >         a = b[_js_idx27540];
>> >         blah(a);
>> >     };
>> > };"
>> >
>> > Personally, I think this is fine and would rather see all functions
>> > behave
>> > this way. That is, if I put a NIL in a tail position in my code, I
>> > should
>> > get "return null" and otherwise no explicit return in JS. We can't
>> > factor
>> > the null vs. undefined distinction out of PS altogether; it's too
>> > engrained
>> > in JS. Anyway this issue is, to my mind, distinct from the implicit
>> > return
>> > feature as such.
>> >
>> > What am I missing?
>> >
>> > Daniel
>> >
>> > _______________________________________________
>> > parenscript-devel mailing list
>> > parenscript-devel at common-lisp.net
>> > http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>> >
>> >
>>
>> _______________________________________________
>> parenscript-devel mailing list
>> parenscript-devel at common-lisp.net
>> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>
>
> _______________________________________________
> parenscript-devel mailing list
> parenscript-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
>
>




More information about the parenscript-devel mailing list