Skip to content

Instantly share code, notes, and snippets.

@lexi-lambda
Created July 19, 2016 17:35
Show Gist options
  • Save lexi-lambda/515c9f67de102489dbe79797dd68ea35 to your computer and use it in GitHub Desktop.
Save lexi-lambda/515c9f67de102489dbe79797dd68ea35 to your computer and use it in GitHub Desktop.
#lang racket/base
(require (for-syntax racket/base
racket/syntax
syntax/parse
syntax/transformer)
racket/lazy-require
racket/promise
racket/runtime-path)
(provide lazy-require lazy-require/value)
(begin-for-syntax
(define-syntax-class lazy-require-clause
#:attributes [definitions]
[pattern [module-path [import-id:id ...]]
#:with runtime-module-path (generate-temporary #'module-path)
#:with [import-id-promise ...] (generate-temporaries (attribute import-id))
#:attr definitions
#'(begin
(define-runtime-module-path-index runtime-module-path 'module-path)
(begin
(define import-id-promise (delay (dynamic-require runtime-module-path 'import-id)))
(define-syntax import-id
(make-variable-like-transformer #'(force import-id-promise))))
...)]))
(define-syntax lazy-require/value
(syntax-parser
[(_ clause:lazy-require-clause ...)
#'(begin clause.definitions ...)]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment