Упрощение сужения боа за счет разрушения массивов?
Очень часто я нахожусь в такой ситуации:
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
Должен быть скопирован / вставлен столько же раз, сколько элементов в массиве, который я хочу уничтожить, и массив должен сначала clone-like
д к V{ }
вектор, и... это просто ужасный, грязный код. (Обратите внимание, что 3 [ dup pop swap ] times
не будет работать из-за эффекта стека.)
Должен быть лучший способ создать экземпляр TUPLE
из элементов массива. Что это?
1 ответ
Обратите внимание, что вы можете распаковывать много элементов одновременно из последовательностей с first2
, first3
а также first4
в sequences
а также x firstn
от sequences.generalizations
,
Я думаю, что самый "факториальный" способ сделать это - определить конструктор, который принимает последовательность в качестве аргумента:
: 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
каждая последовательность с классом.