On Nov 20, 5:57 pm, Garth Sheldon-Coulson <g...@mit.edu> wrote:
> Dear Clojurians,
>
> I am very happy to announce Clojuratica version 2.
>
> Clojuratica now offers the **syntactic** integration of Clojure and
> Mathematica.
>
> What does this mean? It means you can write Clojure code that looks like
> this:
>
> => (FactorInteger 12345)
> [[3 1] [5 1] [823 1]]
>
> You guessed it. FactorInteger is a Mathematica function. And that's a
> Clojure REPL.
>
> Symbolic math in Clojure? Syntax-unquoting to feed in Clojure data
> structures? Absolutely.
>
> => (Sqrt (* 9 a))
> (* 3 (Power a 1/2))
>
> => (let [x [[2 1] [1 2]]]
>      (CholeskyDecomposition ~x))
> [[(Power 2 1/2) (Power 2 -1/2)] [0 (Power 3/2 1/2)]]
>
> Note that the Clojure "matrix" (vector of vectors) is converted on the fly
> to a Mathematica matrix, and vice versa. Automatic conversions take place
> for all Clojure and Mathematica data structures.
>
> There's more. Mathematica functions are now Clojure functions. The following
> is a Mathematica function written in Clojure that finds the n shortest genes
> in the human genome. (Mathematica has some cool functions like GenomeData to
> try out.)
>
> => (Function [n]
>      (Take
>        (Sort
>          (Map
>               (Function [gene] [(GenomeData gene "SequenceLength") gene])
>            (GenomeData)))
>        n))
> #<parse$parse_fn__1230$fn__
> 1234 clojuratica.base.parse$parse_fn__1230$fn__1...@19fa0b5>
>
> What's that ugly return value? It's a first-class Clojure function. We
> evaluated a Mathematica function in Clojure and got back a Clojure function
> which, when we call it, hands off the computation to Mathematica and returns
> the result:
>
> => (*1 4)
> [[11 "IGHD727"] [16 "IGHD411"] [16 "IGHD417"] [16 "IGHD44"]]
>
> All the power of Mathematica is now seamlessly available in Clojure. If you
> like, you can think of Mathematica as a particularly mature Clojure library
> for linear algebra, matrix decomposition, symbolic mathematics,
> optimization, differential equations, symbolic and numerical integration,
> Fourier analysis, 2D and 3D visualization, image and photo manipulation,
> exploratory data analysis, probability and statistics, graph theory, number
> theory, geodesy, and access to the Wolfram Research internet data feeds on
> finance, chemistry, geometry, meteorology, astronomy, protein structure,
> and, as we've seen, the human genome.
>
> Let's take a step back and see how it all works.
>
> Observe: Clojure and Mathematica are remarkably similar languages despite
> their different areas of strength.
>
> Constant-lookup arrays:
>
> Clj vectors:  [1 2 3]
> Mma lists:    {1, 2, 3}
>
> Matrices as nested arrays:
>
> Clj:  [[1 0] [0 1]]
> Mma:  {{1, 0}, {0, 1}}
>
> Function calls *always* use prefix notation:
>
> Clj:  (func arg1 arg2 arg3)
> Mma:  Func[arg1, arg2, arg3]
>
> In Mathematica, common functions do have syntactic sugar, but it always is
> just syntactic sugar:
>
> Clj:  none
> Mma:  1 + 1   is just   Plus[1, 1]
>       !foo && (bar > baz)   is just   And[Not[foo], Greater[bar, baz]]
>
> Homoiconicity:
>
> Clj:  (nth '(func arg1 arg2) 1)   ==>   arg1
> Mma:  Part[Func[arg1, arg2], 1]   ==>   arg1
>
> The similarities suggest the core idea: Mathematica expressions can be
> written as Clojure expressions without any loss of information, and vice
> versa. There is perfect correspondence. Happily, Mathematica functions are
> PascalCase by convention. This allows the interning of Mathematica functions
> right into your Clojure namespace without conflict.
>
> Mma:  FactorInteger[1091]
> Clj:  (FactorInteger 1091)
>
> Mma:  Function[{x}, x + 1]
> Clj:  (Function [x] (Plus x 1))
>
> The heart of Clojuratica is simple. Convert Clojure expressions to
> Mathematica expressions, evaluate them in Mathematica, and parse the result
> back into Clojure expressions.
>
> As you will see in the tutorial on the Clojuratica web page 
> <http://clojuratica.weebly.com>, you are not forced to intern Mathematica
> functions directly into your namespace. You may, but you do not have to. The
> generic way to call Mathematica code is using the math macro (which you
> yourself define, so it need not be called "math"):
>
> => (let [x "World"]
>      (math (StringJoin "Hello, " ~x "! This is some Mathematica code's
> output.")))
> "Hello, World! This is some Mathematica code's output."
>
> => (def hello
>      (math
>        (Function [x]
>          (StringJoin "Hello, " x "! This is a Mathematica function's
> output."))))
> #'user/hello
>
> => (hello "World")
> "Hello, World! This is a Mathematica function's output."
>
> There are other features, too:
>
>     * A concurrency framework for multithreaded, parallel computation.
> Mathematica is not designed for threads or concurrency. It has excellent
> support for parallel computation, but parallel evaultions are initiated from
> a single-threaded master kernel which blocks until all parallel evaluations
> return. By contrast, Clojuratica includes a concurrency framework that lets
> multiple Clojure threads execute Mathematica expressions without blocking
> others. The computations will be farmed out to as many Mathematica kernels
> as are parallelized on the local machine or across a cluster or grid. The
> computations will return asynchronously, and some threads will go about
> their business while others continue to wait. I have worked to make the
> system as high-performance as possible.
>
>     * Hashmap conversion. Mathematica has no map data structure, so I
> include a basic one with Clojuratica, along with a few other helpful
> Mathematica funcions and features (e.g. Let, with is akin to With but allows
> later bindings to see earlier bindings, just like Clojure's let).
>
> Version 2 of Clojuratica is a complete rewrite of version 1. It should be
> considered alpha software for the time being. I would appreciate suggestions
> and bug reports.
>
> I plan to make the integration work in the opposite direction when I have
> time. It might be a while! The Clojure-in-Mathematica integration that was
> available in version 1 has been removed for now.
>
> I encourage you to read the tutorial on the web page 
> <http://clojuratica.weebly.com>. You can download the software there as well.
>
> I hope you enjoy it!

Very cool!

Rich

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