通过解构数组简化 boa 收缩?

Simplifying boa constriction through destructuring arrays?

我经常遇到这样的情况:

IN: scratchpad: TUPLE: box
                    length width height ;

IN: scratchpad { { 1 2 3 } { 4 5 6 } { 6 7 8 } }

--- Data stack:
{ ~array~ ~array~ ~array~ }
IN: scratchpad [ V{ } clone-like ] dup [ map ] dip call

--- Data stack:
V{ ~vector~ ~vector~ ~vector~ }
IN: scratchpad [ dup pop swap dup pop swap dup pop swap drop box boa ] map  

--- Data stack:
V{ ~box~ ~box~ ~box~ }
IN: scratchpad dup .
V{
    T{ box { length 3 } { width 2 } { height 1 } }
    T{ box { length 6 } { width 5 } { height 4 } }
    T{ box { length 8 } { width 7 } { height 6 } }
}

达到了我想要的结果,但是这个:

dup pop swap

必须 copy/pasted 与我要销毁的数组中的项目相同的次数,并且数组必须首先 clone-liked 到 V{ } 向量,并且。 .. 这真是太糟糕了,乱七八糟的代码。 (请注意,由于堆栈效应,3 [ dup pop swap ] times 将不起作用。)

必须有更好的方法从数组的项目构造 TUPLE 的实例。这是什么?

请注意,您可以一次从 first2first3first4 中的 sequencesx firstn 来自 [=19] 的序列中解压许多元素=].

我认为大多数 "Factorish" 方法是定义一个以序列作为参数的构造函数:

: seq>box ( s -- box ) first3 box boa ;

然后就可以map了:

{ { 1 2 3 } { 4 5 6 } } [ seq>box ] map

换句话说,更接近你正在做的事情:

{ { 1 2 3 } { 4 5 6 } } [ box prefix >tuple ] map

>tuple 采用形式为

的序列
{ name-of-tuple-class 1st-slot-value 2nd-slot-value ... last-slot-value }

所以你必须 prefix 每个序列与 class。