From ddee59e73348acf88bca6e9f32138e4fa322574d Mon Sep 17 00:00:00 2001 From: Olof-Joachim Frahm Date: Wed, 16 Oct 2013 02:05:42 +0200 Subject: [PATCH] Differentiate between T/NIL/undefined/false. This means that OGET/OSET return the symbol UNDEFINED if a value is undefined on the Javascript side. Similarly for FALSE. --- src/array.lisp | 8 ++++++-- src/ffi.lisp | 12 ++++++++++++ src/package.lisp | 5 +++-- src/prelude.js | 12 +++++++++++- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/array.lisp b/src/array.lisp index a15b4eb..1cd4c08 100644 --- a/src/array.lisp +++ b/src/array.lisp @@ -54,12 +54,16 @@ (error "~S is not an array." array)) (if (eq (oget array "stringp") 1) 'character - (oget array "type"))) + (let ((type (oget array "type"))) + (and (not (undefined type)) + type)))) (defun array-dimensions (array) (unless (arrayp array) (error "~S is not an array." array)) - (oget array "dimensions")) + (let ((dimensions (oget array "dimensions"))) + (and (not (undefined dimensions)) + dimensions))) ;; TODO: Error checking (defun array-dimension (array axis) diff --git a/src/ffi.lisp b/src/ffi.lisp index db6a23e..d833d96 100644 --- a/src/ffi.lisp +++ b/src/ffi.lisp @@ -15,6 +15,18 @@ (/debug "loading ffi.lisp!") +;; for FFI +(defconstant false 'false) +(%js-vset "falseSymbol" false) +(defconstant undefined 'undefined) +(%js-vset "undefinedSymbol" undefined) + +(defun false (x) + (eq x false)) + +(defun undefined (x) + (eq x undefined)) + (define-setf-expander oget (object key &rest keys) (let* ((keys (cons key keys)) (g!object (gensym)) diff --git a/src/package.lisp b/src/package.lisp index 3ee5105..b026cd4 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -122,7 +122,6 @@ (if foundp (values symbol foundp) (let ((symbols (%package-symbols package))) - (oget symbols name) (let ((symbol (make-symbol name))) (setf (oget symbol "package") package) (when (eq package *keyword-package*) @@ -136,7 +135,9 @@ (defun symbol-package (symbol) (unless (symbolp symbol) (error "`~S' is not a symbol." symbol)) - (oget symbol "package")) + (let ((package (oget symbol "package"))) + (and (not (undefined package)) + package))) (defun export (symbols &optional (package *package*)) (let ((exports (%package-external-symbols package))) diff --git a/src/prelude.js b/src/prelude.js index f3ef952..25908d5 100644 --- a/src/prelude.js +++ b/src/prelude.js @@ -4,6 +4,8 @@ var window = this; var t; var nil; +var falseSymbol; +var undefinedSymbol; var lisp = {}; @@ -119,6 +121,10 @@ function lisp_to_js (x) { return null; else if (x === t) return true; + else if (x === falseSymbol) + return false; + else if (x === undefinedSymbol) + return undefined; else if (typeof x == 'object' && 'length' in x && x.stringp == 1) return xstring(x); else if (typeof x == 'function'){ @@ -134,10 +140,14 @@ function lisp_to_js (x) { } function js_to_lisp (x) { - if (x === null || x === undefined || x === false) + if (x === null) return nil; else if (x === true) return t; + else if (x === false) + return falseSymbol; + else if (x === undefined) + return undefinedSymbol; else if (typeof x == 'string') return make_lisp_string(x); else if (typeof x == 'function'){ -- 1.7.10.4