por
pobrecito hablador
el Miércoles, 24 Octubre de 2012, 10:39h
(#1322755)
Una cosa que no tengo clara es si el python tiene variables persistentes de scope de funcion. El Java lo imita levemente si las variables de la funcion son constantes. Un ejemplo seria:
function foo(a) {
var bar = a + 2;
return function() { return bar++; };
}
var f = foo(2);
En coffee script si lo prefieres seria:
foo = (a) ->
bar = a + 2
() -> bar++
f = foo 2
En este caso la funcionalidad concreta provocaria que cada vez que se llama a la funcion f esta devuelve un valor incrementado de bar, aunque hiciese mucho de que foo se habria ejecutado y finalizado satisfactoriamente. Y con cada llamada a foo, tendriamos un contador nuevo en una funcion diferente. Reconozco que entender las ventajas de esto es dificil de primera entrada, supongo que por eso ha sido eliminado de casi todos los lenguajes. (No se si el Python)
Una ventaja del Javascript sobre Python es el tema de la metaprogramación, he visto dar muchos rodeos para intentar hacer algo parecido a la flexibilidad del Javascript, y aun asi, al final acaba dando muchos problemas.
Y sobre gestion de ambitos, no le falta en absoluto. De hecho entra dentro de variables persistentes en scope de funcion. Es normal que si vienes de fuera del Javascript, no conozcas el concepto y su aplicacion. Si quieres saber mas mirate el NodeJS o bien el JQuery, ambos muy estructurados. En este caso, para encapsular codigo en modules reutilizables, en navegadores, se suele utilizar el siguiente idiom:
function (namespace) {
var bar,foo;...
namespace.bar = bar; } (window);
El NodeJS ja automaticamente moduliza sin requerir este idiom. Un modulo seria:
var bar, foo;... module.exports.bar = bar;
y su uso externo:
var misc = require("./foo-bar") misc.bar()
Asi que diria que hay que andarse con ojo antes de hablar de algo que no se conoce, especialmente algo como el Javascript: tan sencillo en apariencia que parece que con poco esfuerzo lo tengamos que saber todo, pero tan maleable que puede superar muchas barreras (e incluso introducirlas).
por
pobrecito hablador
el Miércoles, 24 Octubre de 2012, 11:06h
(#1322760)
Estás hablando de clausuras [wikipedia.org], y muchos lenguajes las soportan. En el caso de lenguajes orientados a objetos puedes hacer eso que dices con un método de un objeto que incremente el valor de una variable miembro. No veo dónde está la revolución...
Re:dart
(Puntos:0)function foo(a) {
var bar = a + 2;
return function() { return bar++; };
}
var f = foo(2);
En coffee script si lo prefieres seria:
foo = (a) ->
bar = a + 2
() -> bar++
f = foo 2
En este caso la funcionalidad concreta provocaria que cada vez que se llama a la funcion f esta devuelve un valor incrementado de bar, aunque hiciese mucho de que foo se habria ejecutado y finalizado satisfactoriamente. Y con cada llamada a foo, tendriamos un contador nuevo en una funcion diferente. Reconozco que entender las ventajas de esto es dificil de primera entrada, supongo que por eso ha sido eliminado de casi todos los lenguajes. (No se si el Python)
Una ventaja del Javascript sobre Python es el tema de la metaprogramación, he visto dar muchos rodeos para intentar hacer algo parecido a la flexibilidad del Javascript, y aun asi, al final acaba dando muchos problemas.
Y sobre gestion de ambitos, no le falta en absoluto. De hecho entra dentro de variables persistentes en scope de funcion. Es normal que si vienes de fuera del Javascript, no conozcas el concepto y su aplicacion. Si quieres saber mas mirate el NodeJS o bien el JQuery, ambos muy estructurados. En este caso, para encapsular codigo en modules reutilizables, en navegadores, se suele utilizar el siguiente idiom:
function (namespace) {
var bar,foo;
namespace.bar = bar;
} (window);
El NodeJS ja automaticamente moduliza sin requerir este idiom. Un modulo seria:
var bar, foo;
module.exports.bar = bar;
y su uso externo:
var misc = require("./foo-bar")
misc.bar()
Asi que diria que hay que andarse con ojo antes de hablar de algo que no se conoce, especialmente algo como el Javascript: tan sencillo en apariencia que parece que con poco esfuerzo lo tengamos que saber todo, pero tan maleable que puede superar muchas barreras (e incluso introducirlas).
Clausuras
(Puntos:0)Re:dart
(Puntos:0)int f() { static int x = 0; return ++i; }
Ahí tienes tu contador mágico. Y con mejor sintaxis que JavaScript