import end # Mark this module is a top level one. (must be only one)
-`{
-#include <errno.h>
-`}
-
###############################################################################
# System Classes #
###############################################################################
fun is_same_instance(other: nullable Object): Bool is intern
# Have `self` and `other` the same value?
- ##
+ #
# The exact meaning of "same value" is let to the subclasses.
# Implicitly, the default implementation, is `is_same_instance`
fun ==(other: nullable Object): Bool do return self.is_same_instance(other)
# Have `self` and `other` different values?
- ##
+ #
# != is equivalent with "not ==".
fun !=(other: nullable Object): Bool do return not (self == other)
# 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
fun run do main
# Number of the last error
- fun errno: Int is extern `{
- return errno;
- `}
+ fun errno: Int is extern "sys_errno"
end
# Quit the program with a specific return code
end
end
+# Something that can be cloned
+#
+# This interface introduces the `clone` method used to duplicate an instance
+# Its specific semantic is let to the subclasses.
+interface Cloneable
+ # Duplicate `self`
+ #
+ # The specific semantic of this method is let to the subclasses;
+ # Especially, if (and how) attributes are cloned (depth vs. shallow).
+ #
+ # As a rule of thumb, the principle of least astonishment should
+ # be used to guide the semantic.
+ #
+ # Note that as the returned clone depends on the semantic,
+ # the `==` method, if redefined, should ensure the equality
+ # between an object and its clone.
+ fun clone: SELF is abstract
+end
+
# A numeric value supporting mathematical operations
interface Numeric
super Comparable
# Native Booleans.
# `true` and `false` are the only instances.
+#
# Boolean are manipulated trough three special operators:
-# `and`, `or`, `not`.
+# `and`, `or`, `not`.
+#
# Booleans are mainly used by conditional statement and loops.
universal Bool
redef fun object_id is intern
# assert 5.lshift(1) == 10
fun lshift(i: Int): Int is intern
+ # alias of `lshift`
+ fun <<(i: Int): Int do return lshift(i)
+
# `i` bits shift fo the right (aka >>)
#
# assert 5.rshift(1) == 2
fun rshift(i: Int): Int is intern
+ # alias of `rshift`
+ fun >>(i: Int): Int do return rshift(i)
+
redef fun to_i do return self
redef fun to_f is intern
# The character whose ASCII value is `self`.
#
- # assert 65.ascii == 'A'
- # assert 10.ascii == '\n'
+ # 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)
do
return is_lower or is_upper
end
+
+ # Is self a whitespace character?
+ #
+ # These correspond to the "Other" and "Separator" groups of the Unicode.
+ #
+ # In the ASCII encoding, this is those <= to space (0x20) plus delete (0x7F).
+ #
+ # assert 'A'.is_whitespace == false
+ # assert ','.is_whitespace == false
+ # assert ' '.is_whitespace == true
+ # assert '\t'.is_whitespace == true
+ fun is_whitespace: Bool
+ do
+ var i = ascii
+ return i <= 0x20 or i == 0x7F
+ end
end
# Pointer classes are used to manipulate extern C structures.
fun address_is_null: Bool is extern "address_is_null"
# Free the memory pointed by this pointer
- fun free `{ free(recv); `}
+ fun free is extern "free"
end