#lang racket (provide (all-defined-out)) (define (funny-sum xs) (cond [(null? xs) 0] [(number? (car xs)) (+ (car xs) (funny-sum (cdr xs)))] [(string? (car xs)) (+ (string-length (car xs)) (funny-sum (cdr xs)))])) (define (ios-num x) (if (string? x) (string-length x) x)) (define (funny-sum2 xs) (foldl + 0 (map ios-num xs))) (define (Int i) (list 'Int i)) (define (Neg e) (list 'Neg e)) (define (Add e1 e2) (list 'Add e1 e2)) (define (Mul e1 e2) (list 'Mul e1 e2)) (define (Int? x) (eq? (car x) 'Int)) (define (Neg? x) (eq? (car x) 'Neg)) (define (Add? x) (eq? (car x) 'Add)) (define (Mul? x) (eq? (car x) 'Mul)) (define (Int-i e) (car (cdr e))) ; cadr (define (Neg-e e) (car (cdr e))) ; cadr (define (Add-l e) (car (cdr e))) ; cadr (define (Add-r e) (car (cdr (cdr e)))) ; caddr (define (Mul-l e) (car (cdr e))) ; cadr (define (Mul-r e) (car (cdr (cdr e)))) ; caddr (define (eval-exp e) (cond [(Int? e) e] [(Neg? e) (Int (- (Int-i (eval-exp (Neg-e e)))))] [(Add? e) (let ([vl (Int-i (eval-exp (Add-l e)))] [vr (Int-i (eval-exp (Add-r e)))]) (Int (+ vl vr)))] [(Mul? e) (let ([vl (Int-i (eval-exp (Add-l e)))] [vr (Int-i (eval-exp (Add-r e)))]) (Int (* vl vr)))] [#t (error "eval-exp expected an exp")])) (define x (Add (Int 3) (Int 4)))