Skip to content

Instantly share code, notes, and snippets.

@lexi-lambda
Created November 9, 2018 16:24
Show Gist options
  • Save lexi-lambda/a51476311f345fbc13ef0cd9858bf4cc to your computer and use it in GitHub Desktop.
Save lexi-lambda/a51476311f345fbc13ef0cd9858bf4cc to your computer and use it in GitHub Desktop.
#lang racket
(require (for-syntax racket/syntax
threading)
racket/contract
syntax/parse/define)
(define/contract (make-singleton name)
(-> symbol? any/c)
(struct singleton ()
#:reflection-name name
; Never print constructor-style, even if the inspector is stronger.
#:property prop:custom-write
(let ([str (string-append "#<" (symbol->string name) ">")])
(λ (self out mode) (write-string str out))))
(singleton))
(define-simple-macro (define-singleton name:id)
#:with name? (format-id #'name "~a?" #'name)
#:do [(define name-len (string-length (symbol->string (syntax-e #'name))))]
#:with name?+sub-range-binders (syntax-property #'name? 'sub-range-binders
(list (vector (syntax-local-introduce #'name?)
0 name-len 0.5 0.5
(syntax-local-introduce #'name)
0 name-len 0.5 0.5)))
(begin
(define name (make-singleton 'name))
(define (name?+sub-range-binders v) (eq? v name))))
(define-simple-macro (define-singletons name:id ...+)
(begin (define-singleton name) ...))
(define-singleton foo)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment