Added William Halliburton <whalliburton@gmail.com>'s tracing macro to extras folder.
[clinton/parenscript.git] / src / namespace.lisp
CommitLineData
06babcf5 1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4a987e2b 2;;; ParenScript namespace system
06babcf5
VS
3
4(in-package :parenscript)
5
675edae3
TC
6(defun ensure-ps-symbol (symbol)
7 (if (eq (symbol-package symbol) #.(find-package :parenscript))
8 symbol
9 (intern (symbol-name symbol) #.(find-package :parenscript))))
10
4a987e2b 11;;; Symbol obfuscation
0c542be0 12(defvar *obfuscation-table* (make-hash-table))
06babcf5 13
0c542be0
VS
14(defun obfuscate-package (package-designator)
15 (setf (gethash (find-package package-designator) *obfuscation-table*) (make-hash-table)))
06babcf5 16
0c542be0
VS
17(defun unobfuscate-package (package-designator)
18 (remhash (find-package package-designator) *obfuscation-table*))
06babcf5 19
0c542be0
VS
20(defun maybe-obfuscate-symbol (symbol)
21 (let ((obfuscated-symbol-table (gethash (symbol-package symbol) *obfuscation-table*)))
22 (if obfuscated-symbol-table
23 (or (gethash symbol obfuscated-symbol-table)
24 (setf (gethash symbol obfuscated-symbol-table) (ps-gensym "G")))
25 symbol)))
06babcf5 26
0c542be0 27;;; Interface for printing identifiers
06babcf5 28
4a987e2b
VS
29(defvar *package-prefix-table* (make-hash-table))
30
31(defmacro ps-package-prefix (package)
32 "Place for storing a string to be prefixed to any symbols in the
33designated package when translating ParenScript code."
34 `(gethash (find-package ,package) *package-prefix-table*))
06babcf5 35
4a987e2b 36(defun js-translate-symbol (symbol)
0c542be0
VS
37 (let ((possibly-obfuscated-symbol (maybe-obfuscate-symbol symbol)))
38 (if (ps-package-prefix (symbol-package symbol))
6274a448
VS
39 (format nil "~A~A" (ps-package-prefix (symbol-package symbol)) (symbol-to-js-string possibly-obfuscated-symbol))
40 (symbol-to-js-string possibly-obfuscated-symbol))))