开发时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 来做到这一点,但很久以前我就做过这样的事情,所以我怀疑现在我是否能正确地做到这一点。
最佳答案
我不明白(本地人),但凭借耐心和运气,我设法用我最初的想法做到了:
: 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# 中。
关于forth - 如何计算 AND-Forth 的本地人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45670901/