2017-08-14 5 views
2

En développant BigZ, principalement utilisé pour des expériences théoriques numériques, j'ai découvert le besoin d'orthogonalité dans l'ensemble de mots qui crée, filtre ou transforme des ensembles. Je veux quelques mots qui combinent logiquement une large gamme de commandes, sans avoir besoin de mémoriser un grand nombre de mots et de les combiner.Comment compter les habitants dans ANS-Forth?

1 100 condition isprime create-set 

mettre l'ensemble des nombres premiers entre 1 et 100 sur une pile de jeu, tandis que

function 1+ transform-set 

transformer cet ensemble à l'ensemble de tous les nombres p + 1, où p est un nombre premier moins à 100.

en outre,

condition sqr filter-set 

quitte l'ensemble de tous les carrés parfaits sur la forme p + 1 sur la pile. Cela fonctionne plutôt bien pour les ensembles de nombres naturels, mais pour pouvoir créer, filtrer et transformer des ensembles de n-tuples, j'ai besoin de pouvoir compter les locals dans des mots sans nom. Je redessiné mots pour désigner peu des conditions et des fonctions composées:

: ~ :noname ; 
: :| postpone locals| ; immediate 

1 100 ~ :| p | p is prime p 2 + isprime p 2 - isprime or and ; 
1 100 ~ :| a b | a dup * b dup * + isprime ; 

d'exécution ces deux exemples donne la pile de paramètres (1 100 xt), mais pour être capable de gérer ce droit, dans le premier cas, un ensemble de nombres et dans le second cas, un ensemble de paires devrait être produit, je devrai compléter le mot: | pour obtenir (1 100 xt n) où n est le numbet des locaux utilisés. Je pense qu'on pourrait utiliser> IN et PARSE pour le faire, mais il y a longtemps, j'ai fait de telles choses, donc je doute que je puisse le faire correctement de nos jours.

Répondre

1

Vous devriez peut-être supprimer LOCALS| et analyser les variables locales vous-même. Pour chacun d'eux, appelez le (LOCAL) avec son nom et finissez par passer une chaîne vide. Pour plus de détails, voir http://lars.nocrew.org/dpans/dpans13.htm#13.6.1.0086 pour plus de détails.

+1

Si vous le dites. Je ne sais pas comment cela fonctionne, mais je vais essayer de le découvrir. – Lehs

+1

Le document indique que (local) est indéfini à la fois en mode interpréter et en mode compilation et qu'il semble dépendre de l'implémentation. – Lehs

2

Je ne comprenais pas (LOCALS), mais avec de la patience et de chance j'ai réussi à le faire avec mon idée originale:

: bl# \ ad n -- m 
    over + swap 0 -rot 
    do i [email protected] bl = + 
    loop negate ; 
\ count the number of blanks in the string ad n 

variable loc# 

: locals# \ -- 
    >in @ >r 
    [char] | parse bl# loc# ! 
    r> >in ! ; immediate 
\ count the number of locals while loading 

: -| \ -- 
    postpone locals# 
    postpone locals| ; immediate 
\ replace LOCALS| 

maintenant

: test -| a b | a b + ; 

fonctionne comme LOCALS | mais laissez le nombre de sections locales dans la variable globale loC#.