ffi: update code with last syntax
[nit.git] / lib / standard / kernel.nit
index d47cf58..30e8449 100644 (file)
@@ -17,6 +17,10 @@ module kernel
 
 import end # Mark this module is a top level one. (must be only one)
 
+`{
+#include <errno.h>
+`}
+
 ###############################################################################
 # 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,56 @@ 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
+end
+
 ###############################################################################
 # Native classes                                                              #
 ###############################################################################
@@ -209,7 +255,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
@@ -222,35 +271,41 @@ 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
 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
@@ -262,12 +317,15 @@ 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
+
        # `i` bits shift fo the left (aka <<)
        #
        #     assert 5.lshift(1)    == 10
@@ -278,14 +336,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
@@ -438,8 +491,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
@@ -472,9 +525,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
        #
@@ -550,7 +600,7 @@ 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; `}