在运行时将数组解包到堆栈

Unpack an array to the stack at runtime

我有一个数组:

{ 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

Words which call an input parameter must be declared inline so that a caller which passes in a literal quotation can have a static stack effect.

... 因为 call 的语义很难在运行时计算引号。

必须有一种方法可以做到这一点。这是什么?

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

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

最直接的方法可能是使用 vector as a stack:

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

当然,这意味着重新设计所有相关功能来处理它。

也许比向量更好,还有 string buffers,它也可以表现得像堆栈。

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

(或者 SBUF" somesbuf"

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

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

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

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