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