A command-line driver for a KB — the shell dual of the in-process API, launched with
lein run -m vaelii.impl.cli <cmd> <args…>. It runs the engine in-process (no
daemon); to talk to a running daemon use vaelii.impl.client instead.
lein run -m vaelii.impl.cli assert '(dog Fido)' NaturalWorldContext --dir /tmp/kb lein run -m vaelii.impl.cli query '(dog ?x)' NaturalWorldContext --dir /tmp/kb lein run -m vaelii.impl.cli why 3 --dir /tmp/kb lein run -m vaelii.impl.cli export /tmp/dump --dir /tmp/kb lein run -m vaelii.impl.cli repl --starter # interactive, starter schema lein cli help # every command and what it takes
help is a word rather than only a flag because Leiningen answers lein cli --help
itself, printing the alias expansion — the flag never reaches this namespace through
the alias, though it does through the full lein run -m vaelii.impl.cli --help.
Backend. --dir <path> uses the durable :disk backend (recovered on open, so
a fact asserted in one invocation is there in the next); with no --dir the KB is
in-memory and lives only for the process — useful for repl or a single compound
session, pointless across one-shot commands. --starter loads the shipped schema
(types, contexts, relation rules) so you can explore the ontology. --strength monotonic marks an assert known-true. export takes --variant records|records+index and --compression gzip|xz|none.
One writer. A --dir KB takes the single-writer file lock (docs/storage.md), so
the CLI and a daemon cannot own the same directory at once — by design.
A command-line driver for a KB — the shell dual of the in-process API, launched with `lein run -m vaelii.impl.cli <cmd> <args…>`. It runs the engine in-process (no daemon); to talk to a running daemon use `vaelii.impl.client` instead. lein run -m vaelii.impl.cli assert '(dog Fido)' NaturalWorldContext --dir /tmp/kb lein run -m vaelii.impl.cli query '(dog ?x)' NaturalWorldContext --dir /tmp/kb lein run -m vaelii.impl.cli why 3 --dir /tmp/kb lein run -m vaelii.impl.cli export /tmp/dump --dir /tmp/kb lein run -m vaelii.impl.cli repl --starter # interactive, starter schema lein cli help # every command and what it takes `help` is a word rather than only a flag because Leiningen answers `lein cli --help` itself, printing the alias expansion — the flag never reaches this namespace through the alias, though it does through the full `lein run -m vaelii.impl.cli --help`. **Backend.** `--dir <path>` uses the durable `:disk` backend (recovered on open, so a fact asserted in one invocation is there in the next); with no `--dir` the KB is in-memory and lives only for the process — useful for `repl` or a single compound session, pointless across one-shot commands. `--starter` loads the shipped schema (types, contexts, relation rules) so you can explore the ontology. `--strength monotonic` marks an `assert` known-true. `export` takes `--variant records|records+index` and `--compression gzip|xz|none`. **One writer.** A `--dir` KB takes the single-writer file lock (docs/storage.md), so the CLI and a daemon cannot own the same directory at once — by design.
(-main & argv)Parse argv, open the KB, run the command, and print the result. With repl (or no
command) it drops into the interactive loop.
Parse argv, open the KB, run the command, and print the result. With `repl` (or no command) it drops into the interactive loop.
(check-arity! cmd args)Refuse a command line with the wrong number of operands, naming what the command takes and what it got.
Without this the short line reaches dispatch, whose nth raises
IndexOutOfBoundsException — caught and printed, so lein cli assert '(dog Rex)'
answers error: IndexOutOfBoundsException: a true statement about a vector, and no
help at all to someone who left off a context. A long line is refused too, since
the extra operand is otherwise dropped in silence — and a dropped context is a fact
stored somewhere other than where it was meant to go.
Refuse a command line with the wrong number of operands, naming what the command takes and what it got. Without this the short line reaches `dispatch`, whose `nth` raises `IndexOutOfBoundsException` — caught and printed, so `lein cli assert '(dog Rex)'` answers `error: IndexOutOfBoundsException`: a true statement about a vector, and no help at all to someone who left off a context. A *long* line is refused too, since the extra operand is otherwise dropped in silence — and a dropped context is a fact stored somewhere other than where it was meant to go.
Every command word, in the order --help prints it: [min max operands gloss].
max is nil for a command whose last operand is optional. One table rather than
two, because the arity a command takes and the arity --help advertises going
out of step is how a usage message starts lying — and dispatch reaches into args
with nth, so an unchecked short line raises IndexOutOfBoundsException, whose
message is the class name and names neither the command nor the argument.
Every command word, in the order `--help` prints it: `[min max operands gloss]`. `max` is nil for a command whose last operand is optional. One table rather than two, because the arity a command *takes* and the arity `--help` *advertises* going out of step is how a usage message starts lying — and `dispatch` reaches into `args` with `nth`, so an unchecked short line raises `IndexOutOfBoundsException`, whose message is the class name and names neither the command nor the argument.
The command words dispatch knows, for the usage message and unknown command.
The command words `dispatch` knows, for the usage message and `unknown command`.
(dispatch kb cmd args opts)Run one command against kb and return its result (a handle, a seq of sentences /
solutions, a proof tree, …). args are data; opts is the parsed option map.
Run one command against `kb` and return its result (a handle, a seq of sentences / solutions, a proof tree, …). `args` are data; `opts` is the parsed option map.
(open-kb-from {:keys [dir starter memory] :as _opts})Build the KB a run operates on from the parsed opts: :dir → durable disk
(recovered), else in-memory — which :memory also names explicitly, so --memory --dir <path> is a contradiction and is refused rather than resolved by a guess.
:starter loads the shipped schema.
Build the KB a run operates on from the parsed `opts`: `:dir` → durable disk (recovered), else in-memory — which `:memory` also names explicitly, so `--memory --dir <path>` is a contradiction and is refused rather than resolved by a guess. `:starter` loads the shipped schema.
(parse-opts args)Split raw args into [positionals opts]. --k v becomes {:k v}, a bare
--memory / --starter becomes {:flag true}; everything else is a positional,
in order.
A value-taking flag with no value is refused (:unknown-option) rather than bound
nil: assert … --strength with nothing after it would otherwise store at :default
— the exact class the flag was written to escape — and --dir at the end of a line
would open the in-memory KB, gone at process exit. A flag the roster does not
name is refused the same way.
Split raw args into `[positionals opts]`. `--k v` becomes `{:k v}`, a bare
`--memory` / `--starter` becomes `{:flag true}`; everything else is a positional,
in order.
A value-taking flag with no value is refused (`:unknown-option`) rather than bound
nil: `assert … --strength` with nothing after it would otherwise store at `:default`
— the exact class the flag was written to escape — and `--dir` at the end of a line
would open the in-memory KB, gone at process exit. A flag the roster does not
name is refused the same way.(read-arg s)One argv string as data: the EDN it reads as — a sentence, a context symbol, a handle — and the raw string when it reads as none.
That last case is what a filesystem path is. /var/lib/vaelii is not a symbol (two
slashes), so a command taking a path (export, load) would otherwise fail in the
reader, before the command it belongs to had been looked at.
One argv string as data: the EDN it reads as — a sentence, a context symbol, a handle — and the **raw string** when it reads as none. That last case is what a filesystem path is. `/var/lib/vaelii` is not a symbol (two slashes), so a command taking a path (`export`, `load`) would otherwise fail in the reader, before the command it belongs to had been looked at.
(read-forms s)Every EDN form in s, in order — how a REPL line's args ((dog ?x) MyContext) are
parsed into data.
Every EDN form in `s`, in order — how a REPL line's args (`(dog ?x) MyContext`) are parsed into data.
(usage)The --help text: every command, its operands and a one-line gloss.
The `--help` text: every command, its operands and a one-line gloss.
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |