manual-method.rkt (1876B)
1 #lang scheme/base 2 (require "../struct.rkt" 3 "../search.rkt" 4 "../scheme.rkt" 5 "../basic.rkt" 6 "manual-scheme.rkt" 7 (for-syntax scheme/base)) 8 9 (provide ;; public: 10 method xmethod) 11 ; XXX unknown contracts 12 (provide *method **method 13 method-tag 14 constructor-tag 15 name-this-object) 16 17 (define-syntax-rule (method class/interface method-name) 18 (*method 'method-name (quote-syntax class/interface))) 19 20 (define-syntax-rule (xmethod class/intf-id method-id) 21 (elem (method class/intf-id method-id) " in " (racket class/intf-id))) 22 23 (define (*method sym id 24 #:defn? [defn? #f]) 25 (**method sym id #:defn? defn?)) 26 27 (define (**method sym id/tag 28 #:defn? [defn? #f]) 29 (define content (list (symbol->string sym))) 30 (define (mk tag) 31 (make-element symbol-color 32 (list (make-link-element (if defn? 33 value-def-color 34 value-link-color) 35 content 36 (method-tag tag sym))))) 37 (if (identifier? id/tag) 38 (make-delayed-element 39 (λ (ren p ri) 40 (let ([tag (find-scheme-tag p ri id/tag #f)]) 41 (if tag (list (mk tag)) content))) 42 (λ () (car content)) 43 (λ () (car content))) 44 (mk id/tag))) 45 46 (define (method-tag vtag sym) 47 (list 'meth (list (cadr vtag) sym))) 48 49 (define (constructor-tag vtag) 50 (list 'constructor (cadr vtag))) 51 52 (define (name-this-object type-sym) 53 (to-element 54 (string->symbol 55 (regexp-replace 56 #rx"(%|<%>|-mixin)$" 57 (format "_a~a-~s" 58 (if (member (string-ref (symbol->string type-sym) 0) 59 '(#\a #\e #\i #\o #\u)) 60 "n" 61 "") 62 type-sym) 63 ""))))