Skip to content

Instantly share code, notes, and snippets.

@deeglaze
Created September 2, 2013 23:48
Show Gist options
  • Select an option

  • Save deeglaze/6418272 to your computer and use it in GitHub Desktop.

Select an option

Save deeglaze/6418272 to your computer and use it in GitHub Desktop.
A small presentation of the generics scoping weirdness, but doesn't exhibit the bug.
#lang racket/load
(module A racket
(provide gen:foo (rename-out [*a a]))
(define *a #t)
(define a #f)
(define-syntax gen:foo (list #'a)))
(module B racket
(require 'A) (provide ga)
(define-syntax (bar stx)
(define (find-generic-method ctx gen-id delta info method-id)
(define originals
(let loop ([original-ids info]
[rev-originals '()])
(cond
[(null? original-ids) (reverse rev-originals)]
[else
(define original-id (car original-ids))
(define context-id (syntax-local-get-shadower (delta original-id)))
(cond
[(free-identifier=? context-id method-id)
(loop (cdr original-ids) (cons original-id rev-originals))]
[else
(loop (cdr original-ids) rev-originals)])])))
(when (null? originals)
(raise-syntax-error
#f
(format "~.s is not a method of generic interfaces ~.s"
(syntax-e method-id)
(syntax-e gen-id))
ctx
method-id))
(unless (null? (cdr originals))
(raise-syntax-error
#f
(format "multiple methods match ~.s in generic interface ~.s: ~.s"
(syntax-e method-id)
(syntax-e gen-id)
(map syntax-e originals))
ctx
method-id))
(car originals))
(syntax-case stx ()
[(_ gen def derp)
(let ()
(define info (syntax-local-value #'gen (λ () #f)))
(define delta (syntax-local-make-delta-introducer #'gen))
(define methods (map delta info))
(define method-id (find-generic-method stx #'gen delta info #'def))
(with-syntax ([method method-id])
#'(define derp method)))]))
(bar gen:foo a ga))
(require 'B)
(display ga)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment