Thanks, that implementation is just what i was searching for. понедельник, 24 декабря 2012 г., 21:17:11 UTC+4 пользователь juan.facorro написал: > > Here's a possible implementation: > > (ns macro-test > (:require [clojure.pprint :as p])) > > (defn get-args-index [x] > (first (filter identity (map-indexed #(when (vector? %2) %1) x)))) > > (defn insert-at [x y i] > (concat (take (inc i) x) (list y) (drop (inc i) x))) > > (defmacro reify-with-validation [f interface & body] > (let [i (map get-args-index body) > body (map #(insert-at %1 (list f) %2) body i)] > `(reify ~interface ~@body))) > > I tested the expansion with the following code: > > (def with-validation (macroexpand-1 > '(reify-with-validation validate-state ITest > (^void printHello [this] > (println "Hello world!")) > (^void printName [this ^String name] > (println (str "Hello, " name)))))) > > (p/pprint with-validation) > > Here's an example using the macro with clojure.lang.ISeq: > > (def x (reify-with-validation #(println "validating....") clojure.lang.ISeq > (^String toString [this] > (println "toString()")) > (first [this] > (println "first()")) > (next [this] > (println "next()")) > (more [this] > (println "more()")) > (cons [this o] > (println "cons()")))) > > (.toString x) > (.first x) > (.next x) > (.more x) > (.cons x nil) > > Which outputs: > > validating.... > toString() > validating.... > first() > validating.... > next() > validating.... > more() > validating.... > cons() > > Hope it helps, > > Juan > > On Monday, December 24, 2012 10:35:35 AM UTC-3, nkonovalov wrote: >> >> Hi. >> >> I have a java interface. >> Something like this this. >> >> public interface ITest { >> void printHello(); >> void printName(String name); >> } >> >> And i get an implementation using reify. >> >> (def impl (reify macrotest.ITest >> (^void printHello [this] >> (println "Hello world!")) >> (^void printName [this ^String name] >> (println (str "Hello, " name)))) >> ) >> >> Also a have a validation method: >> (defn validate-state [] (println "Some validation code here")) >> >> So to add it into implementation i have to add int into every method >> manually >> >> (def impl (reify ITest >> (^void printHello [this] >> *(validate-state)* >> (println "Hello world!")) >> (^void printName [this ^String name] >> * (validate-state)* >> (println (str "Hello, " name)))) >> ) >> >> Is it possible to make a macros that would get the validation method and >> insert this *(validate-state) *into the begining of each method in reify >> automatically. >> >> Something like that? >> >> (def impl (reify-with-validation *validate-state* ITest >> (^void printHello [this] >> (println "Hello world!")) >> (^void printName [this ^String name] >> (println (str "Hello, " name)))) >> ) >> >> Any thoughts on how to do this? >> >>
-- 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 Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en