1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2004-2008 Jean Privat <jean@pryen.org>
4 # Copyright 2006-2008 Floréal Morandat <morandat@lirmm.fr>
6 # This file is free software, which comes along with NIT. This software is
7 # distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8 # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
9 # PARTICULAR PURPOSE. You can modify it is you want, provided this header
10 # is kept unaltered, and a notification of the changes is added.
11 # You are allowed to redistribute it and sell it, alone or is a part of
14 # Most minimal classes and methods.
15 # This module is the root of the standard module hierarchy.
18 import end # Mark this module is a top level one. (must be only one)
24 ###############################################################################
26 ###############################################################################
28 # The root of the class hierarchy.
29 # Each class implicitly specialize Object.
31 # Currently, Object is also used to collect all top-level methods.
33 # Type of this instance, automatically specialized in every class
35 # A common use case of the virtual type `SELF` is to type an attribute and
36 # store another instance of the same type as `self`. It can also be used as as
37 # return type to a method producing a copy of `self` or returning an instance
38 # expected to be the exact same type as self.
40 # This virtual type must be used with caution as it can hinder specialization.
41 # In fact, it imposes strict restrictions on all sub-classes and their usage.
42 # For example, using `SELF` as a return type of a method `foo`
43 # forces all subclasses to ensure that `foo` returns the correct and updated
45 # A dangerous usage take the form of a method typed by `SELF` which creates
46 # and returns a new instance.
47 # If not correctly specialized, this method would break when invoked on a
50 # A general rule for safe usage of `SELF` is to ensure that inputs typed
51 # `SELF` are stored in attributes typed `SELF` and returned by methods typed
52 # `SELF`, pretty much the same things as you would do with parameter types.
55 # The unique object identifier in the class.
56 # Unless specific code, you should not use this method.
57 # The identifier is used internally to provide a hash value.
58 fun object_id
: Int is intern
60 # Return true if `self` and `other` have the same dynamic type.
61 # Unless specific code, you should not use this method.
62 fun is_same_type
(other
: Object): Bool is intern
64 # Return true if `self` and `other` are the same instance.
65 # Unless specific code, you should use `==` instead.
66 fun is_same_instance
(other
: nullable Object): Bool is intern
68 # Have `self` and `other` the same value?
70 # The exact meaning of "same value" is let to the subclasses.
71 # Implicitly, the default implementation, is `is_same_instance`
72 fun ==(other
: nullable Object): Bool do return self.is_same_instance
(other
)
74 # Have `self` and `other` different values?
76 # != is equivalent with "not ==".
77 fun !=(other
: nullable Object): Bool do return not (self == other
)
79 # Display self on stdout (debug only).
80 # This method MUST not be used by programs, it is here for debugging
81 # only and can be removed without any notice
89 # Display class name on stdout (debug only).
90 # This method MUST not be used by programs, it is here for debugging
91 # only and can be removed without any notice
92 fun output_class_name
is intern
94 # The hash code of the object.
95 # Assuming that a == b -> a.hash == b.hash
97 # Without redefinition, it is based on the `object_id` of the instance.
98 fun hash
: Int do return object_id
/ 8
101 # The main class of the program.
102 # `Sys` is a singleton class, its only instance is `sys` defined in `Object`.
103 # `sys` is used to invoke methods on the program on the system.
105 # Instructions outside classes implicitly redefine this method.
108 # The entry point for the execution of the whole program.
109 # Its job is to call `main` but some modules may want to refine it
110 # and inject specific work before or after the main part.
113 # Number of the last error
114 fun errno
: Int is extern `{
119 # Quit the program with a specific return code
120 fun exit
(exit_value
: Int) is intern
122 # Return the global sys object, the only instance of the `Sys` class.
123 fun sys
: Sys is intern
126 ###############################################################################
128 ###############################################################################
130 # The ancestor of class where objects are in a total order.
131 # In order to work, the method '<' has to be redefined.
133 # What `self` can be compared to?
134 type OTHER: Comparable
136 # Is `self` lesser than `other`?
137 fun <(other
: OTHER): Bool is abstract
139 # not `other` < `self`
140 # Note, the implementation must ensure that: `(x<=y) == (x<y or x==y)`
141 fun <=(other
: OTHER): Bool do return not other
< self
143 # not `self` < `other`
144 # Note, the implementation must ensure that: `(x>=y) == (x>y or x==y)`
145 fun >=(other
: OTHER): Bool do return not self < other
148 fun >(other
: OTHER): Bool do return other
< self
150 # -1 if <, +1 if > and 0 otherwise
151 # Note, the implementation must ensure that: (x<=>y == 0) == (x==y)
152 fun <=>(other
: OTHER): Int
156 else if other
< self then
164 fun is_between
(c
: OTHER, d
: OTHER): Bool
166 return c
<= self and self <= d
169 # The maximum between `self` and `other` (prefers `self` if equals).
170 fun max
(other
: OTHER): OTHER
179 # The minimum between `self` and `c` (prefer `self` if equals)
180 fun min
(c
: OTHER): OTHER
190 # Discrete total orders.
194 redef type OTHER: Discrete
197 fun successor
(i
: Int): OTHER is abstract
199 # The previous element.
200 fun predecessor
(i
: Int): OTHER is abstract
202 # The distance between self and d.
204 # assert 10.distance(15) == 5
205 # assert 'Z'.distance('A') == 25
206 fun distance
(d
: OTHER): Int
213 else if self > d
then
221 while cursor
< stop
do
222 cursor
= cursor
.successor
(1)
229 # A numeric value supporting mathematical operations
233 redef type OTHER: Numeric
235 # Addition of `self` with `i`
236 fun +(i
: OTHER): OTHER is abstract
238 # Substraction of `i` from `self`
239 fun -(i
: OTHER): OTHER is abstract
242 fun -: OTHER is abstract
244 # Multiplication of `self` with `i`
245 fun *(i
: OTHER): OTHER is abstract
247 # Division of `self` with `i`
248 fun /(i
: OTHER): OTHER is abstract
250 # The integer part of `self`.
252 # assert (0.0).to_i == 0
253 # assert (0.9).to_i == 0
254 # assert (-0.9).to_i == 0
255 # assert (9.9).to_i == 9
256 # assert (-9.9).to_i == -9
257 fun to_i
: Int is abstract
259 # The float equivalent of `self`
261 # assert 5.to_f == 5.0
262 # assert 5.to_f != 5 # Float and Int are not equals
263 fun to_f
: Float is abstract
265 # Is this the value of zero in its domain?
266 fun is_zero
: Bool do return self == zero
268 # The value of zero in the domain of `self`
269 fun zero
: OTHER is abstract
271 # The value of `val` in the domain of `self`
273 # assert 1.0.value_of(2) == 2.0
274 # assert 1.0.value_of(2.0) == 2.0
275 # assert 1.value_of(2) == 2
276 # assert 1.value_of(2.0) == 2
277 fun value_of
(val
: Numeric): OTHER is abstract
280 ###############################################################################
282 ###############################################################################
285 # `true` and `false` are the only instances.
287 # Boolean are manipulated trough three special operators:
288 # `and`, `or`, `not`.
290 # Booleans are mainly used by conditional statement and loops.
292 redef fun object_id
is intern
293 redef fun ==(b
) is intern
294 redef fun !=(b
) is intern
295 redef fun output
is intern
296 redef fun hash
do return to_i
298 # 1 if true and 0 if false
309 # Native floating point numbers.
310 # Corresponds to C float.
314 redef type OTHER: Float
316 redef fun object_id
is intern
317 redef fun ==(i
) is intern
318 redef fun !=(i
) is intern
319 redef fun output
is intern
321 redef fun <=(i
): Bool is intern
322 redef fun <(i
): Bool is intern
323 redef fun >=(i
): Bool is intern
324 redef fun >(i
): Bool is intern
326 redef fun +(i
) is intern
327 redef fun - is intern
328 redef fun -(i
) is intern
329 redef fun *(i
) is intern
330 redef fun /(i
) is intern
332 redef fun to_i
is intern
333 redef fun to_f
do return self
335 redef fun zero
do return 0.0
336 redef fun value_of
(val
) do return val
.to_f
342 else if other
< self then
349 redef fun is_between
(c
, d
)
351 if self < c
or d
< self then
358 # Compare float numbers with a given precision.
360 # Because of the loss of precision in floating numbers,
361 # the `==` method is often not the best way to compare them.
364 # assert 0.01.is_approx(0.02, 0.1) == true
365 # assert 0.01.is_approx(0.02, 0.001) == false
367 fun is_approx
(other
, precision
: Float): Bool
369 assert precision
>= 0.0
370 return self <= other
+ precision
and self >= other
- precision
392 # Native integer numbers.
393 # Correspond to C int.
398 redef type OTHER: Int
400 redef fun successor
(i
) do return self + i
401 redef fun predecessor
(i
) do return self - i
403 redef fun object_id
is intern
404 redef fun hash
do return self
405 redef fun ==(i
) is intern
406 redef fun !=(i
) is intern
407 redef fun output
is intern
409 redef fun <=(i
) is intern
410 redef fun <(i
) is intern
411 redef fun >=(i
) is intern
412 redef fun >(i
) is intern
413 redef fun +(i
) is intern
415 redef fun - is intern
416 redef fun -(i
) is intern
417 redef fun *(i
) is intern
418 redef fun /(i
) is intern
420 # Modulo of `self` with `i`.
422 # Finds the remainder of division of `self` by `i`.
426 fun %(i
: Int): Int is intern
428 redef fun zero
do return 0
429 redef fun value_of
(val
) do return val
.to_i
431 # `i` bits shift fo the left (aka <<)
433 # assert 5.lshift(1) == 10
434 fun lshift
(i
: Int): Int is intern
436 # `i` bits shift fo the right (aka >>)
438 # assert 5.rshift(1) == 2
439 fun rshift
(i
: Int): Int is intern
441 redef fun to_i
do return self
442 redef fun to_f
is intern
444 redef fun distance
(i
)
458 else if other
< self then
465 redef fun is_between
(c
, d
)
467 if self < c
or d
< self then
492 # The character whose ASCII value is `self`.
494 # assert 65.ascii == 'A'
495 # assert 10.ascii == '\n'
496 fun ascii
: Char is intern
498 # Number of digits of an integer in base `b` (plus one if negative)
500 # assert 123.digit_count(10) == 3
501 # assert 123.digit_count(2) == 7 # 1111011 in binary
502 fun digit_count
(b
: Int): Int
504 if b
== 10 then return digit_count_base_10
505 var d
: Int # number of digits
506 var n
: Int # current number
511 else if self == 0 then
520 n
= n
/ b
# euclidian division /
525 # Optimized version for base 10
526 fun digit_count_base_10
: Int
538 if val
< 10 then return result
539 if val
< 100 then return result
+1
540 if val
< 1000 then return result
+2
541 if val
< 10000 then return result
+3
547 # Return the corresponding digit character
548 # If 0 <= `self` <= 9, return the corresponding character.
549 # assert 5.to_c == '5'
550 # If 10 <= `self` <= 36, return the corresponding letter [a..z].
551 # assert 15.to_c == 'f'
554 assert self >= 0 and self <= 36 # TODO plan for this
556 return (self + '0'.ascii
).ascii
558 return (self + ('a'.ascii
- 10)).ascii
562 # The absolute value of self
564 # assert (-10).abs == 10
565 # assert 10.abs == 10
579 # Characters are denoted with simple quote.
580 # eg. `'a'` or `'\n'`.
583 redef type OTHER: Char
585 redef fun object_id
is intern
586 redef fun hash
do return ascii
587 redef fun ==(o
) is intern
588 redef fun !=(o
) is intern
589 redef fun output
is intern
591 redef fun <=(i
) is intern
592 redef fun <(i
) is intern
593 redef fun >=(i
) is intern
594 redef fun >(i
) is intern
596 redef fun successor
(i
) is intern
597 redef fun predecessor
(i
) is intern
599 redef fun distance
(c
)
601 var d
= self.ascii
- c
.ascii
609 # If `self` is a digit then return this digit else return -1.
611 # assert '5'.to_i == 5
617 else if is_digit
then
618 return self.ascii
- '0'.ascii
620 return self.to_lower
.ascii
- 'a'.ascii
+ 10
624 # the ascii value of self
626 # assert 'a'.ascii == 97
627 # assert '\n'.ascii == 10
628 fun ascii
: Int is intern
630 # Return the lower case version of self.
631 # If self is not a letter, then return self
633 # assert 'A'.to_lower == 'a'
634 # assert 'a'.to_lower == 'a'
635 # assert '$'.to_lower == '$'
639 return (ascii
+ ('a'.distance
('A'))).ascii
645 # Return the upper case version of self.
646 # If self is not a letter, then return self
648 # assert 'a'.to_upper == 'A'
649 # assert 'A'.to_upper == 'A'
650 # assert '$'.to_upper == '$'
654 return (ascii
- ('a'.distance
('A'))).ascii
660 # Is self a digit? (from '0' to '9')
662 # assert '0'.is_digit == true
663 # assert '9'.is_digit == true
664 # assert 'a'.is_digit == false
667 return self >= '0' and self <= '9'
670 # Is self a lower case letter? (from 'a' to 'z')
672 # assert 'a'.is_lower == true
673 # assert 'z'.is_lower == true
674 # assert 'A'.is_lower == false
675 # assert '$'.is_lower == false
678 return self >= 'a' and self <= 'z'
681 # Is self a upper case letter? (from 'A' to 'Z')
683 # assert 'A'.is_upper == true
684 # assert 'A'.is_upper == true
685 # assert 'z'.is_upper == false
686 # assert '$'.is_upper == false
689 return self >= 'A' and self <= 'Z'
692 # Is self a letter? (from 'A' to 'Z' and 'a' to 'z')
694 # assert 'A'.is_letter == true
695 # assert 'A'.is_letter == true
696 # assert 'z'.is_letter == true
697 # assert '$'.is_letter == false
700 return is_lower
or is_upper
704 # Pointer classes are used to manipulate extern C structures.
706 # Is the address behind this Object at NULL?
707 fun address_is_null
: Bool is extern "address_is_null"
709 # Free the memory pointed by this pointer
710 fun free
is extern "free"