Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-31 Thread Alyssa Kwan
Generating readable code for IDEs is not a good reason. You should
think carefully about variable capture and decide which you want.
Usually, in a macro-generated defn, I do want to capture the
parameters, so I would use ~'this.

On Dec 30, 11:54 pm, André Thieme splendidl...@googlemail.com wrote:
 Am 31.12.2010 03:29, schrieb Alex Baranosky:





  I've been playing with making a macro to encapsulate Stuart's post, like
  this:

  (defmacro defrecord-ifn [name  args]
     `(defrecord ~name ~...@args
       clojure.lang.IFn
       (invoke [this key] (get this key

  (defrecord-ifn Foo [a b c])

  (def foo (Foo. A B C))

  (prn (map foo [:a :c])) = (A, C)

  I get the error:

  No such var: user/this.  I guess this is because it is expanding
  'this' to 'user/this'.  What is the proper way to get a macro like this
  to expand properly?

 Others have already pointed to this# .
 I just would like to add that you can as well use ~'this in some
 cases, where your macros generate defns. The advantage is that some
 editors (like emacs) will show you the parameter vector and that would
 show a useful name and not this_auto_foobarbaz123456 .

-- 
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


Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-31 Thread Robert McIntyre
Be sure to also implement the version of get which takes a not-found
argument so that your objects will work with map code which uses this
functionality.

(defrecord map-like-object [field-1 field-2 etc]
  clojure.lang.IFn
  (invoke [this k] (get this k))
  (invoke [this k not-found] (get this k not-found)))

sincerely,
--Robert McIntryre

On Fri, Dec 31, 2010 at 11:04 AM, Alyssa Kwan alyssa.c.k...@gmail.com wrote:
 Generating readable code for IDEs is not a good reason. You should
 think carefully about variable capture and decide which you want.
 Usually, in a macro-generated defn, I do want to capture the
 parameters, so I would use ~'this.

 On Dec 30, 11:54 pm, André Thieme splendidl...@googlemail.com wrote:
 Am 31.12.2010 03:29, schrieb Alex Baranosky:





  I've been playing with making a macro to encapsulate Stuart's post, like
  this:

  (defmacro defrecord-ifn [name  args]
     `(defrecord ~name ~...@args
       clojure.lang.IFn
       (invoke [this key] (get this key

  (defrecord-ifn Foo [a b c])

  (def foo (Foo. A B C))

  (prn (map foo [:a :c])) = (A, C)

  I get the error:

  No such var: user/this.  I guess this is because it is expanding
  'this' to 'user/this'.  What is the proper way to get a macro like this
  to expand properly?

 Others have already pointed to this# .
 I just would like to add that you can as well use ~'this in some
 cases, where your macros generate defns. The advantage is that some
 editors (like emacs) will show you the parameter vector and that would
 show a useful name and not this_auto_foobarbaz123456 .

 --
 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

-- 
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


Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-30 Thread Chas Emerick
Yes, that's intentional – implementing IFn is (as you can see) orthogonal to 
implementing IPersistentMap, IPersistentCollection, etc.

Of course, keyword access of record slots is most idiomatic, e.g. (:my-slot 
some-record)

If you'd like to pass around a function that accesses a record, there's always 
get, e.g. ((partial get some-record) :my-slot)

- Chas

On Dec 30, 2010, at 8:08 AM, Sunil S Nandihalli wrote:

 Hello everybody,
  An object of class created using defrecord does not implement IFn .. while 
 it behaves very similar to map otherwise .. Is this way by design? can it be 
 made to behave like a hash-map without any performance penalty in terms of 
 behaving like a function?
 
 Thanks,
 Sunil.

-- 
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


Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-30 Thread Stuart Sierra
You can make it implement IFn easily enough:

(defrecord Foo [a b c]
  clojure.lang.IFn
  (invoke [this key] (get this key)))

It has been debated whether or not this is a good idea, design-wise, but it 
should not be a performance penalty.


-Stuart Sierra
clojure.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

Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-30 Thread Alex Baranosky
I've been playing with making a macro to encapsulate Stuart's post, like
this:

(defmacro defrecord-ifn [name  args]
  `(defrecord ~name ~...@args
clojure.lang.IFn
(invoke [this key] (get this key

(defrecord-ifn Foo [a b c])

(def foo (Foo. A B C))

(prn (map foo [:a :c])) = (A, C)

I get the error:

No such var: user/this.  I guess this is because it is expanding 'this' to
'user/this'.  What is the proper way to get a macro like this to expand
properly?

Alex

-- 
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

Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-30 Thread Alex Osborne
Alex Baranosky alexander.barano...@gmail.com writes:

 I've been playing with making a macro to encapsulate Stuart's post, like this:

 (defmacro defrecord-ifn [name  args]
   `(defrecord ~name ~...@args
     clojure.lang.IFn
     (invoke [this key] (get this key

 (defrecord-ifn Foo [a b c])

 (def foo (Foo. A B C))

 (prn (map foo [:a :c])) = (A, C)

 I get the error:

 No such var: user/this.  I guess this is because it is expanding
 'this' to 'user/this'.  What is the proper way to get a macro like
 this to expand properly? 

Use autogensym.  Stick a # on the end of bindings you declare inside
syntax-quote: this# and key#. 

(defmacro defrecord-ifn [name  args]
  `(defrecord ~name ~...@args
clojure.lang.IFn
(invoke [this# key#] (get this# key#

-- 
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


Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-30 Thread Alex Baranosky
Worked like a charm.  Thanks Alex.

-- 
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

Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-30 Thread Alyssa Kwan
Technically, there's no possibility of variable capture, but you
should use gensyms:

(defmacro defrecord-ifn [name  args]
  `(defrecord ~name ~...@args
 clojure.lang.IFn
 (invoke [this# key#] (get this# key#

Thanks,
Alyssa

On Dec 30, 9:29 pm, Alex Baranosky alexander.barano...@gmail.com
wrote:
 I've been playing with making a macro to encapsulate Stuart's post, like
 this:

 (defmacro defrecord-ifn [name  args]
   `(defrecord ~name ~...@args
     clojure.lang.IFn
     (invoke [this key] (get this key

 (defrecord-ifn Foo [a b c])

 (def foo (Foo. A B C))

 (prn (map foo [:a :c])) = (A, C)

 I get the error:

 No such var: user/this.  I guess this is because it is expanding 'this' to
 'user/this'.  What is the proper way to get a macro like this to expand
 properly?

 Alex

-- 
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


Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-30 Thread Sunil S Nandihalli
thanks everybody for the responses .. with macros around ... you just have
to wish for it to get it .. but we need to be careful what we wish for :)
Sunil.

On Fri, Dec 31, 2010 at 8:18 AM, Alyssa Kwan alyssa.c.k...@gmail.comwrote:

 Argh! Six minutes! :P

 On Dec 30, 9:42 pm, Alyssa Kwan alyssa.c.k...@gmail.com wrote:
  Technically, there's no possibility of variable capture, but you
  should use gensyms:
 
  (defmacro defrecord-ifn [name  args]
`(defrecord ~name ~...@args
   clojure.lang.IFn
   (invoke [this# key#] (get this# key#
 
  Thanks,
  Alyssa
 
  On Dec 30, 9:29 pm, Alex Baranosky alexander.barano...@gmail.com
  wrote:
 
 
 
   I've been playing with making a macro to encapsulate Stuart's post,
 like
   this:
 
   (defmacro defrecord-ifn [name  args]
 `(defrecord ~name ~...@args
   clojure.lang.IFn
   (invoke [this key] (get this key
 
   (defrecord-ifn Foo [a b c])
 
   (def foo (Foo. A B C))
 
   (prn (map foo [:a :c])) = (A, C)
 
   I get the error:
 
   No such var: user/this.  I guess this is because it is expanding
 'this' to
   'user/this'.  What is the proper way to get a macro like this to expand
   properly?
 
   Alex

 --
 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.comclojure%2bunsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en


-- 
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

Re: an object of class created using defrecord does not implement IFn .. while it behaves very similar to map otherwise ..

2010-12-30 Thread André Thieme

Am 31.12.2010 03:29, schrieb Alex Baranosky:

I've been playing with making a macro to encapsulate Stuart's post, like
this:

(defmacro defrecord-ifn [name  args]
   `(defrecord ~name ~...@args
 clojure.lang.IFn
 (invoke [this key] (get this key

(defrecord-ifn Foo [a b c])

(def foo (Foo. A B C))

(prn (map foo [:a :c])) = (A, C)

I get the error:

No such var: user/this.  I guess this is because it is expanding
'this' to 'user/this'.  What is the proper way to get a macro like this
to expand properly?


Others have already pointed to “this#”.
I just would like to add that you can as well use “~'this” in some
cases, where your macros generate defns. The advantage is that some
editors (like emacs) will show you the parameter vector and that would
show a useful name and not “this_auto_foobarbaz123456”.

--
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