Skip to content

Instantly share code, notes, and snippets.

@ktakashi
Created September 3, 2015 14:22
Show Gist options
  • Save ktakashi/459d19f7b0321923a1e9 to your computer and use it in GitHub Desktop.
Save ktakashi/459d19f7b0321923a1e9 to your computer and use it in GitHub Desktop.
;; -*- mode: scheme -*-
#!r6rs
(library (prefixed-syntax-rules)
(export prefixed-syntax-rules)
(import (rnrs))
(define-syntax prefixed-syntax-rules
(lambda (x)
(define (check-pattern p)
(define (prefiex? id)
(let ((sym (syntax->datum id)))
(and (not (pair? sym))
(or (not (symbol? sym))
(eq? sym '_)
(eq? sym '...)
(char=? (string-ref (symbol->string sym) 0) #\?)))))
(syntax-case p ()
((id rest ...)
(prefiex? #'id)
(check-pattern #'(rest ...)))
(((a . d) rest ...)
(and (check-pattern #'a) (check-pattern #'d))
(check-pattern #'(rest ...)))
((#(e ...) rest ...)
(check-pattern #'(e ...))
(check-pattern #'(rest ...)))
(() #t)
(k (prefiex? #'k))))
(define (check-patterns p*)
(syntax-case p* ()
(() #'#t)
((p1 p* ...)
(check-pattern #'p1)
(check-patterns #'(p* ...)))
(_ #f)))
(syntax-case x ()
((_ (literals ...) (pat templ) ...)
(check-patterns #'(pat ...))
#'(syntax-rules (literals ...) (pat templ) ...))
(_ (syntax-violation 'prefixed-syntax-rules
"pattern doesn't have ?" '#'x)))))
)
#!r6rs
(import (except (rnrs) syntax-rules)
(for (rename (prefixed-syntax-rules)
(prefixed-syntax-rules syntax-rules))
expand))
(define-syntax foo
(syntax-rules ()
((_ (?foo ?bar) "hoge" ?oops)
(let ((oops (?oops)))
(+ ?foo oops)))))
(display (foo (1 2) "hoge" (lambda () 1))) (newline)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment