(define (eq?-expansion expr operands block)
(if (and (pair? operands)
(pair? (cdr operands))
- (not (pair? (cddr operands))))
+ (null? (cddr operands)))
;; Convert (eq? <expr> #f) and (eq? #f <expr>) to (not <expr>)
;; Conditional inversion will remove the call to not.
- (cond ((constant-eq? (first operands) #f)
- (make-combination expr block (ucode-primitive not) (cdr operands)))
- ((constant-eq? (second operands) #f)
- (make-combination expr block (ucode-primitive not) (list (car operands))))
+ (cond ((expression/always-false? (first operands))
+ (if (expression/effect-free? (first operands))
+ (make-combination expr block (ucode-primitive not) (cdr operands))
+ (sequence/make (and expr (object/scode expr))
+ (list (first operands)
+ (make-combination #f block (ucode-primitive not) (cdr operands))))))
+ ((expression/always-false? (second operands))
+ (if (expression/effect-free? (second operands))
+ (make-combination expr block (ucode-primitive not) (list (car operands)))
+ (sequence/make (and expr (object/scode expr))
+ (list (second operands)
+ (make-combination #f block (ucode-primitive not) (list (car operands)))))))
(else
(make-combination expr block (ucode-primitive eq?) operands)))
#f))