Новость из категории: Информация

Genie: документация, распространенность и синтаксис

Содержание:
1. Вступление;
2. Документация, распространенность и синтаксис (Вы читаете данный раздел).
Документация и распространенность

Genie: документация, распространенность и синтаксис

Документация по Genie - более чем скромная. Единственная официальная страница http://live.gnome.org/Genie содержит довольно аскетичное пособие с описанием синтаксиса языка и его основных особенностей. Ценным источником информации является блог Барри Каулера (Barry Kauler, http://bkhome.org/genie), создателя дистрибутива Puppy Linux и убежденного пропагандиста Genie в прошлом. На сайте http://code.valaide.org можно найти довольно много примеров использования Genie в связке с GTK+ и различными библиотеками. Пожалуй, это всё, что есть в интернете. Блог создателя языка Джеми МакКракена (http:// jamiemcc.livejournal.com) не содержит никакой полезной информации кроме анонса Genie, датированного 2008 годом. Никакой документации по Genie на русском языке нет.

По распространенности Genie намного уступает своему «старшему брату» Vala. Genie несколько лет являлся основным языком при разработке утилит для Puppy Linux, однако в прошлом году создатель этого дистрибутива полностью перешел на BaCon - реинкарнацию классического Basic. В итоге, Genie остался не у дел. Мне не удалось найти в сети ни одного серьезного проекта, целиком написанного на Genie. Есть лишь несколько небольших «игрушечных» программ, однако это не означает, что язык заброшен и никому не нужен. Поддержку синтаксиса Genie в компиляторе Vala никто не собирается прекращать, а младенческий возраст самого языка позволяет надеяться на благополучное будущее. Вместе с тем, отсутствие пропаганды языка и плохая документация явно не способствуют увеличению его популярности.

Синтаксис

Я не буду формально описывать синтаксис Genie, который в своей основе практически идентичен синтаксису языка Python. Вместо этого напишем и разберем такую же простейшую программу с использованием GTK+, что рассматривалась в предыдущей статье о Vala:
uses
Gtk
init
Gtk.init (ref args)
var test = new TestWindow ()
test.show_all ()
Gtk.main ();
class TestWindow : Window init
title = "Test Window" set_default_size  (300, 50) window_position = WindowPosition.CENTER destroy += Gtk.main_quit
var button = new Button.with_label ("Click Me")
button.clicked += def (btn)
btn.label = "Thank you!" 
add (button)

В первую очередь обращает на себя внимание использование отступов для структурирования кода как в Python. Ширину отступов можно задавать произвольно директивой «indent» в начале файла. Например, [indent=4] задаст отступ в 4 символа.



Выполнение программы в Genie начинается с блока init, находящегося вне определений классов и функций. Это аналог функции main() в Vala или C++. В глобальную переменную args автоматически помещаются параметры командной строки приложения, поэтому никаких дополнительных параметров в блоке init указывать не нужно. Далее мы создаем свой класс TestWindow, унаследованный от стандартного класса окна Window. В кон-структоре класса (блок init) выполняются следующие действия: инициализируется окно, создаются виджеты, задается обработчик события нажатия на кнопку.

Синтаксис присоединения функций-обработчиков к событиям в Genie еще более прост, чем в Vala. Используется оператор «+=», который в этом контексте заменяет функцию «connect»:
destroy += Gtk.main_quit

Объявление лямбда-функции, которая является обработчиком события нажатия на кнопку, также выглядит по-другому -используется ключевое слово def(), но по сути все в точности, как в Vala:
button.clicked += def (btn)
btn.label = "Thank you!"

В блоке init основной программы мы создаем экземпляр нового класса, показываем элементы окна функцией show_all() и входим в цикл обработки событий.

Явное объявление переменных в Genie выглядит не так, как в Vala, поскольку используется синтаксис Pascal/Delphi с указанием типа после переменной:
int_val: int = 10 double_val: double = 12.5
button: Button = new Button.with_label  ("Click me!")

Можно объявлять переменные с автоматическим определением типа с помощью ключевого слова var. Его можно также использовать в форме блока:
var
a = "happy"
b = "sad"
c = "ambivalent"

Управляющие конструкции в Genie практически идентичны таковым в Python за исключение некоторых деталей, связанных с типизацией переменных. В Genie в качестве конструкции foreach выступает разновидность цикла for, оперирующая со списками:
for s in args do print s

Тип переменной s компилятор определяет автоматически. Кроме этого варианта есть и индексная форма цикла for, более привычная для программистов на С++ или Pascal:
for var i = 1 to 10 print "i is %d", i

Функции и методы объявляются в Genie в стиле Pascal с типом возвращаемого значения после заголовка функции:
def func(name: string): string print "hello %s", name return "hello!"

Синтаксис классов в Genie имеет ряд особенностей. Можно объявлять перегруженные конструкторы, если они принимают разные аргументы. Также можно использовать синтаксис с суффиксом, например:
var foobar = new Foo(10)  // Основной конструктор
var foobar2 = new Foo.with_bar(10) // Конструктор с суффиксом

В объявлении класса конструкторы задаются ключевым словом construct:
class Foo : Object
/* Это свойство класса */ 
prop a : int
init
print "Переменная foo теперь инициализирована" final
print "Вызван деструктор"
/* В блоке construct можно инициализировать только
* и исключительно свойства класса*/ 
construct (b : int) 
a = b
/* Создает конструктор с префиксом */ 
construct with_bar  (bar : int) 
a = bar

В этом коде также показано использование свойств в классах и создание деструктора в блоке final. Основой иерархии объектов является класс Object, наследование которого наделяет дочерний класс всеми возможностями, предоставляемыми библиотекой glib, которая находится «под капотом».

Обобщенные классы задаются конструкцией %s", s, d[s][/code]
Обработка ошибок в Genie (как и в Vala) реализована достаточно запутано. Это связано с принятой в glib трехуровневой системой перехвата ошибок «домен-код-сообщение». Легче всего объяснить ее на примере:
exception ErrorType1 // Это домен,  задающий некий общий тип // ошибки
CODE_1A // Это код ошибки - уточняющая
// информация внутри домена 
CODE_1B // Еще один код того же домена
init
try // Привычный блок try
Test.thrower() except ex : ErrorType1 // Ловим только ошибки
// типа ErrorType1
print "Перехвачена ошибка "+ ex.message
class Test : Object
// метод,  генерирующий ошибку; домен генерируемых // ошибок задается явно
def static thrower() raises ErrorType1
raise new ErrorType1.CODE_1A("Упс...") /* Генерируется ошибка домена ErrorType1 с кодом CODE_1A и сообщением в виде текстовой строки
"Упс... " */

Система с доменами и кодами ошибок выглядит излишне сложной, но такова организация библиотеки glib - с ней приходится мириться.

Выводы

Строго говоря, Genie - это не более чем альтернативный синтаксис языка Vala, но в то же время, по личным ощущениям от его использования, он является вполне самостоятельным. Пока Genie остается гораздо менее популярным «младшим братом» Vala, однако это вызвано скорее его молодостью и недостатком рекламы, чем объективными причинами. В Genie упор сделан на лаконичность и простоту написания кода. Код на Genie вы-глядит более изящно и легче читается. Кроме того, в базовый язык включены обобщенные контейнеры, что делает его гораздо более похожим по стилю использования на скриптовые языки. Сильная схожесть синтаксиса с языком Python делает его реальной заменой последнего в тех случаях, когда необходима большая скорость и меньшее потребление памяти. Genie наследует все сильные и слабые стороны Vala во всех аспектах кроме синтаксиса, поэтому выводы предыдущей части статьи остаются в силе и в отношении Genie.

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх