coucou747

Ce blog présente principalement les évolutions du compilateur metalang : les nouveaux backends, les nouvelles corrections de bugs, les nouvelles features, nouvaux tests, son utilisation dans le cadre du concours prologin.

le 08/03/2014

Backend GO pour Metalang

Un weekend, l'idée m'est venue de poursuivre l'ajouts de backends à Metalang. Après m'être pété les dents dur Bash (pour de multiples raisons, comme le passage de tableaux par valeur par exemple...), je me suis penché sur un backend que je n'avais jamais tenté : go

J'ai pu assez facilement installer golang depuis les dépots debian, et faire une ébauche de printer, relativement correcte, tout semblait aller pour le mieux : ils ont un genre de scanf donc le travail était relativement facile. Le premier soucis fut sur le fait qu'en go, il n'y a pas de warning : peu importe ce que le compilateur détecte, il déclanche une erreur, même pour une variable non utilisée. La solution consiste à détecter ces variables, et à inserrer :

_ = variableName

devant la déclaration. Soudain, je suis tombé sur un soucis étrange : le compilateur me disait que le code suivant ne renvoyaient pas forcément de valeur :

  if ... {
    return 2
  } else {
    return 0
  }

Pour contourner ce problème, j'ai installé une version récente de go :

  hg clone -u release https://code.google.com/p/go
  hg update default
  cd go/src
  ./all.bash

En gros, ce bug est présent dans GO 1.0, mais pas dans GO 1.1. Une fois ces deux bugs passés, j'ai découvert que le scanf de go était plein de TODO et donc, pas compatible avec le scanf C. J'ai du donc coder une fonction pour skipper les espaces. Heureusement, la librairie standard de GO fournit une fonction bien pratique : UnreadByte. Cette fonction magique permet d'annuller la lecture sur un flux bufferisé. Voici donc le code d'une fonction qui supprime les espaces d'un flux :

func skip() {
  var c byte
  fmt.Fscanf(reader, "%c", &c);
  if c == '\n' || c == ' ' {
    skip()
  } else {
    reader.UnreadByte()
  }
}

On a donc depuis quelques jours, un backend GO pour Metalang.

Dans Catégories/Metalang/Changelog.

Sujets : #backend #metalang #go