| Online Eiffel Documentation

EiffelStudio

# Differences between ETL 2nd printing and Eiffel Software implementation

See also: 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

## Added semantics

- 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.
- Tuples
- 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 and C++ with the introduction of `struct' and C++ external features encapsulation.