Forth 如何计算本地人的数量?

Forth 如何计算本地人的数量?,forth,gforth,Forth,Gforth,在主要用于数论实验的开发过程中,我发现创建、过滤或转换集的单词集需要正交性。我想要几个逻辑组合的单词,涵盖了广泛的命令,而不需要记住大量的单词和组合它们的方法 1 100 condition isprime create-set 将介于1和100之间的所有素数的集合放在集合堆栈上,而 function 1+ transform-set 将此集合转换为所有数字p+1的集合,其中p是小于100的素数 此外 condition sqr filter-set 在堆栈的p+1表格上留下所有完美正方形

在主要用于数论实验的开发过程中,我发现创建、过滤或转换集的单词集需要正交性。我想要几个逻辑组合的单词,涵盖了广泛的命令,而不需要记住大量的单词和组合它们的方法

1 100 condition isprime create-set
将介于1和100之间的所有素数的集合放在集合堆栈上,而

function 1+ transform-set
将此集合转换为所有数字p+1的集合,其中p是小于100的素数

此外

condition sqr filter-set
在堆栈的p+1表格上留下所有完美正方形的集合

这对于自然数的集合非常有效,但是为了能够创建、过滤和转换n元组集合,我需要能够在未命名的单词中计算局部变量。我重新设计了单词,简短地表示复合条件和函数:

: ~ :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 ;

执行这两个示例会得到参数堆栈(1100 xt),但要正确处理这一点,在第一种情况下,应生成一组数字,在第二种情况下,应生成一组对,我必须补足单词:|以获得(1100 xt n),其中n是使用的局部数。我想人们可以使用>IN和PARSE来做这件事,但我做这件事已经很久了,所以我怀疑我现在是否能正确地做这件事

也许您应该删除
局部变量|
并自己解析局部变量。对于每一个,使用其名称调用
(LOCAL)
,并以传递一个空字符串结束

详情请参见。

我不理解(当地人),但凭借耐心和运气,我成功地实现了我最初的想法:

: bl# \ ad n -- m
  over + swap 0 -rot
  do i c@ 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| 
现在


用作局部变量|但将局部变量的数量保留在全局变量loc#中。

如果您这样说的话。我不知道它是如何工作的,但我会尝试找出答案。文档中说(local)在解释和编译模式下都是未定义的,而且它似乎依赖于实现。
: test -| a b |  a b + ;