Skip to content

Instantly share code, notes, and snippets.

Mike Fikes mfikes

Block or report user

Report or block mfikes

Hide content and notifications from this user.

Learn more about blocking users

Contact Support about this user’s behavior.

Learn more about reporting abuse

Report abuse
View GitHub Profile

Note we are using :static-fns, and also note we are using master to get inferrence for implements? CLJS-3140.

At its core is an (arguably internal) optimization surrounding the notion of ^not-native, which is also effectively enabled if a value is tagged with a protocol type.

Note that compiler enables inference for implements? but not satisfies? because the later would break things.

And, if a user type hints with a protocol type, while the user code is arguably correct, it would provoke the same bug surrounding satisfies?.

$ clj -Sdeps '{:deps {org.clojure/clojurescript {:git/url "" :sha "b38ded99dc0967a48824d55ea644bee86b4eae5b"}}}' -m cljs.main -co '{:static-fns true}' -re node -r
mfikes / gist:3a160a1504debd31e5771736256ca022
Last active Sep 8, 2019
Serializing CLJS Bean instances via transit preserving meta
View gist:3a160a1504debd31e5771736256ca022
$ clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"} com.cognitect/transit-cljs {:mvn/version "0.8.256"} com.cognitect/transit-js {:mvn/version "0.8.861"} cljs-bean {:mvn/version "1.4.0"}}}' -m cljs.main -re node -r
ClojureScript 1.10.520
(require '[cognitect.transit :as t]
         '[cljs-bean.core :refer [->clj]]
cljs.user=> (defn roundtrip [x]
              (let [w (t/writer :json
                        {:handlers (cljs-bean.transit/writer-handlers)
View direct-field-access.txt
cljs.user=> (set! *print-fn-bodies* true)
cljs.user=> (defrecord Foo [x])
cljs.user=> (defn bar [^cljs.user/Foo foo] #(:y foo))
cljs.user=> (bar (assoc (->Foo 1) :y 3))
#object[Function "function (){
return new cljs.core.Keyword(null,"y","y",-1757859776).cljs$core$IFn$_invoke$arity$1(foo);
View compare.txt
$ plk -Sdeps '{:deps {cljs-bean {:mvn/version "0.2.0"}}}'
ClojureScript 1.10.520
cljs.user=> (simple-benchmark [o #js {:a 1 :b 2 :c 3}]
#_=> (let [{:keys [a b c]} (js->clj o :keywordize-keys true)]
#_=> (+ a b c))
#_=> 1e6)
[o #object[cljs.tagged-literals.JSValue]], (let [{:keys [a b c]} (js->clj o :keywordize-keys true)] (+ a b c)), 1000000 runs, 3077 msecs
cljs.user=> (require '[cljs-bean.core :refer [bean]])
$ cat src/foo/core.cljs
(ns foo.core)

(prn (time (reduce + (map inc (map inc (range (* 1024 1024)))))))
$ clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.516"}}}' -m cljs.main -O advanced -c foo.core
$ node out/main.js
View bar.cljs
(:require foo.core)
#_(:require-macros foo.core))
(defn try-me []
View core.clj
(ns foo.core)
(defmacro m []
View wrap-fn-object.txt
cljs.user=> (def my-inc (with-meta inc {:a 2}))
cljs.user=> (my-inc 17)
cljs.user=> (js/cljs.user.my_inc 17)
cljs.user.my_inc is not a function. (In 'cljs.user.my_inc((17))', 'cljs.user.my_inc' is an instance of MetaFn)
cljs.user=> (def my-inc' (fn [x] (my-inc x)))
cljs.user=> (js/cljs.user.my_inc_SINGLEQUOTE_ 17)
View foo.txt
ClojureScript 1.10.439
cljs.user=> (defprotocol IFoo
(delete [_]))
cljs.user=> (defrecord Foo []
(delete [_] 1))
cljs.user=> (delete (->Foo))

Old behavior:

cljs.user=> (defn f [x] (when (even? x) (inc x)))
cljs.user=> (let [x (f 2)] (if x (+ x "a")))
WARNING: cljs.core/+, all arguments must be numbers, got [#{number clj-nil} string] instead at line 1
You can’t perform that action at this time.