+(defclass parenscript-symbol ()
+ ((name :initarg :name :accessor name-of)))
+
+(defmethod print-object ((obj parenscript-symbol) stream)
+ (format stream "~a" (name-of obj)))
+
+(defun find-ps-symbol (symbol)
+ (multiple-value-bind (sym hit?) (gethash (string symbol) *ps-symbols*)
+ (when hit? sym)))
+
+(defun ps-intern (thing)
+ (if (typep thing 'parenscript-symbol) thing
+ (let ((str (string thing)))
+ (multiple-value-bind (sym hit?) (gethash str *ps-symbols*)
+ (if hit? sym
+ (setf (gethash str *ps-symbols*)
+ (make-instance 'parenscript-symbol :name str)))))))
+
+(defun get-ps-special-form (name)
+ "Returns the special form function corresponding to the given name."
+ (gethash (find-ps-symbol name) *ps-special-forms*))
+
+(defun add-ps-literal (name &aux (sym (ps-intern name)))
+ (setf (gethash sym *ps-literals*) sym))
+
+(defun undefine-ps-special-form (name &aux (sym (ps-intern name)))