remove closures from code
[nit.git] / lib / standard / kernel.nit
index 17b3268..bf158a3 100644 (file)
@@ -11,8 +11,9 @@
 # You  are  allowed  to  redistribute it and sell it, alone or is a part of
 # another product.
 
+# Most minimal classes and methods.
 # This module is the root of the standard module hierarchy.
-package kernel
+module kernel
 
 import end # Mark this module is a top level one. (must be only one)
 
@@ -21,25 +22,33 @@ import end # Mark this module is a top level one. (must be only one)
 ###############################################################################
 
 # The root of the class hierarchy.
-# Each class implicitely specialize Object.
+# Each class implicitly specialize Object.
+#
+# Currently, Object is also used to collect all top-level methods.
 interface Object
-       # The unique object identifier in the class
+       # The unique object identifier in the class.
+       # Unless specific code, you should not use this method.
+       # The identifier is used internally to provide a hash value.
        fun object_id: Int is intern
 
-       # Return true is `self' and `other' have the same dynamic type
+       # Return true if `self` and `other` have the same dynamic type.
+       # Unless specific code, you should not use this method.
        fun is_same_type(other: Object): Bool is intern
 
-       # Have `self' and `other' the same value?
+       # Have `self` and `other` the same value?
        ##
-       # Implicitely, the default implementation, is ==
+       # The exact meaning of "same value" is let to the subclasses.
+       # Implicitly, the default implementation, is `is`
        fun ==(other: nullable Object): Bool do return self is other
 
-       # Have `self' and `other' different values?
+       # Have `self` and `other` different values?
        ##
-       # != is equivament with "not =".
+       # != is equivalent with "not ==".
        fun !=(other: nullable Object): Bool do return not (self == other)
 
        # Display self on stdout (debug only).
+       # This method MUST not be used by programs, it is here for debugging
+       # only and can be removed without any notice
        fun output
        do
                '<'.output
@@ -48,15 +57,28 @@ interface Object
        end
 
        # Display class name on stdout (debug only).
+       # This method MUST not be used by programs, it is here for debugging
+       # only and can be removed without any notice
        fun output_class_name is intern 
 
-       protected fun exit(exit_value: Int) is intern # Quit the program.
-       protected fun sys: Sys is intern # The global sys object
+       # 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
+       ##
+       # Without redefinition, it is based on the `object_id` of the instance.
+       fun hash: Int do return object_id / 8
 end
 
 # The main class of the program.
+# `Sys` is a singleton class, its only instance is `sys` defined in `Object`.
+# `sys` is used to invoke methods on the program on the system.
 class Sys
-       # Instructions outside classes implicetely redefine this method.
+       # Instructions outside classes implicitly redefine this method.
        fun main do end
 end
 
@@ -67,21 +89,25 @@ end
 # The ancestor of class where objects are in a total order.
 # In order to work, the method '<' has to be redefined.
 interface Comparable
+       # What `self` can be compared to?
        type OTHER: Comparable
 
-       # Is `self' lesser than `other'
+       # Is `self` lesser than `other`?
        fun <(other: OTHER): Bool is abstract 
 
-       # not `other' < `self'
+       # not `other` < `self`
+       # Note, the implementation must ensure that: `(x<=y) == (x<y or x==y)`
        fun <=(other: OTHER): Bool do return not other < self
 
-       # not `self' < `other' 
+       # not `self` < `other`
+       # Note, the implementation must ensure that: `(x>=y) == (x>y or x==y)`
        fun >=(other: OTHER): Bool do return not self < other
 
-       # `other' < `self'
+       # `other` < `self`
        fun >(other: OTHER): Bool do return other < self
 
        # -1 if <, +1 if > and 0 otherwise
+       # Note, the implementation must ensure that: (x<=>y == 0) == (x==y)
        fun <=>(other: OTHER): Int
        do
                if self < other then
@@ -99,7 +125,7 @@ interface Comparable
                return c <= self and self <= d
        end
 
-       # The maximum between `self' and `other' (prefers `self' if equals).
+       # The maximum between `self` and `other` (prefers `self` if equals).
        fun max(other: OTHER): OTHER
        do
                if self < other then
@@ -109,7 +135,7 @@ interface Comparable
                end
        end
 
-       # The minimum between `self' and `c' (prefer `self' if equals)
+       # The minimum between `self` and `c` (prefer `self` if equals)
        fun min(c: OTHER): OTHER
        do
                if c < self then
@@ -132,15 +158,16 @@ interface Discrete
        # The previous element.
        fun prec: OTHER do return self - 1
 
-       # The `i' th successor element.
+       # The `i`-th successor element.
        fun +(i: Int): OTHER is abstract
 
-       # The `i' th previous element.
+       # The `i`-th previous element.
        fun -(i: Int): OTHER is abstract
 
        # The distance between self and d.
-       # 10.distance(15)       # --> 5
-       # 'Z'.distance('A')     # --> 25
+       #
+       #     assert 10.distance(15)         ==  5
+       #     assert 'Z'.distance('A')       ==  25
        fun distance(d: OTHER): Int
        do
                var cursor: OTHER
@@ -168,16 +195,24 @@ end
 # Native classes                                                              #
 ###############################################################################
 
-# Native booleans.
-# `true' and `false' are the only instances.
-# Boolean are manipulated trought three special operators:
-#       `and', `or', `not'.
+# Native Booleans.
+# `true` and `false` are the only instances.
+# Boolean are manipulated trough three special operators:
+#       `and`, `or`, `not`.
 # Booleans are mainly used by conditional statement and loops.
 universal Bool
        redef fun object_id is intern
        redef fun ==(b) is intern
        redef fun !=(b) is intern
        redef fun output is intern
+       redef fun hash
+       do
+               if self then
+                       return 1
+               else
+                       return 0
+               end
+       end
 end
 
 # Native floating point numbers.
@@ -195,8 +230,14 @@ universal Float
        fun -(i: Float): Float is intern
        fun *(i: Float): Float is intern
        fun /(i: Float): Float is intern
-       
-       # The integer part of `self'.
+
+       # 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
 end
 
@@ -207,6 +248,7 @@ universal Int
        redef type OTHER: Int
 
        redef fun object_id is intern
+       redef fun hash do return self
        redef fun ==(i) is intern
        redef fun !=(i) is intern
        redef fun output is intern
@@ -220,11 +262,22 @@ universal Int
        redef fun -(i) is intern
        fun *(i: Int): Int is intern
        fun /(i: Int): Int is intern
-       fun %(i: Int): Int is intern   
+       fun %(i: Int): Int is intern
+
+       # `i` bits shift fo the left (aka <<)
+       #
+       #     assert 5.lshift(1)    == 10
        fun lshift(i: Int): Int is intern
-       fun rshift(i: Int): Int is intern   
 
-       # The float equivalent of `self'
+       # `i` bits shift fo the right (aka >>)
+       #
+       #     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 succ is intern
@@ -238,7 +291,7 @@ universal Int
                        return -d
                end
        end
-       
+
        redef fun <=>(other)
        do
                if self < other then
@@ -277,12 +330,19 @@ universal Int
                end
        end
 
-       # The character whose ASCII value is `self'.
+       # The character whose ASCII value is `self`.
+       #
+       #      assert 65.ascii   == 'A'
+       #      assert 10.ascii   == '\n'
        fun ascii: Char is intern
 
-       # Number of digits of an integer in base `b' plus one if negative)
+       # Number of digits of an integer in base `b` (plus one if negative)
+       #
+       #     assert 123.digit_count(10) == 3
+       #     assert 123.digit_count(2) == 7 # 1111011 in binary
        fun digit_count(b: Int): Int
        do
+               if b == 10 then return digit_count_base_10
                var d: Int # number of digits
                var n: Int # current number
                # Sign
@@ -298,14 +358,38 @@ universal Int
                # count digits
                while n > 0 do
                        d += 1
-                       n = n / b       # euclidian division /          
+                       n = n / b       # euclidian division /
                end
                return d
        end
 
+       # Optimized version for base 10
+       fun digit_count_base_10: Int
+       do
+               var val: Int
+               var result: Int
+               if self < 0 then
+                       result = 2
+                       val = -self
+               else
+                       result = 1
+                       val = self
+               end
+               loop
+                       if val < 10 then return result
+                       if val < 100 then return result+1
+                       if val < 1000 then return result+2
+                       if val < 10000 then return result+3
+                       val = val / 10000
+                       result += 4
+               end
+       end
+
        # Return the corresponding digit character
-       # If 0 <= `self' <= 9, return the corresponding character.
-       # If 10 <= `self' <= 36, return the corresponding letter [a..z].
+       # If 0 <= `self` <= 9, return the corresponding character.
+       #     assert 5.to_c    == '5'
+       # If 10 <= `self` <= 36, return the corresponding letter [a..z].
+       #     assert 15.to_c   == 'f'
        fun to_c: Char
        do
                assert self >= 0 and self <= 36 # TODO plan for this
@@ -316,37 +400,31 @@ universal Int
                end
        end
 
-       # Executre 'each' for each integer in [self..last]
-       fun enumerate_to(last: Int)
-               !each(i: Int)
+       # The absolute value of self
+       #
+       #     assert (-10).abs   == 10
+       #     assert 10.abs    == 10
+       #     assert 0.abs     == 0
+       fun abs: Int
        do
-               var cur = self
-               while cur <= last do
-                       each(cur)
-                       cur += 1
-               end
-       end
-
-       # Executre 'each' for each integer in [self..after[
-       fun enumerate_before(after: Int)
-               !each(i: Int)
-       do
-               var cur = self
-               while cur < after do
-                       each(cur)
-                       cur += 1
-               end
+           if self >= 0
+           then
+               return self
+           else
+               return -1 * self
+           end
        end
 end
 
 # Native characters.
 # Characters are denoted with simple quote.
-# eg. 'a' or '\n'.
+# eg. `'a'` or `'\n'`.
 universal Char
        super Discrete
        redef type OTHER: Char
 
        redef fun object_id is intern
+       redef fun hash do return ascii
        redef fun ==(o) is intern
        redef fun !=(o) is intern
        redef fun output is intern
@@ -369,7 +447,9 @@ universal Char
                end
        end
 
-       # If `self' is a digit then return this digit.
+       # If `self` is a digit then return this digit else return -1.
+       #
+       #     assert '5'.to_i    == 5
        fun to_i: Int
        do
 
@@ -383,13 +463,21 @@ universal Char
        end
 
        # the ascii value of self
+       #
+       #     assert 'a'.ascii    == 97
+       #     assert '\n'.ascii   == 10
        fun ascii: Int is intern
 
        redef fun +(i) is intern
        redef fun -(i) is intern
 
-       # Char to lower case
-       fun to_lower : Char
+       # Return the lower case version of self.
+       # If self is not a letter, then return self
+       #
+       #     assert 'A'.to_lower  == 'a'
+       #     assert 'a'.to_lower  == 'a'
+       #     assert '$'.to_lower  == '$'
+       fun to_lower: Char
        do
                if is_upper then
                        return (ascii + ('a'.distance('A'))).ascii
@@ -398,8 +486,13 @@ universal Char
                end
        end
 
-       # Char to upper case
-       fun to_upper : Char
+       # Return the upper case version of self.
+       # If self is not a letter, then return self
+       #
+       #     assert 'a'.to_upper  == 'A'
+       #     assert 'A'.to_upper  == 'A'
+       #     assert '$'.to_upper  == '$'
+       fun to_upper: Char
        do
                if is_lower then
                        return (ascii - ('a'.distance('A'))).ascii
@@ -407,22 +500,45 @@ universal Char
                        return self
                end
        end
-       
+
+       # Is self a digit? (from '0' to '9')
+       #
+       #     assert '0'.is_digit   == true
+       #     assert '9'.is_digit   == true
+       #     assert 'a'.is_digit   == false
        fun is_digit : Bool
        do
                return self >= '0' and self <= '9'
        end
-       
+
+       # Is self a lower case letter? (from 'a' to 'z')
+       #
+       #     assert 'a'.is_lower   == true
+       #     assert 'z'.is_lower   == true
+       #     assert 'A'.is_lower   == false
+       #     assert '$'.is_lower   == false
        fun is_lower : Bool
        do
                return self >= 'a' and self <= 'z'
        end
-       
+
+       # Is self a upper case letter? (from 'A' to 'Z')
+       #
+       #     assert 'A'.is_upper   == true
+       #     assert 'A'.is_upper   == true
+       #     assert 'z'.is_upper   == false
+       #     assert '$'.is_upper   == false
        fun is_upper : Bool
        do
                return self >= 'A' and self <= 'Z'
        end
-       
+
+       # Is self a letter? (from 'A' to 'Z' and 'a' to 'z')
+       #
+       #     assert 'A'.is_letter  == true
+       #     assert 'A'.is_letter  == true
+       #     assert 'z'.is_letter  == true
+       #     assert '$'.is_letter  == false
        fun is_letter : Bool
        do
                return is_lower or is_upper
@@ -430,5 +546,7 @@ universal Char
 end
 
 # Pointer classes are used to manipulate extern C structures.
-universal Pointer
+extern Pointer
+       # Is the address behind this Object at NULL?
+       fun address_is_null: Bool `{ return recv == NULL; `}
 end