guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 78/99: Implement Hook Builtins


From: Christopher Allan Webber
Subject: [Guile-commits] 78/99: Implement Hook Builtins
Date: Sun, 10 Oct 2021 21:51:08 -0400 (EDT)

cwebber pushed a commit to branch compile-to-js-merge
in repository guile.

commit 7ee8973df5438b9f64b14016e77238df5fc22998
Author: Ian Price <ianprice90@googlemail.com>
AuthorDate: Wed Aug 16 21:37:26 2017 +0100

    Implement Hook Builtins
    
    * module/language/js-il/runtime.js:
      (scheme.Hook): new constructor
      (make-hook, run-hook): Implement builtins.
---
 module/language/js-il/runtime.js | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/module/language/js-il/runtime.js b/module/language/js-il/runtime.js
index cfc1faa..c337fc4 100644
--- a/module/language/js-il/runtime.js
+++ b/module/language/js-il/runtime.js
@@ -1418,8 +1418,35 @@ def_guile0("read-hash-extend", function (self, cont, 
char, fun) {
     return cont(scheme.FALSE);
 });
 
+scheme.Hook = function (arity) {
+    this.arity = arity;
+    this.procs = [];
+};
+
 def_guile0("make-hook", function (self, cont, nargs) {
-    return cont(scheme.FALSE);
+    var arity = (nargs === undefined) ? 0 : nargs;
+    return cont(new scheme.Hook(arity));
+});
+
+def_guile0("run-hook", function (self, cont, hook) {
+    var procs = hook.procs;
+    var args = Array.prototype.slice.call(arguments, 3);
+    // FIXME: validate hook
+    // FIXME: check num args = arity or error
+
+    var loop = function (i) {
+        if (i === procs.length) {
+            return cont(scheme.UNSPECIFIED);
+        } else {
+            var newk = function() {
+                return loop(i+1);
+            };
+
+            var proc = procs[i];
+            return proc.fun.apply(proc.fun, [proc, newk].concat(args));
+        }
+    };
+    return loop(0);
 });
 
 function scm_simple_format (self, cont) {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]