#lang racket (define (less-funny-sum xs) (cond [(null? xs) 0] [(number? (car xs)) (+ (car xs) (less-funny-sum (cdr xs)))] [(string? (car xs)) (+ (string-length (car xs)) (less-funny-sum (cdr xs)))] [#t (error "hey man, that's not a string or number")])) ; ; expressions are either: ; ; - constants of int ; ; - negate of expr ; ; - addition of expr * expr ; ; - multiply of expr * expr ; ; (define (Const n) (list 'Const n)) ; (define (Negate e) (list 'Negate e)) ; (define (Addition e1 e2) (list 'Addition e1 e2)) ; (define (Multiply e1 e2) (list 'Multiply e1 e2)) ; ; ; car ; ; cdr ; ; c[ad]*r ; ; ; cdddddadr = (cdr (cdr (cdr (cdr (cdr (car (cdr ...))))))) ; ; (define (Const-number c) ; ; (car (cdr c)) ; (if (eq? (car c) 'Const) ; (cadr c) ; (error "Const-number: argument not Const?"))) ; ; ; (define (Negate-exp e) (cadr e)) ; ; (define (Addition-exp1 e) (cadr e)) ; (define (Addition-exp2 e) (caddr e)) ; ; (define (Multiply-exp1 e) (cadr e)) ; (define (Multiply-exp2 e) (caddr e)) ; ; ; ; equal? -- general ; ; = -- numbers ; ; eq? -- fast things, like symbols ; ; (define (Const? e) (eq? (car e) 'Const)) ; (define (Negate? e) (eq? (car e) 'Negate)) ; (define (Addition? e) (eq? (car e) 'Addition)) ; (define (Multiply? e) (eq? (car e) 'Multiply)) ; ; (define (eval-exp e) ; (cond [(Const? e) (Const-number e)] ; [(Negate? e) (- (eval-exp (Negate-exp e)))] ; [(Addition? e) (+ (eval-exp (Addition-exp1 e)) ; (eval-exp (Addition-exp2 e)))] ; [(Multiply? e) (* (eval-exp (Multiply-exp1 e)) ; (eval-exp (Multiply-exp2 e)))])) ; (struct Const (number) #:transparent) (struct Negate (exp) #:transparent) (struct Add (exp1 exp2) #:transparent) (struct Mult (exp1 exp2) #:transparent)