CoffeeScript et fonctions nommées

10

Ailleurs , un argument a surgi sur la terminologie d'une fonction nommée dans CoffeeScript. En particulier, quelqu'un a fait référence à quelque chose comme ceci:

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

comme fonction nommée. Mais son objecté que tout dans CoffeeScript est des fonctions anonymes et il n'y a pas de fonctions nommées. C'est certainement vrai, CoffeeScript n'a que des expressions de fonction qui peuvent ensuite être stockées dans une variable. Mais je ne pense pas que cela signifie qu'il est faux d'appeler cela une fonction nommée.

Selon moi, c'est une fonction nommée parce que c'est une fonction qui a reçu un nom. Certes, ce n'est pas une fonction nommée de la même manière que certains autres langages ont des fonctions nommées, mais je pense que c'est assez proche pour qu'il ne soit pas inapproprié de l'appeler une fonction nommée. Insister autrement semble juste être une tergiversation.

Suis-je en train de déjeuner en pensant qu'insister sur le fait que ce n'est pas une fonction nommée est juste une piqûre?

Winston Ewert
la source
3
N'est-ce pas toute cette question juste, eh bien, taquiner? :-)
Mat
@Mat, oui, il semble que je ne peux pas éviter de piqûre de nitpicking
Winston Ewert
Pour le petit groupe de programmeurs avec qui je parle (en dehors de programmers.SE c'est-à-dire), ils disent principalement d'utiliser les fonctions nommées de JavaScript pour les utiliser comme "classes" (constructeurs), tandis que les fonctions anonymes sont stockées dans des variables pour les anciennes fonctions simples.
Sal
1
"Juste tâtonner" implique que la réponse n'a pas d'importance, et que la compréhension des subtilités d'une langue n'est pas un objectif valable.
user229044
Je pourrais le regarder de manière analogue à CoffeeScript: foo = ->est juste une ancienne fonction, tout en class Fooétant un constructeur. Je ne vois aucune raison de foo = ->parler strictement d'anonyme.
Sal

Réponses:

20

CoffeeScript est inexorablement lié à JavaScript et JavaScript différencie les expressions suivantes:

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

En fait, vous pouvez même écrire:

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

Étant donné que cette différence est importante en JavaScript, il est logique d'utiliser les mêmes termes lorsque vous parlez de CoffeeScript. Cependant, CoffeeScript ne prend rien en charge comme la function foo ()syntaxe, nous pouvons donc dire qu'il n'a pas de fonctions "nommées".

Dans un sens, le nom fait partie de la définition de fonction dans le function foo() { ... }, où dans l'autre cas, vous créez simplement une fonction et l'assignez à une variable. Cela se reflète, par exemple, dans la namepropriété (non standard) des fonctions: dans le premier cas, foo.namevous donnera "foo"et dans le second, il vous donnera "".

De plus, en JavaScript, ceux-ci diffèrent également par la façon dont ils sont introduits dans la portée: la première version est "hissée" et disponible dans toute sa portée où la deuxième définition n'est disponible qu'après son affectation.

Fondamentalement, considérez-le comme un jargon spécifique à JavaScript, qui est transféré à CoffeeScript car CoffeeScript est si étroitement lié à JS.

Tikhon Jelvis
la source
1
C'est vrai qu'il n'y a rien de tel qu'un function foo () {}. Cependant, vous pouvez toujours initialiser une fonction nommée via la classconstruction. Juste que le CoffeeScript compilé (le JavaScript résultant) est beaucoup plus détaillé que la plupart des gens écrivent une fonction nommée.
Sal
1
Et aussi, il y a une mise en garde technique: foole corps de votre fonction ne sera pas hissé.
Sal
1
jelivs: pas de problème. Une correction du dernier commentaire que j'ai écrit sur votre réponse: le corps de votre class foofonction ne sera pas hissé en haut du fichier.
Sal
Puisque CoffeeScript ne fait pas la distinction entre les fonctions nommées et anonymes, peut-on vraiment dire que la terminologie est transférée vers CoffeeScript? La distinction de Javascript ne signifie tout simplement rien dans cette langue.
Winston Ewert
@WinstonEwert: C'est important parce que CoffeeScript est si proche de JavaScript. Après tout, la "règle d'or" est: "C'est juste du JavaScript" .
Tikhon Jelvis
5

Il convient de noter que l'utilisateur a explicitement déclaré qu'il transformait une "fonction anonyme en une fonction nommée", les deux termes ayant une signification forte et existante et notamment des fonctionnalités différentes dans le monde JavaScript. Étant donné le sens existant, ils ne faisaient rien de tel, et je l'ai souligné.

CoffeeScript n'est pas si éloigné de JavaScript que vous devriez redéfinir les termes qu'ils partagent pour signifier autre chose dans une langue. CoffeeScript n'existe pas dans certaines bulles, supprimé de son implémentation JavaScript de la façon dont vous pourriez affirmer que C ++ est séparé de Assembly. Connaître la différence entre une fonction anonyme et une fonction nommée questions , parce que si vous attendez votre « nommé » fonction CoffeeScript à se comporter comme une réelle fonction nommée, vous allez être déçu:

doStuff() # I cause an error

# ... later

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

Le JavaScript équivalent fonctionnerait bien, avec une vraie fonction nommée:

doStuff(); // I work just fine!

// later....

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

Vous avez peut-être raison de dire que je ne fais que "taquiner", mais alors quoi? Les points subtils en matière de programmation informatique et le fait d'être "techniquement" correct sont importants. C'est la différence entre écrire du code qui fonctionne et comprendre pourquoi votre code est correct .

user229044
la source
1
Si j'ai essayé votre exemple en Python, par exemple, cela ne fonctionnerait toujours pas. Je ne suis donc pas sûr que cela ait quoi que ce soit à voir avec les fonctions nommées et anonymes.
Winston Ewert
1
@WinstonEwert Voir ma mise à jour. Python n'a vraiment rien à voir avec ça ...
user229044
@meager, mon point est que les fonctions nommées n'agissent pas nécessairement de cette façon, bien qu'elles le fassent en Javascript. Par conséquent, le levage lui-même ne disqualifie pas les fonctions de CoffeeScript d'être considérées comme nommées.
Winston Ewert
Oui, vous devez comprendre que toutes les fonctions de CoffeeScript sont anonymes (en fait, je préférerais dire que ce sont toutes des expressions de fonction). Mais cela ne signifie pas que nous ne pouvons pas être un peu lâches avec la terminologie parfois. C'est pourquoi je pense qu'il est insensé d'insister sur le fait que vous ne pouvez jamais les appeler des fonctions nommées.
Winston Ewert
3

Suis-je en train de déjeuner en pensant qu'insister sur le fait que ce n'est pas une fonction nommée est juste une piqûre?

Non . Après tout, en termes de sémantique, votre référence de fonction est stockée dans une variable, vous pouvez consulter via une variable nom .

Sal
la source
3

Certainement pas un nitpick, imo. Je l'utilise largement pour la lisibilité:

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

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

Donc:

Véritable fonction nommée dans "coffeescript"

hello()

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

Vous échappez pur JS via le backtick `

Notez que vous ne pouvez pas indenter votre corps de fonction.

À votre santé

Zaid Daghestani
la source
1

Ne perdez pas de temps à vous disputer avec les pédants. Ce n'est jamais fructueux. Oui, tout le monde sait ce que vous entendez par "fonction nommée" dans CoffeeScript, même si elle est techniquement incorrecte. Non, l'utilisation d'une terminologie techniquement incorrecte mais largement comprise n'a aucune incidence sur l'exactitude ou l'inexactitude de la solution proposée. Peut-on être plus précis sans gagner en maladresse de phrasé? Probablement pas. Cependant, cela ne signifie pas que les gens le laisseront glisser. Imaginez ce type à l'autre bout de la conversation.

La raison pour laquelle elle est techniquement incorrecte est que vous n'avez pas nommé la fonction, vous avez nommé une référence à la fonction. Considérer:

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

Quel est le nom de la fonction? fooet barfont tous deux référence à la même fonction, mais ont des noms différents. De plus, soit fooou barpourrait être réaffecté à tout moment pour référencer une fonction différente, ou même un type complètement différent, sans changer la fonction elle-même.

Karl Bielefeldt
la source
0

Donc, la façon dont je lis ceci est comme ceci:

Lorsque vous déclarez une fonction dans une console JavaScript à l'aide de

var foo = function() { ... }

puis invoquer foosans parenthèses, il renvoie

function() { ... }

Cependant, si vous le définissez en utilisant

function foo() { ... }

puis invoquer à foonouveau sans parenthèses, il renvoie

function foo() { ... }

Dans le premier cas, je dirais que vous déclarez une variable nommée "foo" en y stockant une fonction anonyme. Dans le deuxième cas, je dirais que vous déclarez en fait une fonction nommée appelée "foo".

Étant donné que CoffeeScript utilise le premier modèle, je conviens qu'il est techniquement correct que les fonctions de CoffeeScript sont toutes des fonctions anonymes stockées dans des variables nommées.

Dylan Ribb
la source