General fixes shaken out by running core.logic's test suite
Running clojure/core.logic's own suite surfaced a batch of general jolt gaps.
None are core.logic-specific; each is a language/host behavior that was wrong or
missing. With these, the core relational engine (unify, run/fresh/conde,
conso/membero/appendo, reification to _0/_1, lcons) runs; the remaining failures
are in core.logic's constraint-logic-programming and finite-domain layers
(tracked separately).
- analyzer: accept the list-member dot form (. target (method args)), sugar for
(. target method args). Re-mint.
- identical? is reference identity (eq?), not value equality. It was aliased to =,
which infinite-loops when a deftype's .equals short-circuits on (identical? this o)
(core.logic's Substitutions) and is wrong for distinct equal collections.
- jrecs use a deftype's declared hashCode/equals/equiv for map/set keying instead
of structural field comparison, so metadata-wrapped keys still match (core.logic
keys substitutions on lvar id, ignoring metadata).
- meta/with-meta dispatch to a deftype's clojure.lang.IObj meta/withMeta methods
when present, so metadata threaded through the type's own assoc/withMeta survives
(previously kept in an identity side-table the reconstructed instances didn't share).
- coll?/seqable? on a deftype require IPersistentCollection (cons) or ISeq (first);
ILookup(valAt)/Indexed(nth)/Counted(count)/Seqable(seq) alone no longer qualify,
matching the JVM.
- syntax-quote resolves a bare symbol to the compile ns's own def before
clojure.core, so a name the ns excluded and redefined (core.logic's == after
:refer-clojure :exclude) qualifies correctly in macro output.
- reader: record literals #ns.Type{...} / #ns.Type[...] expand to the map->/->
factory call.
- structmap API: defstruct/create-struct/struct-map/struct/accessor (map-backed,
insertion-ordered). Re-mint.
- .hashCode on strings/symbols (Java String.hashCode, Symbol Util.hashCombine);
Class.isInstance; java.util.Collection.contains over vector/list/set;
clojure.lang.RT/nextID and clojure.lang.Util hash/hasheq/equiv/identical statics.
corpus.edn: 8 JVM-certified rows. unit.edn: a Counted+Seqable deftype is coll?=false
(was a stale expectation encoding the old behavior).
This commit is contained in:
parent
af91dbbaa6
commit
9dbfd7e5c1
16 changed files with 748 additions and 577 deletions
|
|
@ -460,6 +460,25 @@
|
|||
;; is how libraries reach Clojure's base loader, e.g. aws-api's resources ns).
|
||||
(register-class-statics! "RT" (list (cons "baseLoader" (lambda () the-classloader))))
|
||||
(register-class-statics! "clojure.lang.RT" (list (cons "baseLoader" (lambda () the-classloader))))
|
||||
;; clojure.lang.RT/nextID — process-unique increasing id (AtomicInteger(1)
|
||||
;; getAndIncrement), used by id generators such as core.logic's lvar.
|
||||
(define rt-next-id-counter 1)
|
||||
(define (rt-next-id)
|
||||
(let ((v rt-next-id-counter))
|
||||
(set! rt-next-id-counter (+ rt-next-id-counter 1))
|
||||
v))
|
||||
(register-class-statics! "RT" (list (cons "nextID" rt-next-id)))
|
||||
(register-class-statics! "clojure.lang.RT" (list (cons "nextID" rt-next-id)))
|
||||
;; clojure.lang.Util — hash/equality helpers libraries call directly (core.logic's
|
||||
;; LCons.hashCode uses Util/hash). hash = Java hashCode (0 for nil); hasheq = the
|
||||
;; value hash jolt's = uses; equiv = value equality; identical = reference identity.
|
||||
(let ((util-statics
|
||||
(list (cons "hash" (lambda (x) (if (jolt-nil? x) 0 (record-method-dispatch x "hashCode" jolt-nil))))
|
||||
(cons "hasheq" (lambda (x) (jolt-hash x)))
|
||||
(cons "equiv" (lambda (a b) (if (jolt= a b) #t #f)))
|
||||
(cons "identical" (lambda (a b) (if (eq? a b) #t #f))))))
|
||||
(register-class-statics! "Util" util-statics)
|
||||
(register-class-statics! "clojure.lang.Util" util-statics))
|
||||
;; Thread/currentThread -> a fresh thread jhost wrapping THIS thread's interrupt
|
||||
;; flag (the box from current-interrupt-box, host-static.ss), so .interrupt from
|
||||
;; any thread sets the target thread's flag and .isInterrupted reads it without
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue