Implemented LET and LET* by variable renaming, which provides the
[clinton/parenscript.git] / src / namespace.lisp
CommitLineData
b39a6394
VS
1(in-package "PARENSCRIPT")
2
06babcf5 3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4a987e2b 4;;; ParenScript namespace system
06babcf5 5
4a987e2b 6;;; Symbol obfuscation
4dae66e8 7(defvar *obfuscated-packages* (make-hash-table))
06babcf5 8
4dae66e8
VS
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))
06babcf5 12
0c542be0 13(defun unobfuscate-package (package-designator)
4dae66e8 14 (remhash (find-package package-designator) *obfuscated-packages*))
06babcf5 15
0c542be0 16(defun maybe-obfuscate-symbol (symbol)
4dae66e8
VS
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)))
06babcf5 22
0c542be0 23;;; Interface for printing identifiers
06babcf5 24
4a987e2b
VS
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
29designated package when translating ParenScript code."
30 `(gethash (find-package ,package) *package-prefix-table*))
06babcf5 31
5ffb1eba
VS
32(defun symbol-to-js-string (symbol &optional (mangle-symbol-name t))
33 (let ((symbol-name (funcall (if mangle-symbol-name
34 #'symbol-name-to-js-string
35 #'symbol-name)
36 (maybe-obfuscate-symbol symbol))))
dd4442b8
VS
37 (aif (ps-package-prefix (symbol-package symbol))
38 (format nil "~A~A" it symbol-name)
39 symbol-name)))