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 Pierre Bourdon . É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 kuroineko . Évalué à 1.
merci
je vais regarder ça...
# Merci j'ai trouvé de quoi bien galérer...
Posté par kuroineko . É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.