Let como expresion o como declaracion en harmony (mozilla 1.7,etc)

18 views
Skip to first unread message

jneira

unread,
Oct 13, 2011, 5:16:14 PM10/13/11
to javasc...@googlegroups.com
Bueno parece que al final parte del debate se hizo en twitter. @joseanpg ya ha explicado sus reparos a let como declaracion y yo en principio estoy de acuerdo con el, aunque yo al menos no soy muy objetivo ya que mi lenguaje habitual es lisp y en el let es una simple reescritura de
((lambda (x) ((lambda (y) (+ x y)) 1) 2)
en
(let ((x 2) (y 1)) (+ x y)  
Sin embargo hay quien no le ve tanto problema...

gnz/vnk

unread,
Oct 13, 2011, 5:40:24 PM10/13/11
to javasc...@googlegroups.com
Yo la verdad es que estoy muy de acuerdo con lo explicado por Jose en
Twitter.

Procedo a recopilarlo por si acaso alguien se lo ha perdido:

@joseanpg dijo:
--[[
con la construcción let(a=1){statements} tenemos una clara analogía con
los parametros formales de una funcion ...
... no hay lugar para grandes confusiones por tanto, el ámbito y la
visibilidad son claros: coinciden.
con la construccion let(a=1) expression ocurre lo mismo.
pero consideremos algo como esto: { ....; let a = 1; ...} eso equivale a
let(a=undefined){ ....} y ya la estamos liando
una declaración/definición como esa por ahí perdida en un bloque de 50
líneas te esta creando un ámbito de bloque casi ...
... sin darte cuenta. Y encima ya tenemos dos tipos de variables bien
vivas: las que tienen ambito de bloque con let y las que ...
... tienen ámbito de función con var. Me diras que las otras
construcciones let hacen lo mismo, y es cierto, pero como están al ...
... principio del bloque los riesgos son menores.
hay situaciones "ambiguas" sobre las que no sé si finalmente tomaron una
decisión: ...
¿for(let i=0;....) <--> let(i=0){for(;...)? (es lo más lógico) ó ...
... ¿se creará un ambito nuevo en cada iteración?
]]--

Juan Ignacio Dopazo

unread,
Oct 13, 2011, 8:07:52 PM10/13/11
to javasc...@googlegroups.com
El tema es que lograr crear una sintaxis original para cada nueva feature que se agrega debe ser verdaderamente imposible. Así que es inevitable reutilizar sintaxis de otros lenguajes. En tal caso esperar que el significado de esa sintaxis sea el mismo también es algo difícil. Lo importante es que dentro del lenguaje no tenga ya un significado y que lo que se agregue sea coherente con el resto de la semántica del lenguaje.

La idea para let en for era ayudar a los nuevos usuarios del lenguaje con este caso de uso:

var nodes = document.getElementByTag("foo");
for (var i = 0; i < nodes.length; i++) {
 nodes[i].addEventListener("click", function () {
   alert(i);
 });
}

Pero honestamente no se en que quedo.

Juan

Juan Ignacio Dopazo

unread,
Oct 13, 2011, 8:11:16 PM10/13/11
to javasc...@googlegroups.com
Si, la convivencia entre let y var es un problema. Por eso algunos están proponiendo que haya un plan para matar a var. Algunos por ejemplo proponen que dentro de los nuevos módulos no se pueda usar var. En general me parece una buena idea. Ámbito por bloque tiene sentido en JS pero la mezcla no es positiva.


Juan

jneira

unread,
Oct 14, 2011, 2:35:03 AM10/14/11
to javasc...@googlegroups.com
hala se me ha olvidado un parentesis, si es que...

Valentin Starck

unread,
Oct 14, 2011, 9:47:40 AM10/14/11
to javasc...@googlegroups.com
harmony:let: http://wiki.ecmascript.org/doku.php?id=strawman:let_expressions

Realmente no tengo una opinión demasiado formada al respecto, por el momento me da la impresión de que agrega demasiada complejidad para los beneficios que propone. El caso del for es bastante paradigmático, me gustaría ver el resultado final.

Juan Ignacio Dopazo

unread,
Oct 14, 2011, 9:53:39 AM10/14/11
to javasc...@googlegroups.com


2011/10/14 Valentin Starck <valenti...@gmail.com>

harmony:let: http://wiki.ecmascript.org/doku.php?id=strawman:let_expressions

Realmente no tengo una opinión demasiado formada al respecto, por el momento me da la impresión de que agrega demasiada complejidad para los beneficios que propone. El caso del for es bastante paradigmático, me gustaría ver el resultado final.

Eso es una propuesta de let expressions que no se aprobo. Lo aprobado es http://wiki.ecmascript.org/doku.php?id=harmony:let

Menciona for en los open issues:

  • Should a = []; for (let i = 0; i < 3; i++) a.push(function () { return i; }); print(a[0]()) print 3 or 0?
    • Some say yes (Mark did a lambda coding).
    • Others say no (and Mozilla’s JS1.7 in Rhino and SpiderMonkey implement this, but these could be changed and users might be happier).
    • Jon Zeppieri pointed out a big flaw: for (let i=0;i<N;i++){...} differs from let i=0; for (;i<N;i++){...}.
  • Same example but using for (let i in o) – here everyone agrees that in this form, we want fresh binding per iteration. Same for for-of (see iterators).

Juan
Reply all
Reply to author
Forward
0 new messages