rebol document

Глава 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]]

Updated 8-Apr-2005 - Copyright REBOL Technologies - Formatted with MakeDoc2
REBOL.com Documents Manual Dictionary Library Feedback