On Sat, 18 Jun 2016 23:06:35 -0300 Felipe Magno de Almeida <felipe.m.alme...@gmail.com> said:
> On Sat, Jun 18, 2016 at 10:56 PM, Carsten Haitzler <ras...@rasterman.com> > wrote: > > On Fri, 17 Jun 2016 11:12:51 -0300 Felipe Magno de Almeida > > <felipe.m.alme...@gmail.com> said: > > > > felipe - look at eina promises then loo at stdc++ promise and futures. they > > dont even match. js promises cant be canceled. lua doesn't even have the > > idea of a promise. what we have in eina_promise doesn't translate to any > > language native future/promise thing. it's very specifically an efl thing > > and if we do it we need to embrace it as such and that's how it goes. it > > LOOKs like many language native promise things but it's extended and efl > > specific. that's the on;y way to use promises we have, otherwise we should > > drop them entirely and do things only by obj + event cb's because this > > problem space is just too fragmented with the lowest common denominator not > > being even good enough for us (no cancel) but not even being enough for > > other langs (c++ has wait - we don't) > > I have explained in the email exactly how they would be translated to C++, > JS and Lua by _not_ being a object used directly by the user translated > automatically by Eolian. So I don't know what you mean. JS will be used that is the ONLY way for them to work right. to be translated. have you looked at c+ promises/futures in stdc++? there is no cancel for starters. there are wait methods that we just don't support. you CAN'T map an eina_promise or an eo_promise to c++ promises/futures. they are disjoint sets. > exactly as JavaScript developers are used to, but they will have the option > to cancel as well, and C++ will be able to wait on it or register a callback how? where? without the promise being an object... how? because in js they are promises. in c++ a promise and future are... objects. > function. And for Lua exactly how I explained in the email below. Maybe you > missed my answer to your reply in the bottom of the email,after my answer > to Tom? i saw you spoke about coroutines. but that is not what a promise is in efl. there is a definite handle you have to have to be able to address it. lua have NO promises themselves of any sort. nothing. there is nothing to even have a cancel method on for example. > > so as you said - then make promises full efl supported objects and they > > appear so in every language and work the same way, as the only other option > > is to drop them entirely. > > I neveer said that. And for the reasons I explained below. >> So, in the end, if we make Promises an Eo/Eolian >> object with very well defined semantics, we get >> a "normal class"* that works the same as an yes - you said in c only - but we have to map what we have in c to other languages. show me how a libstdc++ promise/future is able to be canceled? show me. show me how a js promise does progress events 9without extending the class to a special promise class of our own). show me the promises in lua, or futures or anything even equivalent than can be canceled, listened to for success or failure, even events. > >> So, JP asked my opinion privately and he thought it would > >> be better for me to paste what I replied here. I didn't want > >> to make this discussion longer, however I have to make > >> these points explicit so we can move on. Sorry in advance > >> for the huge email. So I'll paste my answer here and then > >> make some considerations of other points afterwards: > >> > >> "" > >> Hello JP, > >> > >> Now I see I should've voiced myself more in the discussion. But it has been > >> too lengthy and too much things to do before and during the feature freeze, > >> so I kinda absteined myself from it. Which was probably an error because > >> now nobody knows my opinion on the matter. > >> > >> My personal stance on promises being Eo objects is that we're hammering > >> things to be OOP more than it should. IMO, Promises are nothing more > >> than a one-element-containers that warns when the value is available. > >> > >> It is not too much different from Eina_List/Eina_Array, etc. Could we > >> make Eina containers Eo objects? We can, would it have benefits? > >> It would. However, it is always a trade-off and the problems it brings > >> would bigger than the benefits. Java does it and it works, but it slow > >> and invites people to inherit classes in ways they can't possibly do > >> because they, inadvertadly, break the class invariants by changing > >> how the user interacts with the class (by overriding methods). > >> > >> I'm sure in C++, JavaScript and Lua they won't be used as an Eolian > >> class at all, that's even why Kolesa has suggested that it should > >> not even be an Eolian class (but be a Eo class implemented directly), > >> that way people can't inherit from it and bindings don't have to > >> special case the class, like we have to do for Eo.Base. > >> > >> Now, why classes shouldn't generate Promise as an Eolian class? > >> Because it makes no sense and it is _not_ convenient to users. > >> Registering events? What does event have to do with anything? > >> And how do you chain promises like in JavaScript with events? > >> Well, you don't. And how about Lua? Why should Lua even > >> generate a Promise object? In Lua I'd expect the Promise > >> to be used to connect the Lua event loop with co-routines, > >> so the current execution would just get scheduled-out and > >> return execution when the Promise is now fulfilled. > >> > >> The idea that we're going to create the _uber_super_ Promise > >> class for all languages is, IMO, completely impossible. Each > >> language will have its own asynchronous-way to deal with > >> how values are going to be available in the future and which > >> syntax better conveys that concept. Promises in our API, > >> OTH, allow us to _talk_ about asynchronous operations > >> in a way that is well-defined and which bindings can rely > >> enough to do proper code generation without knowing > >> specific semantics of each asynchronous operations. That > >> is not possible with events per se, because bindings > >> don't know anything about them. > >> > >> However, making promises an Eo object is not a problem > >> per se, as long as we have _very_well_defined_ > >> semantics for everything, it works exactly the same, > >> but, at the same time, to have very well defined > >> semantics we need to limit on how extensible everything > >> is, otherwise we just get normal events again and > >> that is not well-defined enough to be translatable > >> properly to every language. > >> > >> So, in the end, if we make Promises an Eo/Eolian > >> object with very well defined semantics, we get > >> a "normal class"* that works the same as an > >> Eina_Promise, but uses the Eo syntax > >> for things on C (only on C!), and with that we > >> start paying for things that doesn't seem > >> to make sense IMO, such as the cost of > >> late binding in Eo; the cost of allocating > >> and instantiating a Eo object; etc. Without > >> reaping any benefits. And, IMO, if asynchronous > >> operations are to be _really_ used in EFL, we > >> need promises to be _fast_. Asynchronous > >> operations already have a inherent cost of > >> having to use heap memory where synchronous > >> operations can just use stack allocation, if > >> we make the cost considerably bigger, then > >> asynchronous operations becomes way too > >> costly to be useful for more and more > >> scenarios, and then it just won't be as useful. > >> Or maybe worse, each sub-component > >> start creating its own way of doing asynchronous, > >> because promises now are too expensive. > >> > >> We can optimize things other ways ofc, like > >> caching and etc. But I fear this becomes > >> another eo_do, where we want to be > >> faster than C++ and end up creating a > >> huge infrastructure to make it faster, > >> and end up being even slower. > >> > >> * not so normal, because we need to be able > >> to mark the type information statically when > >> used, as we do for containers, but that is only > >> on usage, so not a huge problem. > >> > >> So, tl;dr; I think we need to have fast > >> promises so we can use it in more places, > >> have a proper C API that is convenient > >> to use and remove any frivelous features > >> that aren't extremely necessary for > >> normal asynchronous operations. And > >> let bindings deal with asynchronous their > >> own way by being users to EFL Promises, > >> and not necessarily expose EFL Promises > >> directly. > >> "" > >> > >> On Fri, Jun 17, 2016 at 9:38 AM, Tom Hacohen <t...@osg.samsung.com> wrote: > >> > On 16/06/16 22:55, Cedric BAIL wrote: > >> >> Being against promise, is only advocating for no asynchrone behavior > >> >> in Efl. This is a position we can't take. So either you have a better > >> >> pattern to handle asynchronous behavior and synchronisation or we have > >> >> to provide promise. Objecting to promise is clearly not helping > >> >> anything here. > >> > > >> > This is FUD and raster called you out on it a few times already, please > >> > stop stating it as fact all over the place, because it's anything but. > >> > You can say "in my opinion it's better to use promises", but that's as > >> > far as I'll go. > >> > >> It is not FUD, making asynchronous operations ad-hoc with events > >> is not just a huge _pain in the ass_ to implement and use in C, but > >> also makes it impossible to translate that into anything that > >> would properly ressemble asynchronous operations in any > >> other language. Just simply ignoring the relationship that is > >> intrinsic on the asynchronous action and the events that > >> are bound to happen and in which order and how many times > >> they do makes it impossible to convey the information to bindings > >> as an asynchronous operation. All you can do is document things > >> and say, hey, you want to have an asynchronous operation? > >> Then first register events here, here and here first, then make > >> a seeming synchronous operation. This is awful for any language > >> and is even worse for Lua for the point I made about on top > >> and to which I'll get in deeper details below. > >> > >> Asynchronous operations _must_be_well_defined_to_be_useful > >> and be consistent. It _doesn't_ have to translate to the same > >> thing everywhere and should not translate to the same thing. > >> > >> We should not Eolize everything just to get automatic generation, > >> this is being super lazy. We need to offer good bindings and > >> that means translating concepts. What we really need is > >> a simple Promise/Future/Simple-Callback (the simple-callback > >> being the harder one to implement) so we can have actual > >> asynchronous operations and not just some events that > >> happen to return data as result from some operation that > >> looks synchronous. > >> > >> You could @tag the s*** out of operations so bindings can > >> understand things so it is translatable, however, doing so, > >> doesn't remove the ad-hoc-ness of using events(without > >> a well-defined Promise concept). Which means that > >> 1. every class will do it differently; 2. Events are racy > >> by nature, overriding eo_event_callback_add to do > >> something completely different can solve the raceness, > >> but you can't just change documentation/expectations > >> from calling a function that behaves someway in > >> every other class. You're simply breaking the > >> function behavior for Promises and would be doing > >> even worse for several classes without a Promise > >> concept. So code that used to work one way for > >> _all_ Eo.Base classes, now only work for non-Promise > >> ones. Polymorphism is not about changing pre-conditions > >> and post-conditions of functions, but about extending > >> and interoperating with code. > >> > >> So, Promises have to exist some way or another for > >> us to have asynchronous operations, otherwise > >> it will be a huge mess, it actually already is. We had > >> _at_least_ two ways to do async, one by setting > >> a property (which actually suffers from the same > >> problem as your proposal of overriding > >> eo_event_callback_add) which makes another > >> function to behave bizarrely different and which > >> any user of such function must now track. This is > >> not dynamic polymorphism, this is not even a > >> quack-is-a-duck dynamic typing, this is asking a duck to > >> quack and a dinosaur eating your computer instead. > >> And another was efl.model which wasn't even > >> asynchronous at all, it just had a function that asked > >> the data to be cached, there was nothing really > >> asynchronous about it, you just _couldn't_ have > >> asynchronous calculations because all calculations > >> had to be ready for fetching synchronously, all > >> it had was two-phase construction, basically. > >> > >> On Fri, 3 Jun 2016 15:42:00 +0900 Carsten Haitzler (The Rasterman) > >> <ras...@rasterman.com> said: > >> > > >> > here's a rundown of efl promises vs other languages. basically our > >> > promises don't match any other languages. we can't just convert them to > >> > js promises or c+ > >> > + promise+futures... and lua just has NOTHING there in the language. so > >> > here is a table: > >> > > >> > FEATURE | EFL | C++ | JS | LUA | > >> > ---------------+-----+-----+-----+-----+ > >> > create | X | X | X | | > >> > destroy | X | X | X | | > >> > then/else | X | X | X | | > >> > value | X | X | X | | > >> > cancel | X | | | | > >> > all | X | | X | | > >> > race | X | | X | | > >> > progress | X | | | | > >> > get status | X | | | | > >> > poll value | X | | | | > >> > wait | | X | | | > >> > wait+timeout | | X | | | > >> > ---------------+-----+-----+-----+-----+ > >> > > >> > c++ futures/promises have features we don't. ti read up and they don't > >> > say wait/wait_for/until are optional and may not work. they seem to be > >> > requirements. so we can't map promises to c++ futures. it's not possible > >> > because we basically break how they work. > >> > > >> > we can't map them to js because js has no ability to cancel promises. > >> > also no progress too. so these features in core api's break then in js. > >> > > >> > it seems you can't ask if a promise or a future is done yet (without then > >> > blocking and waiting) in c++ or js, nor poll/get the value. (fyi in java > >> > you can poll the state to see if a future is done yet... for example - > >> > java not included above). > >> > > >> > lua has NOTHING AT ALL to map to. > >> > >> I'm not developing the lua bindings so I can't say what is really going > >> to be mapped to. But I can say what I expect it to be by having used > >> Lua in a while and specially in a very asynchronous context (distributed > >> systems). Lua should map to co-routines! It will be the most beautiful > >> binding we will have! > >> > >> You just write normal code, it stops and is descheduled (the binding > >> will use the Promise for that) and it is rescheduled when > >> the callback on promise_then is executed. > >> > >> This is why I'm saying on the beggining of the email that we shouldn't > >> think of promises as our uber-asynchronous-communication-class that > >> will be exposed to everybody. We just need well-defined semantics > >> for asynchronous operations so we can translate it to every binding > >> in the most fucking nice way. People will likely _wow_ at our > >> co-routines in Lua! I'm sure I could at least make the lab that > >> created Lua in Brazil to wow at creating GUI interfaces with > >> co-routines. > >> > >> For C++ I'll just implement wait, no big deal. Can it deadlock? Yes, > >> but this is C++, you can deadlock a future anyway, you must know > >> what you're doing. It will only be really usable in a threading > >> context. The other parts is just new member functions or free > >> functions on the efl::eina::future<T>. We use templates in C++, > >> not OO to represent most polymorphisms, this is exactly what > >> we did for efl::eina::list, efl::eina::array, etc. This is > >> expected for C++. > >> > >> For JS, we will just implement a new class with the normal > >> Promise API with just a few more functions as well, people don't > >> care this is not a "standard" Promise as long as it is a > >> thenable. This works exactly like C++ but it is dynamic. > >> > >> So, no problem at all for bindings, as long as we have a proper > >> Promise concept. > >> > >> For all creation "problems" we just pass a efl::eina::promise<X> > >> to C++, in JS we pass two functions (probably three in our case): > >> a success, an error and a progress function that is called > >> by the code that wants to instantiate a promise. That's > >> the way to create promises in JS. > >> > >> For Lua, it could be integrated to yield. > >> > >> The All/Race composition in C++ can just be a free function > >> that gets multiple futures and return another future with > >> a tuple of all values, no big deal. It would work very nicely. > >> > >> For Lua, you probably won't use all very much because a > >> coroutine is a promise_all instrinsically. The race thing > >> would be a composition on co-routines. > >> > >> All problems can be solved if we define promises as a properly > >> defined concept that can be used by bindings and are not > >> intended to be used by binding users directly. > >> > >> > -- > >> > Tom. > >> > >> Kind regards, > >> -- > >> Felipe Magno de Almeida > >> > >> ------------------------------------------------------------------------------ > >> What NetFlow Analyzer can do for you? Monitors network bandwidth and > >> traffic patterns at an interface-level. Reveals which users, apps, and > >> protocols are consuming the most bandwidth. Provides multi-vendor support > >> for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using > >> capacity planning reports. http://sdm.link/zohomanageengine > >> _______________________________________________ > >> enlightenment-devel mailing list > >> enlightenment-devel@lists.sourceforge.net > >> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > >> > > > > > > -- > > ------------- Codito, ergo sum - "I code, therefore I am" -------------- > > The Rasterman (Carsten Haitzler) ras...@rasterman.com > > > > > > -- > Felipe Magno de Almeida > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) ras...@rasterman.com ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports. http://sdm.link/zohomanageengine _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel