Hi Andy,

Thanks for the report!

Andy Wingo <[email protected]> skribis:

> I'm excited about the partial evaluator.  However there is one error
> I've found:
>
>   (letrec ((fold (lambda (f x b null? car cdr)
>                    (if (null? x)
>                        b
>                        (f (car x) (fold f (cdr x) b null? car cdr))))))
>     (fold * x 1 zero? (lambda (x) x) (lambda (x) (- x 1))))
>
> The expansion ends up with the body including lexical-refs to `car' and
> `cdr', but they aren't bound in the letrec body.

Ouch.  I’ve reduced it to:

  (letrec ((fold (lambda (f car) (f (car x)))))
    (fold * (lambda (x) x)))

  =>

  (letrec (fold)
    (#{fold 151247}#)
    ((lambda ((name . fold))
       (lambda-case
         (((f car)
           #f
           #f
           #f
           ()
           (#{f 151248}# #{car 151249}#))
          (apply (lexical f #{f 151248}#)
                 (apply (lexical car #{car 151249}#) (toplevel x)))))))
    (apply (primitive *)
           (apply (lexical car #{car 151249}#) (toplevel x))))

Let’s see...

Ludo’.

Reply via email to