forth - 如何计算 AND-Forth 的本地人?

标签 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 ),但为了能够正确处理这个问题,在第一种情况下应生成一组数字,在第二种情况下应生成一组对,我将来补充这个词:|得到 ( 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/

相关文章:

io - FORTH 包括与负载?

forth - 如何在 Forth (gforth) 的数据堆栈上获取单词字符串表示形式?

forth - 在 Forth 中打印函数的定义

forth - 循环求和数组返回像读取一样的地址,而不是正确的答案。为什么?

forth - 在Forth中实现求幂

forth - CREATE 和 VARIABLE 的区别

forth - 从终端输入缓冲区加载到参数堆栈

string - 如何在 Forth 中比较两个字符串?

forth - 在 Mac 上编译 Gforth 时出现问题

forth - 使用循环反转数据堆栈