Trojan horsing Clojure with Javascript

Trojan Horse with me

http://developers.theguardian.com

Why
Javascript?

  • Dynamic
  • Uses maps as their main data structure
  • Derived from lisp
  • Use first order functions
  • Equally unpopular with "proper" language fans

So we're using Clojurescript, yeah?

No

  • Clojurescript is very opinionated
  • It doesn't fit Node-based build pipelines
  • It uses a library that virtually no-one knows
  • You have to take it whole, no cherry-picking

Wisp

A Clojure-like Lisp syntax

Wisp

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin urna odio, aliquam vulputate faucibus id, elementum lobortis felis. Mauris urna dolor, placerat ac sagittis quis.

Javascript


(defn greet [name] (.concat "Hello " name))

(greet "Robert")

(defn currentSections
    [allSections, activeSections]
  (.filter list (fn [section]
    (.some activeSections
       (fn [activeSection]
         (identical?
           section.id activeSection.id))))))
var greet = exports.greet
    = function greet(name) {
        return 'Hello '.concat(name);
    };
greet('Robert');

var currentSections
    = exports.currentSections
    = function currentSections(
        allSections, activeSections) {
        return list.filter(
            function (section) {
            return activeSections.some(
                function (activeSection) {
                return section.id
                    === activeSection.id;
            });
        });
    };

The parens haven't gone away

Packaging (NPM)

Immutability

Mori

Compiled Clojurescript

Prefix notation

Includes quite a few Clojure standard library functions

Clojure data structures

ImmutableJS

Javascript

Prototype extension

Arrays-compatible interface

Feature comparable with Lo-Dash and Underscore

Influenced by Clojure data structures

 

Om

Love your library
not your language

Omniscient

  • Javascript
  • React
  • ImmutableJS
  • Immstruct

How does Om work?

  • Uses ReactJS to render an in-memory data structure
  • Uses immutable data structures to prevent unnecessary renders
  • Allows React components to be attached to sections of a data structure
  • Uses core.async to handle event changes

Immstruct

  • Wraps ImmutableJS structures
  • Provides an event model
  • Implements cursors

Cursors

 
var data = Immutable.fromJS({'person' :
    {'name' :
        {'first' : 'Robert', 'family' : 'Rees'}
    }
    , 'age' : 452});

var nameCursor = Cursor.from(data, ['person', 'name']);

nameCursor.update('first', function(name) {return name.toUpperCase();} );

data.getIn(['person', 'name', 'first']); // ROBERT

Event driven rendering

var immstruct = require('immstruct'),
  React = require('react');

var appData = immstruct({greeting: "Hello", guest: {name: ""}});

function render() {
    React.render(Component(appData.cursor()), documentElement);
}

render();

appData.on('next-animation-frame', render);

Wot no core.async?

Transducers?

Yes you can!

Why not Clojure?

  • Confident community
  • ES 6, transpilation and ES7
  • libraries > framework

Thank you

Blog: rrees.me

Twitter: rrees

http://slides.com/rrees/trojan-horsing-clojure-with-js

Trojan-horsing Clojure with Javascript

By Robert Rees

Trojan-horsing Clojure with Javascript

How to smuggle Clojure into your work with Javascript

  • 2,623