Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nested types in clojure?

In clojure, how do I type type hint a type that I have created? (I want to nest the types.)

e.g. I had thought that this would work:

(deftype A 
    [#^somePrimitive  someField])

(deftype B
    [#^A Avalue])

This brings up an error message:

Unknown location:
  error: java.lang.ClassNotFoundException: A

Note: clojure types are a new feature which currently exists only in the 'new' branch of clojure.

Edit: I was confused by the different ways of type hinting in clojure for java and clojure types. java classes are hinted as

#^java.some.class

while clojure types are hinted as:

#^:some.Namespace/type
like image 443
Rob Lachlan Avatar asked Dec 29 '09 19:12

Rob Lachlan


2 Answers

For each deftype, a type tag (basically a namespace-qualified keyword) is created so you don't have to AOT-compile your code before you can use the resulting class.

If type A is in the current namespace, you can write it like this:

(deftype B [^::A Avalue])

For types in other namespaces, qualify the keyword using its namespace:

(deftype B [^:user/A Avalue])
like image 143
Daniel Werner Avatar answered Sep 19 '22 16:09

Daniel Werner


(deftype B [#^:user/A Avalue]) works for me.

like image 38
Raoul Duke Avatar answered Sep 21 '22 16:09

Raoul Duke