.NULL. AND m.X <=== must return .null. if m.X is .T., then m.X must to be evaluated
No this is incorrect.
It is not the value of m.X that it determines if must or not must eval m.X,
but the fact that I must know if it is .F. ( for .AND. ) or .T. ( for .OR. ).
Example, when VFP found a .F. it have a deterministic result, and it stop the evaluation:
CLEAR
?
= NULL AND mX(.F.) AND mX(.T.)
?
= NULL AND mX(.T.) AND mX(.F.)
FUNC mX(y)
?? y
RETURN m.y
ENDFUNC