Differences between standard ECMA-367 and Eiffel Software implementation
"ETL 2" refers to the book "Eiffel: The Language" (2nd printing), published by Prentice Hall.
Kernel classes
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Fictitious class for tuples | TUPLE | No | Yes | Yes |
Features
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Prefix and infix feature names | infix "+" | Yes | No | Yes, marked as obsolete |
| Operator and bracket aliases | add alias "+" | No | Yes | Yes, except for new rules
for free operator names |
| Assigner command | item alias "[]" (index: INTEGER): G assign put | No | Yes | Yes |
Design by Contract
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Only postcondition clauses | ensure only a, b | No | Yes | No |
Genericity
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Mutually recursive constraints | A [H, G -> H]
B [H -> C, G -> ARRAY [H]] | No | Yes | Yes |
| Full mutually recursive constraints | A [H -> G, G -> H]
| No | Yes | Yes |
| Expandedness restriction on formal generic | A [reference G]
B [expanded H] | No | No | Yes |
Creating objects
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
Implicit creation procedure (version of
ANY.default_create) | class A feature ... end
-- The following instructions are equivalent:
create {A} a
create {A} a.default_create | No | Yes | Yes |
| Bang-bang syntax | !! a
!! a.make
!B! a
!B! a.make | Yes | No | Yes, marked as obsolete |
| Keyword syntax | create a
create a.make
create {B} a
create {B} a.make | No | Yes | Yes |
| Creation expression | print (create {TIME}.make_now) | No | Yes | Yes |
| Generic creation | create {G} x.make | No | Yes | Yes |
Attachment
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Preserving expandedness status
when attaching expanded object
to reference entity | x := y | No, object is copied to new
object of the corresponding
reference type | Yes | Yes, except for TYPED_POINTER
that is converted to POINTER before
reattachment |
| Reverse assignment (assignment attempt) | x ?= y | Yes | No | Yes. Marked as obsolete (V7.1). |
Feature calls
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Precursor call | Precursor | No | Yes | Yes |
| Non-object call | c := {COLOR}.green | No | Yes | Yes |
| Assigner call | x [i] := x [i] + 1 | No | Yes | Yes |
| Bracket expression as call target | x [i].update | No | No | Yes |
Void-safety
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Attachment marks | a: attached ANY
b: detachable ANY | No | Yes, attached by default | Yes, attached by default |
| Object test | attached {STRING} e as o | No | Yes | Yes |
| Attached target of a call | x.f | No | Yes | Yes, by option void_safety |
| Properly set variable | x := value
use (x) | No | Yes | Yes, by option void_safety |
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Separate declaration | a: separate ANY | No | No. separate reserved but not used | Yes. Object attached to a may be handled by different SCOOP processor. |
Expressions
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Bracket expression | y := x [i] | No | Yes | Yes |
| Creation expression | set_buffer (create {STRING}.make (100)) | No | Yes | Yes |
| Manifest type | {MY_TYPE} | No | Yes | Yes |
| Manifest tuple | [a, b, c] | No | Yes | Yes |
| Agent | list.do_all (agent print (?)) | No | Yes | Yes |
| Once manifest string | once "abc" | No | Yes | Yes |
Constants
| Feature | Example | ETL2 | ECMA-367 | EiffelStudio |
| Verbatim string |
x := "[
This string is left-adjusted.
]"
y := "{
This string is used "as is".
}"
| No | Yes | Yes |
| Manifest type qualifier | {INTEGER_8} 123 | No | Yes | Yes |
| Non-decimal integer | 0xFF | No | Yes | Yes |
| Integer with intermediate underscores | 1_000 0xFFFF_0000 | In groups by 3 digits | Yes | Yes |
Interfacing with external software
| Feature | ETL2 | ECMA-367 | EiffelStudio |
| Access to software written in C | Basic syntax for any external software | Registered sub-language | See details for C externals. |
| Access to software written in C++ | Basic syntax for any external software | Registered sub-language | See details for C++ externals. |
| Access to dynamically loaded libraries (DLLs) | Basic syntax for any external software | Registered sub-language | See details for Interfacing with DLLs. |
| Other external software | Basic syntax for any external software | Unregistered sub-language | No |