> Why does this work?
>
> (take-while (complement #{\a\e\i\o\u}) "the-quick-brown-fox")
>
> When I do something similar, like
>
> (take-while (complement #(Character/isWhitespace %)) "the-quick-brown-
> fox")
>
> I have to deal with the parameter explicitly ("%"). How is the
> parameter hidden in the set/function?

The set *is* a function (it implements IFn). complement accepts a  
function as input, so that works.

Character/isWhitespace is a Java static method, which is not a first- 
class function, and thus can't be passed directly to complement.

The #(...) syntax is shorthand for (fn [...] ...), which introduces a  
new anonymous function. What you've written there is equivalent to

(defn whitespace? [c]
   (Character/isWhitespace c))

(take-while (complement whitespace?) "the quick")


... i.e., you've made a function that calls a Java static method on  
its input.


> Could I do something like that
> in my own code (not sure I'd want to, just curious what magic is at
> work here)?

In your Java code, implement IFn. That's the magic. In your Clojure  
code, just hand around functions.


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

Reply via email to