2e9c9ae274ba6cedcf5b359de15d782b37d3659b
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 # The unique object identifier in the class.
34 # Unless specific code, you should not use this method.
35 # The identifier is used internally to provide a hash value.
36 fun object_id
: Int is intern
38 # Return true if `self` and `other` have the same dynamic type.
39 # Unless specific code, you should not use this method.
40 fun is_same_type
(other
: Object): Bool is intern
42 # Return true if `self` and `other` are the same instance.
43 # Unless specific code, you should use `==` instead.
44 fun is_same_instance
(other
: nullable Object): Bool is intern
46 # Have `self` and `other` the same value?
48 # The exact meaning of "same value" is let to the subclasses.
49 # Implicitly, the default implementation, is `is_same_instance`
50 fun ==(other
: nullable Object): Bool do return self.is_same_instance
(other
)
52 # Have `self` and `other` different values?
54 # != is equivalent with "not ==".
55 fun !=(other
: nullable Object): Bool do return not (self == other
)
57 # Display self on stdout (debug only).
58 # This method MUST not be used by programs, it is here for debugging
59 # only and can be removed without any notice
67 # Display class name on stdout (debug only).
68 # This method MUST not be used by programs, it is here for debugging
69 # only and can be removed without any notice
70 fun output_class_name
is intern
72 # The hash code of the object.
73 # Assuming that a == b -> a.hash == b.hash
75 # Without redefinition, it is based on the `object_id` of the instance.
76 fun hash
: Int do return object_id
/ 8
79 # The main class of the program.
80 # `Sys` is a singleton class, its only instance is `sys` defined in `Object`.
81 # `sys` is used to invoke methods on the program on the system.
83 # Instructions outside classes implicitly redefine this method.
86 # The entry point for the execution of the whole program.
87 # Its job is to call `main` but some modules may want to refine it
88 # and inject specific work before or after the main part.
91 # Number of the last error
92 fun errno
: Int is extern `{
97 # Quit the program with a specific return code
98 fun exit
(exit_value
: Int) is intern
100 # Return the global sys object, the only instance of the `Sys` class.
101 fun sys
: Sys is intern
104 ###############################################################################
106 ###############################################################################
108 # The ancestor of class where objects are in a total order.
109 # In order to work, the method '<' has to be redefined.
111 # What `self` can be compared to?
112 type OTHER: Comparable
114 # Is `self` lesser than `other`?
115 fun <(other
: OTHER): Bool is abstract
117 # not `other` < `self`
118 # Note, the implementation must ensure that: `(x<=y) == (x<y or x==y)`
119 fun <=(other
: OTHER): Bool do return not other
< self
121 # not `self` < `other`
122 # Note, the implementation must ensure that: `(x>=y) == (x>y or x==y)`
123 fun >=(other
: OTHER): Bool do return not self < other
126 fun >(other
: OTHER): Bool do return other
< self
128 # -1 if <, +1 if > and 0 otherwise
129 # Note, the implementation must ensure that: (x<=>y == 0) == (x==y)
130 fun <=>(other
: OTHER): Int
134 else if other
< self then
142 fun is_between
(c
: OTHER, d
: OTHER): Bool
144 return c
<= self and self <= d
147 # The maximum between `self` and `other` (prefers `self` if equals).
148 fun max
(other
: OTHER): OTHER
157 # The minimum between `self` and `c` (prefer `self` if equals)
158 fun min
(c
: OTHER): OTHER
168 # Discrete total orders.
172 redef type OTHER: Discrete
175 fun successor
(i
: Int): OTHER is abstract
177 # The previous element.
178 fun predecessor
(i
: Int): OTHER is abstract
180 # The distance between self and d.
182 # assert 10.distance(15) == 5
183 # assert 'Z'.distance('A') == 25
184 fun distance
(d
: OTHER): Int
191 else if self > d
then
199 while cursor
< stop
do
200 cursor
= cursor
.successor
(1)
207 # A numeric value supporting mathematical operations
211 redef type OTHER: Numeric
213 # Addition of `self` with `i`
214 fun +(i
: OTHER): OTHER is abstract
216 # Substraction of `i` from `self`
217 fun -(i
: OTHER): OTHER is abstract
220 fun -: OTHER is abstract
222 # Multiplication of `self` with `i`
223 fun *(i
: OTHER): OTHER is abstract
225 # Division of `self` with `i`
226 fun /(i
: OTHER): OTHER is abstract
228 # The integer part of `self`.
230 # assert (0.0).to_i == 0
231 # assert (0.9).to_i == 0
232 # assert (-0.9).to_i == 0
233 # assert (9.9).to_i == 9
234 # assert (-9.9).to_i == -9
235 fun to_i
: Int is abstract
237 # The float equivalent of `self`
239 # assert 5.to_f == 5.0
240 # assert 5.to_f != 5 # Float and Int are not equals
241 fun to_f
: Float is abstract
243 # Is this the value of zero in its domain?
244 fun is_zero
: Bool do return self == zero
246 # The value of zero in the domain of `self`
247 fun zero
: OTHER is abstract
249 # The value of `val` in the domain of `self`
251 # assert 1.0.value_of(2) == 2.0
252 # assert 1.0.value_of(2.0) == 2.0
253 # assert 1.value_of(2) == 2
254 # assert 1.value_of(2.0) == 2
255 fun value_of
(val
: Numeric): OTHER is abstract
258 ###############################################################################
260 ###############################################################################
263 # `true` and `false` are the only instances.
264 # Boolean are manipulated trough three special operators:
265 # `and`, `or`, `not`.
266 # Booleans are mainly used by conditional statement and loops.
268 redef fun object_id
is intern
269 redef fun ==(b
) is intern
270 redef fun !=(b
) is intern
271 redef fun output
is intern
272 redef fun hash
do return to_i
274 # 1 if true and 0 if false
285 # Native floating point numbers.
286 # Corresponds to C float.
290 redef type OTHER: Float
292 redef fun object_id
is intern
293 redef fun ==(i
) is intern
294 redef fun !=(i
) is intern
295 redef fun output
is intern
297 redef fun <=(i
): Bool is intern
298 redef fun <(i
): Bool is intern
299 redef fun >=(i
): Bool is intern
300 redef fun >(i
): Bool is intern
302 redef fun +(i
) is intern
303 redef fun - is intern
304 redef fun -(i
) is intern
305 redef fun *(i
) is intern
306 redef fun /(i
) is intern
308 redef fun to_i
is intern
309 redef fun to_f
do return self
311 redef fun zero
do return 0.0
312 redef fun value_of
(val
) do return val
.to_f
318 else if other
< self then
325 redef fun is_between
(c
, d
)
327 if self < c
or d
< self then
353 # Native integer numbers.
354 # Correspond to C int.
359 redef type OTHER: Int
361 redef fun successor
(i
) do return self + i
362 redef fun predecessor
(i
) do return self - i
364 redef fun object_id
is intern
365 redef fun hash
do return self
366 redef fun ==(i
) is intern
367 redef fun !=(i
) is intern
368 redef fun output
is intern
370 redef fun <=(i
) is intern
371 redef fun <(i
) is intern
372 redef fun >=(i
) is intern
373 redef fun >(i
) is intern
374 redef fun +(i
) is intern
376 redef fun - is intern
377 redef fun -(i
) is intern
378 redef fun *(i
) is intern
379 redef fun /(i
) is intern
380 fun %(i
: Int): Int is intern
382 redef fun zero
do return 0
383 redef fun value_of
(val
) do return val
.to_i
385 # `i` bits shift fo the left (aka <<)
387 # assert 5.lshift(1) == 10
388 fun lshift
(i
: Int): Int is intern
390 # `i` bits shift fo the right (aka >>)
392 # assert 5.rshift(1) == 2
393 fun rshift
(i
: Int): Int is intern
395 redef fun to_i
do return self
396 redef fun to_f
is intern
398 redef fun distance
(i
)
412 else if other
< self then
419 redef fun is_between
(c
, d
)
421 if self < c
or d
< self then
446 # The character whose ASCII value is `self`.
448 # assert 65.ascii == 'A'
449 # assert 10.ascii == '\n'
450 fun ascii
: Char is intern
452 # Number of digits of an integer in base `b` (plus one if negative)
454 # assert 123.digit_count(10) == 3
455 # assert 123.digit_count(2) == 7 # 1111011 in binary
456 fun digit_count
(b
: Int): Int
458 if b
== 10 then return digit_count_base_10
459 var d
: Int # number of digits
460 var n
: Int # current number
465 else if self == 0 then
474 n
= n
/ b
# euclidian division /
479 # Optimized version for base 10
480 fun digit_count_base_10
: Int
492 if val
< 10 then return result
493 if val
< 100 then return result
+1
494 if val
< 1000 then return result
+2
495 if val
< 10000 then return result
+3
501 # Return the corresponding digit character
502 # If 0 <= `self` <= 9, return the corresponding character.
503 # assert 5.to_c == '5'
504 # If 10 <= `self` <= 36, return the corresponding letter [a..z].
505 # assert 15.to_c == 'f'
508 assert self >= 0 and self <= 36 # TODO plan for this
510 return (self + '0'.ascii
).ascii
512 return (self + ('a'.ascii
- 10)).ascii
516 # The absolute value of self
518 # assert (-10).abs == 10
519 # assert 10.abs == 10
533 # Characters are denoted with simple quote.
534 # eg. `'a'` or `'\n'`.
537 redef type OTHER: Char
539 redef fun object_id
is intern
540 redef fun hash
do return ascii
541 redef fun ==(o
) is intern
542 redef fun !=(o
) is intern
543 redef fun output
is intern
545 redef fun <=(i
) is intern
546 redef fun <(i
) is intern
547 redef fun >=(i
) is intern
548 redef fun >(i
) is intern
550 redef fun successor
(i
) is intern
551 redef fun predecessor
(i
) is intern
553 redef fun distance
(c
)
555 var d
= self.ascii
- c
.ascii
563 # If `self` is a digit then return this digit else return -1.
565 # assert '5'.to_i == 5
571 else if is_digit
then
572 return self.ascii
- '0'.ascii
574 return self.to_lower
.ascii
- 'a'.ascii
+ 10
578 # the ascii value of self
580 # assert 'a'.ascii == 97
581 # assert '\n'.ascii == 10
582 fun ascii
: Int is intern
584 # Return the lower case version of self.
585 # If self is not a letter, then return self
587 # assert 'A'.to_lower == 'a'
588 # assert 'a'.to_lower == 'a'
589 # assert '$'.to_lower == '$'
593 return (ascii
+ ('a'.distance
('A'))).ascii
599 # Return the upper case version of self.
600 # If self is not a letter, then return self
602 # assert 'a'.to_upper == 'A'
603 # assert 'A'.to_upper == 'A'
604 # assert '$'.to_upper == '$'
608 return (ascii
- ('a'.distance
('A'))).ascii
614 # Is self a digit? (from '0' to '9')
616 # assert '0'.is_digit == true
617 # assert '9'.is_digit == true
618 # assert 'a'.is_digit == false
621 return self >= '0' and self <= '9'
624 # Is self a lower case letter? (from 'a' to 'z')
626 # assert 'a'.is_lower == true
627 # assert 'z'.is_lower == true
628 # assert 'A'.is_lower == false
629 # assert '$'.is_lower == false
632 return self >= 'a' and self <= 'z'
635 # Is self a upper case letter? (from 'A' to 'Z')
637 # assert 'A'.is_upper == true
638 # assert 'A'.is_upper == true
639 # assert 'z'.is_upper == false
640 # assert '$'.is_upper == false
643 return self >= 'A' and self <= 'Z'
646 # Is self a letter? (from 'A' to 'Z' and 'a' to 'z')
648 # assert 'A'.is_letter == true
649 # assert 'A'.is_letter == true
650 # assert 'z'.is_letter == true
651 # assert '$'.is_letter == false
654 return is_lower
or is_upper
658 # Pointer classes are used to manipulate extern C structures.
660 # Is the address behind this Object at NULL?
661 fun address_is_null
: Bool is extern "address_is_null"
663 # Free the memory pointed by this pointer
664 fun free
`{ free(recv); `}