Actually ... just found the original source code of XLisp 0.0 here:
http://www.softwarepreservation.org/projects/LISP/xlisp/0_0/Extract from xlmath.c
/* lor - logical or */
static struct node *lor(args)
struct node *args;
{
struct node *oldstk,arg,*val;
/* create a new stack frame */
oldstk = xlsave(&arg,NULL);
/* initialize */
arg.n_ptr = args;
val = NULL;
/* evaluate each argument */
while (arg.n_ptr != NULL)
if (cnvnum(xlevarg(&arg.n_ptr)) != 0) {
val = true;
break;
}
/* restore the previous stack frame */
xlstack = oldstk;
/* return the result value */
return (val);
}
Clearly it returns the first value which evaluates to != 0.
Same for and:
/* land - logical and */
static struct node *land(args)
struct node *args;
{
struct node *oldstk,arg,*val;
/* create a new stack frame */
oldstk = xlsave(&arg,NULL);
/* initialize */
arg.n_ptr = args;
val = true;
/* evaluate each argument */
while (arg.n_ptr != NULL)
/* get the next argument */
if (cnvnum(xlevarg(&arg.n_ptr)) == 0) {
val = NULL;
break;
}
/* restore the previous stack frame */
xlstack = oldstk;
/* return the result value */
return (val);
}
Returns the value of the last item if all arguments evaluates to != 0.
So this is definitely an ADesk change! Which makes AL the only lisp to return T / nil ONLY from or/and.