SNUSPSNUSP (sigle signifiant SNUSP's Not Unix, but Structured PATH) est un langage de programmation exotique issu de la transformation du Brainfuck en un langage à deux dimensions, inspiré d'un langage appelé PATH[réf. nécessaire]. Le jeu d'instructions de SNUSP est plus proche du brainfuck que PATH, en conservant la même syntaxe pour les instructions relatives à la mémoire ( FonctionnalitésToutes les instructions sont représentées par un caractère non numérique. L'exécution d'un programme SNUSP commence au caractère Les deux instructions de base du contrôle de flot, ruld ( De ce fait, le programme n'affichera rien, malgré la présence d'une instruction de sortie ( /============# | Ceci est un $==/ commentaire. En plus des instructions de changement de direction du flot d'exécution, il existe une instruction de saut inconditionnel ( Il est possible de créer des fonctions par les instructions enter ( $===avant====@\===après===# | \===la=fonction===# L'instruction enter 'empile' (mémorise) sa position et la direction du flot d'exécution dans la pile d'appel. Cette information est utilisée par l'instruction leave, qui 'dépile' (reprend les dernières informations) la pile d'appel et revient à l'endroit enregistré. Pour éviter de faire une boucle infinie, le caractère suivant le SpécificationLe langage est compartimenté en 3 langages de puissance croissante, chacun contenant le précédent :
Cependant, voici l'adresse d'un entretien pour évoluer en un langage SRFI-style extension model plus scalable[1]. ExempleCe code SNUSP calcule le quotient et le reste obtenus par la division euclidienne de deux nombres décimaux à un chiffre issus de l'entrée standard : /==!/============atoi=@@@@=@@=--# | | /==!/====itoa=@@@@=@@=++# | | | | $,@/>,@/@\@/.<@/.# | /-\ \===div=?\<!\?/#!===+<<<\ /-\ \<==@\>@\>>!/?!/=<?\>!\?/<<# | | #\->->+</ \=!\=?!/->>+<<?\# #\?<<+>>-/ Dans le programme ci-dessus, la conversion de chiffres ASCII en nombre entier est faite par les fonctions Un autre exemple implantant la fonction d'Ackermann : /==!/==atoi=@@@@=@@=--# | | | | [j]{i} -> {A(i,j)}, où A est la fonction d'Ackermann | | /=========\!==\!====\ ** recursive ** $,@/>,@/==ack=!\?\<+# | | | A(0,j) -> j+1 j i \<?\+>-@/# | | A(i,0) -> A(i-1,1) \@\>@\->@/@\<-@/# A(i,j) -> A(i-1,A(i,j-1)) {a}[ ][0] # # | | | {0}[ ][a] /-<<+>>\!=/ \=====|==@\>>>@\<<# {a}[ ][0] (a > 0) ? ? | | | [a]{ }[a] [0][ ]{a} \>>+<<-/!==========/ | | [a][ ]{0} # # | | {a}[ ][0][0] | | [0][ ][ ]{a} {0}[ ][a][a] | | [a][ ][ ]{0} #/?========\!==/ \==!/=======?\# \->>+>+<<</ \>>>+<<<-/ Comme dans l'exemple précédent, ce programme lit deux chiffres ASCII décimaux, les convertit en nombres entiers, et les utilise comme paramètres de la fonction Les commentaires ressemblant à Le programme qui utilise la fonction d'Ackermann démontre une propriété remarquable des langages dérivés de Befunge : le code peut être exécuté dans deux directions. Ceci est utilisé par la boucle qui déplace une valeur de deux cellules vers le haut, tout en pouvant déplacer une valeur de deux cellules vers le bas simplement en s'exécutant dans la direction opposée! Pour compléter le programme, la fonction suivante peut être utilisée pour afficher le résultat dans un nombre ASCII décimal à plusieurs chiffres : /recursive\ #/?\ zero ==print10=!\@\>?!\@/<@\.!\-/ | \=/ \==itoa=@@@+@+++++# ! /+ !/+ !/+ !/+ \ mod10 /<+> -\!?-\!?-\!?-\!?-\! \?!\-?!\-?!\-?!\-?!\-?/\ div10 # +/! +/! +/! +/! +/ Notes et références
Voir aussiLiens externes
|