def OR_handler(exp): """We have to consider three cases: (OR) ===> #t (OR e1) ===> e1 (OR e1 e2 ...) ===> (let ((temp-val e1)) (IF temp-val temp-val (OR e2 ...))) ===> ((lambda (temp-val) (IF temp-val temp-val (OR e2 ...))) e1) """ clauses = and_clauses(exp) if pair.length(clauses) == 0: return symbol.true elif pair.length(clauses) == 1: return pair.car(clauses) else: temporarySymbol = symbol.makeUniqueTemporary() lambdaVal = expressions.makeLambda( pair.list(temporarySymbol), pair.list(expressions.makeIf(temporarySymbol, temporarySymbol, makeOr(pair.cdr(clauses))))) return expressions.makeApplication( lambdaVal, pair.list(pair.car(clauses)))
def AND_handler(exp): """We have to consider three cases: (AND) ===> #f (AND e1) ===> e1 (AND e1 e2 ...) ===> (IF e1 (AND e2 ...) #f) """ clauses = and_clauses(exp) if pair.length(clauses) == 0: return symbol.false elif pair.length(clauses) == 1: return pair.car(clauses) else: return expressions.makeIf(pair.car(clauses), makeAnd(pair.cdr(clauses)), symbol.false)
def c_altern(alternative_value): return pogo.bounce(cont, expressions.makeIf(pred_value, consequent_value, alternative_value))