mirror of
https://github.com/EiffelSoftware/eiffel-org.git
synced 2025-12-07 07:12:25 +01:00
Date:2009-06-17T12:38:25.000000Z git-svn-id: https://svn.eiffel.com/eiffel-org/trunk@239 abb3cda0-5349-4a8f-a601-0c33ac3a8c38
339 lines
6.5 KiB
Plaintext
339 lines
6.5 KiB
Plaintext
[[Property:title|Differences between standard ECMA-367 and Eiffel Software implementation]]
|
|
[[Property:weight|-10]]
|
|
[[Property:uuid|0eb58761-5b06-585f-ea92-cab2b8cd74b2]]
|
|
==Kernel classes==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Fictitious class for tuples
|
|
| <eiffel>TUPLE</eiffel>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|}
|
|
|
|
==Features==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Prefix and infix feature names
|
|
| <code>infix "+"</code>
|
|
| Yes
|
|
| No
|
|
| Yes
|
|
|-
|
|
| Operator and bracket aliases
|
|
| <code>add alias "+"</code>
|
|
| No
|
|
| Yes
|
|
| Yes, except for new rules for free operator names
|
|
|-
|
|
| Assigner command
|
|
| <code>item alias "[]" (index: INTEGER): G assign put</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|}
|
|
|
|
==Genericity==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Mutually recursive constraints
|
|
| <code>A [H, G -> H]</code><br/>
|
|
<code>B [H -> C, G -> ARRAY [H]]</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Full mutually recursive constraints
|
|
| <code>A [H -> G, G -> H]</code><br/>
|
|
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Expandedness restriction on formal generic
|
|
| <code>A [reference G]</code><br/>
|
|
<code>B [expanded H]</code>
|
|
| No
|
|
| No
|
|
| Yes
|
|
|}
|
|
|
|
==Creating objects==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Implicit creation procedure (version of <code>ANY.default_create</code>)
|
|
| <code>class A feature ... end</code><br/>
|
|
<code>-- The following instructions are equivalent:</code><br/>
|
|
<code>create {A} a</code><br/>
|
|
<code>create {A} a.default_create</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Bang-bang syntax
|
|
| <code>!! a</code><br/>
|
|
<code>!! a.make</code><br/>
|
|
<code>!B! a</code><br/>
|
|
<code>!B! a.make</code>
|
|
| Yes
|
|
| No
|
|
| Yes, marked as obsolete
|
|
|-
|
|
| Keyword syntax
|
|
| <code>create a</code><br/>
|
|
<code>create a.make</code><br/>
|
|
<code>create {B} a</code><br/>
|
|
<code>create {B} a.make</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Creation expression
|
|
| <code>print (create {TIME}.make_now)</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| [[ET: Genericity and Arrays|Generic creation]]
|
|
| <code>create {G} x.make</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|}
|
|
|
|
==Attachment==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Preserving expandedness status when attaching expanded object to reference entity
|
|
| <code>x</code> <code>:=</code> <code>y</code>
|
|
| 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
|
|
| <code>x</code> <code>?=</code> <code>y</code>
|
|
| Yes
|
|
| No
|
|
| Yes
|
|
|}
|
|
|
|
==Feature calls==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Precursor call
|
|
| <code>Precursor</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Non-object call
|
|
| <code>c := {COLOR}.green</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Assigner call
|
|
| <code>x</code> <code>[</code><code>i</code><code>]</code> <code>:=</code> <code>x</code> <code>[</code><code>i</code><code>]</code> <code>+</code> <code>1</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Bracket expression as call target
|
|
| <code>x</code> <code>[</code><code>i</code><code>]</code><code>.</code><eiffel>update</eiffel>
|
|
| No
|
|
| No
|
|
| Yes
|
|
|}
|
|
|
|
==Void safety==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Attachment marks
|
|
| <code>a: attached ANY</code> <br/>
|
|
<code>b: detachable ANY</code>
|
|
| No
|
|
| Yes, attached by default
|
|
| Yes, default attachment status is controlled by option ''is_attached_by_default''
|
|
|-
|
|
| Object test
|
|
| <code>{o: STRING} e</code>
|
|
| No
|
|
| Yes
|
|
| Yes, all object tests should use different names for locals inside a feature, object tests are not permitted in preconditions and check instructions
|
|
|-
|
|
| Attached target of a call
|
|
| <code>x.f</code>
|
|
| No
|
|
| Yes
|
|
| Yes, by option ''is_void_safe''
|
|
|-
|
|
| Properly set variable
|
|
| <code>x := value</code> <br/>
|
|
<code>use (x)</code>
|
|
| No
|
|
| Yes
|
|
| Yes, by option ''is_void_safe''
|
|
|}
|
|
|
|
==Expressions==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Bracket expression
|
|
| <code>y := x [i]</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Creation expression
|
|
| <code>set_buffer (create {STRING}.make (100))</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Manifest type
|
|
| <code>{MY_TYPE}</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Manifest [[ET: Other Mechanisms|tuple]]
|
|
| <code>[a, b, c]</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| [[ET: Agents|Agent]]
|
|
| <code>list.do_all (agent print (?))</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Once manifest string
|
|
| <code>once "abc"</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|}
|
|
|
|
==Constants==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''Example'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Verbatim string
|
|
|
|
|
<code>x := "[
|
|
This string is left-adjusted.
|
|
]"
|
|
y := "{
|
|
This string is used "as is".
|
|
}"</code>
|
|
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Manifest type qualifier
|
|
| <code>{INTEGER_8} 123</code>
|
|
| No
|
|
| Yes
|
|
| Yes
|
|
|-
|
|
| Non-decimal integer
|
|
| <code>0xFF</code>
|
|
| No
|
|
| Yes
|
|
| Hexadecimal integers
|
|
|-
|
|
| Integer with intermediate underscores
|
|
| <code>1_000 0xFFFF_0000</code>
|
|
| In groups by 3 digits
|
|
| Yes
|
|
| Yes
|
|
|}
|
|
|
|
==Interfacing with external software==
|
|
{|
|
|
|-
|
|
| <center>'''Feature'''</center>
|
|
| <center>'''ETL2'''</center>
|
|
| <center>'''ECMA-367'''</center>
|
|
| <center>'''EiffelStudio'''</center>
|
|
|-
|
|
| Access to software written in C
|
|
| Basic syntax for any external software
|
|
| Registered sub-language
|
|
| See details for [[C externals|C externals]]
|
|
|-
|
|
| Access to software written in C++
|
|
| Basic syntax for any external software
|
|
| Registered sub-language
|
|
| See details for [[C++ Externals|C++ externals]]
|
|
|-
|
|
| Access to dynamically loaded libraries (DLLs)
|
|
| Basic syntax for any external software
|
|
| Registered sub-language
|
|
| No
|
|
|-
|
|
| Other external software
|
|
| Basic syntax for any external software
|
|
| Unregistered sub-language
|
|
| No
|
|
|}
|
|
|
|
|
|
|
|
|