open-axiom repository from github
\documentclass{article}
\usepackage{open-axiom}
\author{Gabriel Dos~Reis}
\begin{document}
\begin{abstract}
\end{abstract}
\tableofcontents
\eject
\section{The Byte domain}
<<domain BYTE Byte>>=
import NonNegativeInteger
import OutputForm
)abbrev domain BYTE Byte
++ Author: Gabriel Dos Reis
++ Date Created: April 19, 2008
++ Date Last Updated: July 18, 2010
++ Basic Operations: byte, bitand, bitor, bitxor
++ Related Constructor: NonNegativeInteger
++ Description:
++ Byte is the datatype of 8-bit sized unsigned integer values.
Byte(): Public == Private where
Public == Join(OrderedFinite,Logic) with
byte: NonNegativeInteger -> %
++ byte(x) injects the unsigned integer value `v' into
++ the Byte algebra. `v' must be non-negative and less than 256.
bitand: (%,%) -> %
++ bitand(x,y) returns the bitwise `and' of `x' and `y'.
bitior: (%,%) -> %
++ bitor(x,y) returns the bitwise `inclusive or' of `x' and `y'.
sample: %
++ \spad{sample} gives a sample datum of type Byte.
Private == SubDomain(NonNegativeInteger, #1 < 256) add
import %icst0: % from Foreign Builtin
import %beq: (%,%) -> Boolean from Foreign Builtin
import %blt: (%,%) -> Boolean from Foreign Builtin
import %bgt: (%,%) -> Boolean from Foreign Builtin
import %ble: (%,%) -> Boolean from Foreign Builtin
import %bge: (%,%) -> Boolean from Foreign Builtin
import %bitand: (%,%) -> % from Foreign Builtin
import %bitior: (%,%) -> % from Foreign Builtin
import %bcompl: % -> % from Foreign Builtin
byte(x: NonNegativeInteger): % == per x
sample == %icst0
x = y == %beq(x,y)
x < y == %blt(x,y)
x > y == %bgt(x,y)
x <= y == %ble(x,y)
x >= y == %bge(x,y)
min() == %icst0
max() == per 255
size() == 256
index n == byte((n - 1) pretend NonNegativeInteger)
lookup x == (rep x + 1) pretend PositiveInteger
random() == byte random(size())$NonNegativeInteger
bitand(x,y) == %bitand(x,y)
bitior(x,y) == %bitior(x,y)
x /\ y == bitand(x,y)
x \/ y == bitior(x,y)
~ x == %bcompl x
@
<<domain BYTEORD ByteOrder>>=
)abbrev domain BYTEORD ByteOrder
++ Author: Gabriel Dos Reis
++ Date Created: February 06, 2009
++ Date Last Modified:
++ Description:
++ This datatype describes byte order of machine values stored memory.
ByteOrder(): Public == Private where
Public == SetCategory with
littleEndian: % ++ \spad{littleEndian} describes little endian host
bigEndian: % ++ \spad{bigEndian} describes big endian host
unknownEndian: % ++ \spad{unknownEndian} for none of the above.
Private == add
unknownEndian == %unknownEndian$Foreign(Builtin)
littleEndian == %littleEndian$Foreign(Builtin)
bigEndian == %bigEndian$Foreign(Builtin)
x = y == %peq(x,y)$Foreign(Builtin)
coerce(x: %): OutputForm ==
outputForm
x = littleEndian => 'litteEndian
x = bigEndian => 'bigEndian
'unknownEndian
@
\section{Sized System Integer datatypes}
<<domain SYSINT SystemInteger>>=
)abbrev domain SYSINT SystemInteger
++ Author: Gabriel Dos Reis
++ Date Created: December 26, 2008
++ Date Last Modified: December 27, 2008
++ Description:
++ This domain implements sized (signed) integer datatypes parameterized
++ by the precision (or width) of the underlying representation.
++ The intent is that they map directly to the hosting hardware
++ natural integer datatypes. Consequently, natural values for
++ N are: 8, 16, 32, 64, etc. These datatypes are mostly useful
++ for system programming tasks, i.e. interfacting with the hosting
++ operating system, reading/writing external binary format files.
SystemInteger(N: PositiveInteger): Public == Private where
Public == OrderedFinite with
sample: % ++ \spad{sample} gives a sample datum of this type.
Private == SubDomain(Integer, length #1 <= N) add
import %icst0: % from Foreign Builtin
sample == %icst0
min: % == per(-shift(1,N-1))
max: % == per(shift(1,N-1)-1)
size() == (rep max - rep min + 1)::NonNegativeInteger
index i == per (i + rep min - 1)
lookup x == (rep x - rep min + 1)::PositiveInteger
random() == per random(rep max)$Integer
@
<<domain INT8 Int8>>=
)abbrev domain INT8 Int8
++ Author: Gabriel Dos Reis
++ Date Created: January 6, 2009
++ Date Last Modified: January 6, 2009
++ Description:
++ This domain is a datatype for (signed) integer values
++ of precision 8 bits.
Int8() == SystemInteger 8
@
<<domain INT16 Int16>>=
)abbrev domain INT16 Int16
++ Author: Gabriel Dos Reis
++ Date Created: January 6, 2009
++ Date Last Modified: January 6, 2009
++ Description:
++ This domain is a datatype for (signed) integer values
++ of precision 16 bits.
Int16() == SystemInteger 16
@
<<domain INT32 Int32>>=
)abbrev domain INT32 Int32
++ Author: Gabriel Dos Reis
++ Date Created: January 6, 2009
++ Date Last Modified: January 6, 2009
++ Description:
++ This domain is a datatype for (signed) integer values
++ of precision 32 bits.
Int32() == SystemInteger 32
@
<<domain INT64 Int64>>=
)abbrev domain INT64 Int64
++ Author: Gabriel Dos Reis
++ Date Created: March 25, 2009
++ Date Last Modified: March 25, 2009
++ Description:
++ This domain is a datatype for (signed) integer values
++ of precision 64 bits.
Int64() == SystemInteger 64
@
<<domain SYSNNI SystemNonNegativeInteger>>=
)abbrev domain SYSNNI SystemNonNegativeInteger
++ Author: Gabriel Dos Reis
++ Date Created: December 26, 2008
++ Date Last Modified: December 27, 2008
++ Description:
++ This domain implements sized (unsigned) integer datatypes
++ parameterized by the precision (or width) of the underlying
++ representation. The intent is that they map directly to the
++ hosting hardware natural integer datatypes. Consequently,
++ natural values for N are: 8, 16, 32, 64, etc. These datatypes
++ are mostly useful for system programming tasks, i.e. interfacting
++ with the hosting operating system, reading/writing external
++ binary format files.
SystemNonNegativeInteger(N: PositiveInteger): Public == Private where
Public == Join(OrderedFinite,Logic) with
bitand: (%,%) -> %
++ bitand(x,y) returns the bitwise `and' of `x' and `y'.
bitior: (%,%) -> %
++ bitior(x,y) returns the bitwise `inclusive or' of `x' and `y'.
sample: %
++ \spad{sample} gives a sample datum of type Byte.
Private == SubDomain(NonNegativeInteger, length #1 <= N) add
import %icst0: % from Foreign Builtin
import %bitand: (%,%) -> % from Foreign Builtin
import %bitior: (%,%) -> % from Foreign Builtin
import %bitnot: % -> % from Foreign Builtin
min: % == %icst0
max: % == per((shift(1,N)-1) : NonNegativeInteger)
sample == min
bitand(x,y) == %bitand(x,y)
bitior(x,y) == %bitior(x,y)
x /\ y == bitand(x,y)
x \/ y == bitior(x,y)
~ x == per((shift(1,N) + rep %bitnot x) : NonNegativeInteger)
@
<<domain UINT8 UInt8>>=
)abbrev domain UINT8 UInt8
++ Author: Gabriel Dos Reis
++ Date Created: January 6, 2009
++ Date Last Modified: January 6, 2009
++ Description:
++ This domain is a datatype for (unsigned) integer values
++ of precision 8 bits.
UInt8() == SystemNonNegativeInteger 8
@
<<domain UINT16 UInt16>>=
)abbrev domain UINT16 UInt16
++ Author: Gabriel Dos Reis
++ Date Created: January 6, 2009
++ Date Last Modified: January 6, 2009
++ Description:
++ This domain is a datatype for (unsigned) integer values
++ of precision 16 bits.
UInt16() == SystemNonNegativeInteger 16
@
<<domain UINT32 UInt32>>=
)abbrev domain UINT32 UInt32
++ Author: Gabriel Dos Reis
++ Date Created: January 6, 2009
++ Date Last Modified: January 6, 2009
++ Description:
++ This domain is a datatype for (unsigned) integer values
++ of precision 32 bits.
UInt32() == SystemNonNegativeInteger 32
@
<<domain UINT64 UInt64>>=
)abbrev domain UINT64 UInt64
++ Author: Gabriel Dos Reis
++ Date Created: March 25, 2009
++ Date Last Modified: March 25, 2009
++ Description:
++ This domain is a datatype for (unsigned) integer values
++ of precision 64 bits.
UInt64() == SystemNonNegativeInteger 64
@
\section{System-level Pointer Datatype.}
<<domain SYSPTR SystemPointer>>=
)abbrev domain SYSPTR SystemPointer
++ Author: Gabriel Dos Reis
++ Date Created: September 8, 2009
++ Date Last Modified: September 8, 2009
++ Description:
++ This domain is a datatype system-level pointer values.
SystemPointer(): SetCategory
== add
import %sptreq: (%,%) -> Boolean from Foreign Builtin
x = y == %sptreq(x,y)
coerce(x:%): OutputForm ==
FORMAT(NIL$Foreign(Builtin),"~A",x)$Foreign(Builtin)
@
\section{The ByteBuffer domain}
<<domain BYTEBUF ByteBuffer>>=
import Byte
)abbrev domain BYTEBUF ByteBuffer
++ Author: Gabriel Dos Reis
++ Date Created: April 19, 2008
++ Date Last Modified: February 15, 2009
++ Related Constructor:
++ Description:
++ ByteBuffer provides datatype for buffers of bytes. This domain
++ differs from PrimitiveArray Byte in that it is not as rigid
++ as PrimitiveArray Byte. That is, the typical use of
++ ByteBuffer is to pre-allocate a vector of Byte of some capacity
++ `n'. The array can then store up to `n' bytes. The actual
++ interesting bytes count (the length of the buffer) is therefore
++ different from the capacity. The length is no more than the
++ capacity, but it can be set dynamically as needed. This
++ functionality is used for example when reading bytes from
++ input/output devices where we use buffers to transfer data in and
++ out of the system.
++ Note: a value of type ByteBuffer is 0-based indexed, as opposed
++ Vector, but not unlike PrimitiveArray Byte.
ByteBuffer(): Public == Private where
macro NNI == NonNegativeInteger
Public == Join(OneDimensionalArrayAggregate Byte,_
CoercibleTo PrimitiveArray Byte,CoercibleTo String) with
byteBuffer: NNI -> %
++ byteBuffer(n) creates a buffer of capacity n, and length 0.
capacity: % -> NNI
++ capacity(buf) returns the pre-allocated maximum size of `buf'.
setLength!: (%,NNI) -> NNI
++ setLength!(buf,n) sets the number of active bytes in the
++ `buf'. Error if `n' is more than the capacity.
Private == add
import %bytevec2str: PrimitiveArray Byte -> String
from Foreign Builtin
-- A buffer object is a pair of a simple array, and the count
-- of active number in the array. Note that we cannot use
-- Lisp-level fill pointers because that would not guarantee that
-- the implementation uses a simple representation, therefore
-- complicating FFI interface.
Rep == Record(ary: PrimitiveArray Byte, sz: NNI)
makeByteBuffer(n: NNI): % ==
per [makeByteBuffer(n)$Foreign(Builtin),n]$Rep
byteBuffer n == makeByteBuffer n
empty() == byteBuffer 0
new(n,b) == per [makeByteBuffer(n,b)$Foreign(Builtin),n]$Rep
# buf == rep(buf).sz
capacity buf == # rep(buf).ary
qelt(buf,i) == qelt(rep(buf).ary,i)$PrimitiveArray(Byte)
elt(buf: %,i: Integer) ==
i >= # buf => error "index out of range"
qelt(buf,i)
qsetelt!(buf,i,b) ==
qsetelt!(rep(buf).ary,i,b)$PrimitiveArray(Byte)
setelt(buf: %,i: Integer, b: Byte) ==
i >= # buf => error "index out of range"
qsetelt!(rep(buf).ary,i,b)
minIndex buf == 0
maxIndex buf == (# buf)::Integer - 1
x = y == rep x = rep y
setLength!(buf,n) ==
n > capacity buf =>
error "attempt to set length higher than capacity"
rep(buf).sz := n
coerce(buf: %): PrimitiveArray Byte ==
rep(buf).ary
coerce(buf: %): String ==
%bytevec2str rep(buf).ary
construct l ==
buf := makeByteBuffer(#l)
for b in l for i in 0.. repeat
buf.i := b
buf
concat(x: %, y:%) ==
nx := #x
ny := #y
buf := makeByteBuffer(nx + ny)
for i in 0..(nx - 1) repeat
buf.i := x.i
for i in 0..(ny - 1) repeat
buf.(nx + i) := y.i
buf
@
\section{The DataArray domain}
<<domain DATAARY DataArray>>=
)abbrev domain DATAARY DataArray
++ Author: Gabriel Dos Reis
++ Date Created: August 23, 2008
++ Description:
++ This domain provides for a fixed-sized homogeneous data buffer.
DataArray(N: PositiveInteger, T: SetCategory): Public == Private where
Public == SetCategory with
new: () -> %
++ new() returns a fresly allocated data buffer or length N.
qelt: (%,NonNegativeInteger) -> T
++ elt(b,i) returns the ith element in buffer `b'. Indexing
++ is 0-based.
qsetelt: (%,NonNegativeInteger,T) -> T
++ setelt(b,i,x) sets the ith entry of data buffer `b' to `x'.
++ Indexing is 0-based.
Private == add
import %equal: (%,%) -> Boolean from Foreign Builtin
new() ==
makeSimpleArray(getVMType(T)$Foreign(Builtin),N)$Foreign(Builtin)
qelt(b,i) ==
getSimpleArrayEntry(b,i)$Foreign(Builtin)
qsetelt(b,i,x) ==
setSimpleArrayEntry(b,i,x)$Foreign(Builtin)
x = y ==
%equal(x,y)
coerce(b: %): OutputForm ==
bracket([qelt(b,i)::OutputForm for i in 0..(N-1)])
@
\section{License}
<<license>>=
--Copyright (C) 2007-2016, Gabriel Dos Reis.
--All rights reserved.
--
--Redistribution and use in source and binary forms, with or without
--modification, are permitted provided that the following conditions are
--met:
--
-- - Redistributions of source code must retain the above copyright
-- notice, this list of conditions and the following disclaimer.
--
-- - Redistributions in binary form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in
-- the documentation and/or other materials provided with the
-- distribution.
--
-- - Neither the name of The Numerical Algorithms Group Ltd. nor the
-- names of its contributors may be used to endorse or promote products
-- derived from this software without specific prior written permission.
--
--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@
<<*>>=
<<license>>
<<domain BYTE Byte>>
<<domain BYTEORD ByteOrder>>
<<domain SYSINT SystemInteger>>
<<domain INT8 Int8>>
<<domain INT16 Int16>>
<<domain INT32 Int32>>
<<domain INT64 Int64>>
<<domain SYSNNI SystemNonNegativeInteger>>
<<domain UINT8 UInt8>>
<<domain UINT16 UInt16>>
<<domain UINT32 UInt32>>
<<domain UINT64 UInt64>>
<<domain SYSPTR SystemPointer>>
<<domain BYTEBUF ByteBuffer>>
<<domain DATAARY DataArray>>
@
\end{document}