rebol document

Глава 3 - Краткий обзор

REBOL/Core Руководство пользователя
Основное содержание
Send Us Feedback

Содержание:

1. Обзор
2. Значения
2.1 Числа
2.2 Время
2.3 Даты
2.4 Деньги
2.5 Кортежи
2.6 Строки
2.7 Теги
2.8 Адреса электронной почты
2.9 Ссылки (URL)
2.10 Имена файлов
2.11 Пары
2.12 Выпуски
2.13 Двоичные
3. Слова
4. Блоки
5. Переменные
6. Оценка
7. Функции
8. Пути
9. Объекты
10. Сценарии
11. Файлы
12. Сеть
12.1 HTTP
12.2 FTP
12.3 SMTP
12.4 POP
12.5 NNTP
12.6 Daytime
12.7 Whois
12.8 Finger
12.9 DNS
12.10 TCP

1. Обзор

Эта глава предоставляет быстрый способ познакомиться с языком REBOL. На примерах в этой главе представлены основные концепции и структура языка, иллюстрирующие все, от значений данных до выполнения сетевых операций.

2. Значения

Сценарий написан с последовательностью значения. Существует множество значений, и многие из них вам знакомы из повседневного опыта.

По возможности, REBOL также позволяет использовать международные форматы для значений, таких как десятичные числа, деньги, время и дата.

2.1 Цифры

Числа записываются в виде целых чисел, десятичных знаков или экспоненциальной записи. Например:

1234 -432 3.1415 1.23E12

А также можно написать в европейском формате:

123,4 0,01 1,2E12

2.2 Время

Время записывается в часах и минутах с необязательными секундами, каждое из которых разделено двоеточиями. Например:

12:34 20:05:32 0:25.345 0:25,345

Секунды могут включать дробную долю секунды. Время также может включать AM и PM без промежуточных пробелов:

12:35PM 9:15AM

2.3 Даты

Даты записываются в международном формате: день-месяц-год или год-месяц-день. Дата также может включать время и часовой пояс. Название или аббревиатура месяца могут использоваться, чтобы сделать его формат более узнаваемым в США. Например:

20-Apr-1998 20/Apr/1998 (как в  США)

20-4-1998 1998-4-20     (международное)

1980-4-20/12:32         (дата со временем)

1998-3-20/8:32-8:00     (с часовым поясом)

2.4 Деньги

Деньги записываются как необязательный международный трехбуквенный символ валюты, за которым следует числовая сумма. Например:

$12.34  USD$12.34  CAD$123.45  DEM$1234,56 

2.5 Кортежи

Кортежи используются для номеров версий, значений цвета RGB и сетевых адресов. Они записываются как целые числа от 0 до 255 и разделены точками. Например:

2.3.0.3.1  255.255.0  199.4.80.7

Требуются как минимум две точки (иначе число будет интерпретировано как десятичное значение, а не как кортеж). Пример:

2.3.0  ; кортеж
2.3.   ; кортеж
2.3    ; десятичное

2.6 Строки

Строки записываются в однострочном или многострочном формате. Строки однострочного формата заключаются в кавычки. Строки многострочного формата заключаются в фигурные скобки. Строки, содержащие кавычки, табуляторы или разрывы строк, должны быть заключены в фигурные скобки в многострочном формате. Например:

"Вот однострочная строка"

{Вот многострочная строка,
содержит "строку" в кавычках.}

Специальные символы (escape-символы) внутри строк обозначаются символом вставки (^). Смотрите Раздел, посвященный строкам, в главе «Значения» для получения таблицы управляющих последовательностей.

2.7 Теги

Теги полезны для языков разметки, таких как XML и HTML. Теги заключаются в угловые скобки. Например:

<title> </body>

<font size="2" color="blue">

2.8 Адреса электронной почты

Адреса электронной почты пишутся прямо в REBOL. Они должны включать знак "@". Например:

info@rebol.com

pres-bill@oval.whitehouse.gov

2.9 Ссылки (URL)

REBOL принимает большинство типов URL-адресов в Интернете. Они начинаются с имени схемы (например, HTTP), за которым следует путь. Например:

http://www.rebol.com

ftp://ftp.rebol.com/sendmail.r

ftp://freda:grid@da.site.dom/dir/files/

mailto:info@rebol.com

2.10 Имена файлов

Перед именами файлов стоит знак процента, чтобы отличать их от других слов. Например:

%data.txt

%images/photo.jpg

%../scripts/*.r

2.11 Пары

Пары используются для обозначения пространственных координат, например положения на дисплее. Они используются для обозначения позиций и размеров. Координаты разделены знаком x . Например:

100x50

1024x800

-50x200

2.12 Выпуски

Выпуск связаны с идентификационными номерами, такими как номера телефонов, номера моделей, номера кредитных карт. Например:

#707-467-8000

#0000-1234-5678-9999

#MFG-932-741-A

2.13 Двоичные

Двоичные значения - это байтовые строки любой длины. Их можно закодировать напрямую в шестнадцатеричном формате или в формате base-64. Например:

#{42652061205245424F4C}

64#{UkVCT0wgUm9ja3Mh}

3. Слова

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

show next image

Install all files here

Country State City Street Zipcode

on off true false one none

REBOL не имеет ключевых слов; нет никаких ограничений на то, какие слова используются или как они используются. Например, вы можете определить свою собственную функцию с именем print и использовать ее вместо предопределенной функции для печати.

Слова не чувствительны к регистру и могут включать дефисы и некоторые другие специальные символы, такие как:

+ - `  * ! ~ & ? |

Следующие примеры иллюстрируют допустимые слова:

number?  time?  date!
image-files  l'image
++ -- == +-
***** *new-line*
left&right left|right

Конец слова обозначается пробелом, разрывом строки или одним из следующих символов:

[ ] ( ) { } " : ; /

В словах нельзя использовать следующие символы:

@ # $ % ^ ,

4. Блоки

REBOL состоит из группировки значений и слов в блоки. Блоки используются для кода, списков, массивов, таблиц, каталогов, ассоциаций и других последовательностей.

Блок - это тип серии, который представляет собой набор значений, организованных в определённом порядке.

Блок заключён в квадратные скобки []. Внутри блока значения и слова могут быть организованы в любом порядке и могут охватывать любое количество строк. Следующие примеры иллюстрируют допустимые формы блоков:

[белый красный зеленый синий желтый оранжевый черный]

["Спилберг" "Назад в будущее" 1:56:20 MCA]

[
    Ted    ted@gw2.dom   #213-555-1010
    Bill   billg@ms.dom  #315-555-1234
    Steve  jobs@apl.dom  #408-555-4321
]

[
    "Elton John"  6894  0:55:68
    "Celine Dion" 68861 0:61:35
    "Pink Floyd"  46001 0:50:12
]

Блоки используются как для кода, так и для данных, как показано в следующих примерах:

loop 10 [print "hello"]

if time > 10:30 [send jim news]

sites: [
    http://www.rebol.com [save %reb.html data]
    http://www.cnn.com   [print data]
    ftp://www.amiga.com  [send cs@org.foo data]
]

foreach [site action] sites [
    data: read site
    do action
]

Сам файл сценария также является блоком. Блок подразумевается, хотя и не включает скобки. Например, если следующие строки были помещены в файл сценария:

красный 
зелёный 
синий 
жёлтый

Когда файл загружен, это будет блок, содержащий слова красный, зелёный, синий и жёлтый. Это эквивалентно написанию:

[красный зелёный синий жёлтый]

5. Переменные

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

возраст: 22
обеденное_время: 12:32
день_рождения: 20-Mar-1997
друзья: ["Женька" "Пашка" "Светка"]

Переменная может относиться к любому типу значения, включая функции (см. Функции) и объекты (см. Объекты).

Переменная относится к определенному значению только в определенном контексте, таком как блок, функция или вся программа. Вне этого контекста переменная может ссылаться на какое-то другое значение или вообще не иметь значения. Контекст переменной может охватывать всю программу или ограничиваться конкретным блоком, функцией или объектом. В других языках контекст переменной часто называют областью действия переменной.

6. Оценка

Блоки выполняются для вычисления их результатов. Когда блок выполняется, то получаются значения его переменных. В следующих примерах оцениваются переменные возраст , обеденное_время , день_рождения и друзья, которые были определены в предыдущем разделе:

print возраст
22
if now/time > обеденное_время [print обеденное_время]
12:32
print third друзья
Светка

Блок можно выполнить несколько раз с помощью цикла, как показано в следующих примерах:

loop 10 [prin "*"]  ;("prin" это не опечатка, см. руководство)
**********
loop 20 [
    wait 8:00
    send friend@rebol.com read http://www.cnn.com
]

repeat count 3 [print ["Счёт:" count]]
Счёт: 1
Счёт: 2
Счёт: 3

Оценка блока возвращает результат. В следующих примерах 5 и PM являются результатами оценки каждого блока:

print do [2 + 3]
5
print either now/time < 12:00 ["AM"]["PM"]
PM

В REBOL нет специальных правил приоритета операторов для оценки блоков. Значения и слова блока всегда оцениваются от первого до последнего, как показано в следующем примере:

print 2 + 3 * 10
50

Можно использовать скобки для управления порядком вычисления, как показано в следующих примерах:

2 + (3 * 10)
32
(length? "boat") + 2
6

Вы также можете оценить блок и вернуть каждый результат, который был вычислен в нем. Это цель функции reduce:

reduce [1 + 2  3 + 4  5 + 6]
3 7 11

7. Функции

Функция - это блок с переменными, которым при каждом запуске блока присваиваются новые значения. Эти переменные называются аргументами функции.

В следующем примере слово sum устанавливается для ссылки на функцию, которая принимает два аргумента, a и b:

sum: func [a b] [a + b]

В приведенном выше примере func используется для определения новой функции. Первый блок функции описывает аргументы функции. Второй блок - это блок кода, который выполняется при вызове функции. В этом примере второй блок складывает два значения и возвращает результат.

В следующем примере показано одно использование функции sum, которая была определена в предыдущем примере:

print sum 2 3
5

Некоторым функциям нужны локальные переменные, а также аргументы. Чтобы определить этот тип функции, используйте function вместо func, как показано в следующем примере:

average: function [series] [total] [
    total: 0
    foreach value series [total: total + value]
    total / (length? series)
]

print average [37 1 42 108]
47

В приведённом выше примере слово series является аргументом, а слово total - локальной переменной, используемой функцией для расчётов.

Блок аргументов функции может содержать строки, описывающие назначение функции и её аргумент, как показано в следующем примере:

average: function [
    "Возвращает среднее числовое значение"
    series "числа для расчёта среднего"
] [total] [
    total: 0
    foreach value series [total: total + value]
    total / (length? series)
]

Эти описательные строки сохраняются вместе с функцией, и их можно просмотреть, запросив помощь по функции, как показано ниже:

help average
ИСПОЛЬЗОВАНИЕ:
    AVERAGE series
ОПИСАНИЕ:
    Возвращает среднее числовое значение
    AVERAGE is a function value.
АРГУМЕНТЫ:
    series -- числа для усреднения (Тип: любой)

8. Пути

Если вы используете файлы и URL-адреса, то вы уже знакомы с концепцией путей. Путь предоставляет набор значений, которые используются для перехода от одной точки к другой. В случае файла путь определяет маршрут через набор каталогов к местоположению файла. В REBOL значения в пути называются refinements(уточнения).

Косая черта (/) используется для разделения слов и значений в пути, как показано в следующих примерах пути к файлу и пути URL:

%source/images/globe.jpg

http://www.rebol.com/examples/simple.r

Пути также можно использовать для выбора значений из блоков, выбора символов из строк, доступа к переменным в объектах и ​​уточнения работы функции, как показано в следующих примерах:

USA/CA/Ukiah/size (выбор блока)
names/12          (позиция в строке)
account/balance   (функция объекта)
match/any         (опция функции)

Функция print в следующем примере показывает простоту использования пути для доступа к мини-базе данных, созданной из нескольких блоков:

towns: [
    Hopland [
        phone #555-1234
        web   http://www.hopland.ca.gov
    ]

        Ukiah [
        phone #555-4321
        web   http://www.ukiah.com
        email info@ukiah.com
    ]
]

print towns/ukiah/web
http://www.ukiah.com

9. Объекты

Объект - это набор переменных, которые имеют определённые значения в контексте. Объекты используются для управления структурами данных и более сложным поведением. В следующем примере показано, как банковский счёт настраивается как объект для определения его атрибутов и функций:

аккаунт: make object! [
  имя: "Джеймс"
  баланс: $100
  ss-номер: #1234-XX-4321
  депозит:  func [amount] [баланс: баланс + amount]
  снятие: func [amount] [баланс: баланс - amount]
]

В приведённом выше примере слова имя, баланс, ss-номер, депозит и снятие являются локальными переменными объекта аккаунт. Депозит и снятие это функции, которые определены в пределах объекта. Доступ к переменным аккаунта можно получить по пути, как показано в следующем примере:

print аккаунт/баланс
$100.00
аккаунт/депозит $300

print ["Баланс " аккаунт/имя " составляет " аккаунт/баланс]
Баланс Джеймс составляет $400.00

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

другой-аккаунт: make аккаунт [
    баланс: $2000
]

Обратите внимание, что новый объект называется другой-аккаунт, и он разделяет значения исходного аккаунта, но предоставляет новую сумму баланса.

Так же легко вы можете создать новый объект, который расширяет старый объект, добавляя новые переменные для названия банка и даты последней активности:

другой-аккаунт: make аккаунт [
    банк: "ООО Банк"
    дата-посещения: 20-Jun-2000
]

print другой-аккаунт/баланс
$2000.00
print другой-аккаунт/банк
ООО Банк
print другой-аккаунт/дата-посещения
20-Jun-2000

10. Скрипты

Сценарий - это файл, содержащий блок, который можно загрузить и оценить. Блок может содержать код или данные и обычно содержит ряд подблоков.

Сценариям требуется заголовок для определения наличия кода. Заголовок может включать имя сценария, дату и другую информацию. В следующем примере сценария первый блок содержит информацию заголовка:

REBOL [
    Title: "Детектор изменения веб-страницы"
    File:  %webcheck.r
    Author: "Reburu"
    Date:  20-May-1999
    Purpose: {
        Определить, изменилась ли веб-страница с момента 
        последней проверки, и если да, то отправить новую страницу 
        по электронной почте. 
    }
    Category: [web email file net 2]
]

page: read http://www.rebol.com

page-sum: checksum page

if any [
    not exists? %page-sum.r
    page-sum <> (load %page-sum.r)
][
    print ["Страница изменена" now]
    save %page-sum.r page-sum
    send luke@rebol.com page
]

11. Файлы

В REBOL к файлам легко получить доступ. В следующей таблице описаны некоторые способы доступа к файлам.

Вы можете прочитать текстовый файл с помощью:

data: read %plan.txt

Вы можете отобразить текстовый файл с помощью:

print read %plan.txt

Чтобы написать текстовый файл:

write %plan.txt data

Например, вы можете записать текущее время с помощью:

write %plan.txt now

Вы также можете легко добавить в конец файла:

write/append %plan data

Двоичные файлы можно читать и записывать с помощью:

data: read/binary %image.jpg

write/binary %new.jpg data

Чтобы загрузить файл как блок или значение REBOL:

data: load %data.r

Сохранить блок или значение в файл так же просто:

save %data.r data

Чтобы запустить файл как сценарий (для этого нужен заголовок):

do %script.r

Вы можете прочитать каталог файлов с помощью:

dir: read %images/

а затем вы можете отобразить имена файлов с помощью:

foreach file dir [print file]

Чтобы создать новый каталог:

make-dir %newdir/

Чтобы узнать текущий путь к каталогу:

print what-dir

Если вам нужно удалить файл:

delete %oldfile.txt

Вы также можете переименовать файл с помощью:

rename %old.txt %new.txt

Чтобы получить информацию о файле:

print size? %file.txt

print modified? %file.txt

print dir? %image

12. Сеть

В REBOL встроено несколько Интернет-протоколов. Эти протоколы просты в использовании и требуют очень мало знаний о работе в сети.

12.1 HTTP

В следующем примере показано, как использовать протокол HTTP для чтения веб-страницы:

page: read http://www.rebol.com

В следующем примере изображение загружается с веб-страницы и записывается в локальный файл:

image: read/binary http://www.page.dom/image.jpg

write/binary %image.jpg image

12.2 FTP

Следующее читает и записывает файлы на сервер, используя протокол передачи файлов (FTP):

file: read ftp://ftp.rebol.com/test.txt

write ftp://user:pass@site.dom/test.txt file

В следующем примере получается список каталогов с FTP:

print read ftp://ftp.rebol.com/pub

12.3 SMTP

В следующем примере отправляется письмо на электронную почту, с помощью простого протокола передачи почты (SMTP):

send luke@rebol.com "Используй силу."

В следующем примере текст файла отправляется по электронной почте:

send luke@rebol.com read %plan.txt

12.4 POP

В следующем примере выполняется выборка электронной почты по протоколу почтового отделения (POP) и печать всех текущих сообщений. Сообщения остаются на сервере:

foreach message read pop://user:pass@mail.dom [
    print message
]

12.5 NNTP

В следующем примере извлекаются новости по сетевому протоколу передачи новостей (NNTP), читаются все новости в определённой группе новостей:

messages: read nntp://news.server.dom/comp.lang.rebol

В следующем примере считывается и печатается список всех групп новостей:

news-groups: read nntp://news.some-isp.net

foreach group news-groups [print group]

12.6 Daytime

Следующий пример получает текущее время с сервера:

print read daytime://everest.cclabs.missouri.edu

12.7 Whois

В следующем примере выясняется, кто отвечает за домен, используя протокол whois:

print read whois://rebol@rs.internic.net

12.8 Finger

Следующий пример получает информацию о пользователе с помощью протокола finger:

print read finger://username@host.dom

12.9 DNS

В следующем примере определяется интернет-адрес из доменного имени и доменное имя из адреса:

print read dns://www.rebol.com

print read dns://8.8.8.8

12.10 TCP

В REBOL также возможны прямые соединения с TCP/IP. Следующий пример представляет собой простой, но полезный сервер, который ожидает подключения к порту, а затем выполняет все, что было отправлено:

server-port: open/lines tcp://:9999

forever [
    connection-port: first server-port
    until [
        wait connection-port
        error? try [do first connection-port]
    ]
    close connection-port
]

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