diff --git a/lib/hyperscript/compiler.sx b/lib/hyperscript/compiler.sx index f1784c70..86f80029 100644 --- a/lib/hyperscript/compiler.sx +++ b/lib/hyperscript/compiler.sx @@ -364,10 +364,7 @@ (true (let ((t (hs-to-sx expr))) - (list - (quote set!) - t - (list (quote +) (list (quote or) t 0) amount))))))) + (list (quote set!) t (list (quote +) t amount))))))) (define emit-dec (fn @@ -416,10 +413,7 @@ (true (let ((t (hs-to-sx expr))) - (list - (quote set!) - t - (list (quote -) (list (quote or) t 0) amount))))))) + (list (quote set!) t (list (quote -) t amount))))))) (define emit-behavior (fn diff --git a/lib/hyperscript/integration.sx b/lib/hyperscript/integration.sx index 8e17242c..7fd9bf4b 100644 --- a/lib/hyperscript/integration.sx +++ b/lib/hyperscript/integration.sx @@ -10,20 +10,46 @@ ;; Returns a function (fn (me) ...) that can be called with a DOM element. ;; Uses eval-expr-cek to turn the SX data structure into a live closure. -(define - hs-handler - (fn - (src) - (let - ((sx (hs-to-sx-from-source src))) - (eval-expr-cek - (list - (quote fn) - (list (quote me)) - (list - (quote let) - (list (list (quote it) nil) (list (quote event) nil)) - sx)))))) +(begin + (define + hs-collect-vars + (fn + (sx) + (define vars (list)) + (define + walk + (fn + (node) + (when + (list? node) + (when + (and + (> (len node) 1) + (= (first node) (quote set!)) + (symbol? (nth node 1))) + (let + ((name (nth node 1))) + (when + (not (some (fn (v) (= v name)) vars)) + (set! vars (cons name vars))))) + (for-each walk node)))) + (walk sx) + vars)) + (define + hs-handler + (fn + (src) + (let + ((sx (hs-to-sx-from-source src))) + (let + ((extra-vars (hs-collect-vars sx))) + (let + ((bindings (append (list (list (quote it) nil) (list (quote event) nil)) (map (fn (v) (list v nil)) extra-vars)))) + (eval-expr-cek + (list + (quote fn) + (list (quote me)) + (list (quote let) bindings sx))))))))) ;; ── Activate a single element ─────────────────────────────────── ;; Reads the _="..." attribute, compiles, and executes with me=element.