package jazz.lang; /////////////////////////////////////////////////////////////////////////////// // // Builtin operators, functions, and methods // // The static members of class Builtin are always automatically imported // /////////////////////////////////////////////////////////////////////////////// public native interface _ { public toString(): String; } public final abstract class Builtin { //////////////////////////////// // Generic arithmetic operators //////////////////////////////// // Binary plus public static (+\2)<T: Arith>(x: T, y: T): T; // Unary plus public static (+\1)<T: Arith>(x: T): T; // Binary minus public static (-\2)<T: Arith>(x: T, y: T): T; // Unary minus public static (-\1)<T: Arith>(x: T): T; // Multiplications public static (*)<T: Arith>(x: T, y: T): T; // Power public static native (**)<T: float>(x: T, n: int): T = "%pow"; // Modulo public static native (%)<T: per>(x: T, y: T): T = "%imod"; // Euclidian division public static native (div)(x: rat, y: rat): int = "%idiv"; // Exact division public static native (/)<T: float>(x: T, y: T): T {rat <: T} = "%div"; // Shift to lsb public static native (>>)<T: per>(x: T, n: int): T = "%rshift"; // Shift to msb public static native (<<)<T: per>(x: T, n: int): T = "%lshift"; // Equality public static (==)<T>(x: T, y: T): boolean; // By default, (x != y) is !(x == y) public static (!=)<T>(x: T, y: T): boolean; // Inequality public static (<=)<T: Comparable>(x: T, y: T): boolean; // By default, (x < y) is (x <= y && !(x == y)) public static (<)<T: Comparable>(x: T, y: T): boolean; // By default, (x > y) is (y < x) public static (>)<T: Comparable>(x: T, y: T): boolean; // By default, (x >= y) is (y <= x) public static (>=)<T: Comparable>(x: T, y: T): boolean; // And public static (&)<T: Lattice>(x: T, y: T): T; // Or public static (|)<T: Lattice>(x: T, y: T): T; // Xor public static (^)<T: BooleanAlgebra>(x: T, y: T): T; // Not public static (~)<T: BooleanAlgebra>(x: T): T; // Conditional public static cond<T: BooleanAlgebra>(x: T, y: T, z: T): T; // Sequential logical and public static native (&&)(x: boolean, y: boolean): boolean = "%logical_and"; // Sequential or public static native (||)(x: boolean, y: boolean): boolean = "%logical_or"; // Logical not public static native (!)(x: boolean): boolean = "%logical_not"; } /////////////////////////////////////////////////////////////////////////////// // // Implementation // /////////////////////////////////////////////////////////////////////////////// // Default implementation of "toString" toString@_() = s { if (native("boolean " "fr.ensmp.cma.jazz.runtime.Primitive.isTuple(java.lang.Object)", this)) { n = native("int fr.ensmp.cma.jazz.runtime.Tuple.size()", this): int; s' = ["(", i -> format("%s%s%a", s'[i-1], (i - 1 > 0 ? ", " : ""), native("%tupleElement", this, i - 1))]; s = format("%s)", s'[n]); } else { s = native("%defaultToString", this); } } // Equality operators native Builtin.(==)(x@_, y@_) = "%eq"; Builtin.(!=)(x@_, y@_) = !(x == y); Builtin.(<)(x@_, y@_) = (x <= y) && !(x == y); Builtin.(>)(x@_, y@_) = y < x; Builtin.(>=)(x@_, y@_) = y <= x;