///|
let folded = UnicodeString::new("StraSSE").foldcase().into_string()
///|
let nfc = UnicodeString::new("e\u{301}").normalize_nfc().into_string()///|
test "unicode helpers" {
inspect(UnicodeChar::new('A').general_category(), content="Lu")
inspect(UnicodeChar::new('A').is_uppercase(), content="true")
inspect(UnicodeString::new("ABC").foldcase().into_string(), content="abc")
inspect(UnicodeString::new("AbC").downcase().into_string(), content="abc")
inspect(UnicodeString::new("abc").upcase().into_string(), content="ABC")
inspect(
UnicodeString::new("e\u{301}").normalize_nfc().into_string(),
content="\u{00e9}",
)
inspect(
UnicodeString::new("\u{00e9}").normalize_nfd().into_string(),
content="e\u{301}",
)
inspect(
UnicodeString::new("e\u{301}").normalize_nfc().foldcase().into_string(),
content="\u{00e9}",
)
inspect(
UnicodeString::new("e\u{301}").normalize_nfkd().into_string(),
content="e\u{301}",
)
inspect(
UnicodeString::new("\u{212b}").normalize_nfkc().into_string(),
content="\u{00c5}",
)
inspect(UnicodeString::new("Hi").into_string(), content="Hi")
}
///|
test "unicode empty normalization" {
inspect(UnicodeString::new("").normalize_nfkc().into_string(), content="")
}
///|
test "unicode char case" {
inspect(UnicodeChar::new('a').is_lowercase(), content="true")
inspect(UnicodeChar::new('0').is_alphabetic(), content="false")
match UnicodeChar::new('a').upcase() {
'A' => ()
_ => fail("expected A")
}
match UnicodeChar::new('A').downcase() {
'a' => ()
_ => fail("expected a")
}
}
///|
test "unicode titlecase" {
match UnicodeChar::new('\u{01C5}').general_category() {
"Lt" => ()
_ => fail("expected titlecase category")
}
match UnicodeChar::new('\u{01C5}').upcase() {
'\u{01C4}' | '\u{01C5}' => ()
_ => fail("expected titlecase upcase")
}
match UnicodeChar::new('\u{01C5}').downcase() {
'\u{01C6}' | '\u{01C5}' => ()
_ => fail("expected titlecase downcase")
}
match UnicodeChar::new('1').downcase() {
'1' => ()
_ => fail("expected unchanged")
}
}
///|
test "unicode hangul normalization" {
inspect(
UnicodeString::new("\u{AC01}").normalize_nfd().into_string(),
content="\u{1100}\u{1161}\u{11A8}",
)
inspect(
UnicodeString::new("\u{1100}\u{1161}\u{11A8}").normalize_nfc().into_string(),
content="\u{AC01}",
)
inspect(
UnicodeString::new("\u{0301}A").normalize_nfd().into_string(),
content="\u{0301}A",
)
inspect(
UnicodeString::new("B\u{0301}").normalize_nfc().into_string(),
content="B\u{0301}",
)
inspect(
UnicodeString::new("\u{212B}").normalize_nfkd().into_string(),
content="A\u{030A}",
)
inspect(
UnicodeString::new("\u{2460}").normalize_nfkd().into_string(),
content="1",
)
}
///|
test "binding helpers" {
let binding = Binding::new(1, Void)
inspect(binding.id(), content="1")
match binding.value() {
Void => ()
_ => fail("expected void")
}
}
///|
test "record field binding helpers" {
let binding = RecordFieldBinding::new("get", 0, None)
inspect(binding.accessor(), content="get")
inspect(binding.index(), content="0")
debug_inspect(binding.mutator(), content="None")
}
///|
test "datum constructors" {
match Datum::Int(42) {
Int(42) => ()
_ => fail("expected int datum")
}
let pair = Datum::Pair(Ref(Symbol("a")), Ref(Nil))
match pair {
Pair(car, cdr) =>
match (car.val, cdr.val) {
(Symbol("a"), Nil) => ()
_ => fail("expected (a)")
}
_ => fail("expected pair")
}
}impl Show for ParseErrortest "Binding::id" {
let binding = Binding::new(7, Void)
inspect(binding.id(), content="7")
}test "Binding::new" {
let binding = Binding::new(1, Void)
inspect(binding.id(), content="1")
}fn CaseClosure::new(id : Int, clauses : Array[CaseClause], env : Array[Map[String, Binding]]) -> CaseClosurefn Continuation::new(id : Int, kont : Kont, handlers : Array[Value], winds : Array[Winder]) -> Continuationpub(all) enum Datum {
Nil
Bool(Bool)
Int(Int)
BigInt(BigInt)
Rat(Int, Int)
BigRat(BigInt, BigInt)
Float(Float)
Complex(Ref[Datum], Ref[Datum])
Label(Int, Ref[Datum])
Char(Char)
String(Ref[String])
Symbol(String)
Pair(Ref[Datum], Ref[Datum])
Vector(Array[Datum])
ByteVector(Array[Int])
Record(Record)
Condition(Condition)
Value(Value)
}pub struct Hashtable {
id : Int
mutable : Bool
equiv : HashtableEquiv
hash : Value?
entries : Ref[Array[HashtableEntry]]
}fn Hashtable::new(id : Int, mutable : Bool, equiv : HashtableEquiv, hash : Value?, entries : Array[HashtableEntry]) -> Hashtablepub(all) enum Kont {
Halt
If(Datum, Datum, Array[Map[String, Binding]], Kont)
Begin(Array[Datum], Array[Map[String, Binding]], Kont)
Set(String, Array[Map[String, Binding]], Kont)
Define(String, Array[Map[String, Binding]], Kont)
AppFun(Array[Datum], Array[Map[String, Binding]], Kont)
AppArgs(Value, Array[Value], Array[Datum], Array[Map[String, Binding]], Kont)
And(Array[Datum], Array[Map[String, Binding]], Kont)
Or(Array[Datum], Array[Map[String, Binding]], Kont)
Cond(Array[Datum], Array[Datum], Array[Map[String, Binding]], Kont)
CondArrow(Value, Kont)
Let(Array[(String, Datum)], Int, Array[Value], Array[Map[String, Binding]], Array[Datum], Kont)
LetStar(Array[(String, Datum)], Int, Array[Map[String, Binding]], Array[Datum], Kont)
LetRec(Array[(String, Datum)], Int, Array[Map[String, Binding]], Array[Datum], Kont)
LetRecInit(Array[(String, Datum)], Int, Array[Value], Array[Map[String, Binding]], Array[Datum], Kont)
LetValues(Array[(Formals, Datum)], Int, Array[Array[(String, Value)]], Array[Map[String, Binding]], Array[Datum], Kont)
LetStarValues(Array[(Formals, Datum)], Int, Array[Map[String, Binding]], Array[Datum], Kont)
DefineValues(Formals, Array[Map[String, Binding]], Kont)
SyntaxCase(Array[Datum], Array[Map[String, Binding]], Kont)
ParameterizeParam(Array[(Datum, Datum)], Int, Array[Parameter], Array[Value], Array[Map[String, Binding]], Array[Datum], Kont)
ParameterizeValue(Array[(Datum, Datum)], Int, Array[Parameter], Array[Value], Array[Map[String, Binding]], Array[Datum], Kont)
ParameterizeConvert(Array[(Datum, Datum)], Int, Array[Parameter], Array[Value], Array[Map[String, Binding]], Array[Datum], Kont)
MakeParameter(Value, Kont)
SetParameter(Parameter, Kont)
GuardResult(GuardInfo)
GuardCond(Array[Datum], Array[Datum], Array[Map[String, Binding]], GuardInfo)
GuardCondArrow(Value, GuardInfo)
Case(Array[Datum], Array[Map[String, Binding]], Kont)
CaseArrow(Value, Kont)
CallWithValues(Value, Kont)
RecordConstructorDone(Kont)
RecordProtocolNApply(RecordType, Array[Value], Kont)
RecordProtocolNResult(RecordType, Kont)
DefineRecordType(String, String, RecordType, Array[RecordFieldBinding], Array[Map[String, Binding]], Kont)
DefineConditionType(String, String, RecordType, Array[RecordFieldBinding], Array[Map[String, Binding]], Kont)
HashtableFindResult(Hashtable, Value, Int, HashtableOp, Kont)
HashtableUpdateApply(Hashtable, Value, Int, Bool, Kont)
MapStep(Value, Array[Datum], Array[Datum], Bool, Kont)
VectorMapFinalize(Kont)
StringMapFinalize(Kont)
WindEnter(Value, Winder, Kont)
WindExit(Winder, Kont)
WindActions(Array[WindAction], Value, Kont, Array[Value])
WindPush(Winder, Array[WindAction], Value, Kont, Array[Value])
ForcePromise(Promise, Kont)
RaiseNonCont
RaiseCont(Kont)
RestoreHandlers(Array[Value], Kont)
}pub(all) enum Primitive {
Add
Sub
Mul
Div
NumEq
Less
Greater
LessEq
GreaterEq
Eq
Eqv
Equal
Cons
Car
Cdr
List
NullP
PairP
SymbolP
SymbolEq
IdentifierP
SyntaxP
FreeIdentifierEq
BoundIdentifierEq
SymbolToString
StringToSymbol
StringHash
StringCiHash
SymbolHash
EqualHash
SyntaxToDatum
DatumToSyntax
BooleanP
BooleanEq
NumberP
IntegerP
ExactIntegerP
RationalP
RealP
ComplexP
ExactP
InexactP
ZeroP
PositiveP
NegativeP
OddP
EvenP
FiniteP
InfiniteP
NanP
ProcedureP
RecordP
RecordRtd
RecordTypeDescriptorP
RecordConstructorDescriptorP
RecordTypeName
RecordTypeParent
RecordTypeUid
RecordTypeGenerativeP
RecordTypeSealedP
RecordTypeOpaqueP
RecordTypeFieldNames
RecordTypeFieldMutableP
RecordConstructorDescriptor
RecordConstructor
RecordPredicate
RecordAccessor
RecordMutator
MakeRecordTypeDescriptor
MakeRecordConstructorDescriptor
Condition
ConditionP
SimpleConditions
ConditionPredicate
ConditionAccessor
MakeEqHashtable
MakeEqvHashtable
MakeHashtable
HashtableP
HashtableSize
HashtableRef
HashtableSet
HashtableDelete
HashtableContainsP
HashtableUpdate
HashtableCopy
HashtableClear
HashtableKeys
HashtableEntries
HashtableEquivalenceFunction
HashtableHashFunction
HashtableMutableP
MakeEnumeration
EnumSetUniverse
EnumSetIndexer
EnumSetConstructor
EnumSetP
EnumSetMemberP
EnumSetSubsetP
EnumSetEq
EnumSetUnion
EnumSetIntersection
EnumSetDifference
EnumSetComplement
EnumSetProjection
EnumSetToList
Not
Apply
CallCC
Values
CallWithValues
MakeParameter
DynamicWind
Eval
Environment
PromiseP
MakePromise
Force
ExactToInexact
InexactToExact
ExactIntegerSqrt
Rationalize
NumberToString
StringToNumber
MakeRectangular
MakePolar
RealPart
ImagPart
Magnitude
Angle
Sqrt
Exp
Log
Expt
Sin
Cos
Tan
Asin
Acos
Atan
Numerator
Denominator
Abs
Quotient
Remainder
Modulo
Gcd
Lcm
Max
Min
Floor
Ceiling
Truncate
Round
BitwiseAnd
BitwiseIor
BitwiseXor
BitwiseNot
BitwiseIf
ArithmeticShift
BitwiseBitCount
BitwiseLength
BitwiseFirstBitSet
BitwiseBitSetP
BitwiseCopyBit
BitwiseBitField
BitwiseCopyBitField
BitwiseRotateBitField
BitwiseReverseBitField
FixnumP
FixnumWidth
LeastFixnum
GreatestFixnum
FxEq
FxLess
FxGreater
FxLessEq
FxGreaterEq
FxZeroP
FxPositiveP
FxNegativeP
FxOddP
FxEvenP
FxMin
FxMax
FxAdd
FxSub
FxMul
FxDiv
FxMod
FxDiv0
FxMod0
FxAddCarry
FxSubCarry
FxMulCarry
FxNot
FxAnd
FxIor
FxXor
FxIf
FxBitCount
FxLength
FxFirstBitSet
FxBitSetP
FxCopyBit
FxBitField
FxCopyBitField
FxRotateBitField
FxReverseBitField
FxArithmeticShift
FxArithmeticShiftLeft
FxArithmeticShiftRight
FlonumP
RealToFlonum
FixnumToFlonum
FlEq
FlLess
FlGreater
FlLessEq
FlGreaterEq
FlIntegerP
FlZeroP
FlPositiveP
FlNegativeP
FlOddP
FlEvenP
FlFiniteP
FlInfiniteP
FlNanP
FlMax
FlMin
FlAdd
FlMul
FlSub
FlDiv
FlAbs
FlDivAndMod
FlDivInt
FlMod
FlDiv0AndMod0
FlDiv0
FlMod0
FlNumerator
FlDenominator
FlFloor
FlCeiling
FlTruncate
FlRound
FlExp
FlLog
FlSin
FlCos
FlTan
FlAsin
FlAcos
FlAtan
FlSqrt
FlExpt
MakeVariableTransformer
GenerateTemporaries
ListP
MakeList
Length
Append
Reverse
ListRef
ListTail
Cxr(String)
Member
Memq
Memv
Assoc
Assq
Assv
Map
ForEach
SetCar
SetCdr
ListCopy
CharEq
CharLess
CharGreater
CharLessEq
CharGreaterEq
CharCiEq
CharCiLess
CharCiGreater
CharCiLessEq
CharCiGreaterEq
CharP
CharToInteger
IntegerToChar
CharAlphabeticP
CharNumericP
CharWhitespaceP
CharUpperCaseP
CharLowerCaseP
CharUpcase
CharDowncase
CharFoldcase
CharGeneralCategory
StringEq
StringLess
StringGreater
StringLessEq
StringGreaterEq
StringCiEq
StringCiLess
StringCiGreater
StringCiLessEq
StringCiGreaterEq
String
MakeString
StringP
StringLength
StringAppend
StringRef
StringSet
StringCopy
Substring
StringCopyBang
StringFill
StringToList
ListToString
StringMap
StringForEach
StringUpcase
StringDowncase
StringFoldcase
StringNormalizeNfc
StringNormalizeNfd
StringNormalizeNfkc
StringNormalizeNfkd
Vector
MakeVector
VectorP
VectorLength
VectorRef
VectorSet
VectorFill
VectorToList
ListToVector
VectorCopy
VectorCopyBang
VectorAppend
VectorMap
VectorForEach
ByteVector
MakeByteVector
ByteVectorP
ByteVectorLength
ByteVectorEq
ByteVectorU8Ref
ByteVectorU8Set
ByteVectorCopy
ByteVectorCopyBang
ByteVectorAppend
ByteVectorFill
ByteVectorToU8List
U8ListToByteVector
StringToUtf8
Utf8ToString
NativeEndianness
ByteVectorUintRef
ByteVectorSintRef
ByteVectorUintSet
ByteVectorSintSet
Display
Write
Newline
OpenOutputString
GetOutputString
CurrentOutputPort
WithExceptionHandler
Raise
RaiseContinuable
Error
AssertionViolation
ImplementationRestrictionViolation
UndefinedViolation
SyntaxViolation
} derive(Eq)pub struct RecordConstructorDescriptor {
id : Int
record_type : RecordType
parent_desc : RecordConstructorDescriptor?
protocol : Value?
}fn RecordConstructorDescriptor::new(id : Int, record_type : RecordType, parent_desc : RecordConstructorDescriptor?, protocol : Value?) -> RecordConstructorDescriptorpub struct RecordField {
name : String
mutable : Bool
}pub struct RecordFieldBinding {
accessor : String
index : Int
mutator : String?
}test "record field binding" {
let binding = RecordFieldBinding::new("get", 0, None)
inspect(binding.accessor(), content="get")
inspect(binding.index(), content="0")
debug_inspect(binding.mutator(), content="None")
}pub(all) enum RecordProcKind {
Constructor(RecordType)
Predicate(RecordType)
Accessor(RecordType, Int)
Mutator(RecordType, Int)
ProtocolN(RecordType, RecordConstructorDescriptor)
ProtocolP(RecordType, Array[Value])
}pub struct RecordType {
id : Int
name : String
parent : RecordType?
is_sealed : Bool
is_opaque : Bool
uid : String?
fields : Array[RecordField]
}fn RecordType::new(id : Int, name : String, parent : RecordType?, is_sealed : Bool, is_opaque : Bool, uid : String?, fields : Array[RecordField]) -> RecordTypepub struct RecordTypeDescriptor {
id : Int
record_type : RecordType
constructor_desc : RecordConstructorDescriptor
}fn RecordTypeDescriptor::new(id : Int, record_type : RecordType, constructor_desc : RecordConstructorDescriptor) -> RecordTypeDescriptorpub struct SyntaxRules {
literals : Array[String]
rules : Array[SyntaxRule]
ellipsis : String
kind : SyntaxRulesKind
def_env : Array[Map[String, Binding]]
}fn SyntaxRules::new(literals : Array[String], rules : Array[SyntaxRule], ellipsis : String, kind : SyntaxRulesKind, def_env : Array[Map[String, Binding]]) -> SyntaxRulespub struct UnicodeChar {
value : Char
}test "char downcase" {
inspect(UnicodeChar::new('A').downcase(), content="a")
}test "char foldcase" {
inspect(UnicodeChar::new('A').foldcase(), content="a")
}test "general category" {
inspect(UnicodeChar::new('A').general_category(), content="Lu")
}test "alphabetic predicate" {
inspect(UnicodeChar::new('A').is_alphabetic(), content="true")
inspect(UnicodeChar::new('1').is_alphabetic(), content="false")
}test "lowercase predicate" {
inspect(UnicodeChar::new('a').is_lowercase(), content="true")
inspect(UnicodeChar::new('A').is_lowercase(), content="false")
}test "uppercase predicate" {
inspect(UnicodeChar::new('A').is_uppercase(), content="true")
inspect(UnicodeChar::new('a').is_uppercase(), content="false")
}test "unicode char wrapper" {
inspect(UnicodeChar::new('A').is_uppercase(), content="true")
}test "char upcase" {
inspect(UnicodeChar::new('a').upcase(), content="A")
}pub struct UnicodeString {
value : String
}test "string downcase" {
inspect(UnicodeString::new("ABC").downcase().into_string(), content="abc")
}test "string foldcase" {
inspect(UnicodeString::new("ABC").foldcase().into_string(), content="abc")
}test "unicode string into_string" {
let wrapped = UnicodeString::new("Hi")
inspect(wrapped.into_string(), content="Hi")
}test "unicode string wrapper" {
inspect(
UnicodeString::new("e\u{301}").normalize_nfc().foldcase().into_string(),
content="\u{00e9}",
)
}test "normalize nfc" {
inspect(
UnicodeString::new("e\u{301}").normalize_nfc().into_string(),
content="\u{00e9}",
)
}test "normalize nfd" {
inspect(
UnicodeString::new("\u{00e9}").normalize_nfd().into_string(),
content="e\u{301}",
)
}test "normalize nfkc" {
inspect(
UnicodeString::new("\u{212b}").normalize_nfkc().into_string(),
content="\u{00c5}",
)
}test "normalize nfkd" {
inspect(
UnicodeString::new("\u{212b}").normalize_nfkd().into_string(),
content="A\u{30a}",
)
}test "string upcase" {
inspect(UnicodeString::new("abc").upcase().into_string(), content="ABC")
}pub(all) enum Value {
Void
Datum(Datum)
Primitive(Primitive)
Closure(Closure)
CaseClosure(CaseClosure)
Values(Array[Value])
GuardHandler(GuardHandler)
Parameter(Parameter)
Promise(Promise)
EvalEnv(EvalEnv)
Continuation(Continuation)
Port(Port)
Record(Record)
RecordProc(RecordProc)
ConditionProc(ConditionProc)
Hashtable(Hashtable)
EnumSet(EnumSet)
EnumSetProc(EnumSetProc)
RecordTypeDescriptor(RecordTypeDescriptor)
RecordConstructorDescriptor(RecordConstructorDescriptor)
SyntaxObject(SyntaxObject)
SyntaxKeyword(String)
Macro(MacroTransformer)
}