Вы можете использовать lazy-require
:
;; a.rkt
#lang racket
(require racket/lazy-require)
(lazy-require ["b.rkt" (b)])
(provide a)
(define (a) 'a)
(list (a) (b))
;; b.rkt
#lang racket
(require racket/lazy-require)
(lazy-require ["a.rkt" (a)])
(provide b)
(define (b) 'b)
(list (a) (b))
Обратите внимание, что вы должны указать lazy-require
конкретные вещи, которые вы хотите импортировать. Это потому, что оно реализовано в терминах dynamic-require
плюс set!
.
Если вы посмотрите на источник для xrepl
, вы увидите, что он определяет макрос defautoload
, который (по модулю некоторых деталей N / A) просто:
(define-syntax-rule (defautoload libspec id ...)
(begin
(define id
(make-keyword-procedure
(λ (kws kw-args . args)
(set! id (dynamic-require 'libspec 'id))
(keyword-apply id kws kw-args args))))
...))