sem*_*ros 12
如果您只想让REPL打印输出的对象更有意义,可以defmethod print-method
为相关的类实现一个.
这是我最近编写的一些代码的缩短版本; 这使得Selenium-WebDriver WebDriver对象的REPL打印输出更有意义:
(defmethod print-method WebDriver
[o w]
(print-simple
(str "#<" "Title: " (.getTitle o) ", "
"URL: " (.getCurrentUrl o) " >")
w))
Run Code Online (Sandbox Code Playgroud)
打印出像 #<Title: A Title, URL: http://example.com >
在这里,WebDriver
代表一个类; 你可以很容易地通过实现内置Clojure的数据结构做print-method
了相应的类(Clojure中的喜悦设有print-method
用于clojure.lang.PersistentQueue
其在默认情况下没有很好的表现).在o
上面的是你正在处理的实际对象,w
是一个作家(由这些类型的打印功能需要).
Joo*_*aat 11
AFAIK,没有简单的方法可以做到这一点,尽管你可以使用reify或proxy来实现clojure.lang.IFn - 这实际上只相当于将你的函数对象包装在另一个对象中.
(def my-fn
(let [f (fn [a] (println a))]
(reify clojure.lang.IFn
(toString [this] "bla")
(invoke [this a] (f a)))))
#'user/my-fn
user> my-fn
#<user$fn$reify__2903 bla>
user> (my-fn 2)
2
nil
user> (.toString my-fn)
"bla"
user> (str my-fn)
"bla"
Run Code Online (Sandbox Code Playgroud)