通过解构数组简化 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-like
d 到 V{ }
向量,并且。 .. 这真是太糟糕了,乱七八糟的代码。 (请注意,由于堆栈效应,3 [ dup pop swap ] times
将不起作用。)
必须有更好的方法从数组的项目构造 TUPLE
的实例。这是什么?
请注意,您可以一次从 first2
、first3
和 first4
中的 sequences
和 x 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。
我经常遇到这样的情况:
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-like
d 到 V{ }
向量,并且。 .. 这真是太糟糕了,乱七八糟的代码。 (请注意,由于堆栈效应,3 [ dup pop swap ] times
将不起作用。)
必须有更好的方法从数组的项目构造 TUPLE
的实例。这是什么?
请注意,您可以一次从 first2
、first3
和 first4
中的 sequences
和 x 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。