PasteRack.org
Paste # 39486
2019-09-07 11:16:26

Fork as a new paste.

Paste viewed 274 times.


Embed:

return.rkt

  1. #lang racket
  2.  
  3. (require (for-syntax syntax/parse))
  4. (require racket/stxparam)
  5. (define-syntax-parameter return
  6.   (lambda (stx)
  7.     (raise-syntax-error (syntax-e stx) "can only be used inside function")))
  8.  
  9. (define-syntax (function stx)
  10.   (syntax-parse stx
  11.     [(_ (func-id arg-id ...) body ...)
  12.      #'(define (func-id arg-id ...)
  13.          (call/cc (lambda (return-k)
  14.                     (syntax-parameterize ([return (make-rename-transformer #'return-k)])
  15.                       body ...))))]))
  16.  
  17.  
  18. (function (f x) (return 100) (+ 1 x))
  19. (f 2)

=>

100