Hi,

just trying to follow here and maybe clarify a bit.

Of course everybody here knows about the conventions :
  - 0 is the success return code
  - anything else is an (hopefully documented) error

we all know about logical shell chaining :

  cmd1 && cmd2 && cmd3 || cmd4

but what I think I understood here is that promises chaining should be a
different construction where the chaining is not dependent on the return code
(success/failure) of any of the actions.

  { action 1 } then { action 2 } then { action 3 }

it's a 'then' meaning 'after that', not an '&&' that means 'on action success'

so with v beeing the value of the promise, you do

  { action 1 } then { if (v!=0) return action21 else return action22 } then { 
if (v==0) action 3 }

and with handy helpers (operator logic) like

  bypassOnFailure(if (v!=0) return v)
  bypassOnSuccess(if (v==0) return v)

you can do

  { action1 } then { bypassOnFailure(); action2 } then { bypassOnSuccess(); 
action3 } then { byPassOnFailure; action4 }

the chaining fails on "System errors" -> Exception on some languages
the logic is implemented in the futur

hope I'm not in outer space.

On Thursday 22 March 2018  09:36, Carsten Haitzler wrote :
> On Wed, 21 Mar 2018 14:18:39 -0400 Cedric Bail <ced...@ddlm.me> said:
> 
> > On March 20, 2018 6:14 PM, Carsten Haitzler <ras...@rasterman.com> wrote:
> > > On Tue, 20 Mar 2018 12:06:08 -0400 Cedric Bail ced...@ddlm.me said:
> > > > On March 20, 2018 7:38 AM, Carsten Haitzler ras...@rasterman.com wrote:
> > > > > On Tue, 20 Mar 2018 10:06:43 -0300 Gustavo Sverzut Barbieri
> > > > > barbi...@gmail.com said:
> > > > 
> > > > <snip>
> > > > 
> > > > > > I said I'd give up... but seeing this makes me sad.
> > > > > > in two lines you: misused the Eina_Error AND missed the purpose of
> > > > > > resolve.
> > > > > > 
> > > > > > I hoped when you looked at it, written as code, you'd realize the
> > > > > > mistake... but seems not... so I'm pointing here.
> > > > > > 
> > > > > > eina_error conversion to string (which will be helpful to high level
> > > > > > languages) is missed, "+ 1000000" is an error that is not
> > > > > > registered...
> > > > > > 
> > > > > > OTOH success is always ZERO, so there is no value... IF that would 
> > > > > > be
> > > > > > right, then it should be a void promise (carries no value).
> > > > > > 
> > > > > > but my hope is that you'll simply move this to
> > > > > > eina_promise_resolve(pd->promise, eina_value_int_init(exit_code))
> > > > > > 
> > > > > > and listen to my advice that is to move the "!= 0" OUTSIDE of this
> > > > > > function, you're mixing roles :-/
> > > > > 
> > > > > eh? we only have 1 value to know of success or failure. an int. 0 ==
> > > > > success. anything else is failure. that's precisely what i did right
> > > > > there.
> > > > 
> > > > No. Think about what Eina_Error mean for binding. It will trigger an
> > > > exception in some language. Now the user as to catch exception and
> > > > instead of doing a switch on expected real error, it has to work around
> > > > this hack to get the real exit status. Additionnaly, there is no
> > > > requirement/guarantee in Eina_Error that this error code will never be
> > > > used for something else.
> > > 
> > > i'm not the one coming up with raising exceptions or not, BUT i mentioned
> > > this before. shell:
> > > 
> > > cmd1 && cmd2 && cmd3
> > >
> > > is a chain of promises. they are the same thing. if cmd1 succeedsm then 
> > > run 
> > > cmd2, if that succeeds run cmd3. if the "it doesnt succeed" is done via an
> > > exception - then promises are going to SUCK.
> > 
> > Great example. This is not a chain of error/success, but a logical and
> > operator, the same way you would do in C :
> > 
> > if (f1() && f2() && f3())
> 
> which is a chain of success only. fo f1, if that is true then f2, if that is
> true then f3.
> 
> if the promises don't fail when the error code is non-zero then you can't 
> chain
> like the above.
> 
> > A chain of future is not designed to just implement the above line, but you
> > should be able to do also :
> > 
> > do || fallback
> 
> and that is a different kind of chain which actually does both things
> irrespective, but logically or's the result. so if do AND fallback both errors
> your result will be "false" (promises just extend this logic over time async
> rather than in-line in a blocking kind of way like if's etc.)
> 
> > or even :
> > 
> > [$? -ne 5]
> > 
> > In all of this case, it is using $? value explicitely or implicitely. It
> 
> in this case you are checking the error code to see what kind of error. an 
> exit
> code of 5 never should imply success. not in the world of the command line
> shell. i didn't make those rules. i'm just following the pattern.
> 
> > would be the same in C, a value. So during a future resolution is when you
> > take a decision on what to do with the value, should it be a &&, ||, -ne, 
> > -eq
> > or whatever. future/promise are a generic construct, they are not supposed 
> > to
> > just handle the shell && command.
> 
> see eio. this does exactly the stuff that eio does. it decides when it's a 
> fail
> or success. with eio for example with stat the eina error value is the 
> syscalls
> errno value. in this case since its a system error ECANCEL will be distinctly
> "not reported" because stat won't say that. there is no conflict.
> 
> with exe exit codes there is a conflict as it can report ANYTHING (actually
> exit codes are basically masked with 0xff so they only report 0->255 even
> thought it's a full int in the C ABI).
> 
> > > if a file download failed to fully complete - exception. if a file_set
> > > failed because file doesn't exist - exception. you do know that there is
> > > tonnes of code in e and efl that does a file_set to just determine if the
> > > file exists AND is an image or not? (well file_set then size_get for non 0
> > > size). if exceptions are the way to do this then there are going to be a
> > > LOT of them and people have to handle them in that language.
> > 
> > Some language implementation of future and asynchronous primitive, like for
> > example Javascript, do not have a failure case. To generate a failure, you
> > throw an execption and you catch it at the end of the future pipeline. 
> > That's
> > how it work. So yes, in some language, you have to deal with exception. And
> > the interface should document the expected exception at some point.
> 
> so if the language means you must handle exceptions then that's how it works.
> you must handle them.
> 
> > > if exe's can never fail - they always succeed unless there is a total
> > > catastrophic failure (fork or something before fork fails - highly 
> > > unlikely)
> > > then you can never use promise chains to run a series of commands one 
> > > after
> > > the other.
> > 
> > If you actually return a value, you can actually make series of commands 
> > with
> > all the behavior you want more easily. How about doing something when the
> > exit code is 5 ? future are a generic construct, not their to do only the
> > equivalent of &&.
> 
> you get an eina error with a value of 1000005. i just used the +100000 to push
> the exit code value well outside any normal range of error codes so its
> distinguishable fro ECANCEL. you get the information. it's there.
> 
> an exit code of 5 is an error. by definition. i didn't make he definition. 
> that
> was done long ago. just like when stat fails in eio and the promise is 
> rejected
> with the errno. the stat failing is an error. even if all i want to do is 
> check
> if the file exists (a very common use of stat - i don't want the data. i just
> want to know if it's there or not). if i need exceptions to deal with "it's 
> not
> there" result... then i have to do that.
> 
> > > something has to make a decision on failure and promises make that 
> > > decision
> > > when it's rejected, and the point of rejection is exit code. the shell
> > > already decided on this. cmd1 && cmd2.
> > 
> > Yes, your code in the future or as Gustavo proposed, we can have helper that
> > check for this value and provide operator logic that you can insert in the
> > pipeline. I hope that help you understand why a process exit code is a 
> > value.
> 
> it's not a "success value". it's an "error value". i've been saying that
> clearly and pointing to how the shell determines it is an error too (a && b &&
> c, /bin/sh -e, state nonexistentfile etc.). the convention is that anything
> non-ero is an error and it's just reporting the kind of error value. that is
> reporting as an eina error in a promise reject, just like eio does.
> 
> if simplecerrors like "file not found" for stat is a promise reject + eina
> error, then execing stat nonexistent file MUST produce the same kind of result
> - an error if the file does not exist (which the stat command will do),
> otherwise it's not consistent. same with any other command.
> 
> Makefiles are another great example. any non-zero exit code from a compile
> command results in the entire compile breaking at that point. any shell
> commands using non-zero exit codes as success of any sort are just simply
> broken commands as they would fail in the above sh -e, makefile, a && b && c,
> etc. etc. cases as they do not follow the shell convention.
> 
> the default "out of the box' must absolutely be anything non-zero is a failure
> because that is the default "out of the box" convention on the cmdline. a
> failure is a promise reject. you clearly did just that in eio.
> 
> if you want tov have some mapping capability to turn some errors into success,
> then that is out of scope for the code in question right now as it is
> implementing a sane default that follows conventions laid down decades ago. if
> by default it succeeded with non-zero exit codes then it'd be broken code as 
> it
> would not be following any conventions within efl (see my comparisons to eio),
> nor from the outside world (command line + exit codes).
> 
> if you want to argue that a non-zero exit code is not an error on the
> command-line (exit codes of processes), then point me to a shell/cmdline
> convention that follows this. for example: ccache returns 0 if the cached file
> is not found or valid and it has to run gcc to do a full compile, or it 
> returns
> 5 if the cache is a hit and can avoid the compile. just an example. point me 
> to
> a NON-BROKEN real usage of non-zero exit codes for success.
> 
> then point me to how they are the majority of cases so that the convention in
> efl should interpret non-zero exit codes as success. then  you will convince 
> me
> that non-zero exit codes are successes.
> 
> i know of no such examples (of non-broken cmds that won't break all of the
> above conventions on the cmdline/shell scrips/Makefiles or basically anything
> that is EXECUTING things and needing to base decisions on what to do next by
> exit codes), thus i'm not even trying to find a solution to this at this point
> because it's not worth doing unless there is a good reason to.
> 
> -- 
> ------------- Codito, ergo sum - "I code, therefore I am" --------------
> Carsten Haitzler - ras...@rasterman.com
> 
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
--- Hell'O from Yverdoom

Jérémy (jeyzu)

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to