1

我有一个数组:

{ 1 2 3 4 }

我想将其内容推送到堆栈中。

我试过:

(sc) { 1 2 3 4 } dup length firstn
1
2
3
4

伟大的!

不过一句话:

: explode ( a -- * ) dup length firstn ; inline

抛出错误Cannot apply “firstn” to a run-time computed value,因为firstn调用call

调用输入参数的单词必须声明为内联,以便传入文字引号的调用者可以具有静态堆栈效果。

...并且由于call ' 语义,很难在运行时计算报价。

必须有办法做到这一点。它是什么?

4

2 回答 2

2

不,没有办法写出这样的词。如果你认为你需要这样的词,你必须重新考虑你如何处理这个问题。

于 2016-03-17T12:19:32.500 回答
1

正如 Björn Lindqvist 所说,Factor 不会让你这样做1,但有一些解决方法。

最直接的方法可能是使用向量作为堆栈

: explode ( v s -- v ) dupd [ swap push ] with each ;
V{ } "somestring" explode
==> V{ 115 111 109 101 115 116 114 105 110 103 }

当然,这意味着重新设计所有相关功能以使用它。

也许比向量更好,还有字符串缓冲区,它也可以像堆栈一样。

"somestring" >sbuf
==> SBUF" somestring"
"-abcd" [ over push ] each
==> "somestring-abcd"

(或者SBUF" somesbuf"

如果您需要继续处理内容,就好像它是堆栈上传递的其他单词的输入一样,您可以使用with-datastack

"somestring-abcd" [ 5 ndrop 3dup ] with-datastack >string
==> "somestringing"

但是把它想象成一种常规的非基于堆栈的语言。每个单词采用固定数量的参数并输出固定数量的结果。

[1]。必须有一些元编程方法来做到这一点。不过,我不认为有一种简单实用的方法。

于 2016-03-23T01:39:14.993 回答