From 78cacbe450e2f46da62c5b95d725292acdbf71b3 Mon Sep 17 00:00:00 2001 From: Ian Price Date: Wed, 17 Jun 2015 20:32:10 +0100 Subject: [PATCH] Implement fluid primitives --- module/language/js-il/runtime.js | 34 +++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/module/language/js-il/runtime.js b/module/language/js-il/runtime.js index ad83fa146..4a4c5421c 100644 --- a/module/language/js-il/runtime.js +++ b/module/language/js-il/runtime.js @@ -370,9 +370,33 @@ scheme.primitives["eqv?"] = function(x, y) { scheme.primitives["equal?"] = not_implemented_yet; // Fluids -scheme.primitives["pop-fluid"] = not_implemented_yet; -scheme.primitives["push-fluid"] = not_implemented_yet; -scheme.primitives["fluid-ref"] = not_implemented_yet; +scheme.Fluid = function (x) { + this.value = x; + return this; +}; + +scheme.primitives["pop-fluid"] = function () { + var frame = scheme.dynstack.shift(); + if (frame instanceof scheme.frame.Fluid) { + frame.fluid.value = frame.fluid.old_value; + return; + } else { + throw "not a frame"; + }; +}; + +scheme.primitives["push-fluid"] = function (fluid, new_value) { + var old_value = fluid.value; + fluid.value = new_value; + var frame = new scheme.frame.Fluid(fluid, old_value); + scheme.dynstack.unshift(frame); + return; +}; + +scheme.primitives["fluid-ref"] = function (fluid) { + // TODO: check fluid type + return fluid.value; +}; // Variables scheme.primitives["variable?"] = not_implemented_yet; @@ -415,3 +439,7 @@ scheme.frame.Prompt = function(tag, escape_only, handler){ this.handler = handler; }; +scheme.frame.Fluid = function(fluid, old_value) { + this.fluid = fluid; + this.old_value = old_value; +};