CoffeeScript y funciones con nombre

10

En otros lugares , ha surgido una discusión sobre la terminología de una función con nombre en CoffeeScript. En particular, alguien se refirió a algo como esto:

 foo = ->
    console.log("bar")

como una función con nombre. Pero se ha objetado que todo en CoffeeScript son funciones anónimas y no hay funciones con nombre. Esto es ciertamente cierto, CoffeeScript solo tiene expresiones de función que luego pueden almacenarse en una variable. Pero no creo que eso signifique que sea incorrecto llamar a esto una función con nombre.

Tal como lo veo, es una función con nombre porque es una función a la que se le ha dado un nombre. Es cierto que no es una función con nombre de la misma manera que otros lenguajes tienen funciones con nombre, pero creo que está lo suficientemente cerca como para que no sea inapropiado llamarla función con nombre. Insistir de otra manera solo parece ser una trampa.

¿Salgo a almorzar pensando que insistir en que esta no es una función nombrada es solo una tontería?

Winston Ewert
fuente
3
¿No es toda esta pregunta solo, bueno, quisquilloso? :-)
Mat
@ Mat, sí, parece que no puedo evitar ser quisquilloso sobre ser quisquilloso
Winston Ewert
Para el pequeño grupo de programadores con los que hablo (fuera de los programadores, es decir), en su mayoría dicen que usen las funciones nombradas de JavaScript para usarlas como "clases" (constructores), mientras que las funciones anónimas se almacenan en variables para funciones antiguas simples.
Sal
1
"Solo bromear" implica que la respuesta no importa, y que comprender las sutilezas de un idioma no es un objetivo digno.
user229044
Podría verlo de forma análoga a CoffeeScript: foo = ->es una función antigua y simple, mientras que class Fooes un constructor. No veo ninguna razón por la foo = ->que se deba llamar estrictamente anónimo.
Sal

Respuestas:

20

CoffeeScript está inexorablemente vinculado a JavaScript, y JavaScript diferencia entre las siguientes expresiones:

function foo() { ... }
var foo = function () { ... }

De hecho, incluso puedes escribir:

var foo = function bar () { ... }

Como esta diferencia es importante en JavaScript, tiene sentido usar los mismos términos cuando se habla de CoffeeScript. Sin embargo, CoffeeScript no admite nada como la function foo ()sintaxis, por lo que podemos decir que no tiene funciones "con nombre".

En cierto sentido, el nombre es parte de la definición de función en function foo() { ... }, donde en el otro caso simplemente crea una función y la asigna a una variable. Esto se refleja, por ejemplo, en la namepropiedad (no estándar) de las funciones: en el primer caso, foo.namele dará "foo"y en el segundo le dará "".

Además, en JavaScript, estos también difieren en términos de cómo se introducen en el alcance: la primera versión se "alza" y está disponible en todo su alcance donde la segunda definición solo está disponible después de que se asigna.

Básicamente, piense en ello como una jerga específica de JavaScript, que se transfiere a CoffeeScript porque CoffeeScript está muy relacionado con JS.

Tikhon Jelvis
fuente
1
Es cierto que no existe tal cosa como a function foo () {}. Sin embargo, aún puede inicializar una función con nombre a través de la classconstrucción. Solo que el CoffeeScript compilado (el JavaScript resultante) es mucho más detallado de cómo la mayoría escribiría una función con nombre.
Sal
1
Y también, hay una advertencia técnica: fooel cuerpo de su función no será izado.
Sal
1
jelivs: no hay problema. Una corrección del último comentario que escribí sobre su respuesta: el class foocuerpo de la función de su no se elevará a la parte superior del archivo.
Sal
Dado que CoffeeScript no hace la distinción entre funciones con nombre y anónimas, ¿podemos realmente decir que la terminología se transfiere a CoffeeScript? La distinción de Javascript simplemente no significa nada en ese idioma.
Winston Ewert
@ WinstonEwert: Importa porque CoffeeScript está muy cerca de JavaScript. Después de todo, la "regla de oro" es: "Es solo JavaScript" .
Tikhon Jelvis
5

Vale la pena señalar que el usuario declaró explícitamente que estaban convirtiendo una "función anónima en una función con nombre", ambos términos tienen un significado fuerte y existente y funcionalidades notablemente diferentes en el mundo de JavaScript. Dado el significado existente, no estaban haciendo tal cosa, y lo señalé.

CoffeeScript no está tan alejado de JavaScript que debería redefinir los términos que ambos comparten para que signifiquen algo más en un idioma. CoffeeScript no existe en alguna burbuja, eliminada de su implementación de JavaScript de la forma en que podría argumentar que C ++ está separado de Assembly. Conocer la diferencia entre una función anónima y una función con nombre es importante , porque si espera que su función CoffeeScript "con nombre" se comporte como una función con nombre real , se sentirá decepcionado:

doStuff() # I cause an error

# ... later

doStuff = (x,y) ->
  alert("Were I actually a named function, this would work!")

El JavaScript equivalente funcionaría bien, con una función real con nombre:

doStuff(); // I work just fine!

// later....

function doStuff() {
  alert("I'm a real named function!")
}

Puede que tengas razón en que solo estoy "molestando", pero ¿y qué? Los puntos sutiles en la programación de computadoras son importantes , y ser "técnicamente" correcto es importante. Es la diferencia entre escribir código que funciona y comprender realmente por qué su código es correcto .

usuario229044
fuente
1
Si probé su ejemplo en Python, por ejemplo, todavía no funcionaría. Por lo tanto, no estoy seguro de que tenga algo que ver con funciones con nombre o anónimas.
Winston Ewert
1
@ WinstonEwert Vea mi actualización. Python realmente no tiene nada que ver con eso ...
user229044
@meager, mi punto es que las funciones con nombre no necesariamente actúan de esa manera, aunque lo hacen en Javascript. Por lo tanto, la elevación en sí no descalifica las funciones de CoffeeScript para que no se consideren con nombre.
Winston Ewert
Sí, debe comprender que todas las funciones en CoffeeScript son anónimas (en realidad, preferiría decir que todas son expresiones de funciones). Pero eso no significa que no podamos ser un poco flojos con la terminología a veces. Es por eso que creo que es difícil insistir en que nunca se les puede llamar funciones con nombre.
Winston Ewert
3

¿Salgo a almorzar pensando que insistir en que esta no es una función nombrada es solo una tontería?

No. Después de todo, en términos de semántica, la referencia de su función se almacena en una variable, a la que puede hacer referencia mediante un nombre de variable .

Sal
fuente
3

Definitivamente no es ni un poco, imo. Lo uso ampliamente para facilitar la lectura:

readfile()
dothis()
dothat()
thistoo()
writefile()

function readfile() {
    ...
}
...

Así:

Función real nombrada en "coffeescript"

hello()

`function hello() {`
console.log 'hello'
dothings()
`}`

Escapa de JS puro a través de la tecla de retroceso `

Tenga en cuenta que no puede sangrar en el cuerpo de su función.

Salud

Zaid Daghestani
fuente
1

No pierdas el tiempo discutiendo con pedantes. Nunca es fructífero. Sí, todos saben lo que quiere decir con una "función con nombre" en CoffeeScript, incluso si es técnicamente incorrecto. No, el uso de una terminología técnicamente incorrecta pero ampliamente entendida no tiene relación con la corrección o incorrección de la solución propuesta. ¿Es posible ser más preciso sin ganar alguna torpeza de fraseo? Probablemente no. Sin embargo, eso no significa que las personas lo dejarán pasar. Solo imagina a este tipo al otro lado de la conversación.

La razón por la que es técnicamente incorrecto es porque no ha nombrado la función, ha nombrado una referencia a la función. Considerar:

foo = bar = ->
  console.log "What's my name?"

¿Cómo se llama la función? fooy barambos hacen referencia a la misma función, pero tienen nombres diferentes. Además, cualquiera fooo barpodría ser reasignado en cualquier momento para hacer referencia a una función diferente, o incluso a un tipo completamente diferente, sin cambiar la función en sí.

Karl Bielefeldt
fuente
0

Entonces, la forma en que leo esto es así:

Cuando declaras una función en una consola JavaScript usando

var foo = function() { ... }

y luego invocar foosin paréntesis, devuelve

function() { ... }

Sin embargo, si lo define usando

function foo() { ... }

y luego invocar de foonuevo sin paréntesis, devuelve

function foo() { ... }

En el primer caso, diría que está declarando una variable llamada "foo" que almacena una función anónima en ella. En el segundo caso, diría que en realidad estás declarando una función con nombre llamada "foo".

Debido a que CoffeeScript usa el primer patrón, estoy de acuerdo en que es técnicamente correcto que las funciones de CoffeeScript son todas funciones anónimas que se almacenan en variables con nombre.

Dylan Ribb
fuente