Out of simple curiosity I wondered how hard it would be to implement flow control using proxy. I know Rich isn't hot on non-structured programming, but there may be times where this might be useful: (ns flow.return-from (:import (flow IReturnFrom)))
(defn create-return-from [value] (proxy [Throwable IReturnFrom] [] (value [& args] value))) (defmacro allow-return-from [form] `(try ~form (catch ~'clojure.proxy.java.lang.Throwable$IReturnFrom e# (.value e#)))) (defmacro return [value] `(throw (create-return-from ~value))) (defn my-loop [count] (dotimes [x count] (if (= x 5) (return x)))) ;; examples (allow-return-from (my-loop 10)) ; -> 5 (dotimes [x 5] (allow-return-from (dotimes [y 5] (if (= y 2) (return y) (println x y))))) In order for the above to work you'll need to compile an interface: ;; compile with the following ;; (binding [*compile-path* "/path/to/classes"] ;; (compile 'flow.return-from-interface)) (ns flow.return-from-interface) (gen-interface :name flow.IReturnFrom :methods [[value [] Object]]) Pretty cool. --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---