Skip to content

Tensegritics/ClojureDart

main
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
August 14, 2022 22:42
doc
January 31, 2023 17:49
January 25, 2023 18:46
April 17, 2022 17:48
July 14, 2022 12:51
January 31, 2023 17:49
July 15, 2022 12:41
January 31, 2023 17:49
January 31, 2023 17:49
May 25, 2022 13:16
May 25, 2022 13:16
March 9, 2022 10:13
September 28, 2022 19:49

What is ClojureDart?

ClojureDart is a port of the Clojure language to Dart.

Its primary goal is to leverage Dart and Flutter to extend Clojure's reach to mobile and desktop apps.

Status

ClojureDart is production-ready: you can ship applications right now.

Some features are missing:

  • no REPL yet, but we have excellent hot-reload so for UI work you get instant feedback
  • multi-method (WIP)
  • sorted-collection (WIP)

In any case get in touch with us on Clojurians #ClojureDart channel)) or open an issue.

Some differences have been documented, see Differences with Clojure.

Links dump

Slack Youtube Twitter

Your first app!

Prerequisites: Clojure and Flutter installed and on your path.

Create a project directory with its deps.edn

mkdir hello
cd hello
cat << EOF > deps.edn
{:paths ["src"] ; where your cljd files are
 :deps {tensegritics/clojuredart
        {:git/url "https://github.com/tensegritics/ClojureDart.git"
         :sha "161e2e9566999ec2c3fc03eb73c261f132b06566"}}
 :aliases {:cljd {:main-opts ["-m" "cljd.build"]}}
 :cljd/opts {:kind :flutter
             :main acme.main}}
EOF

(To update an existing project to the latest ClojureDart, just do clj -M:cljd upgrade)

Initialize project:

clj -M:cljd init

Add some source code:

mkdir -p src/acme
cat << EOF > src/acme/main.cljd
(ns acme.main
  (:require ["package:flutter/material.dart" :as m]))

(defn main []
  (m/runApp
    (m/MaterialApp
      .title "Welcome to Flutter"
      .theme (m/ThemeData .primarySwatch m.Colors/pink)
      .home (m/Scaffold
              .appBar (m/AppBar
                        .title (m/Text "Welcome to ClojureDart"))
              .body (m/Center
                      .child (m/Text "This text is Centered."
                               .style (m/TextStyle
                                        .color m.Colors/red
                                        .fontSize 32.0)))))))
EOF

Compile, watch and run:

clj -M:cljd flutter

In most environments this will spawn a desktop app.

More details there

Maturity

ClojureDart is a work-in-progress but it's good enough for the bravest Clojurists to put in in production. Learn more about what's going on.

Who is behind it?

Tensegritics, an itty-bitty Clojure consultancy by Baptiste Dupuch🐦 and Christophe Grand🐦.

ClojureDart is not a revenue source for us, even if we build it for fun and hopefully profit -- by being the proverbial rising tide which lifts all boats.

Sponsoring us is a good way to get the project moves faster. In the past sponsorship money allowed us to have an intern on the project writing samples and producing videos.

Obviously you can contract us for assistance or development with ClojureDart.

Quick starts

Examples

In the samples directory directory, you'll find original sample code and ports of Flutter recipes.

How to run a sample project

Clone the ClojureDart repo.

git clone https://github.com/Tensegritics/ClojureDart.git

Go to the sample you want to try, let's say fab:

cd ClojureDart/samples/fab

Init the project:

clj -M:cljd init

Then launch the watcher:

clj -M:cljd flutter

You should get the sample running either in Chrome or as a desktop app.

To specify your exact target you must run flutter devices which outputs something like:

3 connected devices:
iPhone 6s (mobile) • D6707352-78D2-46BB-AB95-87355283FC82 • ios            •
com.apple.CoreSimulator.SimRuntime.iOS-15-5 (simulator)
macOS (desktop)    • macos                                • darwin-arm64   •
macOS 12.4 21F79 darwin-arm
Chrome (web)       • chrome                               • web-javascript •
Google Chrome 103.0.5060.114

The second column is the id of the target (here D6707352-78D2-46BB-AB95-87355283FC82, macos or chrome) that you pass to the watcher:

clj -M:cljd flutter -d D6707352-78D2-46BB-AB95-87355283FC82

Enjoy! 🧃

cljd.flutter.alpha

Deprecated, use alpha2.

cljd.flutter.alpha2

cljd.flutter.alpha2 is an utility namespace to remove Flutter boilerplate and integrate more nicely with Clojure.

Thanks!

To all individuals who blindly believed in our endeavor and sponsored our work.

To NuBank who approached us very early for sponsorship.

To Roam Research who bet their mobile apps development (now in the App Store and Play Store) on ClojureDart and allowed us to make steady progress since Summer 2021.

If you want to sponsor our work, you can sponsor either of us, we'll balance sponsorship. If you are a company you can also contact us directly.