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