2010-02-15 11 views
4

Il est connu que les templates C++ sont complets. En tant que tel, il devrait être possible de sortir un quine qui est essentiellement rendu au moment de la compilation. Est-ce que quelqu'un sait si un tel quine a été écrit encore ou où je pourrais en trouver un.Modèle C++ Quine

+0

Mais où voulez-vous obtenir la sortie? – kennytm

+1

D'abord, je ne suis pas sûr que l'exhaustivité de Turing soit une condition nécessaire pour un quine. Deuxièmement, je suis sûr que OUTPUT est une condition nécessaire pour un quine. Dernière fois que j'ai vérifié, les modèles n'ont pas de sortie, en soi. – Cogwheel

+5

En fait, je suis sûr que cette complétude est inutile. Je pourrais définir une langue avec une seule opération, ">" qui ne fait que produire ">". Chaque programme dans cette langue serait un quine. – Cogwheel

Répondre

5

Les modèles peuvent effectuer n'importe quel type de calcul sur des éléments de données entiers, true. Mais ils ne sont pas si bons à I/O.

Quelle forme devrait prendre la réponse? Un modèle qui génère une fonction qui, lorsqu'elle est exécutée, génère la source de quine? Ce n'est pas vraiment le temps de la compilation. Un modèle qui génère une liste de caractères à la compilation (des centaines ou des milliers de classes) composant la source de quine? Peut-être que c'est mieux, mais vous devez toujours exécuter le programme pour le sortir.

En outre, les modèles sont très verbeux, et bien qu'ils soient complets, c'est seulement dans une petite contrainte de mémoire garanti recommandé par la norme. Vous ne pouvez vous attendre à une telle récursivité, par exemple, au-delà de laquelle le programme est très spécifique au compilateur. Il pourrait être impossible d'écrire un quine "calculé de manière significative" qui se stocke dans un formulaire portable.

+0

@Jerry: ajusté. – Potatoswatter

+0

commenter de même. –

+0

J'aime votre suggestion pour la sortie, une liste de caractères à la compilation qui est identique à la source d'origine. Cette liste de caractères ne serait pas sortie dans le sens traditionnel, mais serait simplement incorporée dans l'exécutable compilé sous la forme d'un littéral de chaîne. De toute façon, j'étais juste curieux de savoir si quelqu'un avait tenté une telle chose. – Jeff

3

Les modèles ont une seule forme de sortie directe - messages d'erreur/d'avertissement. Comme il n'y a aucune garantie quant à la forme que cela prend, vous ne pouvez pas écrire quoi que ce soit qui soit certain d'être un quine, et quoi que vous écriviez aura presque certainement un autre texte intercalé avec le code source.

Avec un compilateur qui incorpore la source dans le message d'erreur, l'obtention de chaque sortie de ligne est trop facile - assurez-vous que chaque instruction contient une erreur.