Skip to content

Instantly share code, notes, and snippets.

@benknoble
Last active July 7, 2021 17:35
Show Gist options
  • Save benknoble/a01e20f09ee42fbfc6eca42e72200e84 to your computer and use it in GitHub Desktop.
Save benknoble/a01e20f09ee42fbfc6eca42e72200e84 to your computer and use it in GitHub Desktop.
step macro
#lang racket
(provide define-steps)
(require syntax/parse/define
(for-syntax syntax/parse/lib/function-header))
(begin-for-syntax
(define-splicing-syntax-class step
#:datum-literals (step)
(pattern {~seq step message:string {~and form:expr {~not step}} ...})))
(define-syntax-parse-rule (define-steps header:function-header step:step ...)
(define header
(define step-number -1)
(begin
(set! step-number (add1 step-number))
(displayln (format "~a. ~a" step-number step.message))
step.form ...)
...))
(module+ test
(require rackunit)
(define-steps (foo bar)
step "Setup"
(define a 1)
(define b 2)
step "Make a list"
(list a b bar))
(check-equal? (with-output-to-string (thunk (check-equal? (foo 3) '(1 2 3))))
"0. Setup\n1. Make a list\n"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment