You're right. Meikel's way seems good to me, too, and "try 1" works
after restarting slime. :) Thanks! Meikel, Stuart~

On 11월10일, 오후11시49분, Stuart Halloway <[EMAIL PROTECTED]>
wrote:
> Hi Chanwoo,
>
> I think Meikel's approach of switching to the namespace is simpler,
> but your "try 1" works for me.  Is it possible that you need to reload
> all the namespaces in your REPL to clear out some old code?
>
> Try 2 cannot work because the defn* gets expanded at macro-time, and
> the binding of *test* to true happens later.
>
> Cheers,
> Stuart
>
> > I'm sorry for spamming.. In Stuart's book - 'Programming Clojure', I
> > saw below paragraph:
>
> > "1. Redefine private to mean "private for production code, but public
> > for serialization and unit tests".
> > ...
>
> > I have seen Java programs that needed all these features."
>
> > So I decided to try what he referred to. I thought it will be trivial
> > by using macros.. But shamefully, I couldn't do this simple job.. Here
> > is my code, which does not work:
>
> > ;;;;;;;;TRY 1;;;;;;;;;
> > ;;defn_star.clj
> > (ns defn-star)
>
> > (def *test* (ref false))
>
> > (defmacro defn*
> >  {:doc "If *test* is true, 'defn*' expands to 'defn', otherwise it
> > expands to 'defn-'"}
> >  [& body]
> >  (if (true? @*test*)
> >    `(defn [EMAIL PROTECTED])
> >    `(defn- [EMAIL PROTECTED])))
>
> > ;;temp.clj
> > (ns temp
> >  (:use defn-star))
>
> > (dosync (alter *test* #(not %)))
>
> > (defn* sym->key
> >  {:doc "(sym->key 'abc) => :abc   (sym->key nil) => nil"}
> >  [sym]
> >  (if (= "" (str sym))
> >      nil
> >      (keyword (str sym))))
>
> > ;;test_temp.clj
> > (ns test-temp
> >  (:use temp)
> >  (:use (clojure.contrib test-is))
>
> > (deftest test-sym->key
> >  (is (= (sym->key 'abc) :abc)))
>
> > (run-tests)
>
> > ;;;;;;;;;;TRY 2;;;;;;;;;;
> > ;;defn_star.clj
> > (ns defn-star)
>
> > (def *test* false)
>
> > (defmacro defn*
> >  {:doc "If *test* is true, 'defn*' expands to 'defn', otherwise it
> > expands to 'defn-'"}
> >  [& body]
> >  (if (true? *test*)
> >    `(defn [EMAIL PROTECTED])
> >    `(defn- [EMAIL PROTECTED])))
>
> > ;;temp.clj
> > (ns temp
> >  (:use defn-star))
>
> > (binding [*test* true]
> >  (defn* sym->key
> >    {:doc "(sym->key 'abc) => :abc   (sym->key nil) => nil"}
> >    [sym]
> >    (if (= "" (str sym))
> >        nil
> >        (keyword (str sym)))))
>
> > ;;test_temp.clj
> > (ns test-temp
> >  (:use temp)
> >  (:use (clojure.contrib test-is))
>
> > (deftest test-sym->key
> >  (is (= (sym->key 'abc) :abc)))
>
> > (run-tests)
>
> > In both cases, tests can not recognize 'sym->key'. Though I (:use
> > defn-
> > star), it seems that *test* variable is not referred by 'temp'. Ahh..
> > maybe I think that I didn't properly understand about namespaces. Is
> > there any elegant way to achieve testing private functions? Any
> > suggestion appreciated.
--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to