I learned about identifier macros mostly from scrambling through the racket sources. There they are often seen in places where macros are used instead of functions to avoid the cost of a function call. Normally. macros have the drawback that they can't be passed around or applied like functions.

(define-syntax-rule (call/print fun args ...)
  (begin
    (printf "call ~s\n" (cons 'fun '(args ...)))
    (fun args ...)))

(call/print printf "~a ~a\n" 1 2) ; works

(apply call/print printf "~a ~a\n" '(1 2)) ; fails with "use does not match pattern"

That's where identifier macros come into play:

(define-syntax call/print
  (syntax-id-rules ()
    [(_ fun args ...)
     (begin
       (printf "call ~s\n" (cons 'fun '(args ...)))
       (fun args ...))]
    [_ (lambda (fun . args)
         (printf "call ~s\n" (cons 'fun args))
         (apply fun args))]))

(call/print printf "~a ~a\n" 1 2) ; works with first rule
(apply call/print printf "~a ~a\n" '(1 2)) ; works with the second rule

Like this both cases work and the user must not know if, what he calls is a function or a macros. The advantage for the user is that he gets a speedup in the common case and the developer can optimize functions without breaking code.

Maybe that would be a good addition for the "Optimization" section.

Tobias


On Tue, 04 Dec 2012 23:16:17 +0100, Carl Eastlund <c...@ccs.neu.edu> wrote:

I'm confused about so-called "identifier macros".  I had thought that
ordinary transformers bound to functions could only transform
application-position references to themselves, and that a "set!
transformer" was required to transform bare references and set!
references.  Turns out I was wrong, set! transformers are in fact only
required to transform set! references.  So why are they listed under the
documentation for "identifier macros" and why does that documentation imply
that normal transformers can't handle bare references?

Carl Eastlund


--
---------------------------------------------------------
Tobias Hammer
DLR / Institute of Robotics and Mechatronics
Muenchner Str. 20, D-82234 Wessling
Tel.: 08153/28-1487
Mail: tobias.ham...@dlr.de
_________________________
 Racket Developers list:
 http://lists.racket-lang.org/dev

Reply via email to