))) #'(begin form ...) (next-clause #'(clauses ...)))))))))))) ;; emacs: (put 'compile-time-case 'scheme-indent-function 1) (compile-time-case (system-file-name-convention) ((posix) (define (file-name-separator? c) (char=? c #\/)) (define file-name-separator-string "/") (define (absolute-file-name? file-name) (string-prefix? "/" file-name))) ((windows) (define (file-name-separator? c) (or (char=? c #\/) (char=? c #\\))) (define file-name-separator-string "/") (define (absolute-file-name? file-name) (define (file-name-separator-at-index? idx) (and (> (string-length file-name) idx) (file-name-separator? (string-ref file-name idx)))) (define (unc-file-name?) ;; Universal Naming Convention (UNC) file-names start with \\, ;; and are always absolute. See: ;; http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#fully_qualified_vs._relative_paths (and (file-name-separator-at-index? 0) (file-name-separator-at-index? 1))) (define (has-drive-specifier?) (and (>= (string-length file-name) 2) (let ((drive (string-ref file-name 0))) (or (char<=? #\a drive #\z) (char<=? #\A drive #\Z))) (eqv? (string-ref file-name 1) #\:))) (or (unc-file-name?) (if (has-drive-specifier?) (file-name-separator-at-index? 2) (file-name-separator-at-index? 0))))))) (define (in-vicinity vicinity file) (let ((tail (let ((len (string-length vicinity))) (if (zero? len) #f (string-ref vicinity (- len 1)))))) (string-append vicinity (if (or (not tail) (file-name-separator? tail)) "" file-name-separator-string) file)))