[racket] Unexpected results with impersonators and make-keyword-procedure

From: Scott Moore (sdmoore at fas.harvard.edu)
Date: Fri Mar 6 20:04:10 EST 2015

Hi,

I've run into some strange behavior with the interaction between
impersonators and make-keyword-procedure. I expect that when not invoked
with keywords, the result of make-keyword-procedure and a lambda with the
same form should be equivalent. Instead, they behave differently when
impersonated. I have included a small module that demonstrates the issue
below. I expect that the two checks at the bottom should succeed.

Thanks,
Scott

#lang racket

(require rackunit)

(define-values (prop:my-prop my-prop? my-prop-accessor)
  (make-impersonator-property 'my-prop))

(define (mark-with-my-prop val)
  (impersonate-procedure
   val
   #f
   prop:my-prop
   #t))

(define (mark-fun-mkp f)
  (mark-with-my-prop
   (make-keyword-procedure
    (λ (kwds kwd-args . other-args)
      (keyword-apply f kwds kwd-args other-args))
    (λ args
      (apply f args)))))

(define (mark-fun-lambda f)
  (mark-with-my-prop
   (λ args
     (apply f args))))

(define (dummy-impersonator val)
  (make-keyword-procedure
   (λ (kwds kwd-args . other-args)
     (apply values kwd-args other-args))
   (λ args
     (apply values args))))

(define marked-mkp (mark-fun-mkp display))
(define marked-lambda (mark-fun-lambda display))

(check-eq? (my-prop? marked-lambda) (my-prop? marked-mkp))
(check-eq? (my-prop? (impersonate-procedure marked-lambda
(dummy-impersonator marked-lambda)))
           (my-prop? (impersonate-procedure marked-mkp (dummy-impersonator
marked-mkp))))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20150306/9edccd7b/attachment-0001.html>

Posted on the users mailing list.