- ; For (cond ...) forms, a special case is a (condition) clause without
- ; body. In this case, the value of condition itself should be returned,
- ; and thus is saved in a local variable for testing and returning, if it
- ; is found true.
- ((cond . ,clauses) (guard (and-map (lambda (el)
- (and (list? el) (not (null? el))))
- clauses))
- (let iterate ((tail clauses))
- (if (null? tail)
- (nil-value loc)
- (let ((cur (car tail)))
- (if (null? (cdr cur))
- (let ((var (gensym)))
- (make-let loc
- '(condition) `(,var) `(,(compile-expr (car cur)))
- (make-conditional loc
- (make-lexical-ref loc 'condition var)
- (make-lexical-ref loc 'condition var)
- (iterate (cdr tail)))))
- (make-conditional loc
- (compile-expr (car cur))
- (make-sequence loc (map compile-expr (cdr cur)))
- (iterate (cdr tail))))))))
-
- ((and) (t-value loc))
- ((and . ,expressions)
- (let iterate ((tail expressions))
- (if (null? (cdr tail))
- (compile-expr (car tail))
- (make-conditional loc
- (compile-expr (car tail))
- (iterate (cdr tail))
- (nil-value loc)))))
-
- ((or . ,expressions)
- (let iterate ((tail expressions))
- (if (null? tail)
- (nil-value loc)
- (let ((var (gensym)))
- (make-let loc
- '(condition) `(,var) `(,(compile-expr (car tail)))
- (make-conditional loc
- (make-lexical-ref loc 'condition var)
- (make-lexical-ref loc 'condition var)
- (iterate (cdr tail))))))))