[racket-dev] syntax taints instead of syntax certificates

From: Stephan Houben (stephanh at planet.nl)
Date: Thu Jun 30 14:20:07 EDT 2011

On 06/30/2011 05:01 AM, Carl Eastlund wrote:
> On Wed, Jun 29, 2011 at 10:55 PM, Matthew Flatt<mflatt at cs.utah.edu>  wrote:

>> The problem with having the macro transformer add `syntax-protect' for
>>
>>   (define-syntax bar
>>    (lambda (stx) ...))
>>
>> is that some other transformer can say
>>
>>   ((syntax-local-value #'bar) stx)
>>
>> to get the transformer's result without `syntax-protect' --- which was
>> a gaping hole that Ryan noticed in the certificate system.
>>
>> We considered ways of automating `syntax-protect' for all macros, but
>> the ways we found seemed to create more problems than they solved.
>
> Thank you, that greatly clarifies the issue for me.  Of course I would
> like to see syntax-case and syntax-parse have options to automatically
> syntax-protect as well; that will cover a lot more common cases for
> me.  But now I can see where the trade-offs are that resulted in this
> design.

Something like this springs to mind:

(define-syntax provide/protection
   (syntax-rules ()
     ((_ name)
      (begin
        (define-syntax tmp
          (syntax-rules ()
            ((_ . args) (name . args))))
        (provide (rename-out (tmp name)))))))

If I understand correctly then

(provide/protection mymacro)

would automatically wrap mymacro and export it
(by virtue of redirecting the transformation through syntax-rules).

May I suggest the following introduction for the documentation?

"Nice macros you have here. Would be a pity if ... something
happened to them. But we can provide... protection."

Stephan



Posted on the dev mailing list.