<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dev.eiffel.com/index.php?action=history&amp;feed=atom&amp;title=Immutable_Interface</id>
	<title>Immutable Interface - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://dev.eiffel.com/index.php?action=history&amp;feed=atom&amp;title=Immutable_Interface"/>
	<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;action=history"/>
	<updated>2026-11-01T09:57:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14999&amp;oldid=prev</id>
		<title>Conaclos: English corrections</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14999&amp;oldid=prev"/>
		<updated>2014-02-01T18:20:44Z</updated>

		<summary type="html">&lt;p&gt;English corrections&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:20, 1 February 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l94&quot;&gt;Line 94:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 94:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Therefore the command &amp;#039;do_nothing&amp;#039; can be exported to no classes.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Therefore the command &amp;#039;do_nothing&amp;#039; can be exported to no classes.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* The command &#039;print&#039; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;can &lt;/del&gt;be called only with unqualified calls. It can be too exported to no classes.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* The command &#039;print&#039; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;could &lt;/ins&gt;be called only with unqualified calls. It can be too exported to no classes.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* The commands &amp;#039;copy&amp;#039; and &amp;#039;deep_copy&amp;#039; are probably used mainly through the queries &amp;#039;twin&amp;#039; and respectively &amp;#039;deep_twin&amp;#039;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* The commands &amp;#039;copy&amp;#039; and &amp;#039;deep_copy&amp;#039; are probably used mainly through the queries &amp;#039;twin&amp;#039; and respectively &amp;#039;deep_twin&amp;#039;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l149&quot;&gt;Line 149:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 149:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Inherited Creation Command ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Inherited Creation Command ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;A simple addition to Eiffel could be to allow the create clause in &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;the &lt;/del&gt;deferred classes.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;A simple addition to Eiffel could be to allow the create clause in deferred classes.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The creation commands declared in deferred classes would be inherited creation commands, i.e. creation commands implicitly declared in each descendants.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The creation commands declared in deferred classes would be inherited creation commands, i.e. creation commands implicitly declared in each descendants.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If an effective class declares no new creation commands then all inherited creation commands and the command &amp;#039;default_create&amp;#039; are creation commands.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If an effective class declares no new creation commands then all inherited creation commands and the command &amp;#039;default_create&amp;#039; are creation commands.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If an effective class declares new creation commands then all inherited creation commands and new ones are creation commands.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If an effective class declares new creation commands then all inherited creation commands and new ones are creation commands.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;An inherited command can be declared again in an effective class. This possibility allows then all inherited commands as creation commands without &#039;default_create&#039; (except if &#039;default_create&#039; is an inherited creation command).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;An inherited &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;creation &lt;/ins&gt;command can be declared again in an effective class. This possibility allows then all inherited commands as creation commands without &#039;default_create&#039; (except if &#039;default_create&#039; is an inherited creation command).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l204&quot;&gt;Line 204:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 204:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== ANY and inherited creation commands ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== ANY and inherited creation commands ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The mechanism described in the previous section is not usable on ANY. Indeed, ANY is an effective class.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The mechanism described in the previous section is not usable on ANY. Indeed, ANY is an effective class.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;However it &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;is &lt;/del&gt;very useful to allow the creation of ANY instance?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;However &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;is &lt;/ins&gt;it very useful to allow the creation of ANY instance?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;I have &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;no example &lt;/del&gt;of use of ANY instances. Maybe it is more relevant to make ANY as deferred class and then to use the inherited creation command mechanism.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;I have &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;not examples &lt;/ins&gt;of use of ANY instances. Maybe it is more relevant to make ANY as deferred class and then to use the inherited creation command mechanism.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Conaclos</name></author>
	</entry>
	<entry>
		<id>https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14900&amp;oldid=prev</id>
		<title>Conaclos: Minor corrections</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14900&amp;oldid=prev"/>
		<updated>2013-08-29T12:43:20Z</updated>

		<summary type="html">&lt;p&gt;Minor corrections&lt;/p&gt;
&lt;a href=&quot;https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;amp;diff=14900&amp;amp;oldid=14894&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Conaclos</name></author>
	</entry>
	<entry>
		<id>https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14894&amp;oldid=prev</id>
		<title>Conaclos: tag correction</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14894&amp;oldid=prev"/>
		<updated>2013-08-19T13:36:35Z</updated>

		<summary type="html">&lt;p&gt;tag correction&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:36, 19 August 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l200&quot;&gt;Line 200:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 200:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;e&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/&lt;/ins&gt;e&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Conclusion ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Conclusion ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Conaclos</name></author>
	</entry>
	<entry>
		<id>https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14893&amp;oldid=prev</id>
		<title>Conaclos: Page creation</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14893&amp;oldid=prev"/>
		<updated>2013-08-19T13:33:04Z</updated>

		<summary type="html">&lt;p&gt;Page creation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Immutability]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Eiffel Base 2 relies on immutable interfaces to design better abstractions and to allow a better use of the library.&lt;br /&gt;
This page sketch a solution to allow immutable interface designs.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
An interface is immutable if it exports only queries. The routines exported to no classes are not included in the interface.&lt;br /&gt;
Note that an immutable class has an immutable interface. However queries must be pures, i.e. with no side-effect.&lt;br /&gt;
&lt;br /&gt;
== Issue ==&lt;br /&gt;
Immutable interfaces are not conceivable in the current state of the Eiffel Standard.&lt;br /&gt;
Indeed, all classes inherit of ANY. However ANY exports some commands. Therefore no immutble interface is conceivable.&lt;br /&gt;
&lt;br /&gt;
ANY commands:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface&lt;br /&gt;
	ANY&lt;br /&gt;
	&lt;br /&gt;
feature -- Duplication&lt;br /&gt;
&lt;br /&gt;
	copy (other: like Current)&lt;br /&gt;
			-- Update current object using fields of object attached&lt;br /&gt;
			-- to `other&amp;#039;, so as to yield equal objects.&lt;br /&gt;
		require&lt;br /&gt;
			type_identity: same_type (other)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Current ~ other&lt;br /&gt;
&lt;br /&gt;
	frozen deep_copy (other: like Current)&lt;br /&gt;
			-- Effect equivalent to that of:&lt;br /&gt;
			--		copy (`other&amp;#039; . deep_twin)&lt;br /&gt;
		ensure&lt;br /&gt;
			deep_equal: deep_equal (Current, other)&lt;br /&gt;
	&lt;br /&gt;
feature -- Basic Operations&lt;br /&gt;
&lt;br /&gt;
	default_rescue&lt;br /&gt;
			-- Process exception for routines with no Rescue clause.&lt;br /&gt;
			-- (Default: do nothing.)&lt;br /&gt;
&lt;br /&gt;
	frozen do_nothing&lt;br /&gt;
			-- Execute a null action.&lt;br /&gt;
&lt;br /&gt;
feature -- Output&lt;br /&gt;
&lt;br /&gt;
	print (o: detachable ANY)&lt;br /&gt;
			-- Write terse external representation of `o&amp;#039;&lt;br /&gt;
			-- on standard output.&lt;br /&gt;
			&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make ANY as immutable interface ==&lt;br /&gt;
=== Export commands to no classes ===&lt;br /&gt;
* The command &amp;#039;default_rescue&amp;#039; allows to change an internal behavior. This command can be exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The command &amp;#039;do_nothing&amp;#039; is a procedur especially interresting for agent uses.&lt;br /&gt;
A qualified call of &amp;#039;do_nothing&amp;#039; on any objects is not usefull. An interresting use can be:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	EXAMPLE&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
	do_something&lt;br /&gt;
		do&lt;br /&gt;
			do_something_with (agent {A}.do_nothing)&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	do_something_with (a: PROCEDURE [ANY, TUPLE [A]])&lt;br /&gt;
		do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However the contravariance of the second generic parameter of PROCEDURE can remove this use:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	EXAMPLE&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
	do_something&lt;br /&gt;
		do&lt;br /&gt;
			do_something_with (agent do_nothing)&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	do_something_with (a: PROCEDURE [ANY, TUPLE [A]])&lt;br /&gt;
		do end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore the command &amp;#039;do_nothing&amp;#039; can be exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The command &amp;#039;print&amp;#039; can be called only with unqualified calls. It can be too exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The commands &amp;#039;copy&amp;#039; and &amp;#039;deep_copy&amp;#039; give us a challenge. Indeed they are used in queries (&amp;#039;twin&amp;#039; and &amp;#039;deep_twin&amp;#039;).&lt;br /&gt;
We can note that they are mainly used to initialize a freshly created object.&lt;br /&gt;
&lt;br /&gt;
We can imagine that &amp;#039;twin&amp;#039; and &amp;#039;deep_twin&amp;#039; create a new object and then apply &amp;#039;copy&amp;#039; or respectively &amp;#039;deep_copy&amp;#039;.&lt;br /&gt;
This process does not folow the Eiffel creation phillosophy.&lt;br /&gt;
Maybe it is an opportunity to correct it and then to concretise the queries &amp;#039;twin&amp;#039; and &amp;#039;deep_twin&amp;#039; with Eiffel code.&lt;br /&gt;
&lt;br /&gt;
A solution would be to make both commands as creation commands.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	ANY&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
	copy,&lt;br /&gt;
	deep_copy,&lt;br /&gt;
	default_create&lt;br /&gt;
&lt;br /&gt;
feature {NONE}-- Duplication&lt;br /&gt;
	&lt;br /&gt;
	copy (other: like Current)&lt;br /&gt;
			-- Update current object using fields of object attached&lt;br /&gt;
			-- to `other&amp;#039;, so as to yield equal objects.&lt;br /&gt;
		require&lt;br /&gt;
			type_identity: same_type (other)&lt;br /&gt;
		external&lt;br /&gt;
			&amp;quot;built_in&amp;quot;&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Current ~ other&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	-- ...&lt;br /&gt;
		&lt;br /&gt;
feature -- Duplication&lt;br /&gt;
&lt;br /&gt;
	frozen twin: like Current&lt;br /&gt;
			-- New object equal to `Current&amp;#039;&lt;br /&gt;
			-- `twin&amp;#039; calls `copy&amp;#039;; to change copying/twinning semantics, redefine `copy&amp;#039;.&lt;br /&gt;
		do&lt;br /&gt;
			create Result.copy (Current)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Result ~ Current&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	-- ...&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The both commands can be exported to no classes and two queries can be writed in Eiffel code.&lt;br /&gt;
However the developper must declare the creation commands for ecah effective class.&lt;br /&gt;
&lt;br /&gt;
To remove this issue we can introduce the inherited creation commands.&lt;br /&gt;
&lt;br /&gt;
=== Inherited creation commands ===&lt;br /&gt;
A simple addition to Eiffel could be to allow the create clause in the deferred classes.&lt;br /&gt;
The creation commands declared in deferred classes would be inherited creation commands.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
create -- inherited&lt;br /&gt;
	make&lt;br /&gt;
&lt;br /&gt;
feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
	make (a_n: INTEGER)&lt;br /&gt;
		do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	B&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
	-- make is a creation procedure&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This addition does not affect existing code. The compatibility is preserved.&lt;br /&gt;
And more it can be usefull in constrained generic context.&lt;br /&gt;
&lt;br /&gt;
=== ANY and inherited creation commands ===&lt;br /&gt;
The mechanism described in the previous section is not usable on ANY. Indeed, ANY is an effetcive class.&lt;br /&gt;
However it is very usefull to allow the creation of ANY instance?&lt;br /&gt;
&lt;br /&gt;
I have no example of use of ANY instances. Maybe it is more relevant to make ANY as deferred class and then to use the inherited creation command mechanism.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	ANY&lt;br /&gt;
&lt;br /&gt;
create -- inherited creation commands&lt;br /&gt;
	copy,&lt;br /&gt;
	deep_copy&lt;br /&gt;
	&lt;br /&gt;
feature&lt;br /&gt;
	-- ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;e/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
The proposition allows the design of full immutable interfaces.&lt;br /&gt;
&lt;br /&gt;
The inherited creation command is a minimal mechanism compatible with existing software. It introduces no new keyword.&lt;br /&gt;
it allow to concretise two querise of ANY in Eiffel code and to export to no classes two problematic commands.&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>
	</entry>
</feed>