Emulate common lisps return-from for clojure
Repository Clojars Clojure Download
# clj-return-from
An implementation of common lisp's return-from for clojure
## Usage
The 'block' macro will establish a block with lexical scope. In this
lexical scope, a return-from-<blockname> macro can be used to
immediately exit the block with some return value.
EX:
(block foo
(+ 1 2))
==> 3
(block foo
(return-from-foo :bar)
(+ 1 2))
==> :bar
Note: If you attempt to return-from a block on a different thread
than the one that established the block, you will get a runtime error.
I implemented clj-return-from for several reasons:
1) implementing non-local exits requires that you throw a custom
exception (that must at least hold the return value). That requires
implementing a named class that extends Throwable. That requires you
drop into Java. I've done that so you don't have to.
2) clj-return-from contains code to check that the block and the
return-from are on the same thread.
3) clj-return-from blocks have lexical scope. If you create a named block
that calls a function that happens to create a block with the same
name, they won't conflict.
4) clj-return-from is more concise than try / throw.
To install, add:
:dependencies [[clj-return-from "1.0.0"]]
to your project.clj file. The code is hosted on clojars.
## License
Copyright (C) 2010 Jeff Palmucci
Distributed under the Eclipse Public License, the same as Clojure.