Clean up codebase: rename stdlib layer, strip porting residue, fix tooling
Rename src/jolt -> stdlib (the runtime-loaded layer; jolt-core stays the seed-baked layer) and update the loader / emit-image / doc paths. Drop dead code: the spike/ experiments, the duplicate clojuredocs-export.edn (json moves to tools/), the Janet-era jolt.http binding, and the orphaned persistent_vector.clj whose ns/path didn't even match. Strip porting residue from comments and docstrings across host/chez, jolt-core, stdlib, tests, and docs: internal issue ids, "Phase N" markers, and the "vs Janet" historical exposition, leaving present-tense descriptions and the real JVM-Clojure semantic contrasts. Same pass over the corpus suite labels. The seed is unchanged (docstrings/comments aren't emitted), so the self-host fixpoint and corpus are untouched. Port tools/spec_coverage.py off the dead janet probe to bin/joltc and regenerate coverage.md; drop the dead :host/janet rule from certify.clj and regenerate the conformance profile. Add docs/host-interop.md (the JVM shims and how to register your own host class from a library) and a writing-style note in CLAUDE.md. Stabilize the four racy concurrency corpus cases (future-cancel and agent send/send-off): give the future a sleeping body and the agent a slow action, so cancel reliably catches an in-flight future and deref reliably reads the pre-update snapshot. They certify deterministically now, so drop their :flaky allowlist entries and the orphaned legend.
This commit is contained in:
parent
c18f8087f0
commit
33eff7c7d8
112 changed files with 970 additions and 1621 deletions
35
stdlib/jolt/ffi.clj
Normal file
35
stdlib/jolt/ffi.clj
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
(ns jolt.ffi
|
||||
"Foreign-function interface for jolt libraries. A library loads a shared object
|
||||
and declares typed foreign functions, then exposes a Clojure API over them — no
|
||||
jolt built-in required.
|
||||
|
||||
(require '[jolt.ffi :as ffi])
|
||||
(ffi/load-library {:darwin \"libsqlite3.0.dylib\" :linux \"libsqlite3.so.0\"})
|
||||
(ffi/defcfn sqlite3-open \"sqlite3_open\" [:string :pointer] :int)
|
||||
(let [pp (ffi/alloc (ffi/sizeof :pointer))]
|
||||
(sqlite3-open \"x.db\" pp)
|
||||
(let [db (ffi/read pp :pointer)] ...)
|
||||
(ffi/free pp))
|
||||
|
||||
Types (keywords): :int :uint :long :ulong :int64 :uint64 :size_t :ssize_t
|
||||
:iptr :uptr :double :float :pointer :string :void :uint8 :char.
|
||||
|
||||
The memory/library primitives (alloc/free/read/write/sizeof/load-library/
|
||||
ptr->string/string->ptr/null/null?) are provided by the host. foreign-fn lowers
|
||||
a compile-time-typed signature to a real Chez foreign-procedure.")
|
||||
|
||||
;; foreign-fn binds C symbol `csym` to a typed callable. Expands to the __cfn
|
||||
;; special form (always fully-qualified, so an :as alias on jolt.ffi resolves):
|
||||
;; the analyzer/back end turn it into a Chez foreign-procedure.
|
||||
;; An optional trailing :blocking marks a call that may block (accept/recv/...),
|
||||
;; so it's emitted collect-safe and won't pin the garbage collector.
|
||||
(defmacro foreign-fn [csym argtypes rettype & [opt]]
|
||||
(if (= opt :blocking)
|
||||
(list 'jolt.ffi/__cfn csym argtypes rettype :blocking)
|
||||
(list 'jolt.ffi/__cfn csym argtypes rettype)))
|
||||
|
||||
;; (defcfn name "c_symbol" [argtypes] rettype [:blocking]) — def a foreign function.
|
||||
(defmacro defcfn [name csym argtypes rettype & [opt]]
|
||||
(list 'def name (if (= opt :blocking)
|
||||
(list 'jolt.ffi/__cfn csym argtypes rettype :blocking)
|
||||
(list 'jolt.ffi/__cfn csym argtypes rettype))))
|
||||
Loading…
Add table
Add a link
Reference in a new issue