|
@ -1,12 +1,29 @@ |
|
|
#lang racket |
|
|
#lang racket |
|
|
|
|
|
|
|
|
|
|
|
(define default-shell-vars |
|
|
|
|
|
#hash( |
|
|
|
|
|
("LANG" . "en_US.UTF-8"))) |
|
|
|
|
|
|
|
|
(define shell-env |
|
|
(define shell-env |
|
|
(make-parameter #hash())) |
|
|
(make-parameter default-shell-vars)) |
|
|
|
|
|
|
|
|
|
|
|
(define (remove-dups xs ys) |
|
|
|
|
|
(define dups |
|
|
|
|
|
(set-intersect (map car xs) |
|
|
|
|
|
(map car ys))) |
|
|
|
|
|
(define new-xs |
|
|
|
|
|
(filter-not |
|
|
|
|
|
(compose1 |
|
|
|
|
|
(lambda (x) (member x dups)) |
|
|
|
|
|
car) |
|
|
|
|
|
xs)) |
|
|
|
|
|
new-xs) |
|
|
|
|
|
|
|
|
(define (merge-hash h1 h2) |
|
|
(define (merge-hash h1 h2) |
|
|
(define h1-vs (hash->list h1)) |
|
|
(define h1-vs (hash->list h1)) |
|
|
(define h2-vs (hash->list h2)) |
|
|
(define h2-vs (hash->list h2)) |
|
|
(make-hash (append h1-vs h2-vs))) |
|
|
(define new-h2-vs (remove-dups h2-vs h1-vs)) |
|
|
|
|
|
(make-hash (append new-h2-vs h1-vs))) |
|
|
|
|
|
|
|
|
(define (merge-hashes . hs) |
|
|
(define (merge-hashes . hs) |
|
|
(foldl merge-hash #hash() hs)) |
|
|
(foldl merge-hash #hash() hs)) |
|
@ -25,8 +42,29 @@ |
|
|
(lambda (k v) |
|
|
(lambda (k v) |
|
|
(format "~a=~a" k v))))) |
|
|
(format "~a=~a" k v))))) |
|
|
|
|
|
|
|
|
|
|
|
(define-syntax join-shell-vars |
|
|
|
|
|
(syntax-rules () |
|
|
|
|
|
[(join-shell-vars (k v)) |
|
|
|
|
|
(merge-hash |
|
|
|
|
|
(make-hash |
|
|
|
|
|
(list (cons k v))) |
|
|
|
|
|
(shell-env))] |
|
|
|
|
|
|
|
|
|
|
|
[(join-shell-vars (k v) rest ...) |
|
|
|
|
|
(merge-hash |
|
|
|
|
|
(make-hash (list (cons k v))) |
|
|
|
|
|
(join-shell-vars rest ...))])) |
|
|
|
|
|
|
|
|
|
|
|
(define-syntax with-shell-vars |
|
|
|
|
|
(syntax-rules () |
|
|
|
|
|
[(with-shell-vars (vars ...) expr ...) |
|
|
|
|
|
(parameterize |
|
|
|
|
|
[(shell-env (join-shell-vars vars ...))] |
|
|
|
|
|
(begin expr ...))])) |
|
|
|
|
|
|
|
|
(provide |
|
|
(provide |
|
|
shell-env |
|
|
shell-env |
|
|
merge-hashes |
|
|
merge-hashes |
|
|
set-vars |
|
|
set-vars |
|
|
format-vars) |
|
|
format-vars |
|
|
|
|
|
with-shell-vars) |
|
|