On Sun, Jan 25, 2009 at 8:01 AM, Chouser <[email protected]> wrote:
> On Sun, Jan 25, 2009 at 7:06 AM, Anand Patil
> <[email protected]> wrote:
>>
>> I'd like to repeat my request for an example of definline usage; I
>> feel I've tried everything.
>
> I looked into this yesterday, and it seems to me that definline has
> been broken since SVN rev 1065. I don't know why the usages of it in
> core.clj don't cause errors at compile time, but they don't seem to
> work quite right.
I wrote a new definline that seems to work correctly:
(defmacro definline
"Experimental - like defmacro, except defines a named function whose
body is the expansion, calls to which may be expanded inline as if
it were a macro. Cannot be used with variadic (&) args."
[name & decl]
(let [[pre-args [args expr]] (split-with (comp not vector?) decl)]
`(do
(defn ~name ~...@pre-args ~args ~(apply (eval (list `fn args expr))
args))
(alter-meta! (var ~name) assoc :inline (fn ~args ~expr))
(var ~name))))
Using definline work, and return the Var, just like defn does:
user=> (definline inc2 "returns x plus 2" [x] `(+ 2 ~x))
#'user/inc2
The defined function works as a function:
user=> (map inc2 [1 2 3])
(3 4 5)
It also works inlined:
user=> (inc2 5)
7
And even the docstring works, which I think it didn't before:
user=> (doc inc2)
-------------------------
user/inc2
([x])
returns x plus 2
nil
This means that 'ints', 'doubles', and friends now work too:
user=> (doubles (into-array Double/TYPE [1 2 3]))
#<double[] [...@12aea3e>
user=> (doc doubles)
-------------------------
clojure.core/doubles
([xs])
Casts to double[]
nil
Patch attached.
--Chouser
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---
commit 407a65779f0ebc07772fded00e95225ccb7c8423
Author: Chouser <[email protected]>
Date: Sun Jan 25 12:13:59 2009 -0500
Fix definline
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 5c01215..8d3eef2 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -3031,14 +3031,13 @@
(defmacro definline
"Experimental - like defmacro, except defines a named function whose
body is the expansion, calls to which may be expanded inline as if
- it were a macro. Cannot be used with variadic (&) args."
+ it were a macro. Cannot be used with variadic (&) args."
[name & decl]
- (let [[args expr] (drop-while (comp not vector?) decl)
- inline (eval (list `fn args expr))]
+ (let [[pre-args [args expr]] (split-with (comp not vector?) decl)]
`(do
- (defn ~name ~args ~(apply inline args))
- (let [v# (var ~name)]
- (.setMeta v# (assoc ^v# :inline ~inline))))))
+ (defn ~name ~...@pre-args ~args ~(apply (eval (list `fn args expr)) args))
+ (alter-meta! (var ~name) assoc :inline (fn ~args ~expr))
+ (var ~name))))
(defn empty
"Returns an empty collection of the same category as coll, or nil"