On Sun, Nov 1, 2009 at 9:14 PM, Richard Newman <holyg...@gmail.com> wrote:

>
> > I've given it some thought and it seems it has to be a compiler level
> > feature. Am I right?
>
> You could implement Common Lisp-style "return-from" with a custom
> exception class:
>
> public class BlockException extends Exception {
>   String name;
>   Object val;
>   public BlockException(String name, Object val) {
>     this.name = name;
>     this.val  = val;
>   }
>   public String name() { return this.name; }
>   public Object value() { return this.val; }
> }
>
> (defmacro block [name & body]
>   `(try
>      (do ,@body)
>      (catch BlockException e
>        (if (= (.name e) (name ,name))
>          (.value e)
>          (throw e)))))
>
> (defmacro return-from [name expr]
>   `(throw (BlockException. (name ,name) ,expr)))
>
>
> Then use it:
>
>
> (defn foo []
>   (block outside
>     (do-something
>       ;; ...
>       (return-from outside 5)
>       ;; ...
>   )))


For this to work, you'd first have to implement Common Lisp style unquoting.
:)

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to