~ chicken-core (chicken-5) a9aa473c1eca290cb353e56be10a86e38cac019f
commit a9aa473c1eca290cb353e56be10a86e38cac019f Author: Peter Bex <peter@more-magic.net> AuthorDate: Mon May 8 19:47:22 2017 +0200 Commit: Peter Bex <peter@more-magic.net> CommitDate: Mon May 8 19:47:22 2017 +0200 Update data representation with numerics and "weak pairs" diff --git a/manual/Data representation b/manual/Data representation index 129e7058..4a871a04 100644 --- a/manual/Data representation +++ b/manual/Data representation @@ -58,7 +58,7 @@ collection or internal data type dispatching. ; C_BYTEBLOCK_BIT : Flag that specifies whether this data object contains raw bytes (a string or blob) or pointers to other data objects. -; C_SPECIALBLOCK_BIT : Flag that specifies whether this object contains a ''special'' non-object pointer value in its first slot. An example for this kind of objects are closures, which are a vector-type object with the code-pointer as the first item. +; C_SPECIALBLOCK_BIT : Flag that specifies whether this object contains a ''special'' non-object pointer value in its first slot. An example for this kind of objects are closures, which are a vector-type object with the code-pointer as the first item. This is also used to turn a pair's car into a weak reference in the symbol table, to allow its symbol to be collected. ; C_8ALIGN_BIT : Flag that specifies whether the data area of this block should be aligned on an 8-byte boundary (floating-point numbers, for example). @@ -66,9 +66,14 @@ After these four bits comes a 4-bit type code representing one of the following '''vectors''': vector objects with type bits {{C_VECTOR_TYPE}}, currently 0000. -'''symbols''': vector objects with type bits {{C_SYMBOL_TYPE}}, currently 0001. The three slots -contain the toplevel variable value, the print-name (a string), and the property list -of the symbol. +'''symbols''': vector objects with type bits {{C_SYMBOL_TYPE}}, +currently 0001. The three slots contain the toplevel variable value, +the print-name (a string), and the property list of the symbol. When +manipulating these slots, the symbol table's container needs to be +manipulated as well, to control garbage collection of the symbol: if +the symbol is undefined and has no property list, the symbol table's +container should be a weak reference ({{C_WEAK_PAIR_TYPE}}), otherwise +it should be a strong reference ({{C_PAIR_TYPE}}). '''strings''': byte-vector objects with type bits {{C_STRING_TYPE}}, currently 0010. @@ -86,6 +91,15 @@ a flat closure representation is used). 64 bit architectures) contain a 64-bit floating-point number, in the representation used by the host system's C compiler. +'''bignums''': special vector objects with type bits +{{C_BIGNUM_TYPE}}, currently 0110. This contains only one slot, which +points to a bytevector that contains the number's limbs in a special +format: The first word contains a 1 if the number is negative, 0 if it +is positive. The remaining words form the bignum's limbs. A +bytevector is used because the limbs are stored in the raw machine +format, which would be invalid Scheme objects when viewed as slots in +a vector. + '''ports''': special vector objects with type bits {{C_PORT_TYPE}}, currently 0111. The first slot contains a pointer to a file- stream, if this is a file-pointer, or NULL if not. The other slots @@ -120,10 +134,18 @@ but the object contains an additional slot with a tag (an arbitrary data object) that identifies the type of the pointer. +'''ratnums''': vector-like objects with type-bits {{C_RATNUM_TYPE}}, +currently 1100. The first slot contains the numerator (which can be +positive or negative), the second slot contains the denominator, which +is always positive. These numbers are always simplified, so their gcd +will always be 1. + '''lambda infos''': byte-vector objects with type-bits {{C_LAMBDA_INFO_TYPE}}, currently 1101. -'''buckets''': vector objects with type-bits {{C_BUCKET_TYPE}}, currently 1111. These are -only used internally for the implementation of symbol tables. +'''cplxnums''': vector-like objects with type-bits {{C_CPLXNUM_TYPE}}, +currently 1110. The first slot contains the real part, the second slot +contains the imaginary part of the complex number. These two numbers +are of matching exactness: Either both are flonums or none are. The actual data follows immediately after the header. Note that block addresses are always aligned to the native machine-word @@ -137,7 +159,6 @@ objects), because this will confuse the garbage collector. For more information see the header file {{chicken.h}}. - --- Previous: [[Cross development]]Trap