在开发主要用于数论实验的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 ),但为了能够正确处理,在第一种情况下应该生成一组数字,在第二种情况下应该生成一组对,我必须补充词:| 得到 ( 1 100 xt n ) 其中 n 是使用的当地人的人数。我认为可以使用 >IN 和 PARSE 来做到这一点,但很久以前我做过这样的事情,所以我怀疑我现在能不能正确地做到这一点。