Clojure core / Hara core compatibility¶
Canonical exhaustive grouping for Clojure 1.12.5 and Hara L0 plus std.foundation.
| Group | Count |
|---|---|
only-clojure |
486 |
only-hara |
39 |
same-exact |
194 |
same-renamed |
1 |
same-changed |
12 |
same-changed¶
| Clojure | Hara | Contract |
|---|---|---|
map |
map |
Direct calls are lazy in both; Hara's one-argument transform is eager on ordinary collections and returns a vector, while preserving arrays and existing lazy sources. |
seq |
seq |
Hara exposes the iterator boundary explicitly and also supports applying a transform lazily as (seq transform source); it does not require Clojure ISeq. |
rest |
rest |
Hara returns nil when no values remain; Clojure rest returns an empty sequence. |
partition |
partition |
Hara direct calls are lazy, while its one-argument transform is eager and returns a vector (or array for array input); Clojure's one-argument form is a transducer. |
partition-all |
partition-all |
Hara's one-argument form is an eager transform rather than a Clojure transducer. |
keys |
keys |
Hara returns its runtime-neutral lazy Seq rather than Clojure's JVM sequence implementation. |
vals |
vals |
Hara returns its runtime-neutral lazy Seq rather than Clojure's JVM sequence implementation. |
some |
any? |
Hara any? returns a boolean existential result; Clojure some returns the first truthy predicate result. |
empty? |
empty? |
Hara checks through the iterator protocol and may inspect a one-shot iterator; Clojure uses seq semantics. |
let |
let |
Hara evaluates initializers against the enclosing lexical environment in parallel; Clojure let bindings are sequential. |
defrecord |
defstruct |
Hara has no Clojure JVM record/class contract; portable immutable domain values use defstruct and protocols. |
eval |
eval |
Hara evaluates through its context-local language runtime and does not expose Clojure compiler/JVM eval semantics. |
Hara deliberately has no separate next. Its sequence model is
Option(NonEmptyLazySeq): both seq and rest return nil when no
non-empty cell exists, and every Seq has a first element. vec accepts that
nil result as an empty source, so (vec (rest [1])) is [].
same-renamed¶
| Clojure | Hara | Contract |
|---|---|---|
contains? |
has? |
Hara exposes collection membership as the public has? function. |
Hara public surface¶
| Kind | Count |
|---|---|
| Core functions and macros | 213 |
| Special forms | 33 |
| Protocols | 41 |
| Namespaced library functions | 96 |
only-clojure¶
*', *1, *2, *3, *agent*, *allow-unresolved-vars*, *assert*, *clojure-version*, *command-line-args*, *compile-files*, *compile-path*, *compiler-options*, *data-readers*, *default-data-reader-fn*, *e, *err*, *file*, *flush-on-newline*, *fn-loader*, *in*, *math-context*, *ns*, *out*, *print-dup*, *print-length*, *print-level*, *print-meta*, *print-namespace-maps*, *print-readably*, *read-eval*, *reader-resolver*, *repl*, *source-path*, *suppress-read*, *unchecked-math*, *use-context-classloader*, *verbose-defrecords*, *warn-on-reflection*, +', -', ->, ->>, ->ArrayChunk, ->Eduction, ->Vec, ->VecNode, ->VecSeq, -cache-protocol-fn, -reset-methods, .., ==, EMPTY-NODE, Inst, NaN?, PrintWriter-on, StackTraceElement->vec, Throwable->map, abs, accessor, aclone, add-classpath, add-tap, agent, agent-error, agent-errors, aget, alength, alias, all-ns, alter, alter-meta!, amap, ancestors, any?, areduce, array-map, as->, aset, aset-boolean, aset-byte, aset-char, aset-double, aset-float, aset-int, aset-long, aset-short, assert, assoc!, await, await-for, await1, bases, bean, biginteger, bit-and-not, bit-clear, bit-flip, bit-set, bit-test, boolean, boolean-array, booleans, bound-fn, bound-fn*, bound?, bounded-count, byte, byte-array, case, cast, cat, char, char-array, char-escape-string, char-name-string, chars, chunk, chunk-append, chunk-buffer, chunk-cons, chunk-first, chunk-next, chunk-rest, chunked-seq?, class, class?, clear-agent-errors, clojure-version, coll?, comment, commute, comparator, compile, completing, condp, conj!, construct-proxy, create-ns, create-struct, dec', dedupe, default-data-readers, definline, definterface, defonce, defstruct, deftype, delay, delay?, deliver, denominator, derive, descendants, destructure, disj, disj!, dissoc!, doall, dorun, doseq, dosync, dotimes, double-array, double?, doubles, eduction, ensure, ensure-reduced, enumeration-seq, error-handler, error-mode, every-pred, ex-cause, extend, extend-protocol, extenders, extends?, ffirst, file-seq, filterv, find-keyword, find-ns, find-protocol-impl, find-protocol-method, find-var, flatten, float, float-array, float?, floats, flush, fn?, fnext, fnil, for, force, format, future, future-call, future-cancel, future-cancelled?, future-done?, future?, gen-class, gen-interface, get-method, get-proxy-class, get-thread-bindings, get-validator, halt-when, hash, hash-combine, hash-map, hash-ordered-coll, hash-set, hash-unordered-coll, ident?, identical?, if-some, ifn?, import, inc', infinite?, init-proxy, inst-ms, inst-ms*, inst?, int, int-array, int?, intern, into-array, ints, io!, isa?, iteration, iterator-seq, keep-indexed, lazy-cat, lazy-seq, line-seq, list*, load, load-file, load-reader, loaded-libs, locking, long, long-array, longs, make-array, make-hierarchy, map-indexed, mapv, max-key, memfn, memoize, method-sig, methods, min-key, mix-collection-hash, monitor-enter, monitor-exit, munge, namespace-munge, nat-int?, neg-int?, newline, next, nfirst, nnext, not-any?, not-every?, ns-imports, ns-interns, ns-map, ns-refers, ns-resolve, ns-unalias, ns-unmap, nthnext, nthrest, num, numerator, object-array, parents, parse-boolean, parse-double, parse-long, parse-uuid, partitionv, partitionv-all, pcalls, persistent!, pmap, pop!, pop-thread-bindings, pos-int?, pr, prefer-method, prefers, primitives-classnames, print, print-ctor, print-dup, print-method, print-simple, print-str, printf, println, println-str, prn, prn-str, proxy, proxy-call-with-super, proxy-mappings, proxy-name, proxy-super, push-thread-bindings, pvalues, qualified-ident?, qualified-keyword?, qualified-symbol?, quot, rand, rand-int, rand-nth, random-sample, random-uuid, ratio?, rational?, rationalize, re-find, re-groups, re-matcher, re-matches, re-pattern, re-seq, read, read+string, read-line, read-string, reader-conditional, reader-conditional?, realized?, record?, reduced, reduced?, reductions, ref, ref-history-count, ref-max-history, ref-min-history, ref-set, refer-clojure, reify, release-pending-sends, rem, remove-all-methods, remove-method, remove-ns, remove-tap, replace, replicate, requiring-resolve, reset-meta!, reset-vals!, restart-agent, resultset-seq, reversible?, rseq, rsubseq, run!, satisfies?, send, send-off, send-via, seq-to-map-for-destructuring, seqable?, seque, sequence, set, set-agent-send-executor!, set-agent-send-off-executor!, set-error-handler!, set-error-mode!, set-validator!, short, short-array, shorts, shuffle, shutdown-agents, simple-ident?, simple-keyword?, simple-symbol?, slurp, some->, some->>, some-fn, some?, sorted-map, sorted-map-by, sorted-set, sorted-set-by, sorted?, spit, splitv-at, stream-into!, stream-reduce!, stream-seq!, stream-transduce!, struct, struct-map, subs, subseq, subvec, supers, swap-vals!, sync, tagged-literal, tagged-literal?, tap>, test, thread-bound?, time, to-array, to-array-2d, trampoline, transduce, transient, tree-seq, type, unchecked-add, unchecked-add-int, unchecked-byte, unchecked-char, unchecked-dec, unchecked-dec-int, unchecked-divide-int, unchecked-double, unchecked-float, unchecked-inc, unchecked-inc-int, unchecked-int, unchecked-long, unchecked-multiply, unchecked-multiply-int, unchecked-negate, unchecked-negate-int, unchecked-remainder-int, unchecked-short, unchecked-subtract, unchecked-subtract-int, underive, unquote, unquote-splicing, unreduced, unsigned-bit-shift-right, update-keys, update-proxy, update-vals, uri?, var-get, var-set, var?, vary-meta, vector, vector-of, volatile!, volatile?, vreset!, vswap!, when-first, when-some, while, with-bindings, with-bindings*, with-in-str, with-loading-context, with-local-vars, with-open, with-out-str, with-precision, with-redefs, with-redefs-fn, xml-seq
only-hara functions¶
F, NIL, T, U, Y, Z, array, array?, atom?, callable?, code-column, code-line, collection?, coroutine?, current-namespace, current-symbols, defproject, derefable?, ex-class, get-watches, iter, iter?, iterable?, iterator?, load-resource, macroexpand-all, map-keys, map-vals, object, object?, partition-pair, promise?, queue?, read-forms, regexp?, tuple?, var-sym, watchable?, zip
same-exact¶
*, +, -, /, <, <=, =, >, >=, add-watch, alter-var-root, and, apply, assoc, assoc-in, associative?, atom, bigdec, bigint, binding, bit-and, bit-not, bit-or, bit-shift-left, bit-shift-right, bit-xor, boolean?, butlast, bytes, bytes?, catch, char?, comp, compare, compare-and-set!, complement, concat, cond, cond->, cond->>, conj, cons, constantly, count, counted?, cycle, dec, decimal?, declare, def, defmacro, defmethod, defmulti, defn, defn-, defprotocol, deref, dissoc, distinct, distinct?, do, doto, double, drop, drop-last, drop-while, empty, even?, every?, ex-data, ex-info, ex-message, extend-type, false?, filter, finally, find, first, fn, frequencies, gensym, get, get-in, group-by, identity, if, if-let, if-not, in-ns, inc, indexed?, instance?, integer?, interleave, interpose, into, iterate, juxt, keep, key, keyword, keyword?, last, letfn, list, list?, load-string, loop, macroexpand, macroexpand-1, map-entry?, map?, mapcat, max, merge, merge-with, meta, min, mod, name, namespace, neg?, new, nil?, not, not-empty, not=, ns, ns-aliases, ns-name, ns-publics, nth, number?, odd?, or, partial, partition-by, peek, pop, pos?, pr-str, promise, quote, range, recur, reduce, reduce-kv, refer, remove, remove-watch, repeat, repeatedly, require, reset!, resolve, reverse, second, select-keys, seq?, sequential?, set!, set?, sort, sort-by, special-symbol?, split-at, split-with, str, string?, swap!, symbol, symbol?, take, take-last, take-nth, take-while, the-ns, throw, true?, try, update, update-in, use, uuid?, val, var, vec, vector?, when, when-let, when-not, with-meta, zero?, zipmap
Hara protocols¶
IApplicable, IAssoc, IComponent, IConj, ICons, IContext, ICount, IDeref, IDerefTimeout, IDisplay, IDissoc, IEmpty, IEquality, IExInfo, IFind, IFn, IHash, IIndexed, IIndexedKV, IInvokeIn, ILookup, INamespaced, INavigation, INth, IObjType, IPair, IPointer, IRealize, IReset, ISpace, IToMutable, IToPersistent, IWatch
Hara namespaced libraries¶
| Alias | Public functions |
|---|---|
str |
str/blank?, str/capitalize, str/char, str/char-at, str/comp, str/decapitalize, str/decode, str/decode-utf8, str/encode, str/encode-utf8, str/ends-with?, str/gt?, str/includes?, str/index-of, str/join, str/last-index-of, str/len, str/length, str/lower, str/lt?, str/pad-left, str/pad-right, str/repeat, str/replace, str/replace-first, str/reverse, str/slice, str/split, str/split-lines, str/starts-with?, str/substring, str/to-fixed, str/to-lower, str/to-upper, str/trim, str/trim-left, str/trim-right, str/upper |
bytes |
bytes/copy, bytes/count, bytes/get, bytes/s8, bytes/set, bytes/slice, bytes/u8 |
co |
co/await, co/close, co/coroutine?, co/create, co/resume, co/status, co/yield |
promise |
promise/all, promise/cancel, promise/catch, promise/delay, promise/finally, promise/from, promise/new, promise/state, promise/then, promise/value |
file |
file/delete, file/exists?, file/list, file/mkdir, file/read, file/resolve, file/write |
edn |
edn/pretty, edn/read, edn/write |
json |
json/pretty, json/read, json/write |
os |
os/arch, os/cwd, os/env, os/getenv, os/platform, os/process-alive?, os/process-close-input, os/process-kill, os/process-stderr, os/process-stdout, os/process-wait, os/process-write, os/process?, os/spawn |
socket |
socket/close, socket/connect, socket/send |
set |
set/difference, set/intersection, set/select, set/subset?, set/superset?, set/union |
pretty |
pretty/pprint-str |
| ## Runtime drift |
| Runtime | Missing canonical | Extra implementation |
|---|---|---|
| truffle | 0 | 0 |
| rust-native | 77 | 83 |
| wasm | 77 | 83 |
Parity and transport notes¶
The Java/Truffle and Rust runtimes share the same Foundation mapping contract.
Parity coverage includes odd?, update, and direct/curried/lazy mapping
semantics. If an older packaged runtime disagrees, rebuild it from the current
Foundation source: stale embedded artifacts are the usual cause.
HTA1 transports portable values only. It explicitly rejects Seq and raw
iterator values; materialize them with vec before sending them across an HTA
boundary. Internal iter-* helpers remain implementation-level cleanup work,
not the recommended public data-transport surface.