- High level overview https://yogthos.github.io/ClojureDistilled.html
- An Animated Introduction to Clojure https://markm208.github.io/cljbook/
- Interactive tutorial in a browser https://tryclojure.org/
- Interactive exercises http://clojurescriptkoans.com/
- Clerk notebooks with introductory examples https://github.clerk.garden/anthonygalea/notes-on-clojure
- More interactive exercises https://4clojure.oxal.org/
- Lambda Island tutorials https://lambdaisland.com/
- Functional Programming with Clojure resources https://practicalli.github.io/
Short write up on using REPL when developing UIs in ClojureScript.
Everyone's standard approach to hot-reloading is to use a tool (Figwheel or shadow-cljs) that reloads changed namespaces automatically. This works really well: you change the code, the tool picks up changed files, compiles namespaces and dependants, notifies REPL client which then pulls in compiled changes, and re-runs a function that re-renders UI.
The other approach is to use ClojureScript's REPL directly and rely only on eval from the editor. This more or less matches Clojure style workflow. This approach might be useful when you don't want tools overhead or hot-reloading becomes slow for you or you just used to this style of interactions. Also changing code doesn't always mean that you want to reload all the changes. On the other hand it is very easy to change a couple of top-level forms and forget to eval one of them.
import org.graalvm.nativeimage.c.function.CFunction; | |
import org.graalvm.nativeimage.c.function.CFunction.Transition; | |
import org.graalvm.nativeimage.c.function.CLibrary; | |
import org.graalvm.nativeimage.c.CContext; | |
import org.graalvm.nativeimage.c.type.CCharPointer; | |
import com.oracle.svm.core.c.ProjectHeaderFile; | |
import org.graalvm.nativeimage.c.type.CTypeConversion; | |
import org.graalvm.nativeimage.c.type.CTypeConversion.CCharPointerHolder; | |
import java.util.List; | |
import java.util.Collections; |
(defn qualify-definitions | |
[d prefix] | |
(let [p (str prefix ".") | |
p' (str "#/definitions/" p)] | |
(into | |
{} | |
(map (fn [[k v]] | |
[(str p k) | |
(walk/postwalk | |
(fn [o] |
This is a design for a unnamed programming language that I don't intend currently intend to make. It's dynamically typed, heavily inspired by Clojure, and designed with little thought given to performance.
The main features are:
- Inbuilt pattern matching on functions
- Error values instead of exceptions
- Unconstrained polymorphism
- Modules that are easier to statically analyze than namespaces