我有一个数组:
{ 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
的语义很难在运行时计算报价。
必须 才能实现这一目标。它是什么?
答案 0 :(得分:2)
没有。没有办法写这样的话。如果你认为你需要这样的话,你必须重新思考如何处理这个问题。
答案 1 :(得分:1)
正如BjörnLindqvist所说,因素不会让你这样做 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]。必须有一些元编程方法来做到这一点。但我认为这不是一种简单实用的方法。