Created
September 2, 2013 23:48
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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