luv

Workshop wiki

declarations.lisp

arithmetic/declarations.lisp

system luv/arithmetic · 14 definitions · on GitHub

Backend-neutral declarations connect semantic quantity judgments to represented values without making the representation itself semantic.

in-package#:luv.arithmetic
defgenericdeclaration-representation-type
:documentation

Return declaration's backend or Common Lisp representation type, or NIL.

defgenericdeclaration-quantity-specification
:documentation

Return declaration's homogeneous quantity specification, or NIL.

defgenericdeclaration-quantity-layout
:documentation

Return declaration's heterogeneous quantity layout, or NIL.

defgenericdeclaration-source-form
:documentation

Return the source form which established declaration.

defgenericvalue-declaration-for
name
:documentation

Return the represented-value declaration published by global name, or NIL.

defmethodvalue-declaration-for
name
declare
ignorename
nil
define-conditiondeclaration-compatibility-error
error
actual:initarg:actual:readerdeclaration-compatibility-error-actual
expected:initarg:expected:readerdeclaration-compatibility-error-expected
reason:initarg:reason:readerdeclaration-compatibility-error-reason
:report
lambda
conditionstream
formatstream"Declaration ~S is incompatible with ~S: ~A."
declaration-source-form
declaration-compatibility-error-actualcondition
declaration-source-form
declaration-compatibility-error-expectedcondition
declaration-compatibility-error-reasoncondition
defclassrepresented-value-declaration
representation-type:initarg:representation-type:initformnil:readerdeclaration-representation-type
quantity-specification:initarg:quantity-specification:initformnil:readerdeclaration-quantity-specification
quantity-layout:initarg:quantity-layout:initformnil:readerdeclaration-quantity-layout
source-form:initarg:source-form:initformnil:readerdeclaration-source-form
:documentation

One represented value's machine form and optional semantic meaning.

The representation type and quantity judgment are deliberately parallel: two declarations may both use vec3 while denoting different quantities, and one quantity may acquire different representations in different backends. #OXBSAY

defmethodinitialize-instance:after
let
unless
or
nullspecification
typepspecification'quantity-specification
error"A represented value needs a quantity specification, not ~S."specification
unless
error"A represented value needs a quantity layout, not ~S."layout
defunmake-represented-value-declaration
&keyrepresentation-typequantity-specificationquantity-layoutsource-form

Describe one represented value without wrapping any runtime occurrence.

make-instance'represented-value-declaration:representation-typerepresentation-type:quantity-specificationquantity-specification:quantity-layoutquantity-layout:source-formsource-form
defunensure-declarations-compatible
actualexpected

Require actual storage to satisfy expected represented-value meaning.

Quantity specifications and layouts agree exactly. A NIL expected representation leaves representation choice open; otherwise actual's Common Lisp type must be a known subtype. Return actual on success. #GZ53LD

flet
fail
reason
error'declaration-compatibility-error:actualactual:expectedexpected:reasonreason
let
whenexpected-type
unlessactual-type
fail:missing-representation-type
multiple-value-bind
subtype-pknown-p
subtypepactual-typeexpected-type
unless
andknown-psubtype-p
fail:incompatible-representation-types
let
actual-specification
expected-specification
unless
or
and
nullactual-specification
nullexpected-specification
andactual-specificationexpected-specification
quantity-specification=actual-specificationexpected-specification
fail:incompatible-quantity-specifications
let
actual-layout
expected-layout
unless
or
and
nullactual-layout
nullexpected-layout
andactual-layoutexpected-layout
quantity-layout=actual-layoutexpected-layout
fail:incompatible-quantity-layouts
actual
defunmake-declared-quantity-specification
options&key
default-tensor-order0

Parse one source declaration plist into a quantity specification.

Return NIL when options contains no quantity attributes. This is the common source seam used by arithmetic parameters, shader interfaces, and semantic storage declarations; callers retain ownership of their source-specific error conditions and representation-derived tensor defaults.

destructuring-bind
&key
quantitynilquantity-supplied-p
dimensionnildimension-supplied-p
unitnilunit-supplied-p
tensor-orderdefault-tensor-ordertensor-order-supplied-p
affine-pnilaffine-p-supplied-p
characternilcharacter-supplied-p
options
when
orquantity-supplied-pdimension-supplied-punit-supplied-ptensor-order-supplied-paffine-p-supplied-pcharacter-supplied-p
apply#'make-quantity-specificationquantity
append
anddimension-supplied-p
list:dimensiondimension
list:unitunit:tensor-ordertensor-order
andaffine-p-supplied-p
list:affine-paffine-p
andcharacter-supplied-p
list:charactercharacter
defmacrodefine-quantity-constant

Define an ordinary constant which publishes its represented quantity.

The runtime value remains the unwrapped result of value. type states its Common Lisp representation independently of quantity's semantic declaration; value-declaration-for retrieves the latter at definition boundaries.

unless
and
symbolpname
typequantity
error"DEFINE-QUANTITY-CONSTANT needs a name, :TYPE, and :QUANTITY: ~S"name
let
source-form`
define-quantity-constant,name,value:type,type:quantity,quantity,@
whendocumentation`
:documentation,documentation
query-name
gensym"NAME"
`
progn
declaim
type,type,name
defconstant,name,value,@
defmethodvalue-declaration-for
,query-name
eql',name
declare
ignore,query-name
load-time-value
make-represented-value-declaration:representation-type',type:quantity-specification:source-form',source-form
',name