Skip to content

Instantly share code, notes, and snippets.

@lambder
Created December 22, 2011 12:15
Show Gist options
  • Save lambder/1510110 to your computer and use it in GitHub Desktop.
Save lambder/1510110 to your computer and use it in GitHub Desktop.
Example of extending native Java array types to Clojure protocols
; Copyright (c) Daniel Kwiecinski. All rights reserved.
; The use and distribution terms for this software are covered by the
; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
; which can be found in the file epl-v10.html at the root of this distribution.
; By using this software in any fashion, you are agreeing to be bound by
; the terms of this license.
; You must not remove this notice, or any other, from this software.
;
; Example of extending native Java array types to Clojure protocols
(defn array-of [t]
(.getClass (java.lang.reflect.Array/newInstance t 0)))
(defprotocol P
(ppp [it]))
(extend-type Object
P
(ppp [s]
(format "<%s>" s)))
(extend-type String
P
(ppp [s]
(format "\"%s\"" s)))
(extend-type (array-of Object)
P
(ppp [a]
(apply str
(flatten
["Array["
(interpose ", "
(map
#(ppp %)
a))
"]"]))))
; => (ppp (to-array [1 2 3 4]))
; "Array[<1>, <2>, <3>, <4>]"
; => (ppp (to-array ["foo" "bar"]))
; "Array[\"foo\", \"bar\"]"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment