Глава 7 - Серия блоков
REBOL/Core Руководство пользователя Основное содержание Отправьте нам отзыв
Содержание:
1. Блоки блоков
2. Пути для вложенных блоков
3. Массивы
3.1 Создание массивов
3.2 Начальные значения
4. Составление блоков
1. Блоки блоков
Когда блок отображается как значение в другом блоке, он считается одним значением независимо от того, сколько значений он содержит. Например:
values: [
"new" [1 2]
%file1.txt ["one" ["two" %file2.txt]]
]
probe values
["new" [1 2] %file1.txt ["one" ["two" %file2.txt]]]
Функция length? возвращает четыре значения. Второе и четвертое значения считаются отдельными значениями:
print length? values
4
Значения блоков в пределах values блока могут быть использованы в качестве блока, а также. В следующих примерах second используется для извлечения второго значения из values.
Чтобы распечатать блок, введите:
probe second values
[1 2]
Чтобы узнать длину блока, введите
print length? second values
2
Чтобы распечатать тип данных блока, введите:
print type? second values
block
Таким же образом операции с рядами могут выполняться с другими типами значений ряда в блоках. В следующих примерах pick используется для извлечения %file1.txt из values.
Чтобы посмотреть значение, введите:
probe pick values 3
%file1.txt
Чтобы посмотреть значение, введите:
print length? pick values 3
9
чтобы увидеть тип данных значения:
print type? pick values 3
file
2. Пути для вложенных блоков
Обозначение пути полезно для вложенных блоков.
Четвертое значение в values - это блок, содержащий другой блок. В следующих примерах используется путь для получения информации об этом значении.
Чтобы просмотреть вложенные значения, введите:
probe values/4
["one" ["two" %file2.txt]]
probe values/4/2
["two" %file2.txt]
Чтобы получить длину вложенных значений, введите:
print length? values/4
2
print length? values/4/2
2
Чтобы узнать, какой тип данных вложенного значения, введите:
print type? values/4
block
print type? values/4/2
block
Также можно получить доступ к двум значениям серий в блоке четвертого значения.
Чтобы посмотреть значения, введите:
probe values/4/2/1
two
probe values/4/2/2
%file2.txt
Чтобы получить длины значений:
print length? values/4/2/1
3
print length? values/4/2/2
9
Чтобы узнать, к какому типу данных относятся значения:
print type? values/4/2/1
string
print type? values/4/2/2
file
Чтобы изменить значения:
change (next values/4/2/1) "o"
probe values/4/2/1
too
change/part (next find values/4/2/2 ".") "r" 3
probe values/4/2/2
%file2.r
Приведенные выше примеры иллюстрируют способность REBOL работать со значениями, вложенными внутри блоков. Обратите внимание, что в последней серии примеров change используется для изменения строки и файловой серии на трех уровнях values. Распечатка блока значений дает:
probe values
["new" [1 2] %file1.txt ["one" ["too" %file2.r]]]
3. Массивы
Блоки используются для массивов.
Пример статически определенного двумерного массива:
arr: [
[1 2 3 ]
[a b c ]
[$10 $20 $30]
]
Вы можете получить значения массива с помощью функций извлечения ряда:
probe first arr
[1 2 3]
probe pick arr 3
[$10.00 $20.00 $30.00]
probe first first arr
1
Вы также можете использовать пути для получения значений из массива:
probe arr/1
[1 2 3]
probe arr/3
[$10.00 $20.00 $30.00]
probe arr/3/2
$20.00
Пути также можно использовать для изменения значений в массиве:
arr/1/2: 20
probe arr/1
== [1 20 3]
arr/3/2: arr/3/1 + arr/3/3
probe arr/3/2
== $40.00
3.1 Создание массивов
Функция array создает массивы динамически. Функция принимает аргумент, который является целым числом или блоком целых чисел, и возвращает блок, который является массивом. По умолчанию элементы массива инициализируются как none. Чтобы инициализировать ячейки массива каким-либо другим значением, используйте уточнение /initial, описанное в следующем разделе.
Когда в массив передается одно целое число, возвращается одномерный массив такого размера:
arr: array 5
probe arr
[none none none none none]
Когда предоставляется блок целых чисел, массив имеет несколько измерений. Каждое целое число обеспечивает размер соответствующего измерения.
Вот пример двумерного массива с шестью ячейками, двумя строками по три столбца:
arr: array [2 3]
probe arr
[[none none none] [none none none]]
Его можно превратить в трехмерный массив, добавив в блок еще одно целое число:
arr: array [2 3 2]
foreach lst arr [probe lst]
[[none none] [none none] [none none]]
[[none none] [none none] [none none]]
Блок целых чисел, передаваемый в array, может быть настолько большим, насколько поддерживает ваша память.
3.2 Начальные значения
Чтобы инициализировать ячейки массива значением, отличным от none , используйте уточнение /initial. Это уточнение принимает один аргумент: начальное значение. Вот некоторые примеры:
arr: array/initial 5 0
probe arr
[0 0 0 0 0]
arr: array/initial [2 3] 0
probe arr
[[0 0 0] [0 0 0]]
arr: array/initial 3 "a"
probe arr
["a" "a" "a"]
arr: array/initial [3 2] 'word
probe arr
[[word word] [word word] [word word]]
arr: array/initial [3 2 1] 11:11
probe arr
[[[11:11] [11:11]] [[11:11] [11:11]] [[11:11] [11:11]]]
4. Составные блоки
Функция compose удобна для создания блоков из динамических значений. Его можно использовать для создания как данных, так и кода.
Функция compose принимает блок в качестве аргумента и возвращает блок, который имеет каждое значение в блоке аргументов. Значения в скобках оцениваются перед возвратом блока. Например:
probe compose [1 2 (3 + 4)]
[1 2 7]
probe compose ["The time is" (now/time)]
["The time is" 10:32:45]
Если значения в круглых скобках возвращают блок, используются отдельные значения этого блока:
probe compose [a b ([c d])]
[a b c d]
Чтобы этого не произошло, нужно заключить результат в дополнительный блок:
probe compose [a b ([[c d]])]
[a b [c d]]
Пустой блок ничего не вставляет:
probe compose [a b ([]) c d]
[a b c d]
Когда compose дается блок, содержащий субблоки, субблоки не оцениваются, даже если они содержат круглые скобки:
probe compose [a b [c (d e)]]
[a b [c (d e)]]
Если вы хотите, чтобы субблоки оценивались, используйте уточнение /deep. Оно рафинирование вызывает все круглые скобки должны быть оценены, независимо от того, где они находятся:
probe compose/deep [a b [c (d e)]]
[a b [c d e]]
|