2017-08-14 31 views
2

在开发BigZ时,主要用于数理论实验,我发现在创建,过滤或转换集合的单词集中需要正交性。我想要一些逻辑组合的词汇涵盖广泛的命令,而不需要记住大量单词和组合它们的方法。如何在ANS-Forth中统计当地人?

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),但要能处理这种权利,在第一种情况下的一组数字和在第二种情况下应该生成一组对,我将不得不补充单词:|得到(1 100 xt n)其中n是当地人使用的麻木。我认为可以使用> IN和PARSE来做到这一点,但很久以前我做了这样的事情,所以我怀疑我现在可以做得很好。

回答

1

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

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

+1

如果你这么说。我不知道它是如何工作的,但会试图找出答案。 – Lehs

+1

该文件说明(局部)在解释和编译模式下都是未定义的,它似乎与实现有关。 – Lehs

2

我不明白(LOCALS),但有耐心和运气,我设法与我原来的想法去做:

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

现在

: test -| a b | a b + ; 

作品LOCALS |但保留全局变量loc#中的本地人数。