2

在开发主要用于数论实验的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 来做到这一点,但很久以前我做过这样的事情,所以我怀疑我现在能不能正确地做到这一点。

4

2 回答 2

2

我不明白(当地人),但凭借耐心和运气,我设法用我最初的想法做到了:

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

现在

: test -| a b |  a b + ;

作为本地人工作| 但将局部变量的数量留在全局变量 loc# 中。

于 2017-08-14T23:29:07.843 回答
1

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

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

于 2017-08-14T10:44:51.977 回答