> On Mar 13, 2016, at 8:36 AM, Aleksej Saushev <a...@inbox.ru> wrote: > > Hello, > > Robert Elz <k...@munnari.oz.au> writes: > >> Currently, NetBSD's /bin/sh (all versions since $(( )) was added, back >> in 1994 it seems) calculate the result of >> >> x && y >> >> as 0 if x == 0, otherwise y, and calculate >> >> x || y >> >> as x if x != 0, and as y otherwise. >> >> That is, 3 && 4 evaluates to 4, and 3 || 4 evaluates to 3. >> >> In C, these operators always produce 1 or 0 (true or false), regardless >> of the values of the operands. >> >> So does every other shell I can find to test. >> >> I have just submitted PR bin/50960 about this issue (and it would probably >> be better if you replied to that PR, rather than this e-mail). >> >> I have a fix, it is trivial, but I don't want to implement if someone >> in the NetBSD community (or more importantly, something in the system) is >> relying upon this odd behaviour. > > It is not odd, it follows well-established long-standing tradition that > is reflected in, e.g.: > > "AND evaluates each [expression] until a value of NIL is found or the > end of the list is encountered. If a non-NIL value is the last value it > is returned, or NIL is returned." > > "...expressions which are evaluated in order of their appearance. When > one is found to be non-NIL it is returned as the value of OR. If all are > NIL, NIL is returned." > (The Standard Lisp Report, ca. 1982) > > "If all forms but the last evaluate to true values, <<and>> returns the > results produced by evaluating the last form." > > "If the evaluation of any form other than the last returns a primary > value that is true, <<or>> immediately returns that value..." > (Common Lisp HyperSpec, 1996) > > "If every form but the last evaluates to a non-nil value, <<and>> returns > whatever the last form returns." > > "If any form other than the last evaluates to something other than nil, > <<or>> immediately returns that non-nil value without evaluating the > remaining forms." > (Common Lisp the Language, 2nd ed., 1994) > > "The <test> expressions are evaluated from left to right, and the value > of the first expression that evaluates to a false value (see [Booleans]) > is returned. Any remaining expressions are not evaluated. If all the > expressions evaluate to true values, the value of the last expression is > returned." > > "The <test> expressions are evaluated from left to right, and the value > of the first expression that evaluates to a true value (see [Booleans]) > is returned." > (Revised^4 Report on Scheme, 1991) > > I don't have earlier references at hand. > > > -- > HE CE3OH... >
Is $(( )) lisp mode or arithmetic mode?