GSOC | Extending Common Lisp support

Jamison Hope jrh@theptrgroup.com
Mon Jun 4 04:12:00 GMT 2012


On Jun 3, 2012, at 11:10 PM, I wrote:

> (function x) is still having trouble

The difference here appears to be that in function#rewriteForm(),
it creates a ReferenceExp like this:

	    ReferenceExp rexp = new ReferenceExp(name);
	    rexp.setProcedureName(true);
	    rexp.setFlag(ReferenceExp.PREFER_BINDING2);
	    return rexp;

without assigning it a value for its binding. Then FindCapturedVars
comes along and in its visitReferenceExp() does this:

     Declaration decl = exp.getBinding();
     if (decl == null)
       {
	decl = allocUnboundDecl(exp.getSymbol(),
				exp.isProcedureName());
	exp.setBinding(decl);
       }

and then issues the "no declaration seen" warning.

One way to fix this (which ends up fixing my simple test) is to change
function.java to do the lookup:
             Declaration decl = tr.lookup(name,  
Language.FUNCTION_NAMESPACE);
             if (decl != null)
             {
               return new ReferenceExp(name, decl);
             }
	    ReferenceExp rexp = new ReferenceExp(name);
	    rexp.setProcedureName(true);
             ...

With that, I no longer get the warning, and moreover (write #'x)
succeeds:

> $ kawa /tmp/namespaces.lisp
> 1
> "hello"
> #<procedure x>

Is that a valid change to make? I *think* that calling tr.lookup() from
within function.rewriteForm() will do the appropriate lexical search,
but I'm still a little fuzzy about what's supposed to happen when in the
various Syntax methods.

--
Jamison Hope
The PTR Group
www.theptrgroup.com





More information about the Kawa mailing list