Define custom symbol object in prelude instead of plain objects
authorDavid Vázquez <davazp@gmail.com>
Sat, 4 May 2013 02:50:19 +0000 (03:50 +0100)
committerDavid Vázquez <davazp@gmail.com>
Sat, 4 May 2013 02:50:19 +0000 (03:50 +0100)
src/compiler.lisp
src/prelude.js

index c61e931..7d92b9e 100644 (file)
   #+common-lisp
   (let ((package (symbol-package symbol)))
     (if (eq package (find-package "KEYWORD"))
-        (code "{name: " (dump-string (symbol-name symbol))
-              ", 'package': " (dump-string (package-name package)) "}")
-        (code "{name: " (dump-string (symbol-name symbol)) "}")))
+        (code "(new Symbol(" (dump-string (symbol-name symbol)) ", "
+              (dump-string (package-name package)) "))")
+        (code "(new Symbol(" (dump-string (symbol-name symbol)) "))")))
   #+jscl
   (let ((package (symbol-package symbol)))
     (if (null package)
-        (code "{name: " (dump-symbol (symbol-name symbol)) "}")
+        (code "(new Symbol(" (dump-symbol (symbol-name symbol)) "))")
         (ls-compile `(intern ,(symbol-name symbol) ,(package-name package))))))
 
 (defun dump-cons (cons)
     (code "(x.cdr = " new ", x)")))
 
 (define-builtin symbolp (x)
-  (js!bool
-   (js!selfcall
-     "var tmp = " x ";" *newline*
-     "return (typeof tmp == 'object' && 'name' in tmp);" *newline*)))
+  (js!bool (code "(" x " instanceof Symbol)")))
 
 (define-builtin make-symbol (name)
-  (code "({name: " name "})"))
+  (code "(new Symbol(" name "))"))
 
 (define-builtin symbol-name (x)
   (code "(" x ").name"))
index e49b781..6f5feea 100644 (file)
@@ -62,6 +62,12 @@ function make_lisp_string (string){
 function xstring(x){ return x.join(''); }
 
 
+function Symbol(name, package_name){
+    this.name = name;
+    if (package_name)
+        this['package'] = package_name;
+}
+
 function lisp_to_js (x) {
     if (typeof x == 'object' && 'length' in x && x.type == 'character')
         return xstring(x);