==================================================
                   GBOL++ 1.0.9
==================================================
La machine GBOL est une machine à deux listes, notées S et M,
chacune étant vide ou contenant des entiers (positifs ou négatifs, ou 0) ,
ou des lettres.
Elle peut donc émuler une machine de Turing, donc, en simplifiant,
beaucoup d'automates amusants.
http://fr.wikipedia.org/wiki/Langage_de_programmation_exotique
Notations :
-----------
Nous appelerons T le dernier terme de la liste S , et N l'élément précédent T.
{} est la liste vide.
--> dénote le résultat d'un programme (impressions)
:= signifie 'devient' 
Exemple:
S = {-1 33  a b 42 666}  ; T=666; N=42
Opérations :
------------
Enlister : ajouter un dernier terme à une liste.
Délister : supprimer le dernier terme d'une liste - On appelle "résultat" l'élément supprimé.
Le langage GBOL - Instructions
------------------------------
>	Déliste M et enliste le résultat dans S	(sans effet si M est vide)
<	Déliste S et enliste le résultat dans M (sans effet si S est vide)
#	Echange T et N
=	Enliste T dans S (duplication de T)
!	Imprime T (nombre ou lettre)
R	Enliste un nombre aléatoire positif dans S
X	Déliste S
|	Déliste S
§	Vide toutes les listes et démarre la machine
$	Arrète la machine
+	N := N+T; ensuite X (S est délistée)
*	N := NxT; ensuite X
-	N := N-T; ensuite X
/	N := N/T; ensuite X (si T=0 le résultat est indéfini)
%	N := N modulo T; ensuite X (si T=0 le résultat est indéfini)
Exemples de programmes :
§R=/!	: imprime 1
§R=-!	: imprime 0
§R=/===+++! : imprime 4
	avant : S= {12}
	§ R=/====+=*
	aprés : S= {12 1 1 1 4 }
(...) : Répétitions
--------------------
Les instructions GBOL sont exécutées en séquence.
Exception : Toute suite d'instructions entre parenthéses est répétée tant que T > 0.
Si T <= 0, ou si S est vide,  cette suite n'est pas exécutée.
On peut imbriquer les parenthèses.
Si abc... est une suite d'instructions :
	 (abc...) est équivalent à :
	 
		Tant que  T > 0 
			Exécuter abc...
Exemple :  §R=/===+++ (!R=/-!) -->  4 3 3 2 2 1 1 0
Exemple :  §R=/=( (=<*>R=/-) X!XR=/+=) --> 1 2 6 24 120 720 5040 .. (factorielles)
Exemple :  § 1 ()  --> boucle infinie ..
Phrases
-------
Une phrase est une suite de mots ou d'instructions qui commence par un mot majuscule (1),
et finit par un point  '.' .
Une phrase peut être insérée (invoquée) dans un programme, une autre phrase, ou elle-même. 
Pour insérer une phrase, on écrit son premier mot.
Une phrase est en abyme si elle s'invoque elle-même.
L'insertion se termine dés que l'on rencontre un point '.' dans l'éxécution de la phrase.
Remarque  :
Le '.' correspond à l'instruction 'retour','return' dans certains langages de programmation.
Exemples :
QuaranteDeux  R=/=+=<=<=====****>==**+>+!.
§ QuaranteDeux --> 42
Encore =+==**!. 
§ R=/ Encore  --> 8
§ R=/ Encore Encore Encore  --> 8 4096 549755813888
DoubleDeux =<#=<#>>.
§RR DoubleDeux --> S = {1765940786 840973735 1765940786 840973735}
Plus grand Commun diviseur : Remarquons que cette phrase se met en abyme.
PgCd (=<%># PgCd .) X. 
§ R!R! PgCd ! --> 231 3333 33 (33 est le PGCD de 231 et 3333)
§ R!R! PgCd ! --> 1564985037 1463912607 3
(1) Mot commençant par une Majuscule 
et ne contenant pas deux majuscules consécutives,
et contenant au moins un minuscule.
Invocation de phrases par numéro
--------------------------------
Chaque phrase a un numéro > 0 . On peut invoquer une phrase par son numéro.
Instructions :
&	Enliste dans S le numéro de phrase dont le nom suit
@	Déliste S dans F. Ensuite invoque la phrase de numéro F (si existante)
Exemple :
ActionUn !.
ActionDeux !!.
PlusGrand =<#=<#>> -.
Boucle < 1 (X >=< @ 1+PlusGrand) >XXX . " boucle de T à N "
§ 100 1 &ActionUn Boucle
§ 100 1 &ActionDeux Boucle
Ce qui permet d'augmenter le langage à loisir.
Lettres
-------
:       :       Remplace T par la T-ième lettre du programme; par 0 (zéro) si T trop grand.
\       :       Rempace la T-ième lettre du programme par N (si N est une lettre) . Ceci permet
		au programme de se modifier lui-même.
		
Exemple :
		§14=:(!X1+=:)Bonne année --> imprime Bonne année
Raccourcis 
----------
Les chiffres et nombres décimaux ne font pas partie du langage GBOL,
mais la pluspart des compilateurs GBOL acceptent les abbréviations suivantes :
0	à la place de	R=-
1	à la place de	R=/
2	à la place de	R=/=+
3	à la place de	R=/==++
4	à la place de	R=/===+++
666	à la place de	R=/======....++++..(665 fois)
etc.
Exemple :
		§ 666 42 =
		Aprés : S = {666 42 42}
		
		
Calcul de racine carrée :
PlusGrand =<#=<#>>-.
RacineCarree 1+2/0 1 (X=<-> 1+ PlusGrand) X.
§ 443556 RacineCarree ! --> 666
Exercices
----------
E0 : Ecrire un programme qui multiplie 666 par 42
E1 : Ecrire un programme qui imprime 2 4 6 8 10 ... 666 ..
E2 : Ecrire un programme qui imprime la suite de Fibonacci : 1 1 2 3 5 8 13 21 ..
E3 : Ecrire la phrase 'Factorielle' en abyme qui imprime la factorielle de T
	§ 11 Factorielle !  --> 39916800
	§ 0  Factorielle !  --> 1
E4 : 
	Soit S ne contenant que des entiers positifs.
	Ecrire la phrase 'Rotation' qui effectue une rotation de S :
	Avant : S = { 1 2 3 4 5 }
	Rotation
	Aprés : S = {5 1 2 3 4 }
	Rotation
	Aprés : S = {4 5 1 2 3 }
	
E5 : 	Ecrire la phrase 'Puissance' T := N puissance T
	Pour tricher : http://www.labri.fr/perso/betrema/deug/poly/exp-rapide.html
	
E6 :	Ecrire un interpréteur GBOL pour votre système préferré (Mac ou PC ?)
	
Concours (clôture le 3/3/2009)
==============================
C1 : Ecrire la phrase 'Premier' qui imprime T si T est premier, 0 sinon.
	§ 101 Premier --> 101
	§ 666 Premier --> 0
	§ 988599581 Premier --> 988599581
	
Les ex-aequo seront départagés par les performances du programme 
(nombre d'instructions exécutées pour un nombre secret déposé au pavillon de Breteuil)
Les prix seront conséquents.
Voir aussi
----------
http://fr.wikipedia.org/wiki/Th%C3%A9orie_des_automates
Au cours des années suivantes, les chercheurs débordèrent d'imagination 
pour créer différentes variations de la machine de Turing; 
machine à une pile, à deux piles (GBOL) et plus, machine à queues, 
machine de post, machines à registres, etc. 
Ils s'aperçurent rapidement que malgré leurs efforts, 
la variation n'était qu'une illusion et que tout automate s'inscrivait 
dans une des quatre catégories qu'ils avaient découvertes.
Téléchargement
==============
Un compilateur GBOL pour Wind*ws est disponible ici :
http://www.echolalie.com/gbol