X-Git-Url: http://nitlanguage.org diff --git a/lib/standard/kernel.nit b/lib/standard/kernel.nit index 05d37a7..fb84d2e 100644 --- a/lib/standard/kernel.nit +++ b/lib/standard/kernel.nit @@ -17,6 +17,10 @@ module kernel import end # Mark this module is a top level one. (must be only one) +`{ +#include +`} + ############################################################################### # System Classes # ############################################################################### @@ -84,6 +88,11 @@ end class Sys # Instructions outside classes implicitly redefine this method. fun main do end + + # Number of the last error + fun errno: Int is extern `{ + return errno; + `} end ############################################################################### @@ -157,16 +166,10 @@ interface Discrete redef type OTHER: Discrete # The next element. - fun succ: OTHER do return self + 1 + fun successor(i: Int): OTHER is abstract # The previous element. - fun prec: OTHER do return self - 1 - - # The `i`-th successor element. - fun +(i: Int): OTHER is abstract - - # The `i`-th previous element. - fun -(i: Int): OTHER is abstract + fun predecessor(i: Int): OTHER is abstract # The distance between self and d. # @@ -188,13 +191,64 @@ interface Discrete var nb = 0 while cursor < stop do - cursor = cursor.succ + cursor = cursor.successor(1) nb += 1 end return nb end end +# A numeric value supporting mathematical operations +interface Numeric + super Comparable + + redef type OTHER: Numeric + + # Addition of `self` with `i` + fun +(i: OTHER): OTHER is abstract + + # Substraction of `i` from `self` + fun -(i: OTHER): OTHER is abstract + + # Inverse of `self` + fun -: OTHER is abstract + + # Multiplication of `self` with `i` + fun *(i: OTHER): OTHER is abstract + + # Division of `self` with `i` + fun /(i: OTHER): OTHER is abstract + + # The integer part of `self`. + # + # assert (0.0).to_i == 0 + # assert (0.9).to_i == 0 + # assert (-0.9).to_i == 0 + # assert (9.9).to_i == 9 + # assert (-9.9).to_i == -9 + fun to_i: Int is abstract + + # The float equivalent of `self` + # + # assert 5.to_f == 5.0 + # assert 5.to_f != 5 # Float and Int are not equals + fun to_f: Float is abstract + + # Is this the value of zero in its domain? + fun is_zero: Bool do return self == zero + + # The value of zero in the domain of `self` + fun zero: OTHER is abstract + + # The value of `val` in the domain of `self` + # + # assert 1.0.value_of(2) == 2.0 + # assert 1.0.value_of(2.0) == 2.0 + # assert 1.value_of(2) == 2 + # assert 1.value_of(2.0) == 2 + fun value_of(val: Numeric): OTHER is abstract +end + ############################################################################### # Native classes # ############################################################################### @@ -225,35 +279,42 @@ end # Native floating point numbers. # Corresponds to C float. universal Float + super Numeric + + redef type OTHER: Float + redef fun object_id is intern redef fun output is intern - fun <=(i: Float): Bool is intern - fun <(i: Float): Bool is intern - fun >=(i: Float): Bool is intern - fun >(i: Float): Bool is intern - fun +(i: Float): Float is intern - fun -: Float is intern - fun -(i: Float): Float is intern - fun *(i: Float): Float is intern - fun /(i: Float): Float is intern + redef fun <=(i): Bool is intern + redef fun <(i): Bool is intern + redef fun >=(i): Bool is intern + redef fun >(i): Bool is intern - # The integer part of `self`. - # - # assert (0.0).to_i == 0 - # assert (0.9).to_i == 0 - # assert (-0.9).to_i == 0 - # assert (9.9).to_i == 9 - # assert (-9.9).to_i == -9 - fun to_i: Int is intern + redef fun +(i) is intern + redef fun - is intern + redef fun -(i) is intern + redef fun *(i) is intern + redef fun /(i) is intern + + redef fun to_i is intern + redef fun to_f do return self + + redef fun zero do return 0.0 + redef fun value_of(val) do return val.to_f end # Native integer numbers. # Correspond to C int. universal Int super Discrete + super Numeric + redef type OTHER: Int + redef fun successor(i) do return self + i + redef fun predecessor(i) do return self - i + redef fun object_id is intern redef fun hash do return self redef fun ==(i) is intern @@ -265,12 +326,16 @@ universal Int redef fun >=(i) is intern redef fun >(i) is intern redef fun +(i) is intern - fun -: Int is intern + + redef fun - is intern redef fun -(i) is intern - fun *(i: Int): Int is intern - fun /(i: Int): Int is intern + redef fun *(i) is intern + redef fun /(i) is intern fun %(i: Int): Int is intern + redef fun zero do return 0 + redef fun value_of(val) do return val.to_i + # `i` bits shift fo the left (aka <<) # # assert 5.lshift(1) == 10 @@ -281,14 +346,9 @@ universal Int # assert 5.rshift(1) == 2 fun rshift(i: Int): Int is intern - # The float equivalent of `self` - # - # assert 5.to_f == 5.0 - # assert 5.to_f != 5 # Float and Int are not equals - fun to_f: Float is intern + redef fun to_i do return self + redef fun to_f is intern - redef fun succ is intern - redef fun prec is intern redef fun distance(i) do var d = self - i @@ -441,8 +501,8 @@ universal Char redef fun >=(i) is intern redef fun >(i) is intern - redef fun succ is intern - redef fun prec is intern + redef fun successor(i) is intern + redef fun predecessor(i) is intern redef fun distance(c) do @@ -475,9 +535,6 @@ universal Char # assert '\n'.ascii == 10 fun ascii: Int is intern - redef fun +(i) is intern - redef fun -(i) is intern - # Return the lower case version of self. # If self is not a letter, then return self # @@ -553,7 +610,10 @@ universal Char end # Pointer classes are used to manipulate extern C structures. -extern Pointer +extern class Pointer # Is the address behind this Object at NULL? - fun address_is_null: Bool `{ return recv == NULL; `} + fun address_is_null: Bool is extern "address_is_null" + + # Free the memory pointed by this pointer + fun free `{ free(recv); `} end