`

СПЕЦІАЛЬНІ
ПАРТНЕРИ
ПРОЕКТУ

Чи використовує ваша компанія ChatGPT в роботі?

BEST CIO

Определение наиболее профессиональных ИТ-управленцев, лидеров и экспертов в своих отраслях

Человек года

Кто внес наибольший вклад в развитие украинского ИТ-рынка.

Продукт года

Награды «Продукт года» еженедельника «Компьютерное обозрение» за наиболее выдающиеся ИТ-товары

 

"Иной" скриптинг

0 
 

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

Часть первая

Впрочем, это всего-навсего внешние красоты. Так, бывало, говорила моя матушка... настоящая красота, говорила
она, -- лишь порядок, любовь и свет.
С. Кинг

Давайте вспомним только названия скриптовых языков, с которыми мы уже успели обзорно познакомиться, -- Icon, Ruby, Lua, Tcl и не совсем "скриптовый" не совсем язык Forth. На самом деле скриптовых языков куда больше, и только перечень их наименований занял бы непозволительно много места. Конечно, можно наслаждаться и красотой конструкций, и изящностью реализаций многих языков, но... есть еще и жесткая реальность, зачастую вынуждающая нас отказаться от холодной красоты абстрактной математики в пользу элементарного удобства и соответствия инструмента задаче. Именно из этих соображений автор сугубо субъективно выбрал "на свой вкус" три абсолютно разных скриптовых языка, представляющих три аспекта применения современной технологии скриптинга: автоматизацию нетривиальных (но и не сложных) задач распределенной обработки информации, быстрое прототипирование приложений и, наконец, оптимизацию использования возможностей конкретной платформы. Субъективность выбора, естественно, ни в коей мере не означает безосновательное "мне так нравится": все разработки, предлагаемые читателю для дальнейшего самостоятельного изучения, соответствуют ряду весьма жестких требований. Во-первых, все они бесплатно доступны, во-вторых -- профессионально исполнены (это емкое определение означает как не поддающийся сомнению профессионализм их создателей, так и сомнительную в отношении любой достаточно универсальной программы оценку "качества"), в-третьих -- стабильны в своем развитии. Естественно, столкнувшись после такого обоснования с незнакомыми (или малознакомыми) названиями, читатель с вполне понятным подозрением может спросить: "А почему же столь замечательные разработки так мало известны?". На подобные риторические вопросы, к сожалению, одного исчерпывающего ответа быть не может...


Аспект первый

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

Как это обычно бывает, крохотная программка, дистрибутивная поставка которой занимает всего 179 KB (в формате zip), становится очень серьезным камнем преткновения. Конечно, катастрофическое несоответствие между размерами реализации и потенциальной функциональностью -- дело в скриптинге обычное. Но в случае с языком Rebol слово "катастрофический" не подходит... Впрочем, не будем отвлекаться и использовать отпугивающие раньше времени эпитеты и начнем по порядку.

"Иной" скриптинг
При каждом запуске на консоли Rebol отображается результат последовательности выполнения инициирующих поддержку сетевых протоколов операций

Автор Rebol -- личность без сомнения яркая и хорошо известная, но только не у нас. Пик его знаменитости пришелся на те времена, когда "железный занавес" был еще достаточно прочным. Карл Сазенрат (Karl Sassenrath), архитектор знаменитой Amiga OS -- первой многозадачной мультимедийной операционной системы, отдал Rebol почти 20 лет своей жизни! И, надо сказать, -- не зря. Сегодня эта программка-малютка совершенно одинаково работает чуть ли не на всех известных (и даже почти неизвестных) платформах (более сорока наименований), численность сообщества ее пользователей давно перевалила за "эпохальную" отметку в один миллион, а сам Rebol даже стал основой независимой от платформы сетевой операционной среды с более чем впечатляющими возможностями.

Знакомство с Rebol стоит начинать с преодоления первой трудности -- произношения названия, которое может показаться очевидным. Хотя бы потому, что эта трудность символична: очень многое в Rebol, что кажется слишком очевидным, скрывает за собой далеко не столь очевидные вещи. Итак, название "Rebol" правильно произносится как... "rebel yell", и правило это свято соблюдается многочисленной армией пользователей.

Вторая трудность на деле трудностью не является и заключается в определении того, что мы назвали "аспектом применения". Несмотря на то что любой язык скриптового программирования обладает достаточной степенью универсальности, у каждого есть если не четко определенная, то четко "прорисованная" десятилетиями массового применения область, в которой этот язык соответствует решаемым задачам наилучшим образом. В случае с Rebol "аспект применения" известен изначально и определен самим создателем так: "Обмен и интерпретация информации в распределенных компьютерных системах". Звучит настораживающе емко для менее чем двухсоткилобайтовой программы, не правда ли? Но давайте прислушаемся к мнению автора куда более известного языка Perl -- Ларри Уолла (Larry Wall). Он, естественно, не очень жалует Rebol, но, тем не менее, говорит о нем так: "Rebol -- это фактически освобожденный от скобок вариант Lisp, включающий в себя очень полезные типы данных, например, адреса электронной почты, даты и URL. Как и всякий Lisp-подобный язык, Rebol некоторым может показаться слишком необычным..."

Сегодня язык функционального программирования Lisp утратил свою популярность 15--20-летней давности, поэтому даже его название может ни о чем не говорить многим. В основе этого языка лежит математическая строгость описания функции (именно как математического понятия), а следствие этой строгости -- иногда доводящая до исступления избыточность... скобок. Некогда бывшие одними из излюбленных инструментов "настоящих хакеров", реализации Lisp со временем разрослись до слишком больших масштабов и, как все динозавры, остались в прошлом. Но идеи языка живы во многих облегченных реинкарнациях, среди которых самой популярной сейчас остается Scheme.

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


Осторожно, Rebol!

Rebol -- это кокаин скриптовых языков. Я люблю его и не могу остановиться в его использовании...
Brian McGinty

Естественно, начинать изучать новый язык лучше всего с установки его реализации на свой компьютер. Тем более что размеры Rebol мизерны, а специфических требований к платформе у него, по сути, нет. Дистрибутив базовой поставки языка (бесплатный для персонального использования) Rebol Core можно получить по адресу www.rebol.com/download.html, пройдя ни к чему не обязывающую процедуру предварительной регистрации. Установка системы элементарна для любых ОС -- собственно, никаких специальных процедур нет вообще, достаточно просто распаковать файл в выбранный каталог.

"Иной" скриптинг
Консоль Rebol весьма функциональна, она позволяет полноценно использовать общесистемный clipboard, поддерживает автодополнение имен слов, механизмы автодокументирования и является самодостаточной средой для разработки и отладки скриптов на языке Rebol

"Свежеустановленный" дистрибутив Rebol Core содержит один исполняемый файл впечатляющих размеров (rebol или rebol.exe в зависимости от платформы занимает почти целых 260 KB) и несколько готовых программ-скриптов. Все это дает почти самодостаточную среду одновременно разработки и выполнения Rebol-программ, включающую в себя реализацию собственной интерактивной консоли (даже с автодополнением длинных имен нажатием клавиши Tab). И, прежде чем вводить первую команду в этом окне, следует... запастись терпением. Потому что Rebol готовит массу неожиданностей, особенно для тех, кто уже знает один или несколько "обычных" языков.

Первая приятная неожиданность Rebol -- изобилие встроенных типов данных, свидетельствующее о том, что вы столкнулись с редким образчиком "языка Internet сверхвысокого уровня". В нем совершенно обычной процедурой является отправка одной строчкой командной строки e-mail и парой строчек -- получение и сложная фильтрация html-страницы указанного вами Internet-ресурса. Казалось бы, в этом нет ничего необычного, и, например, пользователей Unix-подобных ОС такими функциями удивить трудно. Но давайте вспомним, что мы уже знаем о Rebol, а именно -- о кросс-платформенности его реализации, -- и на секунду задумаемся: каким образом ее создателям удалось разработать столь мобильный платформенно-независимый механизм вызова сторонних программ для отправки/получения электронной почты и "закачки" с использованием HTTP-протокола, ведь это действительно весьма сложная проблема. И вот тут время удивиться первый раз, потому что ответ на данный вопрос крайне лаконичен -- "Никаким!". Rebol вообще "не умеет" вызывать сторонние программы, и вместо этого в своих неполных трехстах килобайтах инкапсулирует реализации основных сетевых протоколов -- DNS, Finger, Whois, Daytime, HTTP, SMTP, POP, FTP, NNTP, TCP и UDP. Но подождите удивляться сильно -- то ли еще будет. И раз мы начали говорить об изобилии типов данных, то приведем и их пока неполный перечень: число (целое и с плавающей точкой, в том числе и в научной форме записи, допускается так называемая "Европейская нотация", например "0,001"), время (в форматах "часы:минуты" и "часы:минуты:секунды"), дата (в американской и международной форме записи), деньги (а как же без такого типа данных), набор (tuple, короткое множество чисел, разделенных символом ".", используется для представления цветов в форме RGB или IP-адресов), строка, тег (да-да, те самые теги, применяющиеся в языке разметки HTML и мета-языке XML), адрес e-mail , URL, имя файла, пара (значение такого типа может хранить, например, информацию о координатах -- "100 100"), идентификационный номер (issue, значения начинаются с символа "#") и, наконец, бинарная величина (последовательности байтов произвольной длины). Пожалуй, ни один другой скриптовый язык ничем подобным не располагает...

Но встроенные реализации сетевых протоколов и базовые типы данных -- это далеко не все и даже не главное, что есть в Rebol. Наверное, главное -- то, что сам создатель языка назвал "dialecting" -- приспособленность к формированию диалектов (фактически -- определяемых пользователем специфических языков), обеспечиваемая "коктейлем" из объектно-ориентированных механизмов, глубинных элементов функционального программирования и "свободного" синтаксиса. О последнем стоит сказать особо -- в Rebol нет ни зарезервированных ключевых слов, ни зависимости от регистра, ни значимых непечатных символов.

Вероятнее всего, после такого ужасающе-впечатляющего (и все еще далекого от полноты) перечня характеристик и возможностей удержаться от запуска программы будет трудно, так что смело запускайте и выполните свои первые действия в среде Rebol -- конфигурирование. Не следует бояться этого страшного слова -- системный архитектор Amiga OS, заслуженно уважаемой за дружелюбие, и здесь "держит марку". Никакой правки криптографических plain-text конфигурационных файлов не будет -- интерпретатор Rebol запросит у вас ваш e-mail и адреса SMTP, POP и proxy-серверов. Покончив с данной процедурой, можете себя поздравить: вы пока не написали первой программы на Rebol, но приняли участие в ее автоматическом создании (ваша первая программа хранится в файле с именем user.r и является полноценным Rebol-скриптом).

Теперь ваша собственная среда Rebol полностью готова к работе, и наступила пора первого знакомства тет-а-тет. Для этого вам на первых порах понадобится знание всего двух команд -- "what" и "help". Набрав первую из них и "отдав" ее на выполнение интерпретатору нажатием клавиши Enter, вы "спровоцируете" неожиданную активность Rebol -- интерпретатор "вывалит" в окно длинный перечень имен предопределенных (или "встроенных", но это менее точно в случае Rebol) функций. О любой из них можно подробнее узнать с помощью функции "help", введя в консоли Rebol строку в формате "help имя_функции" и нажав Enter. Настало время удивиться еще раз -- не часто встретишь встроенный механизм самодокументирования, да еще и так просто и удобно выполненный, в языке с подобным размером реализации.


Слова...

Куда деваться от наглого
великолепия этих образов?
У. Эко

Понятие "переменная" -- одно из фундаментальных в любом языке программирования. В Rebol, естественно, переменные также есть, но вот называются они иначе -- "словами" (word). Со "словом" может ассоциироваться любое значение, а форма записи процедуры ассоциирования выглядит так:

слово: значение

Теперь можно испытать два механизма Rebol -- ассоциирования слов со значениями и функции определения типа значения, например, таким диалогом с Rebol (в котором вводимые строки обозначаются синим, а "ответы" интерпретатора -- красным цветом, пары символов >> "приглашение" и == "ответ" формируются системой):

>> M_CC: [email protected]
== [email protected]
>> type? M_CC
== email!
>> M_CC: 1024
== 1024
>> type? M_CC
== integer!

В первом действии мы создали "слово" M_CC и ассоциировали с ним значение строки "[email protected]". Во втором -- с помощью функции type? проверили тип ассоциированного со словом значения, и он оказался... адресом e-mail. Затем мы ассоциировали с тем же словом строку цифр "1024" и снова проверили тип: на этот раз он -- целое число.

Использованные нами в этом примере строки значений называются литералами. Rebol, естественно, допускает ассоциирование "слова" не только с литералом, но и со значением другого слова или результатом выполнения какой-либо операции. Например, сразу после проверки примера можно выполнить такой диалог:

>> M_CC_1: M_CC + 1024
== 2048
>> type? M_CC_1
== integer!
>> M_CC_1
== 2048

Здесь мы ассоциировали новое слово M_CC_1 с результатом, полученным вычислением суммы значения, ассоциированного со словом M_CC, со значением литерала "1024", при этом Rebol автоматически привел тип литерала к требуемому. Затем проверили тип ассоциированного со словом M_CC_1 значения и получили предсказуемый результат. А вот последнее действие говорит о слишком многом -- о многом настолько, что пришла пора на время покинуть среду Rebol, введя команду "quit". Потому что знакомство с простым закончилось, и начинается постижение сложных основ.

Казалось бы, "слова" Rebol ничем не отличаются от переменных любого интерпретируемого языка с так называемой динамической типизацией. Но создатели Rebol не случайно изменили терминологию... "Слова" в нем являются на самом деле минимальными вычисляемыми выражениями, а суть "вычисления" слова -- замена его ассоциированным значением. В интерактивном режиме использования Rebol результат этого вычисления получается незамедлительно (что и видно в последнем действии предыдущего примера), в неинтерактивных же скриптах для визуализации значения, ассоциированного со словом, нужно использовать функцию с очевидным именем print (которая, естественно, работает и в интерактивном режиме):

>> print M_CC_1
== 2048

И вот первый нюанс использования "слов" Rebol: например, вы хотите увидеть значение "слова" и затем что-то с данным значением сделать. Естественно, это можно реализовать поледовательностью операций -- сначала вывести значение функцией print, а затем выполнить действие. Но это будет не Rebol. В языке есть специальная функция probe, которая выводит "на печать" значение "слова" и... возвращает его же вызвавшей функции (для знатоков ОС Unix -- аналог команды tee). Значит, для просмотра содержимого и типа "слова" достаточно выполнить такую команду:

>> type? probe M_CC_1
2048
== integer!

Пока что мы говорили о "словах" Rebol как об именованных ассоциациях со значениями и любое использование "слов" подразумевало их "вычисление" -- замену значением. А как быть, если в программе может понадобиться не ассоциированное со "словом" значение, а само "слово"? Для этого Rebol предусматривает специальную форму записи -- 'имя, что можно проверить на следующем примере:

>> type? 'M_CC_1
== word!
>> 'M_CC_1
== M_CC_1
>> M_CC_2: 'M_CC_1
== M_CC_1
>> type? M_CC_2
== word!

Он демонстрирует самое главное отличие "слов" Rebol от более привычных "переменных": "слова" являются типом и могут содержать значения и "слова", переменные же -- характеризуются типом и содержат только значения. Но и это еще не все... Когда мы вводили имя слова в качестве команды, то отмечали, что интерпретатор автоматически выполняет данное слово, и суть выполнения -- замена его ассоциированным значением. В Rebol есть функция do (попробуйте ввести команду help do), позволяющая выполнить значение, ассоциированное со словом, и вот что получится, когда мы применим ее к слову M_CC_2:

>> M_CC_2
== M_CC_1
>> do M_CC_2
== 2048

Механизму "выполнения в глубину" функции do аналогичен механизм "ассоциирования в глубину", реализованный функцией set. Она ассоциирует значение с содержимым слова (естественно, если подобное возможно, то есть если содержимое само является словом). Это демонстрирует элементарный пример, в котором подразумевается, что слово z0 не существовало до момента ввода первой команды:

>> z1: 'z0
== z0
>> set z1 550
== 550
>> z0
== 550

Здесь мы сначала ассоциировали со словом z1 слово z0 (именно само слово z0, а не его значение), а затем командой set ассоциировали содержимое z1 с целым числом 550. А так как содержимое z1 -- это слово z0, соответственно, мы косвенно выполнили ассоциирование z0 со значением 550, что и видно из последних двух строк примера.

О словах Rebol осталось сказать немного в этом вводном курсе (впоследствии мы будем возвращаться к их свойствам еще неоднократно): раз их можно ассоциировать со значениями, то должна быть и обратная процедура. И таковая, естественно, есть -- функция "деассоциации" unset. Причем мы уже знаем достаточно, чтобы не удивиться такой форме записи этой команды (продолжение предыдущего примера):

>> unset 'z1
>> print 'z1
z1
>> print z0
550


Даже если не читать пару строк встроенной документации (командой help unset), легко понять, что функции unset для выполнения действия нужно именно слово, а не ассоциированное с ним значение, и поэтому мы использовали запись в форме unset 'z1. А вот следующая команда убеждает нас, что само слово z1 никуда не делось из системы, как, впрочем, и его бывшее содержимое -- слово z0.


...и фразы...

Но не будем забывать, что существуют знаки, притворяющиеся значащими, а на самом деле лишенные смысла...
У. Эко

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

[ что угодно разделенное пробелами или другими разделительными символами ]

В понятие "что угодно" входят значения, слова (в том числе не имеющие ассоциированных значений), другие блоки... Это означает -- вы можете сразу в консоли Rebol набрать такой пример:

>> mbb: [ 1 $5.0 [email protected] ]
== [1 $5.00 [email protected]]
>> type? mbb
== block!

Здесь не только "во всей красе" предстает слово mbb (слова, оказывается, могут ассоциироваться и с блоками), но мы знакомимся с "блоком" как с еще одним типом данных Rebol. И это еще не все (в программе столь малого размера даже крохотные примеры слишком глубокомысленны): в момент ассоциирования со словом, как видно из реакции интерпретатора, над "блоком" не выполняются никакие действия. Используя термины Rebol, блоки не являются немедленно вычисляемыми. Для того чтобы выполнить блок, к нему надо применить уже известную нам функцию do. Под выполнением блока в Rebol понимается двухступенчатая процедура -- сначала вычисляются все значения "чего угодно" внутри блока, затем собственно блок, при этом, если блок содержит множество выражений, результатом его выполнения является результат вычисления последнего выражения. Свободный синтаксис Rebol не предъявляет никаких дополнительных требований, свойственных многим скриптовым языкам, при описании не помещающихся в одной строке блоков, а в интерактивном режиме интерпретатор при описании длинного блока изменяет вид символа "приглашения" на “[“, подсказывая тем самым, что вы находитесь в режиме ввода блока. Более того, поведение функции do при вычислении можно изменить с помощью модификаторов, но такой "высший пилотаж" автор оставляет читателям для самостоятельного изучения.

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

>> hp: func [ k1 k2 ] [ square-root ( k1 * k1 ) + ( k2 * k2 ) ]
>> print hp 3 4
5

В первой строке мы ассоциировали функцию, вычисляющую гипотенузу прямоугольного треугольника по значениям двух катетов (k1 и k2, являющиеся параметрами функции), со словом hp, во второй -- проверили ее работу вызовом ассоциированной с этим словом функции и конкретными значениями параметров, в третьей -- получили результат ее выполнения.

Элементарность примера не должна вводить читателя в заблуждение относительно возможностей функций Rebol. Первый блок в первой строке примера -- в описании функции называется "блоком спецификации интерфейса" и в серьезных скриптах может быть очень сложным, например таким:

bF: func [
"Фильтр контента сайта itc.ua"
NwO [integer!] "Выдать только новости"
FmO [integer!] "Выдать только заголовки форумов"
...
]
[ блок тела функции ]

В данном случае мы используем описание функции (первая строка блока), типизованные параметры (которые в данном случае должны иметь тип "целое число"; при попытке передать функции значения другого типа будет вызвана ошибка и выдано соответствующее сообщение) и описания каждого параметра. Вначале мы говорили о "самодокументирующемся" характере Rebol, а теперь знаем, откуда берется эта "документация", и даже можем понять, как работает функция help.

Последним в нашем коротком обзоре Rebol будет тип данных "объект". Это, естественно, тоже разновидность "блока", но со своими уникальными свойствами. Два главных из них -- формирование сложных структур данных, представляемых как единое целое (что позволяет использовать объекты в качестве, например, параметров функций), и возможность порождения новых объектов на основе уже имеющихся. Сразу следует уточнить: объекты, как и все блоки, могут содержать "что угодно", в том числе -- функции, блоки и другие объекты. Все остальные нюансы объектов вполне соответствуют своему "блочному происхождению" -- они ассоциируются со словами и, как уже было сказано, являются типом данных языка.

Функция Rebol make предназначена для создания объектов двумя методами -- "с нуля" и "методом расширения". На основе "бесценного кода" созданной в нашем последнем реальном примере функции, ассоциированной со словом hp, можно "с нуля" создать, например, такой объект:

>> T-1: make object! [
[ k1: 10
[ k2: 20
[ hyp: func [ k1 k2 ] [ square-root ( k1 * k1 ) + ( k2 * k2 ) ]
[ ]
>> type? T-1
== object!

В этом примере мы создали "с нуля" (то есть не на основе имеющегося объекта) новый объект с тремя полями, два из которых -- данные (k1 и k2) и одно -- функция. Указание функции make в качестве первого параметра наименования типа object! как раз и информирует интерпретатор Rebol о том, что мы хотим создавать объект "с нуля". Сам объект мы ассоциировали со словом T-1, и не стоит удивляться символу “-“ в именах -- это же свободный синтаксис Rebol! Язык позволяет "добираться" до инкапсулированных в объекты полей с помощью единой формы записи, аналогичной... указанию пути файла в файловой системе ОС Unix и стандартному URL, например, так:

>> type? probe T-1/k1
10
== integer!
>> T-1/k1 -- T-1/k2
== -10

Форма “"слово"/"слово"/..." (в нашем примере -- T-1/k1, T-1/k2) для доступа к полю объекта также является основным способом, например, навигации в интерактивной консоли Rebol по файловой системе (с помощью функций change-dir, list-dir и т.д), независимым от платформы! Что, собственно, и неудивительно, ведь все объекты файловой системы отображаются в Rebol... конечно, собственной иерархией объектов языка.

Теперь попробуем создать новый объект, но уже на основе объекта T-1:
>> Цветной-треугольник: make T-1 [
[ k1: 100
[ k2: 200
[ цвет: 67.45.44
[ ]
>> type? Цветной-треугольник
== object!
>> type? Цветной-треугольник/цвет
== tuple!

В этом диалоге мы создали новый объект, ассоциированный со словом "Цветной-треугольник" (а почему бы и не выбрать такое красивое имя для "переменной"), содержащий все поля базового обекта T-1 (указанного параметром функции make), но с измененными значениями полей k1 и k2, а также дополнительное поле -- ассоциированное со словом "цвет" значение типа набор, представляющее описание цвета в RGB.


...и дела

Руководство пользователя по языку Rebol занимает ни много ни мало -- 700 страниц, и, как уже понятно, сам язык весьма и весьма нетривиален (по крайней мере, для тех, кто никогда не сталкивался с функциональными языками программирования). Естественно, само собой напрашивается требование ответа на очевидный вопрос "А стоит ли...?". Автор не может ни взять на себя ответственность рекомендовать Rebol "всем и вообще", ни изложить в краткой статье что-либо, кроме самых основ, помогающих преодолеть первый шок от столкновения с такой нетрадиционной разработкой, ни, наконец, отвечать на подобный вопрос в каждом конкретном случае. "Потешный" характер примеров (наш журнал все-таки называется не "Вестник Академии наук") и ограниченный объем вынудили оставить без внимания массу крайне важных для скриптовых языков моментов, включая управление потоком выполнения и даже возможности работы со строками ("даже" -- потому что скриптовый язык должен с этим справляться безукоризненно). Впрочем, автор может заверить читателя, что у Rebol с указанными возможностями все в полном порядке.

И все-таки... Мы уже достаточно информированы, чтобы понять, например, такую фрагментарную высокоуровневую модель Rebol-программы с минимальными комментариями:

ITC_Новости: read http://itc.ua/news.phtml
Моя_почта:
read pop://192.168.100.xxx:yyyy
Мой_Канал_Новостей:
Выделить-новости ITC_Новости
foreach message Моя_почта Убрать_Лишнее
join Моя_Почта Мой_Канал_Новостей
send [email protected] join Моя_Почта Мой_Канал_Новостей

Функция read -- это почти все, что необходимо для доступа к удаленному ресурсу по соответствующему протоколу, указанному в URL (почти все, потому что для pop-протокола надо предварительно выполнить функцию open).

Выделить-новости -- это определенная где-то функция, принимающая в качестве параметра строку, ассоциированную со словом ITC_Новости (данная строка является результатом вызова функции read). Она удаляет HTML-разметку и выделяет только содержательный текст (в данный момент совершенно неважно, как это реализуется, значительно важнее знать, что десяти строк на Rebol для решения такой задачи даже очень много).

Функция foreach осуществляет "перебор" каждого сообщения (параметр message) из ассоциированной со словом Моя_почта строки и для каждого сообщения вызывает ассоциированный со словом Убрать_Лишнее блок кода.

Функция join возвращает строку -- результат соединения двух строк (избранные e-mail и новостные колонки), которая отправляется по протоколу SMTP на указанный в параметре адрес e-mail вызовом одной-единственной функции Rebol send.

То, что "получилось" в этом "примере", на деле может быть вашим персональным сервисом -- сколь угодно простым или сложным, автоматически доставляющим в нужное время напоминания или подготовленный "контент" на мобильный телефон (отправкой сообщений на SMS -- шлюз) или PDA.

В общем, можно придумать и реализовать парами сотен строк Rebol множество полезных, не только "сетевых" автоматов, а необходимы для этого всего лишь усердие и воображение.

Ready, set, buy! Посібник для початківців - як придбати Copilot для Microsoft 365

0 
 

Напечатать Отправить другу

Читайте также

 

Ukraine

 

  •  Home  •  Ринок  •  IТ-директор  •  CloudComputing  •  Hard  •  Soft  •  Мережі  •  Безпека  •  Наука  •  IoT