Все функции в Rebol, которые используют параметр /into
, используют семантику insert
. Мы добавили эту опцию, чтобы разрешить инкрементное строительство без необходимости создавать столько промежуточных серий, а также чтобы вы могли выбирать тип целевой серии, предварительно распределять и всевозможные другие уловки опытных пользователей. Параметр /into
использует семантику insert
, потому что insert
не теряет столько информации, сколько append
.
Возьмем ваш пример, но просто используйте collect
:
data: [1 2 3 4 "a" "b" "c" "d"]
output: collect [
foreach [p1 p2 p3 p4] data [ keep p1 keep p3 keep p4 ]
]
probe output
Такой простой код collect
должен упростить написание. Но он немного медленный, поэтому давайте попробуем немного его оптимизировать, используя /into
:
data: [1 2 3 4 "a" "b" "c" "d"]
output: copy []
foreach [p1 p2 p3 p4] data [
output: collect/into [keep p1 keep p3 keep p4] output
]
probe head output
Это стандартная модель для /into
кода, и она будет выводить данные в том порядке, в котором вы хотите. Но на самом деле у этого нет никаких преимуществ перед использованием обычного collect
, поскольку вы не выделяете целевой блок заранее. Это сэкономит на перераспределениях:
data: [1 2 3 4 "a" "b" "c" "d"]
output: make block! 0.75 * length? data
foreach [p1 p2 p3 p4] data [
output: collect/into [keep p1 keep p3 keep p4] output
]
probe head output
Но сам collect
может быть немного медленным, потому что он не является родным; в основном это удобная функция. К счастью, у нас есть более быстрые нативные функции, которые используют /into
одинаково:
data: [1 2 3 4 "a" "b" "c" "d"]
output: make block! 0.75 * length? data
foreach [p1 p2 p3 p4] data [ output: reduce/into [p1 p3 p4] output ]
probe head output
Здесь не используются неродные функции, это должно быть довольно быстро.
person
BrianH
schedule
16.02.2014