GenieВторник, Июль 12, 2011 г.
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
| ||
Оставить коментарий
)
