@codincod/codemirror-lang-clojure
v0.1.0
Published
Clojure language support for the CodeMirror code editor
Maintainers
Readme
@codincod/codemirror-lang-clojure
This package implements Clojure language support for the CodeMirror code editor.
Written in part for CodinCod, a competitive coding platform, where it colours the editor people solve puzzles in.
This code is released under an MIT license.
Usage
import {EditorView, basicSetup} from "codemirror"
import {clojure} from "@codincod/codemirror-lang-clojure"
const view = new EditorView({
parent: document.body,
extensions: [basicSetup, clojure()],
})Measuring it
The grammar is measured against real Clojure with lezer-survey, which has to sit beside this directory:
npm run measure -- ~/corpora/clojure
npm run gaps -- ~/corpora/clojureAgainst the 889 Clojure snippets CodinCod's guessing game holds, 853 parse with no error node. The other 36 are files Clojure's own reader turns down as well, mostly a paren the snippet was cut in half by; every file the reader accepts, the grammar reads clean. The reader turns down 50 in all, so on 14 of them this parser is the more forgiving of the two, which is what an editor wants while somebody is still typing.
What it covers
Clojure, ClojureScript, the .cljc files that are both, and EDN, which are one
reader between them. Every reader macro the language has: sets, anonymous
functions, regular expressions, metadata, namespaced maps, reader conditionals,
tagged literals, symbolic values, and the datum comment that removes the form
behind it however long it runs.
The tree says which word in a form is the verb, which words a let or a defn
binds, and which of the punctuation a Lisp is made of is a name rather than
syntax: / is division, % is an argument, result# is a gensym, and a comma
is whitespace.
The oracle
tools/reads asks Clojure's own reader whether a file reads, which is how the
corpus is told from the files that only share its extension. It runs babashka
out of the code runner's Nix store, and prints one line for every file the
reader turned down.
