Paste: records as a library feature
        
	
	
	
		| Author:  | ks | 
		| Mode:  | factor | 
		| Date:  | Tue, 25 May 2010 07:16:22 | 
	
	Plain Text |
	
	static Bool = NewBoolType();
static Int = NewIntType();
static Pointer[T] = NewPointerType(T);
static Array[T,n] = NewArrayType(T, n);
static Tuple[...T] = NewStructType(...T);
//
// RecordType
//
static RecordType[ID,F] = NewStructType(...FieldTypes(...F));
static FieldTypes = NewProcedure();
overload FieldTypes(first, ...rest) = (FieldType(...first), ...FieldTypes(...rest));
overload FieldTypes() = ();
static FieldType = NewProcedure();
overload FieldType(name, type) = type;
static RecordId = NewGlobalVariable(1);
static NextRecordId = NewProcedure();
overload NextRecordId() {
    var x = RecordId^;
    RecordId^ += 1;
    return x;
}
//
// Record
//
static Record = NewProcedure();
overload Record(fields) = RecordType[NextRecordId(), fields];
//
// fieldRef
//
static fieldRef = NewProcedure();
[ID, FIELDS]
overload fieldRef(x:RecordType[ID,FIELDS], ident) {
    return ref structRef(x, static FieldIndex(ident, static 0, ...FIELDS));
}
static FieldIndex = NewProcedure();
overload FieldIndex(ident, i, first, ...rest) {
    var name, type == first;
    if (name == ident)
        return i;
    return FieldIndex(ident, static i+1, ...rest);
}
overload FieldIndex(ident, i) {
    error("field not found");
}
//
// Node[T]
//
static Node[T] = Record((#value, T), (#next, Pointer[Node[T]]));
	
	
		New Annotation