Самый элегантный способ извлечь блок, пропуская каждые 2 элемента

Скажем, у меня есть

block: [a 1 b 2 c 3]

я хочу

[1 2 3]

Что-то вроде этого неуклюже, и это не работает, потому что я использую тип слова (я бы хотел, чтобы это слово было словом, а не строкой):

  block: [a 1 b 2 c 3]
  block2: []

  counter: -1
  foreach 'element block [
    counter: negate counter
    if counter append block2 element
  ]

person user310291    schedule 17.11.2017    source источник
comment
Помимо функции EXTRACT (см. Ниже), ваше обходное решение снова будет выглядеть более элегантно с COLLECT: collect [foreach [key value] block [keep value]]   -  person rgchris    schedule 17.11.2017


Ответы (1)


Функция ЭКСТРАКТ должна соответствовать всем требованиям:

>> extract/index [a 1 b 2 c 3] 2 2
== [1 2 3]

Он довольно универсален для такого рода вещей.

>> help extract
USAGE:
     EXTRACT series width

DESCRIPTION: 
     Extracts a value from a series at regular intervals. 
     EXTRACT is a function! value.

ARGUMENTS:
     series       [series!] 
     width        [integer!] "Size of each entry (the skip)".

REFINEMENTS:
     /index       => Extract from an offset position.
        pos          [integer!] "The position".
     /into        => Provide an output series instead of creating a new one.
        output       [series!] "Output series".
person rgchris    schedule 17.11.2017