[[Property:title|Differences between ETL 2nd printing and Eiffel Software implementation]]
[[Property:link_title|ETL 2nd printing vs implementation]]
[[Property:weight|-9]]
[[Property:uuid|fc1e73f4-5646-aa41-e7fe-97dc6f3ceb04]]
{{seealso|See also: [[Differences between standard ECMA-367 and Eiffel Software implementation|Differences between standard ECMA-367 and Eiffel Software implementation]] }}
"ETL 2nd printing" refers to the book "Eiffel: The Language" (2nd printing), published by Prentice Hall.
==Added classes==
* New basic classes have been added: INTEGER_8, INTEGER_16, INTEGER_64 and WIDE_CHARACTER.{{seealso|[[Differences between standard ECMA-367 and Eiffel Software implementation|Differences between standard ECMA-367 and Eiffel Software implementation]] }}
==Added classes==
* New basic classes have been added: INTEGER_8, INTEGER_16, INTEGER_64 and WIDE_CHARACTER. INTEGER is now specified as having a 32 bits representation
* New TUPLE, ROUTINE, PROCEDURE and FUNCTION classes required by the agent mechanism.
==Added keywords==
* Precursor
* reference: new keyword to specify that a type is used as a reference type.
* agent: new keyword used by the agent mechanism.
* create: Instead of using the famous exclamation mark to create an instance of a class, you can use the keyword create. Below you will find a correspondence table between the old and the new syntaxes. The old syntax is still valid, but at some points Eiffel Software will remove it from its implementation:
{|
|-
| Old syntax
| New syntax
|-
| !! a
| create a
|-
| !! a.make
| create a.make
|-
| !B! a
| create {B} a
|-
| !B! a.make
| create {B} a.make
|}
* note: replacement for the keyword indexing.
* attribute: new keyword to declare attribute body.
* attached: new keyword to specify attached types and object tests.
* detachable: new keyword to specify detachable types.
==Added semantics==
* [[ET: Genericity and Arrays|Generic creation]]
* Expression creation: you can now create an object within an expression. For example, you want to create an object and pass it as an argument to a function. Whereas you had to create a local variable, create the object and pass it to the function, you now simply need to pass to the function the creation expression. Here is a small example:
{|
|-
| Old method
| New method
|-
|
local
a: STRING
do
!! a.make (10)
f (a)
end
|
do
f (create {STRING}.make (10))
end
|}
This is also very useful since it can improve the power of assertions.
* Mutually recursive constraints: one can now write class A [H, G->H] or class B [H -> C, G -> ARRAY [H]]. As a result, the declaration A [D, E] is valid only if E is a descendant of D. Similarly, the declaration B [E, ARRAY [D]] is not valid, if E is a descendant of D.
* [[ET: Other Mechanisms|Tuples]]
* [[ET: Agents|Agents]]
* Feature access:
local
value: INTEGER
do
value := {MY_CLASS}.value
end
The previous call is valid, if and only if:
** value is a feature representing a constant of a basic type (INTEGER, DOUBLE or CHARACTER)
** value is a C/C++/DLL external feature
** value is an IL static external feature
==Added external support==
Look at the page for [[C externals|C]] and [[C++ Externals|C++]] with the introduction of `struct` and C++ external features encapsulation.