X-Git-Url: http://nitlanguage.org diff --git a/lib/standard/kernel.nit b/lib/standard/kernel.nit index 7457c08..2e9c9ae 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 # ############################################################################### @@ -65,12 +69,6 @@ interface Object # only and can be removed without any notice fun output_class_name is intern - # Quit the program with a specific return code - protected fun exit(exit_value: Int) is intern - - # Return the global sys object, the only instance of the `Sys` class. - protected fun sys: Sys is intern - # The hash code of the object. # Assuming that a == b -> a.hash == b.hash ## @@ -84,8 +82,25 @@ end class Sys # Instructions outside classes implicitly redefine this method. fun main do end + + # The entry point for the execution of the whole program. + # Its job is to call `main` but some modules may want to refine it + # and inject specific work before or after the main part. + fun run do main + + # Number of the last error + fun errno: Int is extern `{ + return errno; + `} end +# Quit the program with a specific return code +fun exit(exit_value: Int) is intern + +# Return the global sys object, the only instance of the `Sys` class. +fun sys: Sys is intern + + ############################################################################### # Abstract Classes # ############################################################################### @@ -209,6 +224,35 @@ interface Numeric # 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 ############################################################################### @@ -225,7 +269,10 @@ universal Bool redef fun ==(b) is intern redef fun !=(b) is intern redef fun output is intern - redef fun hash + redef fun hash do return to_i + + # 1 if true and 0 if false + fun to_i: Int do if self then return 1 @@ -243,6 +290,8 @@ universal Float redef type OTHER: Float redef fun object_id is intern + redef fun ==(i) is intern + redef fun !=(i) is intern redef fun output is intern redef fun <=(i): Bool is intern @@ -256,14 +305,49 @@ universal Float redef fun *(i) is intern redef fun /(i) 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 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 + + redef fun <=>(other) + do + if self < other then + return -1 + else if other < self then + return 1 + else + return 0 + end + end + + redef fun is_between(c, d) + do + if self < c or d < self then + return false + else + return true + end + end + + redef fun max(other) + do + if self < other then + return other + else + return self + end + end + + redef fun min(c) + do + if c < self then + return c + else + return self + end + end end # Native integer numbers. @@ -295,6 +379,9 @@ universal Int 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 @@ -305,11 +392,8 @@ 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 distance(i) do @@ -572,7 +656,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