GSOC | Extending Common Lisp support

Jamison Hope jrh@theptrgroup.com
Tue Apr 24 22:51:00 GMT 2012


On Apr 24, 2012, at 6:09 PM, Charles Turner wrote:

> On 24 April 2012 08:30, Jamison Hope <jrh@theptrgroup.com> wrote:
>> Congratulations to you, sir!
>
> Thank you :)
>
>> We already touched on this a little bit in a previous message, but:  
>> as
>> you're working on this, I encourage you to strive to make things as
>> broadly reusable as possible.
>
> I had noticed these things, I already tried refactoring getNamedType,
> but it's not as straightforward as I initially thought. I'm going to
> try and get DECLARE's scoping working first, before sorting this out.

Yeah, don't get too hung up on it. Like I said, for now, the proper
response might just be to add a FIXME comment and move on.

> ================
>
> Following on from the DECLARE discussion, I tried creating let
> expressions for DECLARE'd bindings.
>
> Here's my latest approach in processTypeDeclArgs along with what I
> think each line is doing:
>
> for each declaration:
>
>        letStart(); // create a new lexical environment
>        ReferenceExp ref = new ReferenceExp(decl); // decl the x in a
> (declare (integer x))
>        letVariable(decl, ref); // push x into this new lexical  
> environment
>        this.lexical.push(decl); // not sure why this is necessary,
> Jamison's advice (I think!)

If you're creating a new let via Compilation#letStart() and going the
letVariable()/letEnter()/letDone() route, then you don't need to  
explicitly
do the lexical.push(). I had just mentioned that in case you were going
to reuse an existing let for which letEnter() had already been called --
in that case, you'd need to call let.add(decl) as well as  
lexical.push(decl)
in order to simulate the letVariable()/letEnter() calls.

For example:

(let ()      
<--------------------------------------------------------------\
   (declare (foo x)) ...) <- when processing this declare, reusing  
this let ^


But by calling letStart() / letVariable() / letEnter(), you're  
rewriting as:

(let ()                    // LET1
   (let ((x ::foo x)) ...)  // LET2

and letEnter() [corresponding to LET2] will automatically do the  
lexical.push(),
so it's probably wrong to manually call it there -- it'll get pushed  
twice but
only popped once (in letDone()).


>        letEnter(); // push this let expr in the lexical environment
>        decl.setType(this.exp2Type((Pair) typeList)); // set the type
> of x in this lexical environment
>        decl.setFlag(Declaration.TYPE_SPECIFIED);
>        letexp = letDone(rewrite_body(body)); // this is dodgy, seems
> necessary to finish up a LET

[snip]

I can't look into this right now, gotta be across town in 10 minutes.
Sorry! Anybody else want to take a look? I might have time later tonight
but no guarantee...

-Jamie

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





More information about the Kawa mailing list