Skip to content

Instantly share code, notes, and snippets.

@ktakashi
Created August 9, 2018 07:18
Show Gist options
  • Save ktakashi/f194045b93843f093a6fb8f1715c1f93 to your computer and use it in GitHub Desktop.
Save ktakashi/f194045b93843f093a6fb8f1715c1f93 to your computer and use it in GitHub Desktop.
Simple define-macro by syntax-case
#!r6rs
(import (rnrs))
(define-syntax define-macro
(lambda (x)
(syntax-case x ()
((_ (name args ... . rest) body ...)
#'(define-macro name (lambda (args ... . rest) body ...)))
((_ name body)
(identifier? #'name)
#'(define-syntax name
(lambda (xx)
(define transformer body)
(syntax-case xx ()
((k expr (... ...))
(datum->syntax #'k
(apply transformer (syntax->datum #'(expr (... ...)))))))))))))
;; dummy
(define (next-prime s) s)
(define-macro (do-primes vars . body)
(let ((var (car vars))
(start (cadr vars))
(end (caddr vars)))
`(do ((,var (next-prime ,start) (next-prime (+ 1 ,var)))
(ending-value ,end))
((> ,var ending-value))
,@body)))
(do-primes (v 0 10) (display v) (newline))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment