OK, I'm trying to get seriously stuck in, and the first thing I'm
trying to do is reimplement an inference engine I first wrote in
Portable Standard Lisp and then in InterLisp-D in /idiomatic/ Clojure.
So please have patience with me...
If one has something which is strongly typed, is it idiomatic to make
a Java class to hold it?
I want a structure like this
(defstruct feature :name :default)
but I want in addition to constrain the binding of :name to be always
a Clojure keyword and the binding of :default to be always a boolean -
the Clojure values either true or false.
I've tried
(defstruct feature [#^Keyword :name] :default)
but the reader spits an illegal argument exception. Is there different
syntax which the reader could parse? Or am I using the wrong kind of
thing?
Of course given that a struct is immutable I could have a make-feature
function which has type-hinted args:
(defn
#^{:doc "Make a feature safely"}
make-feature [#^Keyword name #^bool default]
(struct-map feature :name name :default default))
This works and does sort-of what I want - I can't guarantee that
nothing outside my make-feature function will make features but I
don't think I need to. However, it feels clunky - I instinctively feel
there must be a better way. Is this what deftype should be used for?
If so, where is it documented? The book I'm using - Stuart Halloway's
'Programming Clojure' - doesn't seem to have it (or if it has I've
missed it). Also, I don't seem to have deftype in my 1.1.0 rc3 build :
cc.journeyman.dtree.dtree=> (doc deftype)
java.lang.Exception: Unable to resolve var: deftype in this context
(NO_SOURCE_FILE:20)
I've also grepped the source code of clojure and failed to find it.
While we're on this point I'm delighted with the #^{:doc ...}
metadata! The way this works with the (doc thing) function is elegant
and useful. I'm also delighted with the way that keywords and maps are
functions onto each other:
cc.journeyman.dtree.dtree=> (def alive (make-feature :Alive true))
#'cc.journeyman.dtree.dtree/alive
cc.journeyman.dtree.dtree=> (:name alive)
:Alive
cc.journeyman.dtree.dtree=> (alive :name)
:Alive
This is very, very pretty.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en