Создание серии чисел на красном языке

У меня есть несколько простых вопросов, поэтому я собираю их вместе:

  1. Как лучше всего создать серию чисел. Следующее работает, но есть ли более простой метод, такой как 1:10, доступный на некоторых языках?

    myseries: []

    repeat i 10 [append myseries i]

    print myseries

(1a. Почему приведенный выше код не создает обычный блок кода на этой странице?)

  1. Точно так же, как лучше всего создать серию из 10 элементов, инициализированных значением 0 или ""? Должен ли я использовать там также repeat i 10 или loop 10 и серийно append изначально пустую серию?

  2. Кроме того, должен ли я указывать количество элементов, как в следующем коде, при первоначальном создании серии? В чем недостаток этого не делать?

    myseries: сделать блок! 10

Спасибо за вашу помощь.


person rnso    schedule 10.10.2017    source источник
comment
Это определенно одна из вещей, которые, как мне кажется, должно быть проще сделать. Однако одна из причин, по которой это уже не так, заключается в том, что основное внимание уделяется непосредственному воздействию на данные, а не предварительному созданию ряда. Тем не менее, многие другие функции обработки массивов в моем списке пожеланий   -  person Geeky I    schedule 12.10.2017


Ответы (2)


1) На данный момент я не знаю лучшего способа, хотя на https://gitter.im/red/home обсуждаются диапазонные типы данных или для реализации

а) Делает блок. Вы видите это с probe myseries. Что вы ожидаете?

2) >> append/dup [] 0 10 == [0 0 0 0 0 0 0 0 0 0]

3) Если вы не инициализируете/не резервируете необходимую память, Red должен сделать предположение, сколько памяти необходимо. Это может быть больше, чем нужно или меньше. Если меньше, Red должен выделить еще один кусок памяти. Это может произойти несколько раз, если вам нужно больше памяти. Возможно, ему также придется перемещаться по блокам памяти, если ему нужна непрерывная память, но я не знаю об используемой стратегии.

person sqlab    schedule 11.10.2017

1) Я бы предпочел использовать COLLECT здесь:

myseries: collect [repeat i 10 [keep i]]

2) См. функцию ARRAY:

>> array/initial 10 0
== [0 0 0 0 0 0 0 0 0 0]

Вы также можете передать ему анонимную функцию:

>> i: 0 array/initial 10 does [i: i + 1]
== [1 2 3 4 5 6 7 8 9 10] 

3) Как правило, рекомендуется использовать myseries: make block! 10 (или просто 0, если размер блока неизвестен), чтобы избежать ненужных ошибок! См. Копировать или не копировать, вот в чем вопрос & Является ли REBOL чистым функциональным языком?

person draegtun    schedule 12.10.2017