Got rid of 'ensure-ps-symbol' internal function (at this point all it was doing was...
[clinton/parenscript.git] / src / namespace.lisp
... / ...
CommitLineData
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
29designated package when translating ParenScript code."
30 `(gethash (find-package ,package) *package-prefix-table*))
31
32(defun js-translate-symbol (symbol)
33 (let ((possibly-obfuscated-symbol (maybe-obfuscate-symbol symbol)))
34 (if (ps-package-prefix (symbol-package symbol))
35 (format nil "~A~A" (ps-package-prefix (symbol-package symbol)) (symbol-to-js-string possibly-obfuscated-symbol))
36 (symbol-to-js-string possibly-obfuscated-symbol))))