Skip to content

Instantly share code, notes, and snippets.

@ruliana
Created November 22, 2016 11:04
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 ruliana/80d7bb46225a22a3682711ca8bd11a1d to your computer and use it in GitHub Desktop.
Save ruliana/80d7bb46225a22a3682711ca8bd11a1d to your computer and use it in GitHub Desktop.
Add "return" to Racket when you need a guard-clause
#lang racket
(require racket/stxparam)
(provide return
define/guard)
(define-syntax-parameter return
(λ (stx)
(raise-syntax-error (syntax-e stx) "can only used inside \"define/guard\"")))
(define-syntax-rule (define/guard (name args ...) body0 body ...)
(define (name args ...)
(let/cc ret
(syntax-parameterize ([return (make-rename-transformer #'ret)])
body0
body ...))))
(define/guard (test2 a b)
(when (> a b) (return 456))
(displayln "hehehe")
123)
(define (test a b)
(let/cc return
(when (> a b) (return 456))
(displayln "hehehe")
123))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment