PasteRack.org
Paste # 11465
2018-11-17 17:12:03

Forked from paste # 24019.

Fork as a new paste.

Paste viewed 1893 times.


Embed:

  1. #lang racket/base
  2.  
  3. (require
  4.   (for-syntax racket/base racket/function)
  5.   racket/function
  6.   racket/list
  7.   syntax/parse)
  8.  
  9. (syntax-parse #'(reprovide)
  10.   ([s]
  11.    (define this-file (syntax-source-module (attribute s) #t))
  12.    (define-values (directory file root?) (split-path this-file))
  13.    (define entries (directory-list directory #:build? #t))
  14.    (define directories (filter directory-exists? entries))
  15.    (define files (filter (lambda (x)
  16.                            (and
  17.                              (not (equal? this-file x))
  18.                              (file-exists? x)))
  19.                          entries))
  20.    (define (not-empty? x) (not (empty? x)))
  21.    (define all-files
  22.      (let loop ([files*        files]
  23.                 [directories*  directories])
  24.        (cond
  25.          [(empty? directories*) files*]
  26.          [else
  27.            (define iteration
  28.              (filter not-empty? (flatten (map (curry directory-list #:build? #t) directories*))))
  29.  
  30.            (loop (append (filter file-exists? iteration) files*)
  31.                  (filter directory-exists? iteration))
  32.            ])))
  33.    (datum->syntax #'s `(require ,@(map path->string all-files)) #'s)
  34.    ))
  35.  
  36. (exit)

=>