Le 11 août 2014 à 21:30, Tab Atkins Jr. <jackalm...@gmail.com> a écrit :

> 
> No, all of Peter's comprehensions are short and easy to comprehend.  
> Comparing it with Dave's version, I think it's simply a matter of the JS 
> comprehensions requiring more syntax, and crossing the line from "easy to 
> read" to "hard to read".  Here's the one bit in particular that stands out:
> 
> Norvig:
> unitlist = ([cross(rows, c) for c in cols] +
>             [cross(r, cols) for r in rows] +
>             [cross(rs, cs) for rs in ('ABC','DEF','GHI') for cs in 
> ('123','456','789')])
> 
> Herman:
> var unitlist
>   = [for (c of cols)
>        cross(rows, [c])]
>     .concat([for (r of rows)
>                cross([r], cols)])
>     .concat([for (rs of ["ABC","DEF","GHI"])
>                for (cs of ["123","456","789"])
>                  cross(rs.split(""), cs.split(""))]);
> 
> Norvig's is simple and easy to read. Herman's is polluted with additional 
> method calls and more indentation.  If we remove the indentation...
> 
> var unitlist
>   = [for (c of cols) cross(rows, [c])]
>     .concat([for (r of rows) cross([r], cols)])
>     .concat([for (rs of ["ABC","DEF","GHI"]) for (cs of ["123","456","789"]) 
> cross(rs.split(""), cs.split(""))]);
> 
> Now pretend that for-of works on strings... (maybe it already does, for all I 
> know, and Dave was just being paranoid)
> 
> var unitlist
>   = [for (c of cols) cross(rows, c)]
>     .concat([for (r of rows) cross(r, cols)])
>     .concat([for (rs of ["ABC","DEF","GHI"]) for (cs of ["123","456","789"]) 
> cross(rs, cs)]);
> 
> Okay, it's still a little bit harder to read, due to the .concat() calls and 
> their attendant additional parens, and the parens around the for-of bodies, 
> but it's not *terribly* worse.  It's still bad enough that I don't know if 
> I'd write it.

I think I'd have written (without comprehension):

    var unitlist = [...function*() {
        for (let c of cols)
            yield cross(rows, c)
        for (let r of rows)
            yield cross(r, cols)
        for (let rs of ["ABC","DEF","GHI"]) 
            for (let cs of ["123","456","789"]) 
                yield cross(rs, cs)
    }]

although it is somewhat lengthier because of extra `function*`, `let`s and 
`yield`s.

—Claude
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to