From 3f9bc2dbb00102b17488afaa353083e36c230940 Mon Sep 17 00:00:00 2001 From: Ian Price Date: Mon, 14 Aug 2017 16:26:39 +0100 Subject: [PATCH] Implement basic `equal?' implementation * module/language/js-il/runtime.js (equal?): Remove primitive. Implement as builtin procedure. This version Only handles pairs. --- module/language/js-il/runtime.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/module/language/js-il/runtime.js b/module/language/js-il/runtime.js index c9328a675..34dd3a66a 100644 --- a/module/language/js-il/runtime.js +++ b/module/language/js-il/runtime.js @@ -496,8 +496,6 @@ scheme.primitives["eqv?"] = function(x, y) { return coerce_bool(x === y); }; -scheme.primitives["equal?"] = not_implemented_yet; - // Fluids scheme.Fluid = function (x) { this.value = x; @@ -761,6 +759,24 @@ def_guile0("append", function (self, cont, l1, l2) { return cont(l); }); +function scm_equal(x,y) { + if (x instanceof scheme.Pair) { + if (y instanceof scheme.Pair) { + return (scm_equal(x.car,y.car) && scm_equal(x.cdr,y.cdr)); + } else { + return false; + } + } else if (y instanceof scheme.Pair) { + return false; + } else { + return (x === y); + } +} + +def_guile0("equal?", function (self, cont, x, y) { + return cont(coerce_bool(scm_equal(x,y))); +}); + def_guile0("memq", function (self, cont, val, args) { return cont(scheme.FALSE); });