Forum Programmation.autre petite bêtise juste pour amuser les plus fêlés d'entre nous...

Posté par  .
Étiquettes :
4
20
avr.
2011

Bonjour
donc voilà le code en GFORTH capable d'interpréter du BrainFuck

: array         create 0 do 0 , loop does> swap cells + ;
0 value str
0 value size
variable pos
30000 array mem
variable cur
\ helpers
: incr           1 swap +! ;
: decr          -1 swap +! ;
: goto          1- pos ! ;
: cur-char      str pos @ + c@ ;
: mem-null?     cur @ mem @ 0= ;
: end-of-loop?  cur-char [char] ] = ;
\ go to the corresponding ]
: until         postpone 0= postpone while ; immediate
: skip[         [char] [ = if 1+ then ;
: skip]         [char] ] = if 1- then ;
: skip-char     cur-char skip[ cur-char skip] ;
: skip-loop     -1 begin dup 0= end-of-loop? and until skip-char pos incr repeat drop ;
\ switch like macro
: exit-if-not   postpone if postpone else postpone exit postpone then ; immediate
: ===>          postpone over postpone = postpone exit-if-not ; immediate
\ evaluate a bf instruction
: eval+         [char] +  ===>  cur @ mem incr ;
: eval-         [char] -  ===>  cur @ mem decr ;
: eval.         [char] .  ===>  cur @ mem c@ emit ;
: eval,         [char] ,  ===>  key cur @ mem c! ;
: eval>         [char] >  ===>  cur incr ;
: eval<         [char] <  ===>  cur decr ;
: eval[         [char] [  ===>  mem-null? if skip-loop else pos @ swap then ;
: eval]         [char] ]  ===>  swap mem-null? if drop else goto then ;
: eval-char     eval+ eval- eval. eval, eval> eval< eval[ eval] ( and finally ) drop ;
\ main
: init          to size to str 0 pos ! 0 cur ! ;
: continue?     pos @ size < ;
: bf            init begin continue? while cur-char eval-char pos incr repeat ;

et un exemple d'execution qui démontre deux programmes en BrainFuck
le premier inscrit 0123456789
le second est un hello world

francois@trillian:~/Public/dev/forth/bf$ gforth bf.fs
redefined UNTIL with until  Gforth 0.7.0, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
s" >++>++++++++[<<++++++>+>-]<[-<.+>]"  ok
bf 0123456789 ok
   s" ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."  ok
bf Hello World!
ok
bye
francois@trillian:~/Public/dev/forth/bf$ 
francois@trillian:~/Public/dev/forth/bf$ 

Y a t il d'autre langages un peu "fous" ou "décalés" que vous connaissiez et pour lesquels vous avez écrit un petit interpréteur minimaliste ?
Quelque chose que je puisse utiliser, ou de m'en inspirer pour continuer à me former sur le GFORTH

Merci

  • # SNUSP

    Posté par  . Évalué à 4.

    J'avais trouvé SNUSP assez marrant quand je codais des interpréteurs pour ce genre de bêtises il y a un moment.

    C'est un peu comme du Brainfuck, mais bidimensionnel : on a / et \ qui permettent de faire des « virages » dans le flux d'exécution, et une boucle se représente vraiment comme... une boucle en deux dimensions (un rectangle avec des / et des \ pour les coins quoi).

    Il y a quelques extensions du langage qui permettent d'avoir des procédures, des threads ou de la mémoire bidimensionnelle. Bref, beaucoup de fun si tu veux coder un interpréteur :)

    • [^] # Re: SNUSP

      Posté par  . Évalué à 1.

      merci
      je vais regarder ça...

  • # Merci j'ai trouvé de quoi bien galérer...

    Posté par  . Évalué à 0.

    Grace au membre d'ici et de certains IRC j'ai trouvé :
    SNUSP, LNUSP et PIET m'intéressent particulièrement.

    SNUSP

    LNUSP

    PIET

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.