Files
eiffel-org/documentation/current/eiffelstudio/eiffelstudio-reference/compiler/differences-between-standard-ecma-367-and-eiffel-software-implementation.wiki
alexk 936114c4a7 Author:halw
Date:2009-06-17T12:38:25.000000Z


git-svn-id: https://svn.eiffel.com/eiffel-org/trunk@239 abb3cda0-5349-4a8f-a601-0c33ac3a8c38
2009-06-17 12:59:15 +00:00

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
|}