2013-10-14 4 views
1

Je travaille actuellement sur un petit interprète écrit en Forth. Pour une petite optimisation que je suis en train d'avoir un mot qui crée des mots compilés, par exemple, quelque chose qui se comporte comme ceci:Compiler un mot anonyme dans un mot compilé en Forth

: creator (-- a) 
    :noname (u -- u) 
     10 + ; 
; 

10 creator execute . 
>> 20 ok 

Si essayé plusieurs approches à ce jour et non travaillé (comme ci-dessus naïve, commutation d'interprétation mode, en essayant de compiler une chaîne de source Forth). Est-ce réellement possible?

Répondre

2

Lorsque vous écrivez des mots de compilation, vous devez faire très attention aux mots qui s'exécutent au moment de la compilation et qui s'exécutent au moment de l'exécution. Dans ce cas, 10 + s'exécute au moment de la compilation et ne sera pas compilé en vous: définition de noname.

Je crois que c'est ce que vous voulez:

: creator (-- xt) :noname (n1 -- n2) 
    10 postpone literal postpone + postpone ; ; 

Notez également que vous pouvez utiliser CREATE DOES> dans de nombreux cas. Par exemple. si vous voulez que votre creator d'accepter un nombre qui est utilisé par le mot de l'enfant:

: creator (n1 "name" --) create , 
    does> (n2 -- n1+n2) @ + ; 
+0

Merci cela semble très prometteur. Je vais l'essayer dès que je serai de retour à une machine avec avant. –

+0

Peut-être deux liens utiles que j'ai trouvés après avoir expérimenté votre solution: http://compgroups.net/comp.lang.forth/lambda-+currying-bigforth-gforth-question/1260723 http: // www. forth-ev.de/repos/bigforth/lambda.fs –

+0

Vous pouvez également vérifier]] [[macros (dans gforth et éventuellement d'autres). Avec ceux-ci, le code devient: ': creator: noname 10]] literal +; [[; ' –

Questions connexes