Aller au menu - Aller au contenu

Le langage Scala et son framework web Lift gagnent une version !

Revenir à la liste des news
Participer à la discussion

Image

Informations

Contributeur(s) : Einstein++, neowillow et spider-mario
Publié : le 21/07/2010 à 10:28:56
Catégorie : Programmation
Visualisations : 9 011

Licence : Creative Commons BY SA

Le langage Scala et son framework web Lift gagnent une [...]

Après plusieurs mois d'attente, Scala 2.8 débarque ! Cette toute nouvelle version de Scala comporte comme d'habitude un grand nombre de corrections de bugs ainsi qu'une quantité impressionnante de nouvelles fonctionnalités par rapport à la 2.7.7. Le framework Lift, conçu pour Scala, a lui aussi été récemment mis à jour.

Scala en quelques mots


Image utilisateur
Scala est un langage de programmation moderne et puissant, qui s'appuie sur la JVM et permet ainsi d'être entièrement compatible avec tout programme Java déjà écrit. C'est un langage orienté objet qui possède également de nombreux traits issus des langages fonctionnels et concurrents (utilisant des acteurs). Son nom est la concaténation des deux mots anglais "Scalable" et "Language" qui désignent sa capacité à s'adapter aux contraintes d'utilisation. Il a été conçu pour être utilisé sur tous les types de projets, allant des petits scripts aux grands logiciels commerciaux.

Son créateur, Martin Odersky, est un professeur de programmation et chercheur à l'EPFL. Il a commencé le développement de Scala en 2001 mais il n'a publié la première version que vers la fin de 2003. Parmi les utilisateurs célèbres de Scala on peut citer LinkedIn, Sony Pictures, Siemens, ebay et le réseau social Twitter, initialement conçu en Ruby, qui a migré vers Scala afin d'améliorer ses performances.

Scala est également fortement typé, ce qui signifie que les vérifications de la cohérence des types sont strictes : par exemple, il n'est pas possible, contrairement à ce que permet PHP, d'utiliser un entier au lieu d'une chaîne de caractères ; il est nécessaire d'effectuer explicitement une conversion. Cette rigueur a été mise en place afin d'éviter de passer sous silence des erreurs importantes dans la conception des programmes. Il est, de plus, statiquement typé : ces vérifications sont effectuées à la compilation et non à l'exécution. Ainsi, si un programme Scala compile, le programmeur est sûr qu'il ne commettra pas d'erreur de type à l'exécution.

Cependant, cela n'implique pas que le type des variables doit être systématiquement explicitement indiqué par le programmeur : le langage profite, en effet, d'un système appelé « inférence de types », ce qui signifie que le compilateur déduit le type des variables de leur contexte d'utilisation.

Scala possède d'autres fonctionnalités modernes, comme le filtrage des motifs, les fonctions anonymes (connues sous le nom de fonctions lambda dans d'autres langages), les conversions implicites de classes (un équivalent plus fiable du monkey patching de Ruby), son support natif d'XML et son système de types bien évolué.

Voici l'algorithme (récursif) du tri rapide d'une liste implémenté en Scala grâce à un filtrage de motif :
Code : Scala
1
2
3
4
5
def triRapide(l:List[Int]): List[Int] = l match{ 
      case Nil => Nil
      case (x :: xs) => val (l1, l2) = xs.partition(_ < x)
                         triRapide(l1) ::: x :: triRapide(l2)
}

Un exemple d'utilisation de l'XML dans le langage :
Code : Scala
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// on met les balises XML dans une variable nommée html
val html =
    <html>
      <head>
        <title>Bienvenue sur le SDZ !</title>
      </head>
      <body>
        <p>Vous devez vous connecter pour acceder au contenu de cette page</p>
      </body>
    </html>
  
  // et on peut facilement chercher des balises
  html \\ "head" //renvoie <head><title>Bienvenue sur le SDZ !</title></head>
  html \\ "p"   //renvoie <p>Vous devez [...] de cette page</p>

Et enfin une méthode qui calcule la somme des éléments d'une liste :
Code : Scala
1
def somme(l: List[Int]) = l reduceLeft (_ + _)


Cette notation, très concise, est très courante en programmation fonctionnelle. Le symbole _ correspond en fait à une fonction anonyme, qui sera appliquée à toute la liste par reduceLeft.

Scala 2.8, les nouveautés


La version 2.8 de Scala a vu le jour le 14 juillet en apportant au langage des ajouts et changements plus ou moins importants.

Nouvelle API de collections


L'organisation des « collections » de Scala (les classes servant de conteneurs, comme les vecteurs ou les listes) a été revue dans cette nouvelle version. Elles sont désormais rangées dans le module scala.collection

Celui-ci est lui-même découpé en plusieurs catégories :
  • Mutable, qui contient les collections susceptibles d'être modifiées ;
  • Immutable, pour celles qui ne peuvent pas être modifiées (il faut alors en créer une copie à chaque modification), ce qui permet de les partager entre plusieurs acteurs ;
  • Puis enfin, la catégorie generic qui contient des outils pour faciliter l'implémentation de nouvelles collections.


Les différentes collections peuvent posséder certains comportements (définis par ce qu'on appelle des traits) qui précisent la façon dont on les utilise. Par exemple, l'un des principaux traits est Traversable : celui-ci indique que la collection peut être parcourue à l'aide d'une méthode foreach qu'elle implémente. Elle est alors éventuellement infinie. Mais certaines collections héritant de ce trait peuvent implémenter d'autres traits, comme Seq (qui représente les séquences). Celles-ci sont alors obligatoirement finies, et possèdent une méthode length pour les mesurer. Et ainsi de suite…

Spécialisation des types


Scala se basant sur la JVM, il doit, à la compilation, faire la différence entre les types dits « primitifs » comme les entiers ou les nombres décimaux, et les véritables objets. Ceci pose un problème quand on veut utiliser des types conteneurs, car ils ne peuvent contenir que des objets, et pas de types primitifs.

Le compilateur réalise alors un auto-boxing, en stockant ces valeurs primitives dans des objets créés pour l'occasion (les enveloppeurs, wrappers en anglais). Mais cette façon de faire a un coût : la création des objets en question.

Dans Scala 2.8, l'annotation @specialized a été introduite, qui permet, lors de la définition d'une classe, de préciser au compilateur qu'il peut générer plusieurs classes à la compilation, dont certaines seront plus adaptées aux types primitifs, et d'autres aux objets :

Code : Scala
1
2
3
class MyCollection[@specialized A] {
   def simplyReturn(x: A) = x 
}


Cette fonctionnalité a également été introduite dans un certain nombre de classes prédéfinies.

Arguments nommés et arguments par défaut


Beaucoup de langages autorisent la définition de valeurs par défaut pour les arguments, ce qui permet de ne pas les préciser lors de l'appel d'une méthode, ainsi que de préciser leur nom à l'appel (en ignorant l'ordre dans lequel ils ont été définis). Scala permettait jusqu'à présent la surcharge des méthodes selon leur nombre d'opérateurs, ce qui permettait de remplacer cette fonctionnalité.

Cependant, elle a été ajoutée à la version 2.8 du langage pour des raisons de commodité. Il est par exemple possible de faire (ici, dans la console Scala, qui permet d'entrer du code ligne par ligne) :

Code : Console
scala> def f(a: Int = 10, b: String) = println("a: " + a, "b: " + b)
 f: (a: Int, b: String)Unit
scala> f(b = "Yo") 
(a: 10, b: Yo)


Nouveau compilateur


Parmi toutes ces nouveautés, le compilateur a eu le droit lui aussi à quelques changements. Sa vitesse a en effet été améliorée d'environ 50 %. De manière générale, les développeurs de Scala ont voulu rendre le compilateur utilisable par d'autres programmes, comme des IDE, pour tester rapidement (pendant l'édition) le programme : par exemple, que sa syntaxe est correcte.

Le greffon pour l'IDE Eclipse a été amélioré pour tirer parti de ce nouveau compilateur. Le REPL, sorte de ligne de commande permettant de tester du code Scala ligne par ligne, a été revu et permet l'auto-complétion, la navigation dans l'historique des commandes, et peut être utilisé pour le débuggage, en étant lancé depuis un point arbitrairement choisi d'un programme. Enfin, le compilateur sait maintenant gérer les continuations.

Swing


La bibliothèque graphique de Scala a eu son lot de changements aussi. On note surtout l'ajout du support des événements de la souris et des claviers, l'ajout de quelques nouveaux composants ainsi que l'amélioration de la documentation sur le sujet.
Swing est en fait un wrapper pour la bibliothèque du langage Java qui porte le même nom, mais Scala profite des diverses fonctionnalités qu'il offre (notamment le filtrage des motifs) pour faciliter l'utilisation de ce framework géant, surtout en ce qui concerne la gestion des événements qui est devenue un jeu d'enfants :
Code : Scala
1
2
3
4
5
reactions += {
  case ButtonClicked(b)       =>  //
  case KeyPressed(a, b, c, d) =>  //
  case MouseMoved(a, b, c)    =>  //
}


Le framework Lift


Image utilisateur
Lift est un framework web destiné à être utilisé avec le langage Scala et la machine virtuelle Java. Il consiste en un ensemble de composants facilitant le développement de sites et applications web. Il existe beaucoup de frameworks web, comme Django ou Ruby on Rails, mais l'équipe de Lift met en avant plusieurs atouts, parmi lesquels :

  • Un déploiement vers les conteneurs d'application JEE les plus répandus, voir à ce sujet le tutoriel du site ;
  • puisque les sites et applications Web développés avec Lift tournent sur la JVM, ils bénéficient de ses performances et de son extensibilité (scalability en anglais)
  • le typage de Scala et sa nature fonctionnelle permettent d'obtenir des applications fiables, avec lesquelles le risque de bugs est peu élevé, les incohérences de type et certains effets de bord non voulus étant évités à la compilation
  • Lift permet une utilisation transparente de AJAX et de Comet (où, au lieu de l'approche traditionnelle où le client demande des données au serveur, c'est le serveur qui informe le client que des données sont disponibles), de même que le framework web Nitrogen.


Lift s'appuie donc sur Scala pour faire des applications web riches (du même genre que celles pour lesquelles Ruby on Rails est utilisé), tout en assurant de meilleures performances et une plus grande fiabilité.

Lift 2.0


Le 30 juin, une deuxième version majeure du framework a été annoncée. Elle comporte plusieurs améliorations mineures, comme de meilleures performances ou des messages d'erreur plus clairs. De plus, le framework supporte maintenant nativement les bases de données NoSQL MongoDB et CouchDB, ainsi que des services clefs pour les entreprises comme LDAP ou JTA.

De plus, le support de REST a été amélioré, ainsi que celui de JSON (une représentation textuelle des objets JavaScript), ce qui permet non seulement de convertir facilement des objets Scala vers JSON et inversement, mais également de réutiliser le langage spécialisé pour JSON comme langage de requêtes avec les deux bases de données mentionnées précédemment. Par exemple, on peut écrire Person.findAll(("name" -> "joe") ~ ("age" -> 27)) pour effectuer une requête dans la base de données.

Enfin, un nouveau mécanisme de communication avec l'utilisateur a été rajouté : les screens et les wizards. Ceux-ci permettent une approche plus déclarative et proche de la programmation fonctionnelle, et permettent non seulement de faire abstraction de la présentation (vue) et de l'état (modèle) de la communication avec l'utilisateur. Le code est écrit de la façon suivante :

Code : Scala
1
2
3
4
5
6
object DemanderParfum extends LiftScreen {
  val gout = field(S ? "Quel est votre parfum de glace préféré", "")
  def finish() {
    S.notice("Moi aussi j'aime les glaces au "+gout.is+" !")
  }
}


et peut alors être utilisé dans les templates de Lift par la simple balise <lift:DemanderParfum/>, ou testé en local (sans serveur web). Mais il est également possible de s'assurer que l'entrée de l'utilisateur vérifie certaines conditions, en les rajoutant dans la méthode field :

Code : Scala
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
object DemanderParfum extends LiftScreen {
  val gout = field(S ? "Quel est votre parfum de glace préféré", "",
                     trim, 
                     valMinLen(2, "Le nom est trop court"),
                     valMaxLen(40, "Le nom est trop long"))

  def finish() {
    S.notice("Moi aussi j'aime les glaces au "+gout.is+" !")
  }
}


Beaucoup d'autres fonctionnalités sont disponibles, mais cet éventail suffit à montrer que Lift, comme Scala, est à la recherche d'idées nouvelles pour le web, qui peuvent conduire à une plus grande concision du code, donc à plus de simplicité, sans pour autant sacrifier les performances.

Liens utiles


53 Participations

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1  2  Suivante
Pseudo Discussion
1 visiteur sur cette news (0 membre et 1 Anonyme)
Page 1  2  Suivante
Hors ligne Oneil67 # Posté le 21/07/2010 à 10:34:17
Il faut croire en l'impossible
Avatar

Ville : Selestat
Pays : France métropolitaine
Études : IUT Strasbourg-Sud

Très bonne news, très complette et de qualité sur Scala et Lift :)
Félicitation aux contributeurs :)


EDIT : Prem's! Ben ça vaut le coup de sortir son iPhone pour aller sur le SdZ pendant les pauses au boulo! :-p


Image utilisateur
Image utilisateur
 
Hors ligne neowillow # Posté le 21/07/2010 à 10:36:49
(/◔ ◡ ◔)/
Avatar
Groupe : Anciens

La rédaction de cette news m'a donné envie d'apprendre le Scala.
Bonne lecture. :-°

#LGDF: victor vaincra !
« Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi »
Statistiques mondiales en temps réel. - FAQ C - The C LRG - FAQ Java - Python - OCaml - quoi.info - La France vue par différentes populations




 
Hors ligne anonyme # Posté le 21/07/2010 à 10:37:54

Neowillow> Ça tombe bien, un tutoriel ne devrait pas trop tarder ;) .
Hors ligne L1ne # Posté le 21/07/2010 à 10:54:38
drone1lp.wav
Avatar
Validateurs

Encore un autre langage de programmation ! J'en apprends chaque jours.

Sinon très bonne news !

Créateur du logiciel Easy Create Card 3.0.
Développeur C#, VB.NET.
 
Hors ligne dodelria # Posté le 21/07/2010 à 11:09:21

Très bonne news. Merci !
Hors ligne Edmeral # Posté le 21/07/2010 à 11:16:56
Ulquiorra ♥ Ubuntu !
Avatar

Ville : Meknès
Pays : Maroc

Intéressant comme langage ;)
mais la news est un peu longue...



 
Hors ligne bluestorm # Posté le 21/07/2010 à 11:25:19
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

La news est très intéressante.

Il y a quelques détails dans la présentation de Scala qui m'ont fait tiquer. À mon humble le paragraphe qui cite PHP n'est pas formidable : il utilise implicitement une définition un peu vaporeuse de "typage fort", en critiquant les conversions implicites de PHP (qui sont compatibles avec le typage comme l'a déjà dit Yondaime/`Haku).. avant de présenter les conversions implicites de Scala !

Je trouve l'idée des conversions implicites intéressantes, mais je pense que ça reste une fonctionnalité problématique si on ne s'impose pas une discipline d'utilisation stricte. D'ailleurs, le contenu du billet du blog donné en lien me paraît parfois discutable (même si venant d'un rubiste repenti c'est assez normal et ce n'est pas un drame), et contient un exemple exécrable : la conversion d'une chaîne en entier en comptant les caractères.
C'est le même problème que les type classes que Haskell : qui dit "implicite" dit global et non modulaire, et pour éviter les ambiguités on se retrouve à reposer sur le parfum "nominal" du système (il y a déjà une conversion implicite String->Int définie ? Je crée une classe MyStringCountedByWords !).

PS : désolé de ne pas avoir pu faire remonter ces remarques avant (la news est une news communautaire, et chacun pouvait donc participer à son élaboration); je comptais prendre le temps de la relire sérieusement mais j'ai été pris de court par une publication plus vite que je ne le pensais.
 
Hors ligne Marg51 # Posté le 21/07/2010 à 11:29:36

Avatar

Ville : Saint pierre de boeuf
Pays : France métropolitaine

Très intéressante news !

Citation : iPoulet
Neowillow> Ça tombe bien, un tutoriel ne devrait pas trop tarder ;) .

Et très intéressante nouvelle :p

user powered by Image utilisateur
 
Hors ligne MisterDo # Posté le 21/07/2010 à 11:39:20
\_/O<
Avatar

Sympa la news, la Scala License m'a l'air libre : http://www.scala-lang.org/node/146 (type BSD).

PS : Le lien "Signaler une erreur" me renvoit une page blanche (flemme d'ouvrir un bug), donc il y a un "c" qui traîne tout en bas de la news.
 
Hors ligne planete.game57 # Posté le 21/07/2010 à 11:52:04
Avatar

Études : IRIS

Je ne savais même pas que ça existait. :o

Merci pour cette news très complète qui m'a permis de découvrir ce langage.

xHTML/CSS |||||||||| 100% | PHP/MySQL |||||||||| 100% | Langage C |||||||||| 8.5%
Python |||||||||| 100% | JavaScript |||||||||| 5.5% | Photoshop |||||||||| 0.0%
Smarty |||||||||| 100%

Image utilisateurImage utilisateur
 
Hors ligne anonyme # Posté le 21/07/2010 à 12:27:17

Citation : bluestorm
La news est très intéressante.

Il y a quelques détails dans la présentation de Scala qui m'ont fait tiquer. À mon humble le paragraphe qui cite PHP n'est pas formidable : il utilise implicitement une définition un peu vaporeuse de "typage fort", en critiquant les conversions implicites de PHP (qui sont compatibles avec le typage comme l'a déjà dit Yondaime/`Haku).. avant de présenter les conversions implicites de Scala !


C'est effectivement tiquant comme détail. On en est arrivé là quand j'ai fusionné un vieux début de news de spider-mario avec ce que Einstein++ avait déjà écrit, et je n'ai pas trouvé de solution pour reformuler ça correctement :( . Il faudrait trouver un autre nom pour cette fonctionnalité en français.

Bref, je voulais justement ton avis à ce sujet : je trouve que, comme pour le monkey patching, le problème de la portée se pose. On risque de définir une méthode supplémentaire pour une classe de base dans deux fichiers différents et d'arriver un jour ou l'autre à un conflit, ou à s'étonner de son absence etc. Est-ce qu'une information supplémentaire de portée rendrait la chose plus acceptable selon toi ? Par exemple de définir la méthode au début d'un module, et de ne pouvoir l'utiliser que dans ce module (ou dans ceux où c'est explicitement définit) ?

Edmeral> Les news longues donnent plus d'informations, mais tu n'es naturellement pas obligé de tout lire. Un article (technique, de journal, de blog ou autre) se lit rarement de façon linéaire : il faut le parcourir, regarder sa structure et voir ce qu'il contient d'intéressant. Tu n'es pas le premier à faire ce genre de remarque, j'ai déjà remarqué que les Zéros avaient du mal à aller chercher les informations pertinentes dans un texte s'il dépassait une certaine longueur.
Hors ligne moymoy # Posté le 21/07/2010 à 12:27:20

intéressant, je crois que je vais regarder de plus prés :)

Le tout est plus grand que la somme des parties
 
Hors ligne bluestorm # Posté le 21/07/2010 à 13:40:47
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Citation : iPoulet
Bref, je voulais justement ton avis à ce sujet : je trouve que, comme pour le monkey patching, le problème de la portée se pose. On risque de définir une méthode supplémentaire pour une classe de base dans deux fichiers différents et d'arriver un jour ou l'autre à un conflit, ou à s'étonner de son absence etc. Est-ce qu'une information supplémentaire de portée rendrait la chose plus acceptable selon toi ? Par exemple de définir la méthode au début d'un module, et de ne pouvoir l'utiliser que dans ce module (ou dans ceux où c'est explicitement définit) ?


Dans Scala, la question de la portée est déjà prise en compte et c'est plutôt bien fait. Il me semble (mais je connais malheureusement assez mal Scala) que la conversion implicite ne peut se produire que si la fonction de conversion est présente dans l'environnement actuel (donc a été importée).
 
Hors ligne Mow # Posté le 21/07/2010 à 17:53:40
La vie sans compromis.
Avatar
Flux RSS

Ville : Grenoble
Pays : France métropolitaine

Je ne connaissait pas ce langage.

merci pour la news
 
Hors ligne SoftDeath # Posté le 21/07/2010 à 18:40:01
ben...euh...j'sais plus :s
Avatar

Ville : Toulouse
Pays : France métropolitaine
Études : Université Paul Sabatier Toulouse

Salut,
Je n'aime pas trop cette syntaxe, je préfère de loin coder avec mon bon vieux langage Java ^^ (N°1 aux USA+Développeurs Java les plus demandés :-° )

Découvrez Krama, un framework JEE/Ajax, entièrement open source !
Image utilisateur
 
Hors ligne anonyme # Posté le 21/07/2010 à 18:51:53

Parle-nous du pattern strategy s'il te plaît.
Hors ligne Einstein++ # Posté le 21/07/2010 à 19:44:48
It's not a bug, it's a feature
Avatar

Études : TELECOM SudParis

Citation : bluestorm
Dans Scala, la question de la portée est déjà prise en compte et c'est plutôt bien fait. Il me semble (mais je connais malheureusement assez mal Scala) que la conversion implicite ne peut se produire que si la fonction de conversion est présente dans l'environnement actuel (donc a été importée).

+1

On peut aussi interdire les conversions implicites avec une option du compilateur

Citation : SoftDeath
Je n'aime pas trop cette syntaxe, je préfère de loin coder avec mon bon vieux langage Java ^^

J'avoue que c'était mon avis aussi lors de mes débuts en Scala mais la puissance et l'élégance du langage (par rapport à Java) m'ont poussé à m'habituer à (et aimer) la syntaxe de Scala (il y aura un chapitre dans le tuto qui te convaincra de l'essayer ;) (ou pas)).
 
Hors ligne thebigbost # Posté le 22/07/2010 à 02:29:19

Il y a tant de choses à apprendre ....
Encore un langage inconnu et complet :D
Hors ligne anonyme # Posté le 22/07/2010 à 09:15:36

iPoulet : Tu ne veux pas plutôt dire AbstractStrategyFactoryFactorySingletonDecoratedProxyDAOManager ?

Sinon ça a l'air intéressant Scala, je pense que je vais y jeter un coup d'œil. Sinon, est-ce possible de définir un trait sur une classe dont on n'est pas l'auteur (pour faire comme les classes de type en Haskell, en fait). Ça m'étonnerait, mais on ne sait jamais.
Hors ligne gaetan.tux # Posté le 22/07/2010 à 11:49:32
! ARG !

Super news o_O Je vais faire du scala, ça m'a l'air assez énorme.

Doudidoupipouloupouloupouuuuuu ! yeah !
 
Hors ligne Einstein++ # Posté le 22/07/2010 à 13:44:45
It's not a bug, it's a feature
Avatar

Études : TELECOM SudParis

Citation : Xarch
Sinon, est-ce possible de définir un trait sur une classe dont on est pas l'auteur (pour faire comme les classes de type en Haskell, en fait). Ça m'étonnerait, mais on ne sait jamais.

Oui! Avec les conversions implicites on peut ajouter des méthodes/attributs à toute classe existante (par exemple ajouter isPrime à la classe prédéfinie Int) :magicien:

Et je veux juste ajouter que Scala possède d'autres fonctionnalités très intéressantes (on ne peut pas tout mettre dans une news) :
  • DSL
  • Actors
  • Parsers
  • Généricité avec différents types de variance
  • Évaluation paresseuse
  • Structures de données paresseuses et infinies
  • ...
 
Hors ligne anonyme # Posté le 22/07/2010 à 14:17:22

Hum désolé, j'ai appuyé sur le mauvais bouton. :-'
Hors ligne guigui78580 # Posté le 22/07/2010 à 19:28:08
Avatar

Ville : Le kremlin bicêtre
Pays : France métropolitaine
Études : EPITA

J'ai pas lu la news en entier (honte sur moi je sais, mais je suis fatigué) mais ça m'a l'air de ressembler fortement à de l'OCaml, nan ?

Image utilisateur
 
Hors ligne PainKetchup # Posté le 22/07/2010 à 19:34:01
Diversification !
Avatar
Validateurs

guigui78580 > Tu peux effectivement y voir de légères ressemblances comme son paradigme fonctionnel, son typage ou encore le filtrage de motifs mais ça n'y ressemble pas fortement.

Aimez-vous Erlang ? Ou bien Haskell ? Sinon, vous trouverez sûrement votre bonheur ici.
Exemple pragmatique de Programmation Fonctionnelle.

 
Hors ligne infernalaura # Posté le 22/07/2010 à 20:02:14
Avatar

Salut tous le monde,

juste pour les gens intéressés a Scala aller voir ce produit il est nouveau mais il est très bien fais. :D

Voici le lien Squeryl

Donnez moi des nouvelles sur ca ;)
Hors ligne gnomnain # Posté le 22/07/2010 à 20:25:39
Blblbl !
Avatar
Groupe : Anciens

Citation : Einstein++

Et je veux juste ajouter que Scala possède d'autres fonctionnalités très intéressantes (on ne peut pas tout mettre dans une news) :
  • DSL


Ah, ça ça m'intéresse. Tu peux me dire ce qu'il y a en Scala qui facilite l'écriture de DSL ?

(Sinon, j'ai un tout petit peu regardé Squeryl, et ça a l'air intéressant)

Image utilisateur
Haskell - Learn You a Haskell - Real World Haskell - xmonad - OCaml
Apprenez Haskell ! - #ircduzero
<colbseton> Serialk: tu cherches vraiment des liens logiques dans tout ce que je raconte ?
 
Hors ligne Einstein++ # Posté le 22/07/2010 à 20:45:04
It's not a bug, it's a feature
Avatar

Études : TELECOM SudParis

Citation : gnomnain
Ah, ça ça m'intéresse. Tu peux me dire ce qu'il y a en Scala qui facilite l'écriture de DSL ?

D'abord il y a la notation infixe pour les méthodes à un seul argument: o1.methode(o2) est équivalent à o1 méthode o2 .
Ensuite, on peut donner des noms exotiques aux méthodes : ::,:-: et *=* sont des identificateurs valides. Ce qui donne, avec la notation infixe : o1 :-: o2
Aussi, pour les méthodes qui prennent un seul argument, on peut remplacer les parenthèses par des accolades (meme si la méthode prend plusieurs arguments on peut utiliser la curryfication).
Voici par exemple un while récursif :
Code : Scala
1
2
3
4
5
6
def myWhile(cond: => Boolean)(exp: => Unit): Unit = {
  if(cond) {
    exp
    myWhile(cond)(exp)
  }
}

On peut l'utiliser identiquement au while prédéfini :
Code : Scala
1
2
3
4
5
var i = 0
myWhile(i < 5) {
  println(i)
  i += 1
}


Parmi les DSL du langage on peut noter celui des Actors :
Code : Scala
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//syntaxe proche de celle d'Erlang
def act() {  
    loop {  
      recieve {  
        case (core, charger, NewFun) =>  //...

        case Quit =>  //...

        case Else =>  //...  
      }  
    }  
  }

Ainsi que le DSL des parsers : une orthographe comme celle-ci :
Code : Autre
1
2
3
expr ::= term {"+" term | "-" term}
term ::= factor {"*" factor | "/" factor}.
factor ::= floatingPointNumber | "(" expr ")".

se traduit en :

Code : Scala
1
2
3
4
5
class Arith extends JavaTokenParsers {   
    def expr: Parser[Any] = term~rep("+"~term | "-"~term)
    def term: Parser[Any] = factor~rep("*"~factor | "/"~factor)
    def factor: Parser[Any] = floatingPointNumber | "("~expr~")"
  }


Ce code ne fait pas l'évaluation, elle doit être traitée après.
 
Hors ligne gnomnain # Posté le 22/07/2010 à 22:25:08
Blblbl !
Avatar
Groupe : Anciens

Hum, marrant, avec ton exemple de while, il crée automatiquement un genre de "bloc" qui est évalué quand on mentionne le nom ? J'imagine que ça se fait grâce au type de la fonction (le => Type désigne le type d'une fonction sans arguments qui renvoie un truc de type Type ?).
Est-ce que ça veut dire qu'on peut éxécuter les fonctions sans arguments sans parenthèses ni rien ou c'est un cas particulier ? Le fait qu'elle ne soit pas éxécutée dans l'appel à while me parait un peu magique : ça vient de l'inférence de types ? Le compilateur n'attend pas de fonction à un endroit donc il évalue ?

C'est intéressant en tout cas (j'aime particulièrement le coup des méthodes infixes. est-ce que les opérateurs arithmétiques genre + sont définis de cette manière ? ou alors il y a des cas particuliers parce qu'il faut gérer les priorités ?)

Image utilisateur
Haskell - Learn You a Haskell - Real World Haskell - xmonad - OCaml
Apprenez Haskell ! - #ircduzero
<colbseton> Serialk: tu cherches vraiment des liens logiques dans tout ce que je raconte ?
 
Hors ligne Einstein++ # Posté le 22/07/2010 à 22:45:34
It's not a bug, it's a feature
Avatar

Études : TELECOM SudParis

ce n'est pas un genre de bloc, c'est une fonction anonyme qui ne prend aucun argument. La fonction n'est pas évaluée à l'appel parce qu'on a déclaré son type " => Boolean" (c'est une syntaxe spéciale pour l'évaluation retardée, le vrai type est () => Boolean)

Citation
Est-ce que ça veut dire qu'on peut éxécuter les fonctions sans arguments sans parenthèses ni rien ?

Oui. Cette fonctionnalité est utilisée pour créer des accesseurs pour les champs qui apparaissent comme un accès direct.
Citation
est-ce que les opérateurs arithmétiques genre + sont définis de cette manière ? ou alors il y a des cas particuliers parce qu'il faut gérer les priorités ?">

Oui c'est le cas de tous les opérateurs du langage, même 1 + 3 est transformé en 1 .+(3). Les priorités sont gérées automatiquement(c-à-d si on crée une classe Polynome avec des méthodes -,+ et * l'expression p1 + p2 * p3 s'évalue à p1 + (p2 * p3))
 
Hors ligne SpaceFox # Posté le 23/07/2010 à 02:24:13
Utilise ton cerveau !
Avatar
Validateurs
Flux RSS

Études : UTT

Plus je vois Scala, plus je me dis que j'aime pas le fonctionnel et tout ce que ça apporte.
Je sais pas, mon cerveau doit être câblé en "100 % objet" je pense...

Image utilisateur
 
Pour accéder à cette section
Connectez-vous !
connexion_rpx

Revenir à la liste des news