datatype 型で Readable な文字列を得るには

defrecord した datatype 型を REPL で表示すると Readable な文字列が表示されるのに str 関数で文字列を得ようとすると、いやんな感じになってしまう。

user> (defrecord message [sender text])
user.message
user> (def s (message. "Tom" "Hello"))
#'user/s
user> s
#:user.message{:sender "Tom", :text "Hello"}
user> (str s)
"user.message@c30bb043"
user> (.toString s)
"user.message@c30bb043"

で、調べてみたところ、 REPL で表示されているような文字列を得るには、 pr-str 関数を使うらしい。

user> (pr-str s)
"#:user.message{:sender \"Tom\", :text \"Yes\"}"

str でも同様の表示に変更したい場合は toString メソッドを実装する。

user> (defrecord message [sender text]
        Object
        (toString [this] (pr-str this)))
user.message
user> (def s (message. "Tom" "Hello"))
#'user/s
user> s
#:user.message{:sender "Tom", :text "Hello"}
user> (str s)
"#:user.message{:sender \"Tom\", :text \"Hello\"}"