Todd D: 1. This code must be the worst formatted Racket code I have seen in a long time. Please read EOPL and follow its example.
2. Next, when DrRacket tells you that a particular sub-expression in your program raised an error, please -- pretty please -- pay attention. I removed the superfluous parts of your program, added the one-line ddt, ran free-vars-list on a simple var-exp and immediately got the correct highlighting: #lang eopl (define-datatype expression expression? (var-exp (id symbol?))) (define free-vars-list (lambda (body) ( ;; <<================================== pink starts (if (list? body) (append (free-vars-list (car body)) (free-vars-list (cdr body))) (cases expression body ;; When we have a var-exp, return the variable (var-exp (id) id) (else (list 'fvl "can't happen"))) ) ) ) ;; <<================================= pink ends ) (free-vars-list (var-exp 'x)) 3. What are these parens doing here? Let me rewrite this here: (define free-vars-list (lambda (body) ( (if (list? body) ... ...) ) ) ) [I sincerely apologize for the last two lines.] As you can see now, your if expression is the function position of an application. Why? _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users