Added 'reduce' function to runtime lib.
[parenscript.git] / src / namespace.lisp
blob4a7a90b89d404f8257984f9c46fa2354ddeb5936
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;; ParenScript namespace system
4 (in-package :parenscript)
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))))
11 ;;; Symbol obfuscation
12 (defvar *obfuscated-packages* (make-hash-table))
14 (defun obfuscate-package (package-designator &optional (symbol-map (make-hash-table)))
15 "symbol-map can either be a hash table or a closure that takes a symbol as its only argument."
16 (setf (gethash (find-package package-designator) *obfuscated-packages*) symbol-map))
18 (defun unobfuscate-package (package-designator)
19 (remhash (find-package package-designator) *obfuscated-packages*))
21 (defun maybe-obfuscate-symbol (symbol)
22 (ctypecase (gethash (symbol-package symbol) *obfuscated-packages*)
23 (hash-table (let ((symbol-map (gethash (symbol-package symbol) *obfuscated-packages*)))
24 (or (gethash symbol symbol-map) (setf (gethash symbol symbol-map) (ps-gensym "G")))))
25 (function (funcall (gethash (symbol-package symbol) *obfuscated-packages*) symbol))
26 (null symbol)))
28 ;;; Interface for printing identifiers
30 (defvar *package-prefix-table* (make-hash-table))
32 (defmacro ps-package-prefix (package)
33 "Place for storing a string to be prefixed to any symbols in the
34 designated package when translating ParenScript code."
35 `(gethash (find-package ,package) *package-prefix-table*))
37 (defun js-translate-symbol (symbol)
38 (let ((possibly-obfuscated-symbol (maybe-obfuscate-symbol symbol)))
39 (if (ps-package-prefix (symbol-package symbol))
40 (format nil "~A~A" (ps-package-prefix (symbol-package symbol)) (symbol-to-js-string possibly-obfuscated-symbol))
41 (symbol-to-js-string possibly-obfuscated-symbol))))