在运行时将数组解包到堆栈
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]。必须有一些元编程方法来做到这一点。不过,我认为没有简单实用的方法。
我有一个数组:
{ 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]。必须有一些元编程方法来做到这一点。不过,我认为没有简单实用的方法。