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

Wout Perquin wout.perquin at skynet.be
Fri Dec 4 14:44:48 UTC 2009


On Thu, 2009-12-03 at 17:10 -0800, Red Daly wrote:
> On Thu, Dec 3, 2009 at 1:41 PM, Daniel Gackle <danielgackle at gmail.com> wrote:
> > 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))))))))
> >
> > =>
> >
I try to follow this conversation, but above (defun blep [...]) on my
system returns :
"function blep(ss, x, y) {
    if (foowhat) {
        awhen(bar(), destructuringBind(c(r), it, bangnull(c, r) ? awhen(baz(), blah(it) ? (!blee() ? true : null) : null) : null));
    };
};" ; I used (ps:ps ...)
I assume that is because I either run the wrong Parenscript version or
there are macros involved that I don't have.
ps, it got my attention because of destructering-bind, is that a macro
in the latest Parenscript release ?
Thanks, Wout
> 
> > 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;
> >     };
> > };
> 
> For this specific example it's more a matter of generating reasonable
> code.  There is a better way to represent this function, even when
> implicitly returning null:
> 
> function blep(ss, x, y) {
>     var expr = null;
>     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()) {
>                             expr = true;
>                         }
>                     }
>                 }
>             }
>         }
>     }
>     return expr;
> };
> 
> Now if I am not mistaken, Parenscript cannot make (or fake) an
> expression from any old Parenscript form.  In my mind this is a
> shortcoming of Parenscript, not something we should embrace because
> Javascript distinguishes between statements and expressions.  If I am
> wrong, then I'd be glad to hear about it!
> 
> If we had a 100% working parenscript-form => javascript expression
> implementation, then implementing implicit returning would be simpler
> and this code generation.  I have not seen the implicit return code,
> but this behavior may require more extensive semantic analysis than
> Parenscript currently supports.
> 
> >
> > 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.
> 
> For most cases it will not make any difference.  If it is important to
> the application, you can always explicitly return ps:undefined or nil.
> 
> Red
> 
> >
> > 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





More information about the parenscript-devel mailing list