(define (get-bindings-from-module egg module bindings) (let* ((vektor (gensym)) (rekuire-extension (gensym)) (expression `(module ,(gensym) () (import (rename (only scheme vector require-extension quote) ; quote shouldn't need to be here (vector ,vektor) (require-extension ,rekuire-extension))) (,rekuire-extension ,module) (,vektor ,@bindings)))) (handle-exceptions exn (if ((condition-predicate 'syntax) exn) (signal (make-composite-condition (make-property-condition 'exn 'message (sprintf "This feature depends upon the optional module ~a being installed. Please install it with 'chicken-install -s ~a'." module egg)) (make-property-condition 'unsupported-feature 'egg egg 'module module 'bindings bindings))) (signal exn)) (eval expression)))) ;; FIXME: Write a macro to generate these for us. (define (autoload-lzma!) (let ((real-bindings (get-bindings-from-module 'lzma 'lzma '(compress decompress)))) (set! lzma:compress (vector-ref real-bindings 0)) (set! lzma:decompress (vector-ref real-bindings 1)))) (define lzma:compress (lambda args (autoload-lzma!) (apply lzma:compress args))) (define lzma:decompress (lambda args (autoload-lzma!) (apply lzma:decompress args)))