Golo et Swift, étude comparée
Introduction
Le 2 juin 2014, lors de la keynote de la WWDC d’Apple, un nouveau langage pour créer des applications iOS, OSX, appelé Swift a été présenté. Il rappelle beaucoup Groovy (voir le comparatif Groovy versus Swift: http://glaforge.appspot.com/article/apple-s-swift-programming-language-inspired-by-groovy par Guillaume Laforge).
Golo (non typé) n’a certainement pas inspiré Swift (typé), mais je retrouve quelques aspects fonctionnels similaire. Voyons de quelle manière à travers quelques exemples de codes comparés.
Pour ceux qui ne connaissent pas Golo, c’est un langage dynamique pour la JVM. Plus d’informations ici: http://golo-lang.org/.
Fonctions
Une fonction qui ne retourne rien (void)
Swift:
Golo:
ou:
Une fonction qui retourne quelque chose
Swift:
Golo:
ou:
Nested functions (ou Closures ?)
Les “nested functions” sont des définitions de fonctions à l’intérieur de fonctions, ce qui signifie qu’elles ne sont accessibles qu’à l’intérieur de la fonction qui les contient.
Exemple simple
Swift:
Golo:
Mais une fonction peut aussi retourner une fonction.
Une fonction qui retourne une fonction
Swift:
Et cette fois ci l’appel de notre méthode hola
se fera de la façon suivante:
Golo:
ou
Qui sera aussi appelé de cette manière:
Une fonction comme paramètre
Swift:
Golo:
puis:
“Closures Expressions”
Selon Apple, une “Closure Expression” est un moyen “synthétique” pour écrire/définir une closure. C’est plus simplement ce qui va nous permettre de “simplifier” notre exemple précédent en définissant “inline” le paramètre endMessage
sans passer par la fonction intermédiaire message
de la façon suivante:
Swift:
Golo:
Lire les “Closures en Golo” : http://golo-lang.org/documentation/next/# _closures.
Un peu plus loin, avec les extensions
Les “extensions” dans Swift permettent d’ajouter des fonctionnalités (méthodes) à des types (Classes, Structures …), ce qui permet “d’augmenter” le langage lui même en alliant les “extensions” aux “closures expressions” et aux “generics”.
En Golo on parle des “augmentations” (le principe est le même).
Méthode first()
Il n’y a pas de méthode first
sur le type Array
. Qu’à cela ne tienne, il suffit d’écrire ceci:
Swift:
Et villes.first()
retournera Lyon
, et c’est plus “joli” (question de point de vue) que villes[0].
Golo:
et on l’utilise comme ceci:
Méthode each()
En Swift pour parcourir un tableau, il faut écrire ceci:
Je souhaite avoir une méthode each
pour le type Array
, je vais donc modifier mon extension Array
:
Et maintenant, je peux écrire ceci:
L’inférence de Swift me permet même d’écrire ceci:
Golo:
En Golo cette augmentation existe déjà:
Les classes
La définition d’une classe en Swift reste somme toute très classique:
En Golo:, il n’y a pas de classe ni d’interface, mais il existe les DynamicObjects qui couplés à une fonction comme constructeur peuvent “faire office de classe”:
Remarque: En Swift comme en Golo il n’y a pas le concept de variable privée (sauf un cas particulier en Golo), il faut donc encapsuler les Classes dans des fonctions pour Swift, et les DynamicObjects dans des fonctions pour Golo.
Propriétés
Avec Swift, comme en Objective-C, le concept de propriétés existe et notamment celui de Computed Properties (pour remplacer les getters et les setters):
En Golo, de fait, les membres d’un DynamicObject qui ne sont pas des méthodes sont des propriétés (des getters et setters):
Héritage
En ce qui concerne l’héritage, en Swift il suffit de déclarer juste après le nom de la classe le type (la classe) dont elle hérite:
En Golo:, nous n’avons pas de classe mais nous pouvons “faire des mixins” de DynamicObject() :
Les Structures
En plus des classes, Swift propose les structures. La déclaration se fait de la même manière que les classes, une structure peut implémenter un protocole (interface), être étendue par une extension, par contre elle ne peut hériter. Mais le plus important c’est que les classes sont des types par référence et les structures des types par valeur:
Donald.hello()
retournera toujours Hello, i'm Donald Duck
. Daffy
est une copie de Donald
et donc devient indépendant de Donald
. Vous pouvez notez que les structures disposent d’un constructeur par défaut que nous ne sommes pas obligés de définir.
En Golo:, il existe aussi des structures qui ne contiennent pas de méthode dans leur définition, mais qui peuvent être augmentées. Elles disposent aussi d’un constructeur par défaut. Mais attention, les structures Golo, à la différence de Swift, sont des types par référence, il faudra donc utiliser la méthode copy()
des structures Golo pour faire une copie “par valeur”:
Remarque: on peut avoir des membres privés dans les structures en préfixant les noms des membres par _
, ils deviendrons ainsi inaccessibles. Cf. http://golo-lang.org/documentation/next/# _private_members
Conclusion
Il y a quand même une distance entre les 2 langages qui n’ont pas la même vocation. Cependant le côté fonctionnel des 2 me permet de calquer ma logique de programmation dans les 2.
Tweet