X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler.lisp;h=66a734c231ecba4ebbb4639ecd163b8ad90b8273;hb=dc8d38273bc1d2276e20ca1f18114a78ca4b5639;hp=fb9f62d5d0475f1b675fe6b1bc77236e04d65f1f;hpb=41f31884e0be58584c3ec47f78e32f305833d3a0;p=jscl.git diff --git a/src/compiler.lisp b/src/compiler.lisp index fb9f62d..66a734c 100644 --- a/src/compiler.lisp +++ b/src/compiler.lisp @@ -207,7 +207,7 @@ `(push (list ',name (lambda ,args (block ,name ,@body))) *compilations*)) -(define-compilation if (condition true false) +(define-compilation if (condition true &optional false) (code "(" (ls-compile condition) " !== " (ls-compile nil) " ? " (ls-compile true *multiple-value-p*) " : " (ls-compile false *multiple-value-p*) @@ -266,9 +266,9 @@ (js!selfcall "var func = " (join strs) ";" *newline* (when name - (code "func.fname = " (escape-string name) ";" *newline*)) + (code "func.fname = " (js-escape-string name) ";" *newline*)) (when docstring - (code "func.docstring = " (escape-string docstring) ";" *newline*)) + (code "func.docstring = " (js-escape-string docstring) ";" *newline*)) "return func;" *newline*) (apply #'code strs))) @@ -368,8 +368,11 @@ (mapconcat #'parse-keyword keyword-arguments)))) ;; Check for unknown keywords (when keyword-arguments - (code "for (i=" (+ n-required-arguments n-optional-arguments) - "; i= x.length) throw 'Out of range';" *newline* "return x[i] = " value ";" *newline*)) -(define-builtin afind (value array) +(define-builtin concatenate-storage-vector (sv1 sv2) (js!selfcall - "var v = " value ";" *newline* - "var x = " array ";" *newline* - "return x.indexOf(v);" *newline*)) - -(define-builtin aresize (array new-size) - (js!selfcall - "var x = " array ";" *newline* - "var n = " new-size ";" *newline* - "return x.length = n;" *newline*)) + "var sv1 = " sv1 ";" *newline* + "var r = sv1.concat(" sv2 ");" *newline* + "r.type = sv1.type;" *newline* + "r.stringp = sv1.stringp;" *newline* + "return r;" *newline*)) (define-builtin get-internal-real-time () "(new Date()).getTime()") @@ -1385,6 +1311,54 @@ ;;; Javascript FFI +(define-builtin new () "{}") + +(define-raw-builtin oget* (object key &rest keys) + (js!selfcall + "var tmp = (" (ls-compile object) ")[xstring(" (ls-compile key) ")];" *newline* + (mapconcat (lambda (key) + (code "if (tmp === undefined) return " (ls-compile nil) ";" *newline* + "tmp = tmp[xstring(" (ls-compile key) ")];" *newline*)) + keys) + "return tmp === undefined? " (ls-compile nil) " : tmp;" *newline*)) + +(define-raw-builtin oset* (value object key &rest keys) + (let ((keys (cons key keys))) + (js!selfcall + "var obj = " (ls-compile object) ";" *newline* + (mapconcat (lambda (key) + (code "obj = obj[xstring(" (ls-compile key) ")];" + "if (obj === undefined) throw 'Impossible to set Javascript property.';" *newline*)) + (butlast keys)) + "var tmp = obj[xstring(" (ls-compile (car (last keys))) ")] = " (ls-compile value) ";" *newline* + "return tmp === undefined? " (ls-compile nil) " : tmp;" *newline*))) + +(define-raw-builtin oget (object key &rest keys) + (code "js_to_lisp(" (ls-compile `(oget* ,object ,key ,@keys)) ")")) + +(define-raw-builtin oset (value object key &rest keys) + (ls-compile `(oset* (lisp-to-js ,value) ,object ,key ,@keys))) + +(define-builtin objectp (x) + (js!bool (code "(typeof (" x ") === 'object')"))) + +(define-builtin lisp-to-js (x) (code "lisp_to_js(" x ")")) +(define-builtin js-to-lisp (x) (code "js_to_lisp(" x ")")) + + +(define-builtin in (key object) + (js!bool (code "(xstring(" key ") in (" object "))"))) + +(define-builtin map-for-in (function object) + (js!selfcall + "var f = " function ";" *newline* + "var g = (typeof f === 'function' ? f : f.fvalue);" *newline* + "var o = " object ";" *newline* + "for (var key in o){" *newline* + (indent "g(" (if *multiple-value-p* "values" "pv") ", 1, o[key]);" *newline*) + "}" + " return " (ls-compile nil) ";" *newline*)) + (define-compilation %js-vref (var) (code "js_to_lisp(" var ")")) @@ -1453,7 +1427,7 @@ (mapcar #'ls-compile args)) ", ") ")"))) (unless (or (symbolp function) (and (consp function) - (eq (car function) 'lambda))) + (member (car function) '(lambda oget)))) (error "Bad function designator `~S'" function)) (cond ((translate-function function) @@ -1462,8 +1436,14 @@ #+jscl (eq (symbol-package function) (find-package "COMMON-LISP")) #-jscl t) (code (ls-compile `',function) ".fvalue" arglist)) + #+jscl((symbolp function) + (code (ls-compile `#',function) arglist)) + ((and (consp function) (eq (car function) 'lambda)) + (code (ls-compile `#',function) arglist)) + ((and (consp function) (eq (car function) 'oget)) + (code (ls-compile function) arglist)) (t - (code (ls-compile `#',function) arglist))))) + (error "Bad function descriptor"))))) (defun ls-compile-block (sexps &optional return-last-p decls-allowed-p) (multiple-value-bind (sexps decls)