C’est ma faute, j’ai oublié les backslashes, ils ont une signification spéciale à l’intérieur des chaînes.
En Scheme, les expressions ont souvent la forme d’une liste. Par défaut, une expression de la forme (f a b 3) signifie que la fonction f est appliquée aux arguments a, b et 3. Ici f, a, b et 3 sont sous-expressions: 3 est un nombre litéral et f, a et b sont des variables. Évidemment, la valeur d’un nombre litéral, c’est le nombre même. Évaluer une variable, c’est renvoyer sa valeur.
Cependent, parfois on ne veut pas évaluer une expression. Par exemple, si je veux obtenir la liste (1 2 3), je ne peux pas tout simplement écrire (1 2 3), car c’est l’application de la fonction 1 aux arguments 2 et 3. Mais c’est absurde, 1 n’est même pas une fonction. La forme spéciale quote existe pour supprimer l’évaluation. Ainsi, (quote (1 2 3)) signifie « ne pas évaluer l’expression suivante (c’est-à-dire, (1 2 3)), mais l’utiliser comme données ». Ça peut être abrégé comme '(1 2 3). Donc, le caractère ' signifie que l’expression suivante n’est pas à évaluer. Par conséquence, il ne faut pas écrire ' avant les sous-expressions: dans '(1 (2 3) (4 5)), le guillemet supprime l’évaluation de la liste entière, y compris les sous-listes.
Ainsi, on peut utiliser le guillemet pour former des listes litérales. Un autre emploi fréquent du guillemet, c’est avant un symbole pour obtenir le symbole même au lieu de la valeur associé: 'a résulte en le symbole a, pas en la valeur de la variable a. '(1 2 ("foo" "bar") (a (b c))) est une liste litérale avec sous-listes contenant des nombres, des symboles et des chaînes.
C’est pourquoi il ne faut qu’un guillemet avant le liste.
Puis, en lisp, il n’y pas de listes proprément dites. Il y a des paires, dont des chaînes nous appellons listes. La paire composée de 1 et 2 est notée (1 . 2). La notation (1 2 3 4) est une abréviation de (1 . (2 . (3 . (4 . ())))), donc une chaîne des paires dont le deuxièmes éléments sont eux-mêmes paires, sauf (4 . ()), où () désigne un objet dit une liste vide. C’est pourquoi
(eMajorOnStringSix . ("e" "<e,\\6 b,\\5 e\\4 gis\\3 b\\4 e'\\1>" "o;2;2;1;o;o;"))
et
(eMajorOnStringSix "e" "<e,\\6 b,\\5 e\\4 gis\\3 b\\4 e'\\1>" "o;2;2;1;o;o;")
, c’est la même chose.
À propos, en lisp, on préfère écrire e-major-on-string-six.
Partager