Skip to content

Instantly share code, notes, and snippets.

@drewc
Created August 20, 2019 18:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drewc/4ee85d7e26a364526f8931937b4947aa to your computer and use it in GitHub Desktop.
Save drewc/4ee85d7e26a364526f8931937b4947aa to your computer and use it in GitHub Desktop.
defsyntax (define-endpoint stx)
(def (%defvar name match in)
(let ((e (gensym))
(i (gensym))
(c (gensym))
(varname (string->symbol (format "~A::endpoint"
name))))
`(define ,varname
(let ((,e
(with-catch (set! bar mux)
(lambda (_)
(construct-endpoint ,name ,match))
(lambda ()
(let ((,e ,varname))
(set! (endpoint-match ,e) ,match)
,e))))
(,i ,in))
(unless (memq ,e ,i)
(set! (cdr ,i)
(cons ,e (cdr ,i))))
,e))))
(syntax-case stx ()
((macro name match in: endpoints)
(with-syntax ((var (datum->syntax #'macro
(%defvar (syntax-e #'name)
(syntax-e #'match)
(syntax-e #'endpoints)))))
#'var))
((macro name match)
(with-syntax ((var (datum->syntax #'macro
(%defvar (syntax-e #'name)
(syntax-e #'match)
'*endpoints*))))
#'var))))
@drewc
Copy link
Author

drewc commented Aug 20, 2019

(defrules define-endpoint ()
  ((_ name match)
   (add-endpoint! (make-endpoint 'name match)))
  ((_ name match args ... )
   (add-endpoint! (make-endpoint 'name match args ...)))
  ((_ name match mux: mux args ... )
   (add-endpoint! (make-endpoint 'name match args ...)
                  to: mux)))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment