Skip to content

Commit

Permalink
fixes for latest clojure version
Browse files Browse the repository at this point in the history
  • Loading branch information
xificurC committed May 2, 2024
1 parent 51a99d6 commit 9a183bb
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 31 deletions.
2 changes: 1 addition & 1 deletion deps.edn
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
missionary/missionary {:mvn/version "b.35"}
dom-top/dom-top {:mvn/version "1.0.9"}
fipp/fipp {:mvn/version "0.6.26"}
org.clojure/clojure {:mvn/version "1.12.0-alpha5"}
org.clojure/clojure {:mvn/version "1.12.0-alpha11"}
org.clojure/clojurescript {:mvn/version "1.11.121"}
org.clojure/tools.analyzer.jvm {:mvn/version "1.2.3"} ;; used by Electric
org.clojure/tools.logging {:mvn/version "1.2.4"}
Expand Down
27 changes: 26 additions & 1 deletion src/hyperfiddle/electric/impl/expand.clj
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,32 @@
(try (#'clojure.core/serialized-require sym) ; try bc it can be cljs file
(catch java.io.FileNotFoundException _))))

(defn macroexpand-clj [o] (serialized-require (ns-name *ns*)) (macroexpand-1 o))
(defn ?expand-clj-method-call [o]
(let [[s & args] o]
(if (clojure.lang.Compiler/namesStaticMember s)
(let [?class (-> s namespace symbol)]
(if (clojure.lang.Compiler$HostExpr/maybeClass ?class false)
(list* '. ?class (-> s name symbol) args)
o))
o)))

(defn macroexpand-clj [o]
(serialized-require (ns-name *ns*))
(let [o2 (macroexpand-1 o)]
(if (identical? o o2)
(?expand-clj-method-call o)
o2)))

;; - else if(namesStaticMember(sym))
;; - {
;; - Symbol target = Symbol.intern(sym.ns);
;; - Class c = HostExpr.maybeClass(target, false);
;; - if(c != null)
;; - {
;; - Symbol meth = Symbol.intern(sym.name);
;; - return preserveTag(form, RT.listStar(DOT, target, meth, form.next()));
;; - }
;; - }

(defn expand-referred-or-local-macros [o cljs-macro-env]
;; (:require [some.ns :refer [some-macro]])
Expand Down
11 changes: 10 additions & 1 deletion src/hyperfiddle/electric/impl/lang_de2.clj
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,20 @@

(declare -expand-all-in-try)

(defn ?expand-clj-method-call [o]
(let [[s & args] o]
(if (clojure.lang.Compiler/namesStaticMember s)
(let [?class (-> s namespace symbol)]
(if (clojure.lang.Compiler$HostExpr/maybeClass ?class false)
(list* '. ?class (-> s name symbol) args)
o))
o)))

(defn macroexpand-clj [o env]
(serialized-require (ns-name *ns*))
(if-some [mac (when-some [mac (resolve env (first o))] (when (.isMacro ^clojure.lang.Var mac) mac))]
(apply mac o env (next o))
(try (macroexpand-1 o) ; e.g. (Math/abs 1) will expand to (. Math abs 1)
(try (?expand-clj-method-call o)
(catch ClassNotFoundException _ o)))) ; e.g. (goog.color/hslToHex ..) won't expand on clj

(def !a (cljs-ana/->!a))
Expand Down
8 changes: 8 additions & 0 deletions test/hyperfiddle/electric/impl/expand_test.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -151,3 +151,11 @@
:ns 'hyperfiddle.electric.impl.expand-unloaded}
'(let [x 1]))))
(throw (ex-info "clj macroexpansion for unloaded ns fails" {}))))

#?(:clj
(tests
"clojure 1.12 macroexpansion regression on class/method calls"
(all '(clojure.lang.PersistentArrayMap/createAsIfByAssoc nil)) := '(. clojure.lang.PersistentArrayMap createAsIfByAssoc nil)


))
58 changes: 30 additions & 28 deletions test/hyperfiddle/electric_de_test.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -2190,31 +2190,33 @@
(swap! !offset inc)
% := 2))

(defn payT [_] (m/sp (m/? (m/sleep 10)) (rand-int 1000)))
(defn task->incseq [T] (m/ap (m/amb (i/empty-diff 0) (assoc (i/empty-diff 1) :grow 1, :change {0 (m/? T)}))))

(defn uf->is [uf]
(m/ap (m/amb (i/empty-diff 0)
(let [!first (atom true) v (m/?> uf)]
(assoc (i/empty-diff 1) :grow (if @!first (do (swap! !first not) 1) 0), :change {0 v})))))

(defn event->task [flow]
(uf->is (m/ap
(let [!busy? (atom false)
v (m/?> (m/eduction (remove (fn [_] @!busy?)) flow))
dfv (m/dfv), done! #(dfv false)]
(m/amb
[v done! (reset! !busy? true)]
[v done! (reset! !busy? (m/? dfv))])))))


(def !c (atom nil))
(tests
(with ((l/local {}
(let [[v done!] (e/join (event->task (m/observe (fn [!] (reset! !c !) #()))))]
(case (e/server (e/join (task->incseq (payT v))))
(tap (done!))))) tap tap)
(@!c 1)
% := false
(@!c 2)
% := false))
(comment
(defn payT [_] (m/sp (m/? (m/sleep 10)) (rand-int 1000)))
(defn task->incseq [T] (m/ap (m/amb (i/empty-diff 0) (assoc (i/empty-diff 1) :grow 1, :change {0 (m/? T)}))))

(defn uf->is [uf]
(m/ap (m/amb (i/empty-diff 0)
(let [!first (atom true) v (m/?> uf)]
(assoc (i/empty-diff 1) :grow (if @!first (do (swap! !first not) 1) 0), :change {0 v})))))

(defn event->task [flow]
(uf->is (m/ap
(let [!busy? (atom false)
v (m/?> (m/eduction (remove (fn [_] @!busy?)) flow))
dfv (m/dfv), done! #(dfv false)]
(m/amb
[v done! (reset! !busy? true)]
[v done! (reset! !busy? (m/? dfv))])))))


(def !c (atom nil))
(tests
(with ((l/local {}
(let [[v done!] (e/join (event->task (m/observe (fn [!] (reset! !c !) #()))))]
(case (e/server (e/join (task->incseq (payT v))))
(tap (done!))))) tap tap)
(@!c 1)
% := false
(@!c 2)
% := false))
)

0 comments on commit 9a183bb

Please sign in to comment.