Упрощение сужения боа за счет разрушения массивов?

Очень часто я нахожусь в такой ситуации:

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 каждая последовательность с классом.

Другие вопросы по тегам