Skip to content

Instantly share code, notes, and snippets.

@aamedina
Created June 16, 2014 15:57
Show Gist options
  • Select an option

  • Save aamedina/d7e0218bf9120f179486 to your computer and use it in GitHub Desktop.

Select an option

Save aamedina/d7e0218bf9120f179486 to your computer and use it in GitHub Desktop.
(defprotocol PointerTo
(pointer [val]))
(extend-protocol PointerTo
String
(pointer [s]
(Pointer/pointerToCString s))
clojure.lang.Seqable
(pointer [seq]
(-> (Pointer/allocateList (class (first seq)) (count seq))
(doto (.addAll seq))
(.getPointer))))
(defmacro import-library
[library-name]
(letfn [(extract-type [cls]
(symbol (peek (str/split (str cls) #"\."))))
(wrap-parameter [param]
(if (= param 'Pointer)
(list 'pointer param)
param))]
(let [library-class (resolve library-name)]
`(do ~@(for [m (:members (r/reflect library-class))
:let [field? (instance? clojure.reflect.Field m)
method? (instance? clojure.reflect.Method m)
params (mapv extract-type (:parameter-types m))
body `(. ~library-name ~(:name m)
~@(map wrap-parameter params))]
:when (contains? (:flags m) :public)]
(cond
field? `(def ~(:name m) ~body)
method? `(defn ~(:name m) ~params ~body)
:else nil))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment