Genie

Вторник, Июль 12, 2011 г.
Вам нравится синтаксис Python? Простота и лёгкость с которой можно решать не простые задачи. Вот простейший пример работы со списком:

l = []

l.append("Genie")
l.append("Rocks")
l.append("The")
l.append("World")

for s in l:
    print s

print " "

l[2] = "My"

for s in l:
    print s


выполним его:

demoriz [~]% python2 bla.py
Genie
Rocks
The
World
 
Genie
Rocks
My
World


А теперь попробуйте тоже самое написать на С. Скорее всего это также не сложно, но сравниться с лаконичностью Python вряд ли удастся. Я конечно понимаю что C и Python это совершенно разные языки для разных задач и с совершенно разными уровнями абстракции. Но как бы хотелось иметь возможность писать вот так же кратко и изящно в компилируемых языках.
И это возможно!
Совсем недавно я буквально наткнулся на Genie.
Genie is a new programming language, in the same vein as Vala, that allows for a more modern programming style while being able to effortlessly create and use GObjects natively.

Смотрите сами:

[indent=4]

init
    var l = new list of string

    l.add("Genie")
    l.add("Rocks")
    l.add("The")
    l.add("World")

    for s in l
        print s

    print " "

    l[2] = "My"

    for s in l
        print s


déjà vu, неправдали? Всё также просто и понятно. И компилируется в бинарник.

demoriz [~]% valac --pkg gee-1.0 bla.gs 
demoriz [~]% ./bla 
Genie
Rocks
The
World
 
Genie
Rocks
My
World


Точнее сначала переводится на обычный C и потом уже компилируется через gcc. Если к valac добавить параметр --save-temps то при компиляции будет сохранён промежуточный C вариант. В нашем случае:

demoriz [~]% valac --pkg gee-1.0 --save-temps bla.gs


А вот и полученный bla.c

/* bla.c generated by valac 0.12.1, the Vala compiler
 * generated from bla.gs, do not modify */


#include <glib.h>
#include <glib-object.h>
#include <stdlib.h>
#include <string.h>
#include <gee.h>

#define _g_free0(var) (var = (g_free (var), NULL))
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))



void _vala_main (gchar** args, int args_length1);


static gpointer _g_object_ref0 (gpointer self) {
	return self ? g_object_ref (self) : NULL;
}


void _vala_main (gchar** args, int args_length1) {
	GeeArrayList* _tmp0_ = NULL;
	GeeArrayList* l;
	_tmp0_ = gee_array_list_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL);
	l = _tmp0_;
	gee_abstract_collection_add ((GeeAbstractCollection*) l, "Genie");
	gee_abstract_collection_add ((GeeAbstractCollection*) l, "Rocks");
	gee_abstract_collection_add ((GeeAbstractCollection*) l, "The");
	gee_abstract_collection_add ((GeeAbstractCollection*) l, "World");
	{
		GeeArrayList* _tmp1_;
		GeeArrayList* _s_list;
		gint _tmp2_;
		gint _s_size;
		gint _s_index;
		_tmp1_ = _g_object_ref0 (l);
		_s_list = _tmp1_;
		_tmp2_ = gee_collection_get_size ((GeeCollection*) _s_list);
		_s_size = _tmp2_;
		_s_index = -1;
		while (TRUE) {
			gpointer _tmp3_ = NULL;
			gchar* s;
			gchar* _tmp4_;
			gchar* _tmp5_;
			_s_index = _s_index + 1;
			if (!(_s_index < _s_size)) {
				break;
			}
			_tmp3_ = gee_abstract_list_get ((GeeAbstractList*) _s_list, _s_index);
			s = (gchar*) _tmp3_;
			_tmp4_ = g_strconcat (s, "\n", NULL);
			_tmp5_ = _tmp4_;
			g_print ("%s", _tmp5_);
			_g_free0 (_tmp5_);
			_g_free0 (s);
		}
		_g_object_unref0 (_s_list);
	}
	g_print (" \n");
	gee_abstract_list_set ((GeeAbstractList*) l, 2, "My");
	{
		GeeArrayList* _tmp6_;
		GeeArrayList* _s_list;
		gint _tmp7_;
		gint _s_size;
		gint _s_index;
		_tmp6_ = _g_object_ref0 (l);
		_s_list = _tmp6_;
		_tmp7_ = gee_collection_get_size ((GeeCollection*) _s_list);
		_s_size = _tmp7_;
		_s_index = -1;
		while (TRUE) {
			gpointer _tmp8_ = NULL;
			gchar* s;
			gchar* _tmp9_;
			gchar* _tmp10_;
			_s_index = _s_index + 1;
			if (!(_s_index < _s_size)) {
				break;
			}
			_tmp8_ = gee_abstract_list_get ((GeeAbstractList*) _s_list, _s_index);
			s = (gchar*) _tmp8_;
			_tmp9_ = g_strconcat (s, "\n", NULL);
			_tmp10_ = _tmp9_;
			g_print ("%s", _tmp10_);
			_g_free0 (_tmp10_);
			_g_free0 (s);
		}
		_g_object_unref0 (_s_list);
	}
	_g_object_unref0 (l);
}


int main (int argc, char ** argv) {
	g_type_init ();
	_vala_main (argv, argc);
	return 0;
}


Впечатляет ;)
Теги: Genie
 
   
Оставить коментарий
Оставить комментарий   Нажмите, чтобы отменить ответ.
Доступен html впределах разумного. Для цитирования используйте <blockquote></blockquote>, для отрисовки программного кода [code][/code].
Для всяких хакеров и прочих: комментарии проходят санитизацию, всё лишнее будет вырезано. Так что не тратьте своё драгоценное время.
Имя (обязательно)
E-Mail (Не будет опубликован , обязательно)
Сайт (необязательно)