如何计算ANS-Forth的当地人?

时间:2017-08-14 09:00:21

标签: forth gforth

在开发BigZ时,主要用于数论理论实验,我发现在创建,过滤或转换集的单词集中需要正交性。我想要一些逻辑组合的词汇涵盖各种各样的命令,而不需要记住大量的单词和组合它们的方法。

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 ;

执行这两个例子给出了参数堆栈(1 100 xt)但是能够处理这个权利,在第一种情况下是一组数字,在第二种情况下应该产生一组对,I'我必须补充这个词:|得到(1 100 xt n)其中n是当地人使用的numbet。我认为可以使用> IN和PARSE来做到这一点,但是很久以前我做过这样的事情,所以我怀疑我现在可以做得恰到好处。

2 个答案:

答案 0 :(得分:2)

我不理解(LOCALS),但耐心和幸运,我设法用我最初的想法做到了:

callback = options;

现在

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

作为LOCALS |但是将本地数量保留在全局变量loc#。

答案 1 :(得分:1)

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

有关详细信息,请参阅http://lars.nocrew.org/dpans/dpans13.htm#13.6.1.0086