[racket] Code Error Creating List
I apologize in advance for not actually reading through your code
beyond the point where it began using constructs that I'm not familiar
with, but I will give some advice that may or may not be helpful.
You're trying to return '(x). What you're actually returning is
(x)--an application of the value x with no arguments. It looks to me
like you're missing a level of quote-ness somewhere, or you're
accidentally evaluating the return value instead of just returning it.
Todd (but not the same one who asked the question)
On Tue, May 17, 2011 at 8:03 PM, Todd Dobmeyer <dobmeyer.2 at wright.edu> wrote:
> I am taking a class at Wright State University and we are working on problem
> 3.27 from the EOPL 2nd Edition. This problem has us modifying the closure
> procedure to only bind the free variables in our environment instead of
> storing all the variables. I am trying to write some code that will create a
> list of all the variables in my expression. This will then be passed to a
> difference procedure (that has been provided) to determine which variables
> are free. Unfortunately, every time I run my procedure, I receive the error:
> "procedure application: expected procedure, given: x (no arguments)" What I
> should be returning is the list '(x) as "x" is the only variable in my
> simple expression. The string I am running is as follows:
>
> (define str2 "let x = 15 y = 27
> in let f = proc () x
> in let x = 8
> in (f)")
>
> I then run the command:
>
> (run str2)
>
> After it works through its beginning work, it finally hits the proc-exp
> where it calls closure. My closure function calls me free-vars procedure but
> it apparently does not return a list like I think it should. I have tried
> numerous ways and always get this same error. Any ideas on where I am going
> wrong would be greatly appreciated. I'm sure there are errors inside my
> logic, but if anybody can help me figure out why I am not returning a list
> out of (free-vars) that would be great! My code looks like:
>
> (define free-vars
> (lambda (body)
> (list (free-vars-list body))
> )
> )
>
> (define free-vars-list
> (lambda (body)
> (
> (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)
> (primapp-exp (prim rands) (append(free-vars-list
> (car rands)) (free-vars-list (cdr rands))))
> (if-exp (test-exp true-exp false-exp)
> (append (free-vars-list test-exp)
> (free-vars-list true-exp) (free-vars-list false-exp)))
> (begin-exp (exp1 exps) (append (free-vars-list
> exp1) (free-vars-list exps)))
> (let-exp (ids rands body) (append (free-vars-list
> body)))
> (proc-exp (ids body) (append (free-vars-list
> body)))
> (app-exp (rator rands) (append (free-vars-list
> rator) (free-vars-list rands)))
> (else '())
> )
> )
> )
> )
> )
>
> (define closure
> (lambda (ids body env)
> (let ((todd (free-vars body)))
> (let ((freevars (difference todd ids)))
> (let ((saved-env
> (extend-env
> freevars
> (map (lambda (v) (apply-env env v)) freevars)
> (empty-env))
> ))
> (lambda (args)
> (eval-expression body (extend-env ids args env)))
> )
> )
> ))
> )
>
> My call stack looks like:
>
> procedure application: expected procedure, given: x (no arguments)
>
> C:\Users\Todd\Documents\CS784\Assign2\3-5-mod.scm: 255:4
> (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)
> (primapp-exp (prim rands) (append(free-vars-list
> (car rands)) (free-vars-list (cdr rands))))
> (if-exp (test-exp true-exp false-exp)
> (append (free-vars-list test-exp)
> (free-vars-list true-exp) (free-vars-list false-exp)))
> (begin-exp (exp1 exps) (append (free-vars-list
> exp1) (free-vars-list exps)))
> (let-exp (ids rands body) (append (free-vars-list
> body)))
> (proc-exp (ids body) (append (free-vars-list
> body)))
> (app-exp (rator rands) (append (free-vars-list
> rator) (free-vars-list rands)))
> (else '())
> )
> )
> )
> )
> )
>
> (define closure
> (lambda (ids body env)
>
> C:\Users\Todd\Documents\CS784\Assign2\3-5-mod.scm: 247:4
> (list (free-vars-list body))
> )
> )
>
> (define free-vars-list
> (lambda (body)
>
> C:\Users\Todd\Documents\CS784\Assign2\3-5-mod.scm: 276:4
> (let ((freevars (difference todd ids)))
> (let ((saved-env
> (extend-env
> freevars
> (map (lambda (v) (apply-env env v)) freevars)
> (empty-env))
> ))
> (lambda (args)
> (eval-expression body (extend-env ids args env)))
> )
> )
> ))
> )
>
> (run str2)
>
> C:\Users\Todd\Documents\CS784\Assign2\3-5-mod.scm: 138:4
> (map (lambda (x) (eval-rand x env)) rands)))
>
> C:\Users\Todd\Documents\CS784\Assign2\3-5-mod.scm: 120:8
> (let ((args (eval-rands rands env)))
> (eval-expression body (extend-env ids args env))))
>
> Thanks for all your help!
> Todd
> _________________________________________________
> For list-related administrative tasks:
> http://lists.racket-lang.org/listinfo/users
>