From 6096749405f50dd00ed55c5eb7810e7a953b89ad Mon Sep 17 00:00:00 2001 From: Manuel Simoni Date: Wed, 21 Mar 2012 02:43:45 +0100 Subject: [PATCH] Add JS-OBJECT and JS-ARRAY. --- repl.virtua | 4 ++-- standard.virtua | 6 ++++++ test.virtua | 2 +- virtua.js | 13 ++++++++++++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/repl.virtua b/repl.virtua index e2b9b00..3e63dce 100644 --- a/repl.virtua +++ b/repl.virtua @@ -74,13 +74,13 @@ (defun print-stack-trace (f) ;; extreme hack: skip first 6 frames (def off 6) - (while (> off 0) (set! f (get-slot f "parent")) (set! off (- off 1))) + (while (> off 0) (set! f (get-slot f "parent")) (dec! off)) ;; only show fixed number of frames (def frames 10) (until (or? (= #void f) (= frames 0)) (print f) (set! f (get-slot f "parent")) - (set! frames (- frames 1)))) + (dec! frames))) (set! (js-global "lisp_repl_onsubmit") (js-function repl-submit)) diff --git a/standard.virtua b/standard.virtua index 864070b..112f16f 100644 --- a/standard.virtua +++ b/standard.virtua @@ -502,6 +502,12 @@ (define-js-number-binop "*") (define-js-number-binop "/")) +(defmacro inc! (var . delta) env + (eval (list set! var (list + var (if (pair? delta) (car delta) 1))) env)) + +(defmacro dec! (var . delta) env + (eval (list set! var (list - var (if (pair? delta) (car delta) 1))) env)) + ;;;; Comparison (def number< (js-binop "<")) diff --git a/test.virtua b/test.virtua index d384c72..b18b221 100644 --- a/test.virtua +++ b/test.virtua @@ -36,7 +36,7 @@ ;;;; Arrays -(assert (instance? (make-array) Array)) +(assert (instance? (js-array) Array)) ;;;; Binops diff --git a/virtua.js b/virtua.js index 8be3331..68bf977 100644 --- a/virtua.js +++ b/virtua.js @@ -26,7 +26,6 @@ function lisp_make_kernel_env() { lisp_export(env, "null?", lisp_make_wrapped_native(lisp_lib_null, 1, 1)); lisp_export(env, "intern", lisp_make_wrapped_native(lisp_intern, 1, 1)); lisp_export(env, "symbol-name", lisp_make_wrapped_native(lisp_symbol_name, 1, 1)); - lisp_export(env, "make-array", lisp_make_wrapped_native(lisp_make_array, 0, 0)); lisp_export(env, "#t", lisp_t); lisp_export(env, "#f", lisp_f); lisp_export(env, "#ignore", lisp_ignore); @@ -72,6 +71,8 @@ function lisp_make_kernel_env() { lisp_export(env, "js-call", lisp_make_wrapped_native(lisp_js_call, 2)); lisp_export(env, "js-function", lisp_make_wrapped_native(lisp_js_function, 1, 1)); lisp_export(env, "js-binop", lisp_make_wrapped_native(lisp_js_binop, 1, 1)); + lisp_export(env, "js-object", lisp_make_wrapped_native(lisp_js_object, 0, 1)); + lisp_export(env, "js-array", lisp_make_wrapped_native(lisp_js_array, 0, 0)); /* Debugging */ lisp_export(env, "stack-frame", lisp_make_wrapped_native(lisp_stack_frame, 0, 0)); lisp_export(env, "Stack-Frame", Lisp_Stack_Frame); @@ -386,6 +387,16 @@ function lisp_js_binop(op) { return cmb; } +/* Creates JS object with given prototype (optional). */ +function lisp_js_object(proto) { + return Object.create((typeof(proto) !== "undefined") ? proto : null); +} + +/* Creates JS array. */ +function lisp_js_array() { + return []; +} + /**** Arrays ****/ var Lisp_Array = Array.prototype;