{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Clojure\n", "\n", "[Clojure](http://clojure.org/) is a dialect of Lisp that runs in the JVM.\n", "It shares with Lisp the code-as-data philosophy and a powerful macro system.\n", "Clojure is predominantly a functional programming language, and features a rich set of immutable, persistent data structures.\n", "It has strong support for reliable multithreading and concurrency." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "; lazy infinite sequence with recursive definition\n", "(def fib-seq-lazy \n", " ((fn rfib [a b] \n", " (lazy-seq (cons a (rfib b (+ a b)))))\n", " 0 1))\n", "(take 20 fib-seq-lazy)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "; 'unless' cannot be defined with a function because\n", "; it does not always evaluate both its arguments.\n", "(defmacro unless [pred a b]\n", " `(if (not ~pred) ~a ~b))\n", "(unless false (println \"Will print\") (println \"Will not print\"))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(defn run [nvecs nitems nthreads niters]\n", " (let [vec-refs (vec (map (comp ref vec)\n", " (partition nitems (range (* nvecs nitems)))))\n", " swap #(let [v1 (rand-int nvecs)\n", " v2 (rand-int nvecs)\n", " i1 (rand-int nitems)\n", " i2 (rand-int nitems)]\n", " (dosync\n", " (let [temp (nth @(vec-refs v1) i1)]\n", " (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))\n", " (alter (vec-refs v2) assoc i2 temp))))\n", " report #(do\n", " (prn (map deref vec-refs))\n", " (println \"Distinct:\"\n", " (count (distinct (apply concat (map deref vec-refs))))))]\n", " (report)\n", " (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))\n", " (report)))\n", "; When run, we see no values get lost or duplicated in the shuffle.\n", "; There are 36 distinct numbers before and after. \n", "(run 6 6 6 100000)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Using the classpath to load a jar\n", "\n", "This first cell shows that you get an error if you try to import a class not built-in to BeakerX:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(import com.beaker.BeakerXClasspathTest)\n", "(def classpathTest (new BeakerXClasspathTest))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The magic `%classpath` allows you to add jars to your kernel." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%classpath add jar ../resources/jar/BeakerXClasspathTest.jar" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(import com.beaker.BeakerXClasspathTest)\n", "(def classpathTest (new BeakerXClasspathTest))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(BeakerXClasspathTest/staticTest)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(. classpathTest getObjectTest)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[{:foo 1}{:foo 2}]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(import '[com.twosigma.beakerx.chart.xychart Plot]\n", " '[com.twosigma.beakerx.chart.xychart.plotitem Line])\n", "(doto (Plot.)\n", " (.setTitle \"We Will Control the Title\")\n", " (.setXLabel \"Horizontal\")\n", " (.setYLabel \"Vertical\")\n", " (.add (doto (Line.)\n", " (.setX [0, 1, 2, 3, 4, 5])\n", " (.setY [0, 1, 6, 5, 2, 8]))))" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Import/Unimport magic command" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%import com.twosigma.beakerx.widget.IntSlider" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(new IntSlider)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%unimport com.twosigma.beakerx.widget.IntSlider" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "(new IntSlider)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "beakerx_kernel_parameters": {}, "kernelspec": { "display_name": "Clojure", "language": "clojure", "name": "clojure" }, "language_info": { "codemirror_mode": "Clojure", "file_extension": ".clj", "mimetype": "text/x-clojure", "name": "Clojure", "nbconverter_exporter": "", "version": "1.7" } }, "nbformat": 4, "nbformat_minor": 2 }