> ## Content Index
> Fetch the complete content index at: https://www.sfeir.dev/llms.txt
> Use this file to discover other available public pages before exploring further.

# Long live the quine !
- URL: https://www.sfeir.dev/back/long-live-the-quine/
- Published: 2024-12-20T09:18:25.000Z
- Updated: 2024-12-20T09:18:25.000Z
- Description: Chaque jour de l'Avent, retrouvez une courte anecdote du monde de la tech ! Ici pas de chocolats mais des petites anecdotes pour briller en société avec des faits insolites ! Aujourd'hui, on parle des programmes "quines"!
- Author: Renaud Hoyoux
- Tags: Avent, programming, developpeur, Back, quine

En programmation, et particulièrement en programmation fonctionnelle, on **adore** la réflexivité. Le cas le plus connu est celui des fonctions qui prennent des fonctions en argument et retournent des fonctions.  
Mais on a aussi des méthodes qui vont lister l'ensemble des méthodes d'une classe et en exécuter une.

[En Java](https://www.sfeir.dev/back/le-langage-java-definition/), le célèbre framework [Spring](https://www.sfeir.dev/back/back-spring-boot/) est construit sur ce mécanisme : il instancie des classes et les met en argument d'autres constructeurs.

On peut donc avoir une fonction qui va lister l'ensemble des fonctions et donc avoir dans son output ... son propre nom.  
Mais peut-on aller plus loin encore ?

Pourrait-on écrire une fonction dont l'exécution produit une copie de **son propre code source** ?

La réponse est oui ! Ces programmes particuliers sont appelés **quines** en hommage au logicien américain *Willard Van Orman Quine* et sont souvent considérés comme des exercices de style élégants qui mettent en lumière la souplesse des différents langages de programmation.

La difficulté d'écrire une quine en fait un défi pour les programmeurs désireux de démontrer leur compréhension approfondie de leur langage de programmation préféré.

### Quelques exemples

```bash
  #!/bin/sh
  quine () {
  echo -e "#!/bin/sh\n$1"
  echo "quine '$1'"
  }
  
  quine 'quine () {
  echo -e "#!/bin/sh\\n$1"
  echo "quine \047$1\047"
  }
  '
```

En Bash

```javascript
const f = () => "const f = " + f
```

En Javascript

```python
a='a=%r;print(a%%a)';print(a%a)
```

En Python3

Et pour terminer, une plus compliquée en Java :

```Java
class Quine{public static void main(String[] args){char n=10;char b='"';String a="class Quine{public static void main(String[] args){char n=10;char b='%c';String a=%c%s%c;System.out.format(a,b,b,a,b,n);}}%c";System.out.format(a,b,b,a,b,n);}}
```