luv

Workshop wiki

domains.lisp

domains/domains.lisp

system luv/domains · 13 definitions · on GitHub

Small protocols shared by finite-domain materializations.

in-package#:luv.domains
defgenericdomain-cardinality
domain
:documentation

Return the exact number of sites in finite domain.

This deliberately says nothing about coordinate or offset representation. Those mappings belong to concrete domain protocols and are added only when a client needs to traverse them.

defclassidentity-vocabulary-domain
members:readeridentity-vocabulary-members
offsets:reader%identity-vocabulary-offsets
revision:initform0:readeridentity-vocabulary-revision
limit:initarg:limit:initformnil:reader%identity-vocabulary-limit
:documentation

An append-only finite domain whose semantic members have EQ identity.

MEMBERS is the adjustable vector interpreting every dense offset. Appending a new identity increments REVISION without moving any old offset, so retained dense columns stay meaningful. Clients borrow MEMBERS rather than copying it; snapshots which cross an ownership boundary must freeze it explicitly.

defmethodinitialize-instance:after
let*
source
coercemembers'simple-vector
limit
%identity-vocabulary-limitdomain
vector
make-array
lengthsource
:adjustablet:fill-pointer
lengthsource
offsets
make-hash-table:test#'eq
when
andlimit
>
lengthsource
limit
error"Vocabulary starts with ~D members but its limit is ~D."
lengthsource
limit
loopformemberacrosssourceforoffsetfrom0do
multiple-value-bind
oldpresent-p
gethashmemberoffsets
whenpresent-p
error"Vocabulary member ~S occurs at offsets ~D and ~D."memberoldoffset
setf
arefvectoroffset
member
gethashmemberoffsets
offset
setf
slot-valuedomain'members
vector
slot-valuedomain'offsets
offsets
defunmake-identity-vocabulary-domain
&keymemberslimit

Return an append-only EQ vocabulary initially containing members.

make-instance'identity-vocabulary-domain:membersmembers:limitlimit
defmethoddomain-cardinality
length
identity-vocabulary-membersdomain
defunidentity-vocabulary-member
domainoffset

Return the semantic member interpreted by offset under domain.

let
members
identity-vocabulary-membersdomain
unless
and
integerpoffset
<=0offset
<offset
lengthmembers
error"Offset ~S is outside vocabulary ~S with cardinality ~D."offsetdomain
lengthmembers
arefmembersoffset
defunidentity-vocabulary-offset
domainmember&optional
intern-pt

Return member's stable dense offset, appending it when intern-p and new.

let
offsets
%identity-vocabulary-offsetsdomain
multiple-value-bind
offsetpresent-p
gethashmemberoffsets
cond
present-poffset
notintern-p
nil
t
let*
members
identity-vocabulary-membersdomain
next
lengthmembers
limit
%identity-vocabulary-limitdomain
when
andlimit
>=nextlimit
error"Vocabulary ~S cannot contain more than ~D members."domainlimit
vector-push-extendmembermembers
setf
gethashmemberoffsets
next
incf
slot-valuedomain'revision
next
defclasskeyword-vocabulary-domain
members:initarg:members:reader%keyword-vocabulary-members
offsets:initarg:offsets:readerkeyword-vocabulary-offsets
:documentation

An immutable finite domain whose semantic sites are keyword symbols.

The member vector is the explicit interpretation of every dense offset. A shape change creates another domain rather than changing what an existing offset means; persisted or borrowed indices therefore remain closed by the domain they travel with.

defunmake-keyword-vocabulary-domain
members

Return an immutable keyword domain preserving members' order exactly.

Duplicate or non-keyword members are rejected. The resulting mapping is appropriate for dense runtime columns and for explicit persisted vocabulary tables; the keyword is semantic identity and its offset is only meaningful under this domain.

let*
members
copy-seq
coercemembers'simple-vector
offsets
make-hash-table:test#'eq
loopforkeywordacrossmembersforoffsetfrom0do
unless
keywordpkeyword
error"Vocabulary member ~S at offset ~D is not a keyword."keywordoffset
multiple-value-bind
oldpresent-p
gethashkeywordoffsets
whenpresent-p
error"Vocabulary keyword ~S occurs at offsets ~D and ~D."keywordoldoffset
setf
gethashkeywordoffsets
offset
make-instance'keyword-vocabulary-domain:membersmembers:offsetsoffsets
defmethoddomain-cardinality
length
%keyword-vocabulary-membersdomain
defunkeyword-vocabulary-members
domain

Return a fresh vector containing domain's keywords in dense-offset order.

copy-seq
%keyword-vocabulary-membersdomain
defunkeyword-vocabulary-offset
domainkeyword&optional
error-pt

Return keyword's dense offset under domain.

When error-p is false, return NIL for a keyword outside the domain.

multiple-value-bind
offsetpresent-p
gethashkeyword
keyword-vocabulary-offsetsdomain
cond
present-poffset
error-p
error"Keyword ~S is not a member of domain ~S."keyworddomain
tnil
defunkeyword-vocabulary-keyword
domainoffset

Return the semantic keyword interpreted by offset under domain.

let
members
%keyword-vocabulary-membersdomain
unless
and
integerpoffset
<=0offset
<offset
lengthmembers
error"Offset ~S is outside domain ~S with cardinality ~D."offsetdomain
lengthmembers
arefmembersoffset