在运行时将数组解压缩到堆栈

时间:2016-03-16 21:47:21

标签: arrays stack factor-lang

我有一个数组:

{ 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 的语义很难在运行时计算报价。

必须 才能实现这一目标。它是什么?

2 个答案:

答案 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]。必须有一些元编程方法来做到这一点。但我认为这不是一种简单实用的方法。