Take the following code:

#+BEGIN_SRC racket
(require racket/match)

(define-syntax-rule (methods* [(method-name method-args ...) body ...] ...
                              fallback)
  (let ((method-name
         (lambda (method-args ...)
           body ...)) ...)
    (define all-methods (list (cons 'method-name method-name) ...))
    (define method-dispatch
      (make-keyword-procedure
       (lambda (kw-args kw-vals method . args)
         (match (assq method all-methods)
           [(cons _name found-method)
            found-method
            #;(keyword-apply found-method kw-args kw-vals args)]
           [#f
            (keyword-apply fallback kw-args kw-vals method args)]))))
    method-dispatch))

(define no-such-method
  (make-keyword-procedure
   (lambda (kw-vals kw-args method . args)
     (error "No such method" method))))

(define-syntax-rule (methods method-defns ...)
  (methods* method-defns ... no-such-method))
#+END_SRC

This is kind of a kluge, I know.  But you get the idea.  Let over
lambda, because we're going to be reusing these procedures over and over
again across multiple calls.

Now let's say I instantiate this like:

#+BEGIN_SRC racket
  (define my-methods
    (methods
     [(double x)
      (* x x)]))
#+END_SRC

> my-methods
#<procedure:...tor-lib/methods.rkt:130:7>

That's the line where method-dispatch is defined, *inside the macro*.
But what I really want is for the annotation on the procedure to be
*where my-methods is defined*.... not pointing back inside the macro.

I have no idea how to do this.  Thoughts?

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/87sfveu34u.fsf%40dustycloud.org.

Reply via email to