REBOL 3/Скрипты REBOL 3
Файловый суффикс
[править]Можно обойтись без расширения файла, но современные платформы так исторически устроены, что активно используют суффикс, например, для операций открытия и редактирования файлов. В этом случае, легче корректно интерпретировать их. REBOL файлы имеют расширение .r и оно используется функциями инсталляции для ассоциации файлов с системой. Кроме того подразумевается, что файлы находятся в стандартной директории с именем REBOL . Однако соглашение в отношении суффикса не принципиально и файлы могут иметь любое расширение. И, безусловно, что вам доступны файлы в любом другом месте, при определенных условиях. Код «языка» REBOL не имеет официального MIME типа. Поскольку MIME тип используются веб-страницами и браузерами, то неофициально существует такой тип:
text/rebol
Вообще, это обосновано для медийных типов, работающих с бинарным кодом, но для интерпретации текстовых данных не существенно. Тем не менее, в системе REBOL также возможен GUI код, презентации, базы данных и их комбинации, поэтому некоторый MIME класс имеет место, как в XML или HTML.
Структура
[править]Структура скрипта свободна. Разметка и форматирование могут быть использованы для упрощения понимания структуры и содержания скрипта. Поощряется использование стандартных стилей конструирование скриптов с большей универсальностью читабельности. Здесь еще будут приводится образцы часто используемых конструкций — header / body, including files, forward references, data creation, encoding Unicode, BOM.
Заголовки
[править]Прямо предшествуют телу скрипта. Каждый скрипт должен иметь заголовок, чтобы определить назначение и другие аттрибуты скрипта. Заголовок может содержать имя скрипта, автора, данные, версию, имя файла, дополнительную информацию. В REBOL-файлах данных, которые не связаны прямым определением не требуется заголовка. Заголовки используются по нескольким причинам:
- Они устанавливают скрипт как существующий валидный ресур текст для REBOL-интерпретатора
- Интерпретатор использует заголовок чтобы выводить название скрипта и определяет какие ресурсы и версия требуется перед его определением
- Заголовок предоставляет стандартный путь для связи названия, назначения, автора и другие детали скриптов. Вы можете часто из заголовка скрипта понять, что интересно вам.
- Скрипт архивируется и web сайты используют заголовки для генерации директориев скрипта, категорий и ссылочных отношений
- В некоторых текстовых редакторах доступны преобразования заголовка, который содержит информацию об авторе, дате, версии и истории.
Общая форма заголовка скрипта выглядит так:
REBOL [block]
Чтобы интерпретатор узнал заголовок, блок должен следовать за словом REBOL. Только следует поставить пробел (пространство, табуляцию или линии) между словом и блоком. Блок, что следует за словом REBOL есть объект дефиниция, которая описывает скрипт. Предпочтительный минимальный заголовок:
REBOL [ Title: "Scan Web Sites" Date: 2-Feb-2000 File: %webscan.r Author: "Jane Doer" Version: 1.2.3 ]
Когда скрипт загружен, определяется заголовочный блок как множество слов с их определенными значениями. Эти значения используются интепретатором и могут также использоваться самим скриптом. Определенные слова как простые значения также могут определяться как сложные значения, предоставленные в блоке:
REBOL [ Title: "Scan Web Sites" Date: 12-Nov-1997 Author: ["Ema User" "Wasa Writer"] ]
Заголовок может быть более сложным, предоставлять информацию об авторе, копирайте, форматировании, требуемой версии, истории ревизий и так далее. Блок, используемый для конструирования заголовка — объект и может расширяться новой информацией. Полный заголовок может выглядеть похожим на этот:
REBOL [ Title: "Full REBOL Header Example" Date: 8-Sep-1999 Name: 'Full-Header ; For window title bar Version: 1.1.1 File: %headfull.r Home: http://www.rebol.com/rebex/ Author: "Carl Sassenrath" Owner: "REBOL Headquarters" Rights: "Copyright (C) Carl Sassenrath 1999" Needs: [2.0 ODBC] Tabs: 4 Purpose: { The purpose or general reason for the program should go here. } Note: { An important comment or notes about the program can go here. } History: [ 0.1.0 [5-Sep-1999 "Created this example" "Carl"] 0.1.1 [8-Sep-1999 {Moved the header up, changed comment on extending the header, added advanced user comment.} "Carl"] ] Language: 'English ]
Аргументы
[править]Когда скрипт вычисляется (развертывается) он имеет доступ к информации о себе, которая находится в объекте system/script. Объект содержит список полей:
- Header — заголовок скрипта
- Parent — объект родительского скрипта, если скрипт развертывает другой скрипт
- Path — путь директорий файл или URL где осуществляется вычисление скрипта
- Args — аргументы скрипта, которые передаются командной строкой операционной системе или функции do, которая развертывает скрипт
Пример:
print system/script/title print system/script/header/date do system/script/args do system/script/path/script.r
Последнем пример демонстрирует некоторый путь, где скрипт script.r выполняется в настоящее время.
Программные опции
[править]Скрипты имеют доступ к опциям, предоставляемым интепретатором. Они находятся в объекте system/options. Объект содержит следующие поля:
- home — путь, определяемый как переменная окружения вашей операционной системы или (системного регистра для определенных типов ОС). Путь используется для нахождения файлов rebol.r и user.r
- script — имя файла, предоставляющего запущенному интепретатору скрипт
- path — путь к текущей директории
- args — аргументы, предоставляемые интепретатору в командной строке
- do-arg — строка как аргумент --do опции командной строки
Объект содержит и другие опции. Тип:
probe system/options
Примеры, содержащие опции объекта:
print system/options/script probe system/options/args print system/options/home/user.r
Выполнение
[править]Существует два способа выполнить скрипт: инициализировать его в работающем интерпретаторе или функцией do.
rebol script.r
Или:
do %script.r do http://www.rebol.com/script.ru
do функция возвращает результат, когда завершит определение. Не забывайте о правильном заголовке REBOL в файле скрипта.
Загрузка
[править]Файл скрипта может быть загружен как данные без выполнения. Это делается функцией load, которая читает текст файла и транслирует переменные в значения, слова и блоки. Ее результатом будет блок, в котором просто есть значения и они могут быть возвращены. Аргументы функции это имя файла, URL или строка.
load %script.r load %datafile.txt load http://www.rebol.org/script.r load "print now"
Итак load функция:
- читает текст из файла, URL или строки
- ищет заголовок, если есть
- транслирует данные
- возвращает блок, содержащий значения
Например, если файл скрипта buy.r содержит текст:
Buy 100 shares at $20.00 per share
То он может быть загружен из командной строки:
data: load %buy.r
Результат загрузки в боке:
probe data [Buy 100 shares at $20.00 per share]
Это пример диалекта REBOL, не осуществляющего напрямую выполнение кода. Файлу не требуется заголовок при загрузке, который необходим при выполнении. Функция load имеет параметры:
- /header — включает заголовок, если он представлен
- /next — загружает только следующее значение (одно за раз)
- /marup — обрабатывает файл как текст разметки (XML, HTML), заключая теги в блоки
То есть можно возвратить и заголовок скрипта, который будет возвращен как первый аргумент и при использовании параметра next возвратит два значения. Наконец, пример с использованием load/markup:
<title>Example</title> probe data [<title>Example</title>]
Сохранение
[править]load функция загружает данные, которые могут быть записаны в ресурсном текст формате. Фантастическая возможность создания внутренней мини базы! Функция save имеет два аргумента: имя файла и либо блок, либо сохраняемое значение.
data: [Buy 100 shares at §20.00 per share] save %data.r data
Соответственно позднее:
data: load %data.r
Так можно перегружать простые данные, например, stamp:
save %data.r now stamp: load %data.r
Простые значения не требуют скобок. Можно сохранить файл скрипта с заголовком, тогда функция используется с параметром
header: [Title: "Example"] save/header %data.r data header
Функция save имеет еще такие параметры: /all, /flat и /only.
Хранилище данных
[править]В продолжение темы хранения данных мы видим, что файлы можно использовать как хранилище данных. Формат простой. Заголовок не требуется. Используются функции load/all и save. Следует заметить, что REBOL может работать с файлами в сотни Гб. В дальнейшем будут продемонстрированы приемы сжатия, конвертации и криптографии. Планируется развитие данной темы.
Комментарии
[править]Комментарии используются для пояснений назначений секций скрипта. REBOL предоставляет несколько типов комментариев:
- in headers — каждый скрипт начинается с заголовка, где имеется возможность описать общую информацию о скрипте
- in functions — это часть спецификации function! используемой help, рекомендуется всегда комментировать название функции и аргументы
- embedded — комментарии внедренные в код и могут быть там, когда код загружен
- lexical — лексические комментарии возникают в ресурсах кода и освобождаются от кода при загрузке
Лексические комментарии делаются точкой с запятой:
zertplex: 10 ; set to the highest quality
Внедренные комментарии в фигурных скобках:
{ This is long multilined comment. }
Такая техника работает, когда строки не интерпретируются как аргументы функций. Если вы хотите быть уверенными в том, чтобы сложный комментарий не интерпретировался как код, можно перед строкой указать слово comment:
comment { This is a long multilined comment }
Функция comment указывает игнорировать следующий блок или строку. Внимание! Строка и блок — актуальные части скрипта. Будьте аккуратны при использовании места в данных блока, потому что они становятся частью этих данных!
Оптимизация
[править]Имеется ввиду процедура cleanup, форматирование скрипта с принятыми в сообществе рекомендациями. В библиотеке примеров имеется пример короткого скрипта, который для этого предназначен. Его можно посмотреть здесь. На тему оптимизации функций смотрите Rebcode. В принципе, скрипт формируется свободно, вы можете предпочитать только командную строку, расщеплять его или соединять в одну длинную строку. Интерпретатору безразличны человеческие проблемы. Но на самом деле, следовать рекомендациям более важная вещь, чем кажется на первый взгляд. Читабельность кода — это критерий его качества и основания для повторного использования. Такой код легче читать, поддерживать и изменять. В следующей секции подробнее о рекомендациях по форматированию. Смотрите примеры!
Рекомендации по стилю
[править]Структурируйте для ясности содержание. Квадратных скобок блоков для ясности содержание не достаточно. Априори они связаны с синтаксисом, который определяет блок, но не содержание. Кроме того существует пространство между блоками, где скобки отсутствуют. Там где есть возможность, открывайте скобки для строк, ассоциируемых с выражениями. закрывающая скобка должна выражать больше, чем просто уровень, но и глубину. Это в равной мере относится и к круглым и фигурным скобкам. Старайтесь выделять связные выражения и сгруппированные. Аккуратно используйте переносы.
Стандартная табуляция REBOL — четырех-пробельная. Существуют различные редакторы, где вы можете изменять предпочтительные настройки.
Де-табуляция прежде переноса — символ табуляции ASCII 9 не идентичен четырем пробелам во многих обозревателях, поэтому используйте редактор или REBOL функции для де-табуляции перед опубликованием.
Предел длины строки в 80 символов легче прочитать в портативных редакторах и в той же электронной почте. Кроме того, длинные строки создают проблемы при загрузке.
Имена слов — демонстрируют ваш код. Относитесь к выбору имен очень критично. Имя должно быть кратким и ясным. Когда есть возможность используйте слова естественных языков. В простом прямой путь.
Используйте краткие слова, связанные со смыслом. Причем локальные слова могут быть короче простых слов, а длинные лучше использовать для глобальных слов. Используйте целые слова, где только возможно. Не стремитесь сокращать слова. Слово — редкая ценность!
Имена сложных слов иностранного происхождения используются стандартным стилем, но не символами, а используя тире.
Начинайте имена функций с глаголов. Только потом местоимения, наречия и прилагательные. Некоторые существительные могут использоваться как глаголы. Начинайте слова данных с существительных. Это слова для объектов и переменных, содержащих данные. Они могут включать модификаторы (прилагательные) при необходимости.
Используйте стандартные имена!
Заголовки скриптов используйте самым активным образом. Они позволяют другим скриптам использовать информацию, например, при каталогизации. Заголовки функций, как правило обеспечиваюся специальными блоками для строк в пределах 70 символов и меньше. В них описываются типы значений функции и значения нормального возврата.
Имена файлов. Лучший способ — подумать о том, как вы найдете файл через несколько месяцев. Часто достаточно коротких и ясных имен. Не забывайте, что имена файлов участвуют в директориях. Связывайте их с общими словами.
Примеры внедрений. Показывайте в скрипте примеры, как его быстро верифицировать и корректно использовать в других системах.
Отладка внедрений. Часто используется для построения отладочных функций как порт скрипта. Особенно в сети и для файлов, содержащих скрипты, которые посылают и записывают файлы для тестов. Такие тесты могут быть возможны с контрольными переменными в голове скрипта.
Минимизация глобалов. В больших скриптах и, вообще, где только возможно избегайте использовать глобальные имена, которые доставляют внешние выражения другим моделям и функциям. Это всегда практично для коротких скриптов, но помните, что короткий скрипт может каждый раз вызывать скрипт, который длиннее. Когда используете коллекцию глобальных переменных, то закрывайте отношения с используемыми объектами, которые держат треки.
Для каждой рекомендации разработчики языка приводят примеры, которые можно посмотреть здесь.
Внедрение
[править]REBOL даёт возможность внедрить скрипт в другие тексты, такие, например, как web-страницы. Ваш скрипт найдет их и выполнится.
Текст прежде заголовка. Текст скрипта не требуется начинать с заголовка. Его можно внедрять в любом месте текста, это позволяет вставлять скрипты в почтовые сообщения, web -страницы и другие файлы. Заголовок отмечает начало скрипта, а текст, который следует за ним и есть тело скрипта. Текст, находящийся перед заголовком, называется preface и игнорируется в течении выполнения.
Выполнение в виде Unix shell-скрипта — ещё один распространённый случай.
Текст прежде и после. Когда скрипт следует за текстом, не имеющем отношения к скрипту, скрипт должен быть заключен в квадратные скобки. Смотрите примеры описанных ситуаций здесь.