Dans l’article précédent Un quine en R je présentais un quine en langage R. Le code était un peu long, 19 lignes, surtout comparé au code Ruby de l’article original:

src = "\nputs \"src = \" + src.inspect + src"
puts "src = " + src.inspect + src

En Ruby, c’est court en partie grâce à la méthode inspect qui échappe automatiquement les caractères non imprimables et les guillemets:

>> foo = "\nputs \"src\""
"\nputs \"src\""
>> foo.inspect
"\"\\nputs \\\"src\\\"\""

Bien entendu j’ai cherché une fonction similaire en R, du moins pour les chaînes de caractères. J’ai laissé tombé après un quart d’heure de recherches infructueuses, et j’ai pondu le code de l’article précédent.

C’est là que Hadley Wickham himself m’a suggéré l’utilisation de la fonction encodeString. C’est ce que j’avais cherché sans le trouver. Du coup, un quine en R prends beaucoup moins de place et deviens plus compréhensible:

src <- "\nwriteLines(c(paste(\"src <-\", encodeString(src, quote='\"')), src))"

writeLines(c(paste("src <-", encodeString(src, quote='"')), src))

Cette version me plait bien, je l’ai donc ajouté sur le rosettacode.org.

Comme dit la dernière fois, il est bon d’utiliser diff pour s’assurer qu’on a bien écrit un quine:

diff -u quine2.r <(Rscript quine2.r)

Et voilà le résultat:

$ Rscript quine3.r
src <- "\nwriteLines(c(paste(\"src <-\", encodeString(src, quote='\"')), src))"

writeLines(c(paste("src <-", encodeString(src, quote='"')), src))