For version 0.7.0.
To top.

Core types


This part of the documentation is a somewhat arbitrary description of the core types in the language a user should be aware of. The reason for having such a sloppy characterization of what is presented here, is that as long as Shapes is dynamically typed, it is not that important to know exactly what type an object has. It also becomes a rather arbitrary language design decision when the language should reflect a subdivision into subtypes in the compiler. For instance, the language end type §Drawable certainly has many different types representing it in the compiler.
Below, an alphabetical list of links to bindings is provided. For a grouping of the bindings by cathegory, the readers is referred to the the chapter on system bindings in the main language reference.
Sections:    Special types    Simple types    Elementary tuple types    Points and paths    Graphics in 2d    Functions and function-like things    Container types    Graphs    Text    Other    Graphics in 3d and lightening    Composite

Alphabetical list
§Alpha    §Array    §ArrowHead    §ArrowHead3D    §Backtrace    §Boolean    §CapStyle    §Character    §Class    §ColorSpace    §ConsPair    §Coords    §Coords3D    §CornerCoords    §DEdge    §DMultiEdge    §Dash    §Drawable    §DynamicBindings    §Edge    §EdgeData    §Exception    §Float    §FloatPair    §FloatTriple    §Font    §Function    §Graph    §GraphKey    §Integer    §JoinStyle    §KernedText    §Length    §LengthLike    §MultiEdge    §MultiPath    §MultiPath3D    §Node    §NodeData    §Object    §Offset    §Path    §Path3D    §PathPoint    §PathPoint3D    §PathSlider    §PathSlider3D    §RandomSeed    §RasterImage    §Seq    §SeqNil    §SeqPair    §Span    §String    §Structure    §Symbol    §TextOperation    §TextRenderingMode    §Transform    §Transform3D    §UEdge    §UMultiEdge    §Walk   

Special types

The classes in this section are the foundation of the type hierarchy in Shapes. You can do quite a lot in Shapes without knowing about these types, but they become central as soon as you want to deal with the types of values.
§Class    §Object   
§Object
Abstraction:
Every other type in Shapes is a subtype of §Object.
Construction
Fields
A value of type §Object has no fields.
Description
It is impossible to create values of type §Object, but the type is useful as the “any type”.
Note that it is by intention that §Object has no fields, to avoid name clashes with derived types. Instead, core functions such as ..Shapes..typeof are used to access properties of any value.
See also:..Shapes..typeof ..Shapes..Data..nil?
§Class
Abstraction:
The type of types.
Construction
See also:  ..Shapes..typeof
Fields
FieldTypeDescription

name§String
A short textual description of the type, useful for debugging purposes.
Description
The §Class objects are the runtime representation of types in Shapes.
At the time of writing Shapes does not really have a type hierarchy, so there is no way support for checking the subtype relationship (the only non-trivial such relation is that between any type and §Object, which never has to be tested anyway). This will change in the future.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§Class=§Class§Boolean Same type test.
§Class≠ or /=§Class§Boolean Not same type test.

Simple types

Values that are naturally characterized by a single scalar are considered to have simple types. These types generally have no fields.
§Boolean    §Character    §Float    §Integer    §Length    §LengthLike    §Offset    §String    §Symbol   
§Float
Abstraction:
A scalar; a quantity without physical dimension.
Construction
Syntax:  float
Fields
A value of type §Float has no fields.
Involved operators
A large number of types may be scaled by floats, which makes the list of operators very long for floats. Since dividing by a float is expected to mean the same as multiplying by the multiplicative inverse of the float, the list gets even longer.

Unary prefix operators
OperatorTypeResultDescription

~§Float§Float Negation.

Binary operators
TypeOperatorTypeResultDescription

§Float--§Float§Float Pythagoream subtraction. Both terms must be non-negative, and second term must not be larger than the first.
§Float++§Float§Float Pythagoream addition.
§Float+§Float§Float Addition.
§Float-§Float§Float Subtraction.
§Float∠ or /_§Float§Float In presence of a zero arguent, the result is π/2. The result is zero if signs are equal, otherwise the result is π.
§Float*§Float§Float Multiplication.
§Float/§Float§Float Division.
§Float<§Float§Boolean Less than comparison.
§Float>§Float§Boolean Greater than comparison.
§Float=§Float§Boolean Equality test.
§Float≠ or /=§Float§Boolean Inequality test.
§Float≤ or <=§Float§Boolean Test less than or equal.
§Float≥ or >=§Float§Boolean Test greater than or equal.
§Float∠ or /_§Length§Float In presence of a zero arguent, the result is π/2. The result is zero if signs are equal, otherwise the result is π.
§Float*§FloatPair§FloatPair Vector-scalar multiplication.
§Float*§FloatTriple§FloatTriple Vector-scalar multiplication.
§Float*§Length§Length Multiplication.
§Float*§Coords§Coords Vector-scalar multiplication.
§Float*§Coords3D§Coords3D Vector-scalar multiplication.
§Float*§Dash§Dash Scale.
§Float*§RGB§RGB Scale components.
§Float*§Gray§Gray Scale components.
§Float*§SpecularReflection§SpecularReflection Scale weight.
§Float*§Integer§Float Multiplication.
§Float/§Integer§Float Division.
§PathSlider+§Float§PathSlider Move spline time.
§PathSlider3D+§Float§PathSlider3D Move spline time.
§PathSlider-§Float§PathSlider Reverse move spline time.
§PathSlider3D-§Float§PathSlider3D Reverse move spline time.
§Length∠ or /_§Float§Float In presence of a zero arguent, the result is π/2. The result is zero if signs are equal, otherwise the result is π.
§FloatPair*§Float§FloatPair Vector-scalar multiplication.
§FloatTriple*§Float§FloatTriple Vector-scalar multiplication.
§Length*§Float§Length Multiplication.
§Coords*§Float§Coords Vector-scalar multiplication.
§Coords3D*§Float§Coords3D Vector-scalar multiplication.
§Dash*§Float§Dash Scale.
§RGB*§Float§RGB Scale components.
§Gray*§Float§Gray Scale components.
§SpecularReflection*§Float§SpecularReflection Scale weight.
§Integer*§Float§Float Multiplication.
§Length/§Float§Length Division.
§FloatPair/§Float§FloatPair Division by scalar.
§Coords/§Float§Coords Division by scalar.
§FloatTriple/§Float§FloatTriple Division by scalar.
§Coords3D/§Float§Coords3D Division by scalar.

§Boolean
Abstraction:
A truth value.
Construction
Syntax:  boolean
Fields
A value of type §Boolean has no fields.
Involved operators

Unary prefix operators
OperatorTypeResultDescription

not or ¬§Boolean§Boolean Negation.

Binary operators
TypeOperatorTypeResultDescription

§Boolean∧ or and§Boolean§Boolean Conjunction.
§Boolean∨ or or§Boolean§Boolean Disjunction.
§Boolean⊻ or xor§Boolean§Boolean Exclusive or.

§Integer
Abstraction:
An integer number.
Construction
Syntax:  integer
See also:  ..Shapes..Geometry..duration
Fields
FieldTypeDescription

hex§String
Hexadecimal representation. Negative values are represented as the absolute value prefixed by the character ~ (tilde). See also bits_hex.
dec§String
Similar to hex, but using decimal representation.
oct§String
Similar to hex, but using octal representation.
bin§String
Similar to hex, but using octal representation. See also bits_bin.
bits_bin§String
Bit pattern, with bits in decreasing order of significance, and using the two's complement to represent negative values. See also bin.
bits_hex§String
Similar to bits_bin, but the bit pattern is expressed compactly by writing each group of four bits as one hexadecimal value. See also hex.
Involved operators

Unary prefix operators
OperatorTypeResultDescription

~§Integer§Integer Negation.

Binary operators
TypeOperatorTypeResultDescription

§Integer+§Integer§Integer Addition.
§Integer-§Integer§Integer Subtraction.
§Integer*§Integer§Integer Multiplication.
§Integer/§Integer§Integer Integer division.
§Integer<§Integer§Boolean Less than comparison.
§Integer>§Integer§Boolean Greater than comparison.
§Integer=§Integer§Boolean Equality test.
§Integer≠ or /=§Integer§Boolean Inequality test.
§Integer≤ or <=§Integer§Boolean Test less than or equal.
§Integer≥ or >=§Integer§Boolean Test greater than or equal.
§Integer*§Float§Float Multiplication.
§Integer*§Length§Length Multiplication.
§Float*§Integer§Float Multiplication.
§Length*§Integer§Length Multiplication.
§Float/§Integer§Float Division.
§Length/§Integer§Length Division.

§Length
Abstraction:
The §Length type represents a physical length. Lengths are often specified as a scalar times a unit of length.
Construction
Syntax:  length
Fields
A value of type §Length has no fields.
Involved operators

Unary prefix operators
OperatorTypeResultDescription

~§Length§Length Negation.
+§Length§Offset Note: Requires enclosing parantheses! Constructs a relative length.

Binary operators
TypeOperatorTypeResultDescription

§Length--§Length§Length Pythagoream subtraction. Both terms must be non-negative, and second term must not be larger than the first.
§Length++§Length§Length Pythagoream addition.
§Length+§Length§Length Addition.
§Length-§Length§Length Subtraction.
§Length∠ or /_§Length§Float In presence of a zero arguent, the result is π/2. The result is zero if signs are equal, otherwise the result is π.
§Length/§Length§Float Ratio.
§Length<§Length§Boolean Less than comparison (with signed lengths).
§Length>§Length§Boolean Greater than comparison (with signed lengths).
§Length=§Length§Boolean Equality test.
§Length≠ or /=§Length§Boolean Inequality test.
§Length≤ or <=§Length§Boolean Test less than or equal.
§Length≥ or >=§Length§Boolean Test greater than or equal.
§Length+§Dash§Dash Shift.
§Length∠ or /_§Float§Float In presence of a zero arguent, the result is π/2. The result is zero if signs are equal, otherwise the result is π.
§Length*§Float§Length Multiplication.
§Length*§FloatPair§Coords Scale direction by length.
§Length*§FloatTriple§Coords3D Scale direction by length.
§Length*§Integer§Length Multiplication.
§Length/§Float§Length Division.
§Length/§Integer§Length Division.
§Dash+§Length§Dash Shift.
§PathSlider+§Length§PathSlider Move distance.
§PathSlider3D+§Length§PathSlider3D Move distance.
§PathSlider-§Length§PathSlider Reverse move distance.
§PathSlider3D-§Length§PathSlider3D Reverse move distance.
§Float∠ or /_§Length§Float In presence of a zero arguent, the result is π/2. The result is zero if signs are equal, otherwise the result is π.
§Float*§Length§Length Multiplication.
§FloatPair*§Length§Coords Scale direction by length.
§FloatTriple*§Length§Coords3D Scale direction by length.
§Integer*§Length§Length Multiplication.
§Coords/§Length§FloatPair Directional ratio.
§Coords3D/§Length§FloatTriple Directional ratio.

§Offset
Abstraction:
The §Offset type represents a coordinate which is to be interpreted relative a local coordinate frame. The values are sometimes referred to as relative lengths, since they specify a length relative to something else.
Construction
Operators:  ( + §Length )
Fields
A value of type §Offset has no fields.
§LengthLike
Abstraction:
The §LengthLike type is something which can be used as a coordinate. It is either an ordinary §Length, or an §Offset.
Construction
Fields
A value of type §LengthLike has no fields.
§Symbol
Abstraction:
A value defined by its name; the value analogue of identifiers in the source.
Construction
Syntax:  symbol
Fields
A value of type §Symbol has no fields.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§Symbol<§Symbol§Boolean Order predicate.
§Symbol>§Symbol§Boolean Order predicate.
§Symbol=§Symbol§Boolean Equality test.
§Symbol≠ or /=§Symbol§Boolean Inequality test.
§Symbol≤ or <=§Symbol§Boolean Reflexive order predicate.
§Symbol≥ or >=§Symbol§Boolean Reflexive order predicate.

§Character
Abstraction:
A character.
Construction
Syntax:  character
See also:  ..Shapes..String..Unicode  ..Shapes..String..AdobeGlyphList
Fields
FieldTypeDescription

code§Integer
The Unicode code point corresponding to the character.
§String
Abstraction:
A chunk of text.
Construction
Syntax:  string
See also:  ..Shapes..Debug..sourceof
Fields
FieldTypeDescription

UTF8?§Boolean
Predicate for valid utf-8 contents.
bytecount§Integer
The size of the string contents in bytes, not counting the trailing null byte.
UTF8count§Integer
The number of utf-8 characters in the string. Must not be evaluated on strings which are not valid utf-8.
byteselectmethod
pos::( §Seq §Span ) §String
Create new data string by selecting bytes in the string. The elements of pos must be in the range from zero to one less the number of bytes in the string, and the resulting §String will have a byte count equal to the number of elements in pos.
pos::§Integer §Integer
Select a single byte, and return its unsigned value.
UTF8selectmethod
pos::( §Seq §Span ) §String
Create new text string by selecting characters in the string. The elements of pos must be in the range from zero to one less the number of characters in the string, and the resulting §String will have a character count equal to the number of elements in pos.
pos::§Integer §Character
Select a single character.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§String+§String§String Concatenation.

Elementary tuple types

Values of types in this section combine a fixed number of other values to form a tuple.
§Coords    §Coords3D    §CornerCoords    §FloatPair    §FloatTriple   
§FloatPair
Abstraction:
The §FloatPair type is typically a sized direction in the plane.
Construction
Syntax:  float-pair
See also:  ..Shapes..Geometry..coords
Fields
FieldTypeDescription

x§FloatFirst component.
y§FloatSecond component.
Involved operators

Unary prefix operators
OperatorTypeResultDescription

~§FloatPair§FloatPair Scaling by negative unit.

Binary operators
TypeOperatorTypeResultDescription

§FloatPair+§FloatPair§FloatPair Addition.
§FloatPair-§FloatPair§FloatPair Subtraction.
§FloatPair∠ or /_§FloatPair§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§FloatPair*§FloatPair§Float Standard inner product.
§FloatPair∥ or */§FloatPair§FloatPair Orthogonal projection of first argument on direction given by second argument.
§FloatPair∠ or /_§Coords§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§FloatPair*§Float§FloatPair Vector-scalar multiplication.
§FloatPair*§Coords§Length Standard inner product.
§FloatPair*§Length§Coords Scale direction by length.
§FloatPair/§Float§FloatPair Division by scalar.
§FloatPair∥ or */§Coords§FloatPair Orthogonal projection of first argument on direction given by second argument.
§Coords∠ or /_§FloatPair§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§Float*§FloatPair§FloatPair Vector-scalar multiplication.
§Coords*§FloatPair§Length Standard inner product.
§Length*§FloatPair§Coords Scale direction by length.
§Coords∥ or */§FloatPair§Coords Orthogonal projection of first argument on direction given by second argument.

§FloatTriple
Abstraction:
The §FloatTriple type is typically a sized direction in the perceivable space.
Construction
Syntax:  float-triple
See also:  ..Shapes..Geometry3D..coords
Fields
FieldTypeDescription

x§FloatFirst component.
y§FloatSecond component.
z§FloatThird component.
Involved operators

Unary prefix operators
OperatorTypeResultDescription

~§FloatTriple§FloatTriple Scaling by negative unit.

Binary operators
TypeOperatorTypeResultDescription

§FloatTriple+§FloatTriple§FloatTriple Addition.
§FloatTriple-§FloatTriple§FloatTriple Subtraction.
§FloatTriple∠ or /_§FloatTriple§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§FloatTriple*§FloatTriple§Float Standard inner product.
§FloatTriple∥ or */§FloatTriple§FloatTriple Orthogonal projection of first argument on direction given by second argument.
§FloatTriple∠ or /_§Coords3D§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§FloatTriple*§Float§FloatTriple Vector-scalar multiplication.
§FloatTriple*§Coords3D§Length Standard inner product.
§FloatTriple*§Length§Coords3D Scale direction by length.
§FloatTriple/§Float§FloatTriple Division by scalar.
§FloatTriple∥ or */§Coords3D§FloatTriple Orthogonal projection of first argument on direction given by second argument.
§Coords3D∠ or /_§FloatTriple§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§Float*§FloatTriple§FloatTriple Vector-scalar multiplication.
§Coords3D*§FloatTriple§Length Standard inner product.
§Length*§FloatTriple§Coords3D Scale direction by length.
§Coords3D∥ or */§FloatTriple§Coords3D Orthogonal projection of first argument on direction given by second argument.

§Coords
Abstraction:
The §Coords type is a pair of §Length ordinates.
Construction
Syntax:  coords-2D
See also:  ..Shapes..Geometry..coords  ..Shapes..Geometry..cornercoords  ..Shapes..Geometry..mean  ..Shapes..Geometry..pathpoint_mean  ..Shapes..Geometry..controlling_maximizer  ..Shapes..Layout..centerof  ..Shapes..Layout..mspoint
Fields
FieldTypeDescription

x§LengthFirst component.
y§LengthSecond component.
Involved operators

Unary prefix operators
OperatorTypeResultDescription

~§Coords§Coords Scaling by negative unit.
+§Coords§OffsetCoords Note: Requires enclosing parantheses! Constructs relative coordinates.

Binary operators
TypeOperatorTypeResultDescription

§Coords--§Coords§Path Path connection.
§Coords+§Coords§Coords Addition.
§Coords-§Coords§Coords Subtraction.
§Coords∠ or /_§Coords§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§Coords∥ or */§Coords§Coords Orthogonal projection of first argument on direction given by second argument.
§Coords<§Coords§PathPoint Attach backward handle to second argument.
§Coords>§Coords§PathPoint Attach forward handle to first argument.
§Coords--§PathPoint§Path Path connection.
§Coords--§Path§Path Path connection.
§Coords∠ or /_§FloatPair§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§Coords*§Float§Coords Vector-scalar multiplication.
§Coords*§FloatPair§Length Standard inner product.
§Coords/§Length§FloatPair Directional ratio.
§Coords/§Float§Coords Division by scalar.
§Coords∥ or */§FloatPair§Coords Orthogonal projection of first argument on direction given by second argument.
§Coords<§PathPoint§PathPoint Attach backward handle to second argument.
§Coords<§PathSlider§PathPoint Attach backward handle to second argument.
§Coords>§PolarHandleBase§PathPoint Attach forward handle to first argument.
§Path--§Coords§Path Path connection.
§FloatPair∠ or /_§Coords§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§Float*§Coords§Coords Vector-scalar multiplication.
§FloatPair*§Coords§Length Standard inner product.
§FloatPair∥ or */§Coords§FloatPair Orthogonal projection of first argument on direction given by second argument.
§PolarHandleBase<§Coords§PathPoint Attach backward handle to second argument.
§PathPoint>§Coords§PathPoint Attach forward handle to first argument.
§PathSlider>§Coords§PathPoint Attach forward handle to first argument.

§CornerCoords
Abstraction:
§CornerCoords is a subtype of §Coords. Objects of this type behave as §Coords in every situation except when being the center point of a path point with one or more undetermined handle angles.
Construction
Syntax:  corner-point-2D
Fields
FieldTypeDescription

x§LengthFirst component.
y§LengthSecond component.
a§FloatCorner angle.
§Coords3D
Abstraction:
The §Coords3D type is a triple of §Length ordinates.
Construction
Syntax:  coords-3D
See also:  ..Shapes..Geometry..mean  ..Shapes..Geometry..pathpoint_mean  ..Shapes..Geometry..controlling_maximizer  ..Shapes..Geometry3D..coords
Fields
FieldTypeDescription

x§LengthFirst component.
y§LengthSecond component.
z§LengthThird component.
Involved operators

Unary prefix operators
OperatorTypeResultDescription

~§Coords3D§Coords3D Scaling by negative unit.
+§Coords3D§OffsetCoords3D Note: Requires enclosing parantheses! Constructs relative coordinates.

Binary operators
TypeOperatorTypeResultDescription

§Coords3D--§Coords3D§Path3D Path connection.
§Coords3D+§Coords3D§Coords3D Addition.
§Coords3D-§Coords3D§Coords3D Subtraction.
§Coords3D∠ or /_§Coords3D§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§Coords3D∥ or */§Coords3D§Coords3D Orthogonal projection of first argument on direction given by second argument.
§Coords3D<§Coords3D§PathPoint3D Attach backward handle to second argument.
§Coords3D>§Coords3D§PathPoint3D Attach forward handle to first argument.
§Coords3D--§PathPoint3D§Path3D Path connection.
§Coords3D--§Path3D§Path3D Path connection.
§Coords3D∠ or /_§FloatTriple§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§Coords3D*§Float§Coords3D Vector-scalar multiplication.
§Coords3D*§FloatTriple§Length Standard inner product.
§Coords3D/§Length§FloatTriple Directional ratio.
§Coords3D/§Float§Coords3D Division by scalar.
§Coords3D∥ or */§FloatTriple§Coords3D Orthogonal projection of first argument on direction given by second argument.
§Coords3D<§PathPoint3D§PathPoint3D Attach backward handle to second argument.
§Coords3D<§PathSlider3D§PathPoint3D Attach backward handle to second argument.
§Path3D--§Coords3D§Path3D Path connection.
§FloatTriple∠ or /_§Coords3D§Float In presence of a zero arguent, the result is π/2. Otherwise, the usual definition of angle between vector applies.
§Float*§Coords3D§Coords3D Vector-scalar multiplication.
§FloatTriple*§Coords3D§Length Standard inner product.
§FloatTriple∥ or */§Coords3D§FloatTriple Orthogonal projection of first argument on direction given by second argument.
§PathPoint3D>§Coords3D§PathPoint3D Attach forward handle to first argument.
§PathSlider3D>§Coords3D§PathPoint3D Attach forward handle to first argument.

Points and paths

Not much needs to be known about most of these intuitive types.
§MultiPath    §MultiPath3D    §Path    §Path3D    §PathPoint    §PathPoint3D    §PathSlider    §PathSlider3D   
§PathPoint
Abstraction:
The §PathPoint type is a via-point on a path, with optional rear and front control points (or handles).
Construction
Syntax:  path-point-2D
Operators:  ( §Coords < §PathPoint )  ( §Coords < §PathSlider )  ( §PolarHandleBase < §PathPoint )  ( §PolarHandleBase < §PathSlider )  ( §PathPoint > §Coords )  ( §PathSlider > §Coords )  ( §PathPoint > §PolarHandleBase )  ( §PathSlider > §PolarHandleBase )
Fields
FieldTypeDescription

rear§CoordsControl point in backward direction.
mid§CoordsCenter (or via) point.
front§CoordsControl point in forward direction.
Involved operators

Unary postfix operators
TypeOperatorResultDescription

§PathPoint--cycle§Path Constructs a closed path with only one spline.

Binary operators
TypeOperatorTypeResultDescription

§PathPoint--§PathPoint§Path Path connection.
§PathPoint--§PathPoint§Path Path connection.
§PathPoint--§Path§Path Path connection.
§PathPoint>§Coords§PathPoint Attach forward handle to first argument.
§PathPoint>§PolarHandleBase§PathPoint Attach forward handle to first argument.
§Coords--§PathPoint§Path Path connection.
§Path--§PathPoint§Path Path connection.
§Coords<§PathPoint§PathPoint Attach backward handle to second argument.
§PolarHandleBase<§PathPoint§PathPoint Attach backward handle to second argument.

§PathSlider
Abstraction:
An instance of §PathSlider is a position on a particular path. Hence, it is a combination of a path and a path time.
Construction
See also:  ..Shapes..Geometry..maximizer  ..Shapes..Geometry..pathpoint_maximizer  ..Shapes..Geometry..intersection  ..Shapes..Geometry..approximator  ..Shapes..Geometry..pathpoint_approximator
Fields
A path slider has many fields. Many appear in pairs, and in most cases the either one can easily be computed given the other. The exception is when the slider is at the transition from one spline to another. Then the “reversed” version of the type-field refers to a property of the first spline, while the “plain“ version refers to a property of the second spline.
FieldTypeDescription

p§CoordsThe coordinates of the point.
v§LengthThe speed at the point. Note that this does not make sense from a geometric point of view, since it is not a property of the shape of the path but its representation.
rv§LengthThe speed in the reverse direction.
T§FloatPairUnit vector in the tangent direction.
rT§FloatPairUnit vector in the reverse tangent direction.
N§FloatPairUnit vector in the normal direction (always pointing couter-clockwise from the tangent).
rN§FloatPairUnit vector in the reverse normal direction.
ik§LengthRadius of curvature (that is, the inverse of the curvature).
rik§LengthRverse radius of curvature.
time§FloatPath time at the slider.
length§LengthDistance from beginning of path to slider.
past§BooleanSlider is beyond the end of the path.
looped§BooleanSlider was reached by looping on a closed path.
mod§PathSliderSlider obtained by computing the path time modulo the duration of the path.
info( §Void §Structure )May contain information related to how the slider was computed. The set of fields available in the structure (if any) will depend on the particular computation. See, for instance, ..Shapes..Geometry..approximator for a computation which stores information in this field.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§PathSlider--§PathSlider§Path Path connection.
§PathSlider+§Float§PathSlider Move spline time.
§PathSlider+§Length§PathSlider Move distance.
§PathSlider-§Float§PathSlider Reverse move spline time.
§PathSlider-§Length§PathSlider Reverse move distance.
§PathSlider>§Coords§PathPoint Attach forward handle to first argument.
§PathSlider>§PolarHandleBase§PathPoint Attach forward handle to first argument.
§Coords<§PathSlider§PathPoint Attach backward handle to second argument.
§PolarHandleBase<§PathSlider§PathPoint Attach backward handle to second argument.

§Path
Abstraction:
A curve.
§Path does not correspond directly to the path type in pdf. In pdf, a path can consist of several subpaths. In Shapes, such a subpath is of type §Path, and the list of subpaths is of type §MultiPath.
Construction
Operators:  ( §PathPoint -- §PathPoint )  ( §Path -- §Path )  ( §PathSlider -- §PathSlider )
See also:  ..Shapes..Geometry..reverse  ..Shapes..Geometry..rectangle  ..Shapes..Geometry..meetpaths  ..Shapes..Geometry..svg_path  ..Shapes..Geometry..upsample_balance  ..Shapes..Geometry..upsample_inflections  ..Shapes..Geometry..upsample_bends  ..Shapes..Geometry..upsample_every  ..Shapes..Layout..bbox  ..Shapes..Geometry..circle  ..Shapes..Geometry..ccw_arc  ..Shapes..Geometry..cw_arc  ..Shapes..Geometry..linkpaths  ..Shapes..Geometry..buildchain  ..Shapes..Geometry..pathmap  ..Shapes..Geometry..sidepath  ..Shapes..Geometry..sidepath2  ..Shapes..Geometry3D..generic_arc3D  ..Shapes..Geometry3D..ccw_arc3D  ..Shapes..Geometry3D..cw_arc3D
Fields
FieldTypeDescription

begin§PathSliderBeginning of path.
end§PathSliderEnd of path.
closed?§BooleanTrue for closed paths.
null?§BooleanTrue if there are no path points on the path.
Description
Since a path is a curve, and a curve is typically defined as a continuous mapping from a real parameter to the space containing the curve, Shapes allows objects of type §Path to be used as functions. Since the curve can be measured, a path can be applied also to §Length objects. Hence, [pth u] becomes a shorthand for ( pth.begin + u ).
Involved operators

Unary postfix operators
TypeOperatorResultDescription

§Path--cycle§Path Closes an open path.

Binary operators
TypeOperatorTypeResultDescription

§Path--§Path§Path Path connection.
§Path&§Path§MultiPath Path union.
§Path--§Coords§Path Path connection.
§Path--§PathPoint§Path Path connection.
§Path&§MultiPath§MultiPath Path union.
§Coords--§Path§Path Path connection.
§PathPoint--§Path§Path Path connection.
§MultiPath&§Path§MultiPath Path union.

§MultiPath
Abstraction:
Basically, a set of curves.
This type in Shapes corresponds to the generic path type in pdf, that is, a list of continuous cubic splines. This can function as a way of grouping several splines into one object, but the real purpose is to define complex regions to fill with paint. Please refer to the pdf documentation for the semantics of filling complex paths.
Construction
Operators:  ( §Path & §Path )
Fields
FieldTypeDescription

list§SeqA list of the contained paths, each of type §Path.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§MultiPath&§MultiPath§MultiPath Path union.
§MultiPath&§Path§MultiPath Path union.
§Path&§MultiPath§MultiPath Path union.

§PathPoint3D
Abstraction:
The analogue of §PathPoint, in 3d instead of 2d.
A major difference between path points in 2d and 3d is that the machinery for deducing values of undertermined handle angles and radii is not generalized to 3d.
Construction
Syntax:  path-point-3D
Operators:  ( §Coords3D < §PathPoint3D )  ( §Coords3D < §PathSlider3D )  ( §PathPoint3D > §Coords3D )  ( §PathSlider3D > §Coords3D )
Fields
FieldTypeDescription

rear§Coords3DControl point in backward direction.
mid§Coords3DCenter (or via) point.
front§Coords3DControl point in forward direction.
Involved operators

Unary postfix operators
TypeOperatorResultDescription

§PathPoint3D--cycle§Path3D Constructs a closed path with only one spline.

Binary operators
TypeOperatorTypeResultDescription

§PathPoint3D--§PathPoint3D§Path3D Path connection.
§PathPoint3D--§PathPoint3D§Path3D Path connection.
§PathPoint3D--§Path3D§Path3D Path connection.
§PathPoint3D>§Coords3D§PathPoint3D Attach forward handle to first argument.
§Coords3D--§PathPoint3D§Path3D Path connection.
§Path3D--§PathPoint3D§Path3D Path connection.
§Coords3D<§PathPoint3D§PathPoint3D Attach backward handle to second argument.

§Path3D
Abstraction:
The analogue of §Path, in 3d instead of 2d.
Construction
Operators:  ( §PathPoint3D -- §PathPoint3D )  ( §Path3D -- §Path3D )  ( §PathSlider3D -- §PathSlider3D )
See also:  ..Shapes..Geometry..reverse  ..Shapes..Geometry..meetpaths  ..Shapes..Geometry..upsample_balance  ..Shapes..Geometry..upsample_every
Fields
FieldTypeDescription

begin§PathSlider3DBeginning of path.
end§PathSlider3DEnd of path.
closed?§BooleanTrue for closed paths.
null?§BooleanTrue if there are no path points on the path.
Involved operators

Unary postfix operators
TypeOperatorResultDescription

§Path3D--cycle§Path Closes an open path.

Binary operators
TypeOperatorTypeResultDescription

§Path3D--§Path3D§Path3D Path connection.
§Path3D&§Path3D§MultiPath3D Path union.
§Path3D--§Coords3D§Path3D Path connection.
§Path3D--§PathPoint3D§Path3D Path connection.
§Path3D&§MultiPath3D§MultiPath3D Path union.
§Coords3D--§Path3D§Path3D Path connection.
§PathPoint3D--§Path3D§Path3D Path connection.
§MultiPath3D&§Path3D§MultiPath3D Path union.

§MultiPath3D
Abstraction:
The analogue of §MultiPath, in 3d instead of 2d.
Construction
Operators:  ( §Path3D & §Path3D )
Fields
FieldTypeDescription

list§SeqA list of the contained paths, each of type §Path3D.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§MultiPath3D&§MultiPath3D§MultiPath3D Path union.
§MultiPath3D&§Path3D§MultiPath3D Path union.
§Path3D&§MultiPath3D§MultiPath3D Path union.

§PathSlider3D
Abstraction:
The analogue of §PathSlider, in 3d instead of 2d.
Construction
See also:  ..Shapes..Geometry..maximizer  ..Shapes..Geometry..pathpoint_maximizer  ..Shapes..Geometry..approximator  ..Shapes..Geometry..pathpoint_approximator
Fields
A path slider has many fields. Many appear in pairs, and in most cases the either one can easily be computed given the other. The exception is when the slider is at the transition from one spline to another. Then the “reversed” version of the type-field refers to a property of the first spline, while the “plain“ version refers to a property of the second spline.
FieldTypeDescription

p§Coords3DThe coordinates of the point.
v§LengthThe speed at the point. Note that this does not make sense from a geometric point of view, since it is not a property of the shape of the path but its representation.
rv§LengthThe speed in the reverse direction.
T§FloatPairUnit vector in the tangent direction.
rT§FloatPairUnit vector in the reverse tangent direction.
N§FloatPairUnit vector in the normal direction (this direction is normal to the tangent).
rN§FloatPairUnit vector in the reverse normal direction.
B§FloatPairUnit vector in the bi-normal direction (pointing such that the tangent, the normal, and the bi-normal forms a system with positive orientation).
rV§FloatPairUnit vector in the reverse bi-normal direction.
ik§LengthRadius of curvature (that is, the inverse of the curvature).
rik§LengthRverse radius of curvature.
time§FloatPath time at the slider.
length§LengthDistance from beginning of path to slider.
past§BooleanSlider is beyond the end of the path.
looped§BooleanSlider was reached by looping on a closed path.
mod§PathSlider3DSlider obtained by computing the path time modulo the duration of the path.
info( §Void §Structure )May contain information related to how the slider was computed. The set of fields available in the structure (if any) will depend on the particular computation. See, for instance, ..Shapes..Geometry..approximator for a computation which stores information in this field.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§PathSlider3D--§PathSlider3D§Path3D Path connection.
§PathSlider3D+§Float§PathSlider3D Move spline time.
§PathSlider3D+§Length§PathSlider3D Move distance.
§PathSlider3D-§Float§PathSlider3D Reverse move spline time.
§PathSlider3D-§Length§PathSlider3D Reverse move distance.
§PathSlider3D>§Coords3D§PathPoint3D Attach forward handle to first argument.
§Coords3D<§PathSlider3D§PathPoint3D Attach backward handle to second argument.

Graphics in 2d

Values of the types described here can be drawn (possibly after projection to 2d).
§Alpha    §CapStyle    §ColorSpace    §Dash    §Drawable    §JoinStyle    §RasterImage   
§Drawable
Abstraction:
This is the common base type of drawable things in 2d.
Construction
See also:  ..Shapes..Graphics..spot  ..Shapes..Graphics..clip  ..Shapes..Graphics..clipodd  ..Shapes..Graphics..stroke  ..Shapes..Graphics..fill  ..Shapes..Graphics..fillstroke  ..Shapes..Graphics..fillodd  ..Shapes..Graphics..TeX  ..Shapes..Layout..bboxed  ..Shapes..Layout..center  ..Shapes..Layout..center_x  ..Shapes..Layout..center_y  ..Shapes..Layout..center_wlm  ..Shapes..Layout..Xcenter_y  §•Text
Fields
A value of type §Drawable has no fields.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§Drawable&§Drawable§Drawable Graphics composition. Second argument on top of first.

§RasterImage
  isa  §Drawable
Abstraction:
Rasterized image.
Construction
See also:  ..Shapes..Graphics..import_raster
Fields
FieldTypeDescription

size_x§IntegerWidth in pixels.
size_y§IntegerWidth in pixels.
depth§IntegerBits per color component.
space§ColorSpaceColor space.
§CapStyle
Abstraction:
Construction
Fields
A value of type §CapStyle has no fields.
§JoinStyle
Abstraction:
Construction
Fields
A value of type §JoinStyle has no fields.
§Dash
Abstraction:
Construction
See also:  ..Shapes..Traits..dashpattern
Fields
A value of type §Dash has no fields.
Description
The total length of the dash pattern can be obtained using ..Shapes..Numeric..Math..abs.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§Dash+§Length§Dash Shift.
§Dash*§Float§Dash Scale.
§Length+§Dash§Dash Shift.
§Float*§Dash§Dash Scale.

§Alpha
Abstraction:
Construction
See also:  ..Shapes..Traits..alphashape  ..Shapes..Traits..alphaopacity
Fields
A value of type §Alpha has no fields.
§ColorSpace
Abstraction:
A parameterization of colors.
Construction
Fields
A value of type §ColorSpace has no fields.
See also:..Shapes..Traits..@blend

Functions and function-like things

Besides objects of type §Function, there are other objects that can behave like functions in many ways. Most importantly, objects of the types in this section can appear at the first position in a composite expression. The function-like type §Array is mentioned among the other container types.
§Function    §Span    §Transform    §Transform3D   
§Function
Abstraction:
In Shapes, the type §Function serves two purposes; an object of type §Function may be either a pure function, or a non-pure function. A pure function cannot have side effects, and will always return the same result given the same arguments and dynamic environment. Note that changing the dynamic environment may change the result of a function.
Construction
Syntax:  function
Fields
A value of type §Function has no fields.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§Function⊙ or ()§Function§Function Composition.
§Function=§Function§Boolean Test equality between internal pointers.
§Function≠ or /=§Function§Boolean Test inequality of internal pointers.

§Transform
Abstraction:
The §Transform type is an affine transform, mapping §Coord to §Coord.
Below, a transform is denoted ( L, p ), defined by ( L, p )( u ) = L u + p.
Construction
See also:  ..Shapes..Geometry..affinetransform  ..Shapes..Geometry..shift  ..Shapes..Geometry..rotate  ..Shapes..Geometry..scale  ..Shapes..Geometry..inverse
Fields
FieldTypeDescription

p§CoordsThe offset, p.
L§TransformThe linear part, L.
Lx§FloatPairL x, that is, the first column of L in the ( x, y ) basis.
Ly§FloatPairL y, that is, the second column of L in the ( x, y ) basis.
xL§FloatPairx L, that is, the first row of L in the ( x, y ) basis.
yL§FloatPairy L, that is, the first row of L in the ( x, y ) basis.
linear?§Boolean
True if the transform has no translational part.
The test has zero tolerance and must not be used on the result from a numeric computation — chop the result first.
translation?§Boolean
True if the linear part is the identity.
The test has zero tolerance and must not be used on the result from a numeric computation — chop the result first.
special?§BooleanTrue if the transform does not change orientation.
Euclidean?§Boolean
True if the transform preserves Euclidean distance.
For linear transforms, this is the same as the transform being orthogonal or unitary.
This test is not exact, but uses a build-in tolerance.
chopmethod
T::§Float p::§Length §Transform
Performes round-off according to given tolerances.
The elements in the linear part may be rounded (with tolerance T) towars the values { -1, 0, 1 }, while the elements in the offset are only to rounded to zero (with tolerance p).
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§Transform*§Transform§Transform Composition.
§Transform⊙ or ()§Transform§Transform Composition.

§Transform3D
Abstraction:
The analogue of §Transform, in 3d instead of 2d.
Below, a transform is denoted ( L, p ), defined by ( L, p )( u ) = L u + p.
Construction
See also:  ..Shapes..Geometry3D..affinetransform  ..Shapes..Geometry3D..shift  ..Shapes..Geometry3D..rotate  ..Shapes..Geometry3D..scale  ..Shapes..Geometry3D..inverse
Fields
FieldTypeDescription

p§Coords3DThe offset, p.
L§Transform3DThe linear part, L.
Lx§FloatTripleL x, that is, the first column of L in the ( x, y, z ) basis.
Ly§FloatTripleL y, that is, the second column of L in the ( x, y, z ) basis.
Lz§FloatTripleL z, that is, the third column of L in the ( x, y, z ) basis.
xL§FloatTriplex L, that is, the first row of L in the ( x, y, z ) basis.
yL§FloatTripley L, that is, the first row of L in the ( x, y, z ) basis.
zL§FloatTriplez L, that is, the third row of L in the ( x, y, z ) basis.
linear?§Boolean
True if the transform has no translational part.
The test has zero tolerance and must not be used on the result from a numeric computation — chop the result first.
translation?§Boolean
True if the linear part is the identity.
The test has zero tolerance and must not be used on the result from a numeric computation — chop the result first.
special?§BooleanTrue if the transform does not change orientation.
Euclidean?§Boolean
True if the transform preserves Euclidean distance.
For linear transforms, this is the same as the transform being orthogonal or unitary.
This test is not exact, but uses a build-in tolerance.
chopmethod
T::§Float p::§Length §Transform3D
Performes round-off according to given tolerances.
The elements in the linear part may be rounded (with tolerance T) towars the values { -1, 0, 1 }, while the elements in the offset are only to rounded to zero (with tolerance p).
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§Transform3D*§Transform3D§Transform3D Composition.
§Transform3D⊙ or ()§Transform3D§Transform3D Composition.

§Span
  isa  ( last::( §Integer §Float §Length )  §Seq )
Abstraction:
Given the last position in a container, the §Span expands to a range of values. The type of last must match the types produced by the thunks in the §Span.
The expansion is often requested by methods of container types that support the use of §Span to denote ranges of values inside the container.
Calling a §Span is very much like evaluating a delayed call to ..Shapes..Data..range, see ..Shapes..Data..span.
Construction
See also:  ..Shapes..Data..span
Fields
A value of type §Span has no fields.

Container types

Values of types in this section hold values of other types.
§Array    §ConsPair    §Seq    §SeqNil    §SeqPair    §Structure   
[§ConsPair §A §D]
Abstraction:
Container for two values. Often used to form linked lists and trees.
§A  
Type of car field.
§D  
Type of cdr field.
Construction
See also:  ..Shapes..Data..cons
Fields
§T  
Type of fold sum.
§•S  
State type.
FieldTypeDescription

car§A
First element.
cdr§B
Second element.
foldlmethod
op::( ::§T ::§A  §T ) zero::§T §T
Performs a left fold, assuming that the cdr field also has the same method. The following code would be a valid Shapes implementation of the method.
\ op zero → [cdr.foldl op [op zero car]]
foldrmethod
op::( ::§A ::§T  §T ) zero::§T §T
Performs a right fold, assuming that the cdr field also has the same method. The following code would be a valid Shapes implementation of the method.
\ op zero → [op car [cdr.foldr op zero]]
foldslmethod
op::( ::§T ::§A ::  §T ) zero::§T •state:: §T
Performs a left fold with state, assuming that the cdr field also has the same method. The following code would be a valid Shapes implementation of the method.
\ op zero •st → [cdr.foldsl op [op zero car •st] •st]
foldsrmethod
op::( ::§A ::§T ::  §T ) zero::§T •state:: §T
Performs a right fold with state, assuming that the cdr field also has the same method. The following code would be a valid Shapes implementation of the method.
\ op zero •st → [op car [cdr.foldsr op zero •st] •st]
Description
When used to build linked lists, one shall use ..Shapes..Data..nil to terminate the list. Recall that this value is recognized by ..Shapes..Data..nil?.
The following example illustrates the extension ..Shapes..Data / seq-support and how the laziness of ..Shapes..Data..cons allows infinite streams to be defined.
Folds
Folds over lists come in two flavors — left and right. §ConsPair can hold thunks, but infinite streams cannot be folded.

Source: show/hide visit

stdout: show/hide
See also:..Shapes..Data..nil?
[§Seq §E]
Abstraction:
A singly linked list.
§E  
Type of elements in list.
Defined as: ( [§SeqPair §E] §SeqNil )
See also:..Shapes..Data..nil?  ..Shapes..Data..fcons  ..Shapes..Data..list  ..Shapes..Data..range
[§SeqPair §E]
  isa  [§Seq §E]
Abstraction:
A non-empty singly linked list.
§E  
Type of elements in list.
Defined as: ( [§ConsPair §E [§Seq §E]] )
§SeqNil
  isa  [§Seq §E]
Abstraction:
An empty singly linked list.
Construction
Fields
§T  
Type of fold sum.
§•S  
State type.
FieldTypeDescription

foldlmethod
op zero::§T §T
Just returns zero.
foldrmethod
op zero::§T §T
Just returns zero.
foldslmethod
op zero::§T •state:: §T
Just returns zero.
foldsrmethod
op zero::§T •state:: §T
Just returns zero.
See also:..Shapes..Data..nil?
§Array
  isa  ( ::§Integer  §Value )
Abstraction:
Values of type §Array are one-dimensional arrays. The array has a finite size, does not contain any thunks, and any element can be accessed in constant time by specifying its index. The index of the first element is 0.
Construction
See also:  ..Shapes..Data..array  §•Array
Fields
§T  
Type of fold sum.
§E  
Type of list elements.
§•S  
State type.
FieldTypeDescription

size§Integer
The size of the array.
range§Seq
Range of valid indices, from low to high. Constant time and space implementation. Efficient for left folds; instead of a right fold over range, one should try to make a left fold over reverse_range instead.
For arr of type , arr.range is equivalent to
[range '0 count:arr.size]
reverse_range§Seq
Reverse range of valid indices, from high to low. Constant time and space implementation. Efficient for left folds; instead of a right fold over reverse_range, one should try to make a left fold over range instead.
For arr of type , arr.reverse_range is equivalent to
[range arr.size-'1 step:'~1 count:arr.size]
list§Seq
Converts the array to a list.
foldlmethod
op::( ::§T ::§E  §T ) zero::§T §T
Performs a left fold over the array.
foldrmethod
op::( ::§E ::§T  §T ) zero::§T §T
Performs a right fold over the array.
foldslmethod
op::( ::§T ::§E ::  §T ) zero::§T •state:: §T
Performs a left fold with state over the array.
foldsrmethod
op::( ::§T ::§E ::  §T ) zero::§T •state:: §T
Performs a right fold with state over the array.
§Structure
Abstraction:
Container mirroring the information being passed to the callee in a function application. That is, it may contain both named and ordered fields.
Construction
Syntax:  structure
See also:  ..Shapes..Data..unlist
Fields
FieldTypeDescription

Description
The contents of a §Structure value can be passed to a function using the split-call. The named fields of a structure may also be accessed just like the named fields of any other compound value. Ordered values may be accessed using trivial helper functions (simply returning the appropriate ordered argument).
For an example showing the various ways to work with §Structure values, see the structure syntax.

Graphs

A graph is a data structure with nodes and edges. They can be modeled in many ways, but Shapes comes with one set built-in types that define the preferred way of representing graphs in Shapes. Since the types are built-in, the allow for a more efficient implementation than would could be obtained with user-defined types. The need for a graph data structure is discussed in the tutorial.html.
§DEdge    §DMultiEdge    §Edge    §EdgeData    §Graph    §GraphKey    §MultiEdge    §Node    §NodeData    §UEdge    §UMultiEdge    §Walk   
§GraphKey
Abstraction:
A key identifying some entity in a graph, like a node or a graph partition.
Defined as: ( §Symbol §Integer )
[§Node §N §E]
Abstraction:
The §Node type is a reference to a node belonging to a particular graph. It gives constant time access to the referenced graph node.
§N  
Type of node values.
§E  
Type of edge values.
Construction
Fields
FieldTypeDescription

value§N
The value associated with the node.
key§GraphKey
The key used to retrieve the from the §Graph.
partition( §GraphKey §Void )
Graph partition. Unless void, the node will not be adjacent to other nodes in the same partition.
index§Integer
Each node in the graph has a unique value in a range starting from zero. It is generally not identical to the key even if all keys are of type §Integer.
u_degree§Integer
Number of undirected edges incident to the node. Loop edges count twice.
d_degree_in§Integer
Number of directed edges with target at the node.
d_degree_out§Integer
Number of directed edges with source at the node.
d_degree§Integer
The sum of d_degree_in and d_degree_out. Note that loop edges will count twice.
degree§Integer
The sum of u_degree and d_degree.
u_loop_count§Integer
Number of undirected loop edges incident to the node. Each loop counts once.
d_loop_count§Integer
Number of directed loop edges incident to the node. Each loop counts once.
loop_count§Integer
The sum of u_loop_count and d_loop_count.
u_edgesmethod
loops:true::§Boolean [§Seq [§UEdge §N §E]]
Finds all incident undirected edges. Loops can be excluded by setting loops to false. Loop edges are only included once.
u_multiedgesmethod
loops:true::§Boolean [§Seq [§UMultiEdge §N §E]]
Similar to u_edges, but with parallel edges grouped as multiedges.
d_edges_inmethod
loops:true::§Boolean [§Seq [§DEdge §N §E]]
Finds all incident directed edges with target at the current node. Loops can be excluded by setting loops to false.
d_multiedges_inmethod
loops:true::§Boolean [§Seq [§DMultiEdge §N §E]]
Similar to d_edges_in, but with parallel edges grouped as multiedges.
d_edges_outmethod
loops:true::§Boolean [§Seq [§DEdge §N §E]]
Finds all incident directed edges with source at the curret node. Loops can be excluded by setting loops to false.
d_multiedges_outmethod
loops:true::§Boolean [§Seq [§DMultiEdge §N §E]]
Similar to d_edges_out, but with parallel edges grouped as multiedges.
edges_inmethod
loops:true::§Boolean [§Seq [§Edge §N §E]]
The union of edges obtained with u_edges and d_edges_in.
multiedges_inmethod
loops:true::§Boolean [§Seq [§MultiEdge §N §E]]
Similar to edges_in, but with parallel edges grouped as multiedges.
edges_outmethod
loops:true::§Boolean [§Seq [§Edge §N §E]]
The union of edges obtained with u_edges and d_edges_out.
multiedges_outmethod
loops:true::§Boolean [§Seq [§MultiEdge §N §E]]
Similar to edges_out, but with parallel edges grouped as multiedges.
edgesmethod
loops:true::§Boolean [§Seq [§Edge §N §E]]
The results of u_edges, d_edges_in, and d_edges_out taken together, except for directed loops that are only included once.
multiedgesmethod
loops:true::§Boolean [§Seq [§MultiEdge §N §E]]
Similar to multiedges, but with parallel edges grouped as multiedges.
u_loopsmethod
[§Seq [§UEdge §N §E]]
All undirected loop edges incident to the node. Each loop edge is only included once.
u_multiloopsmethod
[§Seq [§UMultiEdge §N §E]]
Similar to u_loops, but with parallel edges grouped as multiedges. Note that the returned sequence will contain at most one element.
d_loopsmethod
[§Seq [§DEdge §N §E]]
All directed loop edges incident to the node. Each loop edge is only included once.
d_multiloopsmethod
[§Seq [§DMultiEdge §N §E]]
Similar to d_loops, but with parallel edges grouped as multiedges. Note that the returned sequence will contain at most one element.
loopsmethod
[§Seq [§Edge §N §E]]
The union of edges obtained with u_loops and d_loops.
multiloopsmethod
[§Seq [§MultiEdge §N §E]]
The union of multiedges obtained with u_multiloops and d_multiloops.
tracemethod
edge::( [§Edge §N §E] [§MultiEdge §N §E] ) [§Node §N §E]
Get the §Node on the other side of edge. It is an error if edge is not incident to the current node, or if edge is directed but does not have the current node as source.
backtracemethod
edge::( [§Edge §N §E] [§MultiEdge §N §E] ) [§Node §N §E]
Get the §Node on the other side of edge. It is an error if edge is not incident to the current node, or if edge is directed but does not have the current node as target.
u_neighborsmethod
loops:true::§Boolean parallel:true::§Boolean [§Seq [§Node §N §E]]
All nodes on the other side of an undirected edge incident to the current node. Loop edges count twice, and each parallel edge counts once. Loops can be excluded by setting loops to false, and setting parallel to false gives only unique nodes in the result.
d_neighbors_inmethod
loops:true::§Boolean parallel:true::§Boolean [§Seq [§Node §N §E]]
All nodes on the other side of a directed edge with target at the current node. Each parallel edge counts once, as do loop edges. Loops can be excluded by setting loops to false, and setting parallel to false gives only unique nodes in the result.
d_neighbors_outmethod
loops:true::§Boolean parallel:true::§Boolean [§Seq [§Node §N §E]]
All nodes on the other side of a directed edge with source at the current node. Each parallel edge counts once, as do loop edges. Loops can be excluded by setting loops to false, and setting parallel to false gives only unique nodes in the result.
neighbors_inmethod
loops:true::§Boolean parallel:true::§Boolean [§Seq [§Node §N §E]]
The results of u_neighbors and d_neighbors_in taken together. Loops can be excluded by setting loops to false, and setting parallel to false gives only unique nodes in the result.
neighbors_outmethod
loops:true::§Boolean parallel:true::§Boolean [§Seq [§Node §N §E]]
The results of u_neighbors and d_neighbors_out taken together. Loops can be excluded by setting loops to false, and setting parallel to false gives only unique nodes in the result.
neighborsmethod
loops:true::§Boolean parallel:true::§Boolean [§Seq [§Node §N §E]]
The results of u_neighbors, d_neighbors_in, and d_neighbors_out taken together. Loops can be excluded by setting loops to false, and setting parallel to false gives only unique nodes in the result.
get_graphmethod
[§Graph §N §E]
Get the graph to which the node belongs.
See also:§Edge §Graph §NodeData
[§Edge §N §E]
Abstraction:
The §Edge type is a reference to an edge belonging to a particular graph. It gives constant time access to the referenced graph edge.
§N  
Type of node values.
§E  
Type of edge values.
Construction
Fields
FieldTypeDescription

directed?§Boolean
Whether the edge is directed or undirected.
source[§Node §N §E]
The source of a directed edge, or one of the nodes incident to an undirected edge. source and target are only identical for undirected edges in case of loops.
target[§Node §N §E]
The target of a directed edge, or one of the nodes incident to an undirected edge. source and target are only identical for undirected edges in case of loops.
value§E
The value associated with the edge.
label§GraphKey
A label which may be used in combination with source and target to identify the edge. Note that, in general, the label does not have to be unique, even for a given pair of source and target.
index§Integer
Each edge in the graph has a unique value in a range starting from zero.
get_graphmethod
[§Graph §N §E]
Get the graph to which the edge belongs.
See also:§Node §Graph §EdgeData
[§UEdge §N §E]
Abstraction:
An undirected edge.
§N  
Type of node values.
§E  
Type of edge values.
Defined as: ( [§Edge §N §E] (> directed?::§(false) <) )
[§DEdge §N §E]
Abstraction:
A directed edge.
§N  
Type of node values.
§E  
Type of edge values.
Defined as: ( [§Edge §N §E] (> directed?::§(true) <) )
[§MultiEdge §N §E]
Abstraction:
The §MultiEdge type is set of parallel edges. It provides a simplified way of working with multigraphs when one is not interested in the multiplicity of parallel edges. Two edges (compare §Edge) are parallel if and only if they are both directed or both undirected, and have the same source and target nodes.
§N  
Type of node values.
§E  
Type of edge values.
Construction
Fields
FieldTypeDescription

directed?§Boolean
Whether the parallel edges are directed or undirected.
source[§Node §N §E]
The common source node of the parallel edges.
target[§Node §N §E]
The common target node of the parallel edges.
count§Integer
The multiplicity of the parallel edges. That is, the length of edges, which is always positive.
edges [§Seq [§Edge §N §E]]
The individual parallel edges, ordered by their index.
There is always at least one edge in the sequence.
u_edges [§Seq [§UEdge §N §E]]
Identical to edges, except that it is only allowed when the parallel edges are undirected.
d_edges [§Seq [§DEdge §N §E]]
Identical to edges, except that it is only allowed when the parallel edges are directed.
get_graphmethod
[§Graph §N §E]
Get the graph to which the parallel edges belongs.
See also:§Edge §Graph
[§UMultiEdge §N §E]
Abstraction:
An undirected multiedge.
§N  
Type of node values.
§E  
Type of edge values.
Defined as: ( [§MultiEdge §N §E] (> directed?::§(false) <) )
[§DMultiEdge §N §E]
Abstraction:
A directed multiedge.
§N  
Type of node values.
§E  
Type of edge values.
Defined as: ( [§MultiEdge §N §E] (> directed?::§(true) <) )
[§Graph §N §E]
Abstraction:
Graph of nodes and edges.
§N  
Type of node values.
§E  
Type of edge values.
Construction
See also:  ..Shapes..Data..graph  §•Graph
Fields
FieldTypeDescription

undirected?§Boolean
Whether directed edges are not allowed in the graph's domain.
directed?§Boolean
Whether undirected edges are not allowed in the graph's domain.
mixed?§Boolean
Whether both undirected and directed edges are allowed in the graph's domain. That is, the graph's domain is neither directed nor undirected.
loops?§Boolean
Whether loop edges are allowed in the graph's domain.
parallel?§Boolean
Whether parallel edges are allowed in the graph's domain.
partitioned?§Boolean
Whether the graph's domain requires each node to belong to a partition.
key_is_index?§Boolean
Whether node keys coincide with node indices.
key_is_range?§Boolean
Whether node keys coincide with node indices plus key_offset.
key_offset§Integer
Node key of node with index zero. It is an error to access this field unless key_is_range?.
partition_count§Integer
Number of partitions, that is, the length of partitions. Note that a graph without any partitions may still contain nodes as long as it is not partitioned?.
partitions [§Seq §GraphKey]
The keys identifying the partitions of the graph, or empty if the graph is not partitioned?.
node_count§Integer
Number of nodes.
u_edge_count§Integer
Number of undirected edges, including loop edges.
d_edge_count§Integer
Number of directed edges, including loop edges.
edge_count§Integer
The sum of u_edge_count and d_edge_count.
u_loop_count§Integer
Number of undirected loop edges.
d_loop_count§Integer
Number of directed loop edges.
loop_count§Integer
The sum of u_loop_count and d_loop_count.
nodes [§Seq [§Node §N §E]]
All nodes in the graph, with each node appearing at the position given by its index.
u_edges [§Seq [§UEdge §N §E]]
All undirected edges in the graph. If the graph is undirected, each edge will appear at the position given by its index.
d_edges [§Seq [§DEdge §N §E]]
All directed edges in the graph. If the graph is directed, each edge will appear at the position given by its index.
edges [§Seq [§Edge §N §E]]
All edges in the graph, with each edge appearing at the position given by its index.
u_multiedges [§Seq [§UMultiEdge §N §E]]
All undirected multiedges in the graph.
d_multiedges [§Seq [§DMultiEdge §N §E]]
All directed multiedges in the graph.
multiedges [§Seq [§MultiEdge §N §E]]
All multiedges in the graph.
partitionmethod
key::§GraphKey [§Seq [§Node §N §E]]
All nodes in the given partition.
partition_node_countmethod
key::§GraphKey §Integer
The number of nodes in the given partition.
item?method
item::( [§Node §N §E] [§Edge §N §E] [§MultiEdge §N §E] ) §Boolean
Test if an item such as a node, an edge, or a multiedge belongs to the graph.
key?method
key::§GraphKey §Boolean
Test if a node key is present in the graph.
index_nodemethod
index::§Integer [§Node §N §E]
Retrieves a node in the graph identified by its index.
index_edgemethod
index::§Integer [§Edge §N §E]
Retrieves an edge in the graph identified by its index.
find_nodemethod
key::§GraphKey [§Node §N §E]
Finds a node in the graph identified by its key.
find_u_edgesmethod
source:void::( §Node §GraphKey §Void ) target:void::( §Node §GraphKey §Void ) label:void::( §GraphKey §Void ) loops:true::§Boolean [§Seq [§UEdge §N §E]]
Finds all undirected edges that are incident to both source and target. The default value means any node.
If label is a §GraphKey, only edges with that label are returned. If label is void, any edge label will match; there is no way to only return edges that do not have a label (that is, the label being void).
Loops can be excluded by setting loops to false. Loop edges are only included once.
find_d_edgesmethod
source:void::( §Node §GraphKey §Void ) target:void::( §Node §GraphKey §Void ) label:void::( §GraphKey §Void ) loops:true::§Boolean [§Seq [§DEdge §N §E]]
Finds all directed edges from source to target. Analogous to find_u_edges.
find_u_multiedgesmethod
source:void::( §Node §GraphKey §Void ) target:void::( §Node §GraphKey §Void ) loops:true::§Boolean [§Seq [§UMultiEdge §N §E]]
Finds all undirected multiedges that are incident to both source and target. The default value means any node.
Unlike find_u_edges, it is not possible to specify an edge label; a §MultiEdge will always contain all parallel edges.
Loops can be excluded by setting loops to false. Loop edges are only included once.
find_d_multiedgesmethod
source:void::( §Node §GraphKey §Void ) target:void::( §Node §GraphKey §Void ) loops:true::§Boolean [§Seq [§DMultiEdge §N §E]]
Finds all directed multiedges from source to target. Analogous to find_u_multiedges.
the_u_edgemethod
source::( §Node §GraphKey ) target::( §Node §GraphKey ) label:void::( §GraphKey §Void ) [§UEdge §N §E]
Returns the only undirected edge incident to both source and target.
If label is a §GraphKey, only edges with that label are considered. If label is void, any edge label will match.
It is an error if there is not exactly one matching edge.
the_d_edgemethod
source::( §Node §GraphKey ) target::( §Node §GraphKey ) label:void::( §GraphKey §Void ) [§DEdge §N §E]
Returns the only directed edge from source to target. Analogous to the_u_edge.
the_u_multiedgemethod
source::( §Node §GraphKey ) target::( §Node §GraphKey ) [§UMultiEdge §N §E]
Returns the undirected multiedge incident to both source and target.
It is an error if there is no matching edge.
the_d_multiedgemethod
source::( §Node §GraphKey ) target::( §Node §GraphKey ) [§DMultiEdge §N §E]
Returns the directed multiedge from source to target. Analogous to the_u_multiedge.
rekey_with_indexmethod
offset:'0::§Integer [§Graph §N §E]
Constructs a graph where each new node key is obtained by adding offset to the current node's index. If index is left at its default, this will generate a graph where the node keys coincide with the node indices.
with_node_valuesmethod
values::[§Seq §Value] [§Graph §N §E]
Constructs a graph with node values given by values. The order in value corresponds to node indices.
The resulting graph will share most of its data except the node values with the original graph..
with_edge_valuesmethod
values::[§Seq §Value] [§Graph §N §E]
Constructs a graph with edge values given by values. The order in value corresponds to edge indices.
The resulting graph will share most of its data except the edge values with the original graph..
induced_subgraphmethod
nodes::[§Seq [§Node §N §E]] [§Graph §N §E]
Constructs the subgraph indiced by the specified nodes.
The node indices in the resulting graph will correspond to the positions in nodes. To just reorder the nodes of a graph, use this method with all nodes in nodes.
spanning_subgraphmethod
edges::[§Seq [§Edge §N §E]] [§Graph §N §E]
Constructs the spanning subgraph with the specified edges.
The nodes of the resulting graph are identical to those of the original graph (including their indices).
Description
The §Graph data structure is designed to fill the gap created by the functional language's restriction to non-recursive data structures. A recursive data structure is when a value either directly or indirectly contains a reference to itself, like a node with a reference to its neighbor, which in turn has a reference back to the first node. In an imperative language, it is possible to have nodes containing references to their adjacent nodes, and this is often the most natural and efficient way of modeling a graph.
Since Shapes is functional, however, there cannot be recursive data structures, and so one has to model graphs in a non-recursive manner. Of course, there are many such representations, one of the most common being some kind of adjacency matrix, where each non-zero entry in the matrix represents an edge in the graph, with the row in the matrix corresponding to the source node, and the column in the matrix corresponding to the target node. While such a matrix representation may be good for representing the graph structure alone, it is rather inconvenient when one wants values associated with the nodes and edges, and it may also be inefficient for certain operations depending on the details of the matrix representation.
Shapes uses function calls to break the cycles that would otherwise result in recursive data structures. This sometimes turns out as member functions that are often called with no arguments, but that could still not be plain non-function fields.
See also:§Walk
[§Walk §N §E]
Abstraction:
The §Walk type is a walk in a particular graph. A walk has a start and an end node, and a sequence of edges that can be traced in order to get from the start node to the end node.
§N  
Type of node values.
§E  
Type of edge values.
Construction
See also:  ..Shapes..Data..walk
Fields
FieldTypeDescription

start[§Node §N §E]
The start node of the walk.
end[§Node §N §E]
The end node of the walk.
edges [§Seq [§Edge §N §E]]
The edges of the walk.
edge_count§Integer
Number of edges in the walk, also known as the length of the walk.
closed?§Boolean
The walk is closed if the start and end nodes are the same, that is, the opposite of being open.
open?§Boolean
The walk is open if the start and end nodes are different, that is, the opposite of being closed.
simple?§Boolean
The walk is simple if all nodes along the walk are distinct, except that the start and end nodes may be the same.
trail?§Boolean
The walk is a trail if all edges are distinct.
node_cover?§Boolean
The walk is a node cover if it visits every node of the graph it belongs to.
For example, a Hamiltonian walk is a simple node cover.
edge_cover?§Boolean
The walk is an edge cover if it traverses every edge of the graph it belongs to.
Note that an Eulerian cycle is a closed trail that is also an edge cover.
graph [§Graph §N §E]
Graph to which the walk belongs.
Description
A §Walk is the representation of a traversal of a graph along its edges. In general, nodes and edges may be visited zero or more times along the walk, but by placing constraints on the §Boolean properties of the walk, one obtains more specialized types of walks, such as trails or Eulerian cycles.
Graph walks
Examining the properties and iterating over a §Walk.

Source: show/hide visit

stdout: show/hide
See also:§Graph
[§NodeData §N]
Abstraction:
The §NodeData type is a structure holding data used to define a node during graph construction.
Strictly speaking, the type only consists of the field key, since the other field may be omitted where §NodeData is used to construct graphs.
§N  
Type of node values.
Construction
Fields
FieldTypeDescription

key§GraphKey
Node key.
value§N
The value associated with the node.
partition( §GraphKey §Void )
Graph partition. Unless void, the node may not be connected to other nodes in the same partition.
See also:§Node ..Shapes..Data..graph §EdgeData
[§EdgeData §E]
Abstraction:
The §EdgeData type is a structure holding data used to define an edge during graph construction.
Strictly speaking, the type only consists of the fields source and target, since the other fields have default values where §EdgeData is used to construct graphs.
§E  
Type of edge values.
Construction
Fields
FieldTypeDescription

source§GraphKey
The source of a directed edge, or one of the nodes incident to an undirected edge.
target§GraphKey
The target of a directed edge, or one of the nodes incident to an undirected edge.
value§E
The value associated with the edge.
label§GraphKey
A label which may be used in combination with source and target to identify the edge. Note that, in general, the label does not have to be unique, even for a given pair of source and target.
directed§Boolean
Whether the edge is directed or undirected.
See also:§Edge ..Shapes..Data..graph §NodeData

Text

When it comes to text, Shapes' inheritance from pdf is obvious. However, while the raw pdf format uses bare integers and floats to encode the various parameters of rendered text, Shapes puts a more human-friendly layer on top of this. This motivates the additional type in this section.
§Font    §KernedText    §TextOperation    §TextRenderingMode   
§Font
Abstraction:
A font face, used with ..Shapes..Text..@font.
Construction
See also:  ..Shapes..Text..font
Fields
FieldTypeDescription

family§StringThe family name of the font.
style§StringThe name of the face's style. May be empty.
PostScript_name§SymbolA §Symbol corresponding to the PostScript name of the face. This is the key that would identify the font if it was not embedded in the produced pdf file (currently Shapes only supports embedded fonts), and may be seen in error messages.
kerning?§BooleanWhether the face's metrics support kern pairs. This may be true even if there are actually no kern pairs in the font, as long as it is not expected that there should have been at least some kern pairs.
glyphmethod
char::§Character (> odd?::§odd? paths::§MultiPath advance::§Length <)
Dynamic references:none
Return the paths that generate the image of the glyph corresponding to char, along with the kind of painting/clipping operation that should be applied to the paths to generate the image, and by how much the text drawing position should be advanced after the glyph has been painted.
Description
Support for other fonts than the standard fonts of the pdf standard (these are restricted to the characters in the MacRoman encoding) is only available if the Shapes compiler has been built with the optional FreeType library.
§TextOperation
Abstraction:
An object to be used with §•Text.
Construction
Fields
A value of type §TextOperation has no fields.
Description
This type has several subtypes, but only one of them (§KernedText) can be constructed by the user; other subtypes are currently only used internally in the Shapes compiler.
§KernedText
  isa  §TextOperation
Abstraction:
A string of text, possibly with kerning distances inserted between some of the characters.
Construction
See also:  ..Shapes..Text..kerning  ..Shapes..Text..kern
Fields
FieldTypeDescription

list§Seq
A list of [§ConsPair §Length §TextOperation] pairs with horizontal position and a text operation corresponding to the individual characters.
§TextRenderingMode
Abstraction:
Indicate wheter to stroke and/or fill rendered text, used with ..Shapes..Text..@rendering.
Construction
See also:  ..Shapes..Text..textmode
Fields
FieldTypeDescription

fill§BooleanWhether rendered text shall be filled.
stroke§BooleanWhether rendered text shall be stroked.
Description
The text rendering modes os Shapes correspond directly to the non-clipping text rendering modes in pdf. The clipping rendering modes are used internally, but are only accessible to users through ..Shapes..Graphics..clip.
See the design note in ..Shapes..Text..@rendering for the motivation behind this type.

Other

Here, various types that don't fit in the above cathegories are placed.
§Backtrace    §DynamicBindings    §Exception    §RandomSeed   
§DynamicBindings
Abstraction:
Represents dynamic bindings that can be put in scope using the with-dynamic syntax.
Construction
See also:  ..Shapes..bindings
Fields
A value of type §DynamicBindings has no fields.
Involved operators

Binary operators
TypeOperatorTypeResultDescription

§DynamicBindings&§DynamicBindings§DynamicBindings Dynamic binding union.
§DynamicBindings&|§DynamicBindings§DynamicBindings Asymmetric dynamic binding union. Bindings to the right take precedence over bindings to the left.

§RandomSeed
Abstraction:
This is the type of hot values that spawn §•Random states.
There is currently no documentation infrastructure for systematic documentation of types of hot values. This should be fixed once Shapes gets equpped with object oriented features and a type system.
Construction
Fields
A value of type §RandomSeed has no fields.
§Backtrace
Abstraction:
Wrapper for escape continuations, not allowing the continuation to be invoked, just allowing the continuation to be used to generate backtraces.
Construction
Syntax:  backtrace-escape-continuation
Fields
FieldTypeDescription

top?§BooleanTrue if there is no parent continuation.
up§BacktraceThe parent continuation.
Description
Direct access to non-escaping continuations is not permitted in Shapes because of all the semantic issues they bring to a language. However, to be able to build a good error-handling mechanism based on continuations it is neccessary to be able to capture the backtrace where the error occurs. Early versions of Shapes had a special error function that immediately aborted evaluation, using the compilers ability to generate the backtrace at the point where evaluation was aborted. However, to let the user program error-catching mechanisms it is necessary that evaluation may proceed for some time after the error occurs, and if it is later decided that the error cannot be handled one must be able to inform the user about where the error occurred. This means that the information available in a continuation must be possible to pass from the point where the error occurs to where it is handled. This type provides the means to do exactly that, and since it doesn't provide a way to invoke the continuation it wraps, its use has no serious implications for the semantics of the language.
See also:..Shapes..C—error
§Exception
Abstraction:
Exceptions that the user can catch by binding ..Shapes..C—error.
Construction
Fields
FieldTypeDescription

kind§SymbolKey telling the kind of exception. See list of symbols used by the core below.
source§StringShort string describing where the exception originated. For functions in the core, this will be the name of the function in the global environment. Intended both for display and comparison.
detailsdepends on kindAdditional info.
Description
The symbols used for the kind field are given by the table below.
Symbol Meaning Content of details
'out_of_range An argument to a function is out of range. A §Integer telling the index of the argument.
'type_mismatch An argument to a function has a type which cannot be handled. A §Integer telling the index of the argument.
'misc Miscellaneous error. void
'external An error occurred outside of Shapes. void
'PDF_version A pdf feature not supported by the used pdf version was needed. void
'dtmin A spline segment was too long in relation to ..Shapes..Geometry..arcdelta, causing the integration step length to be shorter than dtmin. A §Float less than 1 giving the ratio between the needed integration step length and dtmin.
'numeric A numeric problem was detected (likely because of ill-conditioned data). void

Graphics in 3d and lightening

There are two important differences when it comes to graphics in 3d compared to that in 2d. First, one has to consider the relation between the 3d scene where the objects are defined, and the 2d media they must eventually be incorporated with. Second, light modeling is a very important tool for obtaining reasonable colors of objects in 3d.

Composite

These types are defined in terms of other types. What this comes down to is classes of functions and structures, and union types.
§ArrowHead    §ArrowHead3D   
§ArrowHead
Abstraction:
An arrowhead that ..Shapes..Graphics..stroke can use when painting paths.
Defined as: ( ::§Path  (> picture::§Drawable cut::§Length <) )
See also:§ArrowHead3D
§ArrowHead3D
Abstraction:
This is the analogue of §ArrowHead, but in 3d instead of 2d.
Defined as: ( ::§Path3D  (> picture::§Drawable3D cut::§Length <) )
Get Shapes at SourceForge.net. Fast, secure and Free Open Source software downloads