#lang s-exp "../lang/kernel.rkt" ;; Macros for recording the definition of resources in a program. (require (for-syntax racket/base racket/path racket/port syntax/parse "coerse-content-bytes.rkt" "munge-path.rkt" "record.rkt")) (provide define-resource) (require "structs.rkt") (require "specialize/impl.rkt") ;; file-resource: ;; (define-syntax (define-resource stx) (syntax-parse stx [(_ name:id) (with-syntax ([path (symbol->string (syntax-e #'name))]) (syntax/loc stx (define-resource name path)))] [(_ name:id path:str) (let* ([normal-path (normalize-path (build-path (or (current-load-relative-directory) (current-directory)) (syntax-e #'path)))] [munged-path (munge-path normal-path)] [content (coerse-content-bytes normal-path (call-with-input-file normal-path port->bytes))]) (with-syntax ([normal-path normal-path] [munged-path munged-path] [content content]) (syntax/loc stx (begin ;; Compile time code: (begin-for-syntax (let* ([this-module (variable-reference->resolved-module-path (#%variable-reference))] [resolved-module-path (resolved-module-path-name this-module)]) (record-resource resolved-module-path normal-path munged-path))) ;; Run time code (define name (specialize! (resource normal-path munged-path content)))))))]))