(define *modules* #{}) (define-syntax import (syntax-rules () ((import name) (import name name)) ((import name as) (let ((env (current-env)) (strname (if (symbol? 'name) (->string 'name) name))) (if (in? strname #\:) (let* ((fullname (string:split strname #\:)) (_mod (car fullname)) (fun (cadr fullname))) (eval `(define ,(->symbol 'as) ,((*modules* _mod) fun)) env)) (hash:kv-map ($ (eval `(define ,(string->symbol (++ (->string 'as) ":" (->string (car %)))) ,(cadr %)) env)) (*modules* strname))))))) (define-syntax defmodule (syntax-rules (export require) ((defmodule name (export exports ...) (require files ...) x ...) ((lambda () (let ((env (current-env))) (begin (map (lambda (file) (load file env)) 'files) (module name (export exports ...) x ...)))))) ((defmodule name (export exports ...) body ...) (let () body ... (hash:set! *modules* (->string 'name) (make-hash (map ($ (if (list? %) (cons (->string (caddr %)) (eval (car %))) (list (->string %) (eval %)))) '(exports ...))))))))