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.