4bc2798a55800967ffb3c3ed4c0a4bf20ec91730
[clinton/parenscript.git] / src / namespace.lisp
1 (in-package "PARENSCRIPT")
2
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 ;;; ParenScript namespace system
5
6 ;;; Symbol obfuscation
7 (defvar *obfuscated-packages* (make-hash-table))
8
9 (defun obfuscate-package (package-designator &optional (symbol-map (make-hash-table)))
10 "symbol-map can either be a hash table or a closure that takes a symbol as its only argument."
11 (setf (gethash (find-package package-designator) *obfuscated-packages*) symbol-map))
12
13 (defun unobfuscate-package (package-designator)
14 (remhash (find-package package-designator) *obfuscated-packages*))
15
16 (defun maybe-obfuscate-symbol (symbol)
17 (ctypecase (gethash (symbol-package symbol) *obfuscated-packages*)
18 (hash-table (let ((symbol-map (gethash (symbol-package symbol) *obfuscated-packages*)))
19 (or (gethash symbol symbol-map) (setf (gethash symbol symbol-map) (ps-gensym "G")))))
20 (function (funcall (gethash (symbol-package symbol) *obfuscated-packages*) symbol))
21 (null symbol)))
22
23 ;;; Interface for printing identifiers
24
25 (defvar *package-prefix-table* (make-hash-table))
26
27 (defmacro ps-package-prefix (package)
28 "Place for storing a string to be prefixed to any symbols in the
29 designated package when translating ParenScript code."
30 `(gethash (find-package ,package) *package-prefix-table*))
31
32 (defun symbol-to-js-string (symbol)
33 (let ((symbol-name (symbol-name-to-js-string (maybe-obfuscate-symbol symbol))))
34 (aif (ps-package-prefix (symbol-package symbol))
35 (format nil "~A~A" it symbol-name)
36 symbol-name)))