On 11/24/2013 11:34 AM, Yakov Goldberg wrote:
> Hi again!
> Kai, Cedric thanks for answer!
> Comments added.
>
> On 11/22/2013 04:20 AM, Cedric BAIL wrote:
>> On Fri, Nov 22, 2013 at 12:27 AM, Kai Huuhko <kai.huu...@gmail.com> wrote:
>>> 17.11.2013 15:53, Yakov Goldberg kirjoitti:
>>>> Short memo about a project:
>>>> The idea is that each Eo class is represented into a .eo file. These
>>>> files are manually modified to add new functions, comments, callbacks...
>>>> and parsed and the generation phase updates the C/H files.
>>>>
>>>> They contain descriptions of inherited classes, properties, methods,
>>>> base classes implemented functions and callbacks.
>>>>
>>>> Some explanations:
>>>> "name" - class name from Eo class description. We check that it is unique.
>>>> "inherits" - names of parent classes
>>>> "constructors" - (actually it is a method, just put it into separate
>>>> section). Here you will meet only custom constructors.
>>>>
>>>> Properties.
>>>>        Property can be set/get; only set, only get; this is saved in "type"
>>>> field: "rw"(or no tag), "ro", "wo".
>>> Have you thought about adding another level of nesting with set and get
>>> members? This way you could make them optional and wouldn't need that
>>> type field:
>>>
>>> ...
>>>     "properties": {
>>>       "size_hint_max": {
>>>         "set": {
>>>           "comment": "Sets the hints for an object's maximum size.",
>>>           "legacy_override": "evas_object_size_hint_max_set"
>>>         },
>>>         "get": {
>>>           "comment": "Retrieves the hints for an object's maximum size.",
>>>           "legacy_override": "evas_object_size_hint_max_get"
>>>         },
>>>         "parameters": [
>>>           {"w" : ["Evas_Coord", "comment"]},
>>>           {"h" : ["Evas_Coord", "comment"]}
>>>         ]
>>>       },
>>>       "below": {
>>>         "get": {
>>>           "comment": "Get the Evas object stacked right below the object",
>>>           "legacy_override": "evas_object_below_get"
>>>         },
>>>         "parameters": [
>>>           {"ret" : ["Evas_Object*", "comment"]},
>>>         ]
>>>       }
>>> ...
>> That sounds like a nice improvement to me.
> Same for me. I'll play with it.
And we could assume that we have to generate set and get if no set/get 
section is specified. comment would be under the name directly. Does it 
seem ok?
>>> Another suggestion is to make legacy_override apply the whole class as a
>>> prefix:
>>>
>>> {
>>>     "name": "Evas_Image",
>>>     "legacy_prefix": "evas_object_image",
>>> ...
>>>
>>> You could have the individual legacy overrides for cases where legacy
>>> property/method name does not follow the naming in Eo API, in cases
>>> where there is no legacy prop/method you could have an empty string as
>>> override, or maybe a bool value:
>>>
>>> "legacy": false
>> Then why not just: "legacy" instead of "legacy_prefix", and if not
>> defined, there is no legacy function provided by that class.
> Yes, lets put "legacy" property per class. Just there will be some
> redundancy,
> for class "Elm_Button" we will have to provide "legacy" : "elm_button".
> It can be deleted starting from some version. (I also have to add some
> "version" tag)
>
> There is also one more question.
> Now we have legacy: "elm_button_autorepeat_get"
> also we have added Eo API
> "elm_obj_button_autorepeat_get".
> Will Eo2 API be the same -> "elm_obj_button_autorepeat_get"?
>>> In the Python bindings we've also got "deleters" for properties; for
>>> example when user calls del(list.children) it's the same as calling
>>> clear() on the list. Would you consider having these deleters in Eo
>>> metadata as well?
>> That is a very good idea indeed. Javascript binding will benefit from
>> the same metadata.
> Yea, cool. But I want to clear something.
> Suppose we have Evas_Object class and funcs to set/get color.
> So in python we will have EvasObject_Py class with setter/getter,
> but without deleter, as there is no color property in object actually.
> So we will not provide deleter in eo-mata in this case.
> Smth like this:
>
> class  EvasObject_Py(object):
>
>       def  getcolor(self):
>           cdef int r, g, b, a
>           eo_do(self.eo_obj, evas_obj_color_get(&r, &g, &b, &a))
>           r_ = r
>           g_ = g
>           b_ = b
>           a_ = a
>           return  (r_, g_, b_, a_)
>       def  setcolor(self,  r, g, b, a):
>           eo_do(self.eo_obj, evas_obj_color_get(r, g, b, a))
>
>       color  =  property(getcolor,  setcolor,  None,  "I'm the 'color' 
> property.")
>
>
> Now about lists:
> AFAIR, in Py_Bindings some data is saved in internal lists sometimes.
> So this could look like this:
>
> class  SomeClass(object):
>       def  __init__(self):
>           self._somelst  =  []
>
>       def  getsomelst(self):
>           return  self._somelst
>       def  setsomelst(self,  lst):
>           self._somelst  =  lst
>           cdef Eina_List _lst
>           # casting from py list to Eina_List
>           eo_do(self.eo_obj, some_class_somelist_set(_lst))
>       def  delsomelst(self):
>           del  self._somelst
>           eo_do(self.eo_obj, some_class_somelist_clear())
>      somelst  =  property(getsomelst,  setlsomest,  delsomelst,  "I'm the 
> 'lst' property.")
>
> So in eo-meta we can provide func "somelist_clear" as a deleter?
> Did I understand right?
>
>>>> Methods: the same as properties, but with direction of parameter.
>>>>
>>>> Implements: list of overridden functions:
>>>>                  ["class name" , "func_name"]
>>>> Sometimes, if there will be name clash between property and method, user 
>>>> will have to add 3rd paremeter "func_type":
>>>>             ["class name" , "method_name", "method_type"]
>>> Why is this third parameter needed? Wouldn't it be easier to forbid
>>> clashing properties/methods and have a cleanly overriding inheritance?
> Great, you are right!
> In this case (in Python) we will have two definitions for "some_name" in
> class.
> One will defined as function and other as property, but only one(which
> is defined last) will work.
> Am I right?
> And this means that
> "elm_widget_theme"
> "elm_widget_theme_get"
> "elm_widget_theme_set"
> all must be treated as methods.
I don't think setting properties as methods is wise. It will create 
inconsistency when for example we will access in live the Eolian database.
We need a way to resolve the conflicts and conserve legacy API as is.
If we take theme as example, we can change the method name to 
theme_apply and indicate via the flag legacy_override that the legacy 
API name is elm_widget_theme. Only legacy will be different from the 
other languages (Eo, Python, C++...). Eo will be changed to 
...SUB_ID_THEME_APPLY.
In this way, we respect the legacy style and fail a compilation if a 
same name is used in properties and methods sections.
>>>> Example.
>>>> http://pastebin.com/u9DPnmK2
>>>>
>>>> Some issue.
>>>> One of the main task is to generate legacy functions. But not every Eo
>>>> function has a legacy. So we have to add
>>>> "legacy"("legacy_override") flag into JSON. Moreover there are cases
>>>> when we need to specify legacy func's name.
>>>>
>>>> Example: Eo class name is "Evas_Image". It has a method "source_set".
>>>> (This is not a property, because it returns some value)
>>>> To generate legacy we take class name and method name, so we will get
>>>> "evas_image_source_set", while real name is "evas_object_image_source_set"
>>>> Thus, as soon as we have to keep "legacy" flag, we can keep full name of
>>>> legacy method.
>>>>
>>>> {
>>>>        "name": "Evas_Image",
>>>>        "inherits": ["Evas_Object"],
>>>>        "methods" : {
>>>>             "source_set": {
>>>>                   "comment": "Set the source object on an image object.",
>>>>                   "return_type": "Eina_Bool",
>>>>                   "legacy_override": "evas_object_image_source_set",
>>>>                    "parameters": {
>>>>                    "in" : [
>>>>                           {"src" : ["Evas_Object*", "comment"]}
>>>>                    ]
>>>>              }
>>>>         },
>>>>       }
>>>> }
>>>>
>>>>
>>>> - In case of properties, we need to keep "legacy_set", "legacy_get".
>>>> Initial generation will be automatic, nevertheless we'll have to check
>>>> everything manually.
>>>> -   Description of parameters: {"name" : ["type", "comment"]}; for
>>>> methods additional sections "in" "out" must be added.
>>>>
>>>> - implements section can be moved into methods and properties sections.
>>>> It can look more consistent, but requires one more nested level.
>>>> "methods" :
>>>> {  "realizes" : {
>>>>             "source_set" : {
>>>>             }
>>>>         },
>>>>        "implements" : [
>>>>             ["Evas_Smart", "resize"]
>>>>        ]
>>>> }
>>>>
>>>> -  implements section should have description of event being sent
>>>>       "implements": [
>>>>           ["Evas_Smart", "resize", {"int", "int", "char *"}],
>>>>       ]
>>>> ========================================================
>>>> ========================================================
>>>> Another solution is to write C-styled eo file. Which requires another
>>>> parser.
>>>> http://pastebin.com/stycZmKV
>>>> This is very first version, after which we switched to JSON, so it
>>>> doesn't have many fields.
>>>>
>>>> So advantages and drawbacks:
>>>> - C-styled file is more compact
>>>>
>>>> - JSON is more flexible and scalable (we already require several helping
>>>> tags and different comments for _set/_get properties)
>>>>      and also some reference between functions(for documentation) need to
>>>> be added.
>>>> - easier to support versioning
>>>> - 3rd party parsers can be used.
>>>> but requires to keep JSON structure - that means quotes and brackets.
>>> Have you looked into YAML?
>>> https://en.wikipedia.org/wiki/YAML
>>>
>>> It has similar features to JSON while being more compact.
>> It is the first time I look at it. It is indeed more compact, but I am
>> not sure it is easy to get how to use it for new comers.
>>
>>> If the choice is between C-like syntax and JSON, I'll go with JSON as
>>> it's easier to create a forward compatible parser/lexer for it, and
>>> because of the reasons you mentioned above. But this should not depend
>>> on a single round of voting, we should strive to find a syntax and
>>> structure which serves all our relevant needs and is easy to work with.
>> I think we are not committed yet to either C-like or JSON syntax, this
>> discussion and thread is a good opportunity to raise your voice and
>> see if we can find a better solution.
>>
>>> P.S. I am interested to work on the language bindings aspect of this
>>> after 1.8 Python bindings are released.
>> Cool :-)
> Cool!
> ------------------------------------------------------------------------------
> Shape the Mobile Experience: Free Subscription
> Software experts and developers: Be at the forefront of tech innovation.
> Intel(R) Software Adrenaline delivers strategic insight and game-changing
> conversations that shape the rapidly evolving mobile landscape. Sign up now.
> http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>


------------------------------------------------------------------------------
Shape the Mobile Experience: Free Subscription
Software experts and developers: Be at the forefront of tech innovation.
Intel(R) Software Adrenaline delivers strategic insight and game-changing 
conversations that shape the rapidly evolving mobile landscape. Sign up now. 
http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to