[ClojureScript] Re: how to use new data_readers.cljc feature with deftype

2017-02-16 Thread Thomas Heller
On Thursday, February 16, 2017 at 6:40:41 PM UTC+1, Dustin Getz wrote:
> My expectation is the compiler, when it sees `(def foo #DbId [1 2])` will 
> emit javascript equal to `(def foo (hypercrud.types/read-DbId [1 2])`

Your assumption is incorrect. I cannot answer your question since I have not 
used data_readers.cljc in CLJS. I have however used it in Clojure and my one 
and only recommendation is: DON'T!

Don't get me wrong, tagged literals are excellent when it comes to data. Not so 
much for code though. Lets look at two variants of code that achieve the same 
thing:

data_readers.cljc
(ns my.app)

(def foo #Dbld [1 2])

vs. just plain CLJ(S)

(ns my.app
  (:require [hypercrud.types :as t]))

(def foo (t/dbld 1 2))


These both achieve the same thing. However the non-tagged version is self 
contained. It does not need anything else to run. You can eval it in a REPL and 
it will work. You can see which namespaces are involved and which function is 
called.

The data literal version however cannot run without setting up an environment. 
It must read the data_readers.cljc and eval things (at READ time). Have fun 
debugging this. The trouble with this for CLJS is also that you now must teach 
the compiler about all your objects. Since it must learn what code to emit so 
your object can be constructed by the JS runtime.

So my warning is to never use tagged literals for code.

For data you can use the :readers opts in clojure.edn/read-string [1].

CLJS has (cljs.reader/register-tag-parser! "tag" parse-fn) or the same as above 
if you are using tools.reader.


YMMV,
/thomas

[1] https://clojure.github.io/clojure/clojure.edn-api.html

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojurescript+unsubscr...@googlegroups.com.
To post to this group, send email to clojurescript@googlegroups.com.
Visit this group at https://groups.google.com/group/clojurescript.


[ClojureScript] Re: how to use new data_readers.cljc feature with deftype

2017-02-16 Thread Dustin Getz
My expectation is the compiler, when it sees `(def foo #DbId [1 2])` will emit 
javascript equal to `(def foo (hypercrud.types/read-DbId [1 2])`

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojurescript+unsubscr...@googlegroups.com.
To post to this group, send email to clojurescript@googlegroups.com.
Visit this group at https://groups.google.com/group/clojurescript.


[ClojureScript] how to use new data_readers.cljc feature with deftype

2017-02-16 Thread Dustin Getz
I receive this error:

Attempting to call unbound fn: #'hypercrud.types/read-DbId

My hypercrud.types namespace is a cljs file, since the compiler jvm process 
will need to emit javascript that calls my deftype constructor. Am I 
misunderstanding something?

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojurescript+unsubscr...@googlegroups.com.
To post to this group, send email to clojurescript@googlegroups.com.
Visit this group at https://groups.google.com/group/clojurescript.