Guest User

Untitled

a guest
Oct 15th, 2012
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. #lang racket
  2. (require syntax/parse/define
  3. (for-syntax syntax/parse
  4. racket/syntax
  5. racket/struct-info
  6. racket/list))
  7.  
  8. (begin-for-syntax
  9. (define (rename id stx)
  10. (syntax-parse stx
  11. [(name args ...) #`(#,id args ...)]
  12. [_ id]))
  13.  
  14. (struct class (name methods)
  15. #:property prop:procedure (λ (this stx) (rename (class-name this) stx)))
  16.  
  17. (struct typed-id (name type)
  18. #:property prop:procedure (λ (this stx) (rename (typed-id-name this) stx))))
  19.  
  20. (define-simple-macro (define-class name:id slot:id ...)
  21. #:with hidden (generate-temporary #'name)
  22. (begin (struct hidden (slot ...))
  23. (define-syntax name (class #'hidden (list #'slot ...)))))
  24.  
  25. (define-simple-macro (define-class-instance name:id (~var class (static class? "class")) arg ...)
  26. #:do [(define args-count (length (class-methods (syntax-local-value #'class))))]
  27. #:fail-unless (= (length (syntax->list #'(arg ...))) args-count)
  28. (format "need ~a arguments" args-count)
  29. #:with hidden (generate-temporary #'name)
  30. (begin (define hidden (class arg ...))
  31. (define-syntax name (typed-id #'hidden #'class))))
  32.  
  33. (define-simple-macro (slot-value (~var id (static typed-id? "typed id")) slot:id)
  34. #:do [(define class (syntax-local-value (typed-id-type (syntax-local-value #'id))))
  35. (define accessors (fourth (extract-struct-info (syntax-local-value (class-name class)))))
  36. (define rest-accessors (memf (λ (x) (free-identifier=? x #'slot)) (class-methods class)))]
  37. #:fail-unless rest-accessors
  38. (format "slot ~a does not exist in class ~a."
  39. (symbol->string (syntax->datum #'slot))
  40. (symbol->string (syntax->datum (typed-id-type (syntax-local-value #'id)))))
  41. #:with accessor (list-ref accessors (- (length accessors) (length rest-accessors)))
  42. #:with real-name (typed-id-name (syntax-local-value #'id))
  43. (accessor real-name))
Advertisement
Add Comment
Please, Sign In to add comment