Ignore this. ;) deftype and reify and all of that good stuff are now in the Clojure master branch. Rich pulled new into master a few days ago.
On Jan 15, 4:09 am, Michael Wood <esiot...@gmail.com> wrote: > 2010/1/15 Simon Brooke <still...@googlemail.com>: > > > > > 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) > > #^something applies to the thing to the right of it. There's no need > to enclose anything in square brackets. But this won't work here > anyway: > > user=> (defstruct feature #^Keyword :name :default) > java.lang.IllegalArgumentException: Metadata can only be applied to IMetas > :default > java.lang.Exception: Unmatched delimiter: ) > > > 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)) > > defn also supports docstrings more directly like this: > > (defn make-feature > "Make a feature safely" > [...] > (struct-map ...)) > > > This works and does sort-of what I want - I can't guarantee that > > Does it? > > user=> (defn > #^{:doc "Make a feature safely"} > make-feature [#^Keyword name #^bool default] > (struct-map feature :name name :default default)) > #'user/make-feature > user=> (make-feature "some name" 42) > {:name "some name", :default 42} > > > 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. > > It's not in any official release yet. In your git checkout do > something like this to get it: > > $ git checkout -b new origin/new > > That will create a branch called "new" based on the "new" branch in > Rich's repository. Then you can "git pull" as usual to keep it > updated. If you want to switch back to master, just do "git checkout > master". > > I've not tried deftype yet, so I don't know if it's what you're looking for. > > -- > Michael Wood <esiot...@gmail.com>
-- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en