<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://dev.eiffel.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Clemahieu</id>
		<title>EiffelStudio: an EiffelSoftware project - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://dev.eiffel.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Clemahieu"/>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/Special:Contributions/Clemahieu"/>
		<updated>2026-05-19T20:35:30Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Building_LLVM&amp;diff=13889</id>
		<title>Building LLVM</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Building_LLVM&amp;diff=13889"/>
				<updated>2010-06-15T20:24:03Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: New page: Windows:  * Install the following ** CMake http://www.cmake.org/ ** MinGW http://www.mingw.org/ ** MSYS http://www.mingw.org/wiki/MSYS ** MSYS DTK http://www.mingw.org/wiki/msys (Contains ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Windows:&lt;br /&gt;
&lt;br /&gt;
* Install the following&lt;br /&gt;
** CMake http://www.cmake.org/&lt;br /&gt;
** MinGW http://www.mingw.org/&lt;br /&gt;
** MSYS http://www.mingw.org/wiki/MSYS&lt;br /&gt;
** MSYS DTK http://www.mingw.org/wiki/msys (Contains Perl)&lt;br /&gt;
* Add MinGW and MSYS bin directory to your PATH environment variable.&lt;br /&gt;
* Check out appropriate release from LLVM SVN repository http://llvm.org/svn/llvm-project/llvm&lt;br /&gt;
** Releases are under /tags/RELEASE_* e.g. http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_27&lt;br /&gt;
* Start CMake&lt;br /&gt;
* Within CMake change &amp;quot;Where is the source code&amp;quot; to your llvm source directory&lt;br /&gt;
* Within CMake change &amp;quot;Where to build the binaries&amp;quot; to a build directory&lt;br /&gt;
* Push &amp;quot;Configure&amp;quot;, CMake will ask &amp;quot;Specify the generator for this project&amp;quot;&lt;br /&gt;
* Select &amp;quot;MSYS Makefiles&amp;quot; and choose &amp;quot;finish&amp;quot;. CMake will work then present configuration options in red.&lt;br /&gt;
* Set configuration options, no changes are usually necessary&lt;br /&gt;
* Push &amp;quot;Configure&amp;quot; again and CMake will work again and the &amp;quot;Generate&amp;quot; button should become available&lt;br /&gt;
* Push &amp;quot;Generate&amp;quot; and CMake should put Makefiles in your build directory&lt;br /&gt;
* From the command line, navigate to your build directory and run &amp;quot;make&amp;quot;&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=13888</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=13888"/>
				<updated>2010-06-15T20:04:13Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]__NOTOC__&lt;br /&gt;
&amp;lt;h1 class=&amp;quot;firstHeading&amp;quot;&amp;gt;EiffelStudio Integrated Development Environment&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:EiffelStudioScreenshot.png|thumb|250px|right|EiffelStudio IDE ([http://eiffel.com/products/studio/screenshots.html more screenshots]) ]]&lt;br /&gt;
&lt;br /&gt;
Welcome to the central resource for EiffelStudio developers and contributors.&lt;br /&gt;
==News==&lt;br /&gt;
*''26 May 2010'': EiffelStudio 6.6 is available for download at http://www.eiffel.com/downloads&lt;br /&gt;
*''24 March 2010'': Dr. Meyer is the recipient of the 2009 Harlan D. Mills award&lt;br /&gt;
*''8 December 2009'': EiffelStudio 6.5 is available at http://www.eiffel.com/downloads&lt;br /&gt;
*''August 2009'': Check out [http://www.bertrandmeyer.com Bertrand Meyer's new blog]&lt;br /&gt;
*Join us on IRC at chat.freenode.net #eiffelstudio or through http://community.eiffel.com/irc&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is an advanced commercial-grade IDE for the [http://en.wikipedia.org/wiki/Eiffel_programming_language Eiffel programming language]. It is maintained and developed mostly by [http://www.eiffel.com  Eiffel Software] and hosted at the [http://se.inf.ethz.ch/ Chair of Software Engineering] at [http://www.ethz.ch/ ETH Zurich].&lt;br /&gt;
&lt;br /&gt;
On April 5th, 2006, Eiffel Software relicensed the EiffelStudio product under the [[Gnu Public License]]. Eiffel Software still offers a commercial variant. Both versions share the same source code.&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is a full-featured IDE offering the following features, many of them unique:&lt;br /&gt;
&lt;br /&gt;
* Complete compiler for the Eiffel programming language, with Design By Contract (DBC) support and both high compile-time speed and high-performance executables, based on the Melting Ice Technology.&lt;br /&gt;
* Full portability (including graphics) across Windows, MacOS X, Linux, *BSD, Solaris and other operating systems&lt;br /&gt;
* Smart code editor&lt;br /&gt;
* Sophisticated multi-view browsing and viewing facilities&lt;br /&gt;
* Interactive debugger&lt;br /&gt;
* Graphical modeling tool for UML and BON with full roundtrip&lt;br /&gt;
* Refactoring support&lt;br /&gt;
* GUI development tool (EiffelBuild) and fully portable GUI library (EiffelVision)&lt;br /&gt;
* Many other libraries of reusable component.&lt;br /&gt;
&lt;br /&gt;
The Eiffel compiler creates C code that is then handed to a standard C compiler. As a result, Eiffel programs have a run-time performance comparable to those directly written in C or C++, but with the benefits of an advanced object-oriented model and strong typing. EiffelStudio uses a highly efficient compacting garbage collector to free the developer from the burden of memory management.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;If you want to know more about the unique features of Eiffel and EiffelStudio, check out our [[Reasons for using Eiffel]] page.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;font-size:80%;&amp;quot; bgcolor=white|&lt;br /&gt;
{| cellspacing=8 width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
* [[Downloads]]&lt;br /&gt;
* [[EiffelStudio 6.6 Releases|Changelog of 6.6 (release branch)]]&lt;br /&gt;
* [http://docs.eiffel.com/book/eiffelstudio/software-installation-eiffelstudio Installing EiffelStudio]&lt;br /&gt;
* [[Compiling Hello World]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Working with EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[Eiffel Glossary]]&lt;br /&gt;
* [[Eiffel Compilation Explained]]&lt;br /&gt;
* [[EiffelStudio Wish List]]&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
== Contributing! ==&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Projects|How to contribute: the Projects page]]&lt;br /&gt;
* [[:Category:Testing|EiffelStudio testing process: you can participate!]]&lt;br /&gt;
* [[EiffelStudio 6.7 Releases|Changelog of latest development version, currently 6.7 (development trunk)]]&lt;br /&gt;
* [[Repository|Getting the source: Subversion repository]]&lt;br /&gt;
* [[Compiling EiffelStudio]]&lt;br /&gt;
* [[:Category:Tools|Developer's tools]]&lt;br /&gt;
* [[Language_Roadmap|Language roadmap]]&lt;br /&gt;
* [[Environment_Roadmap|Environment roadmap]]&lt;br /&gt;
* [[Design_and_coding_rules|Design and coding rules]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.eiffelroom.org EiffelRoom]&lt;br /&gt;
* [[Spread_the_word|Spread the word]]&lt;br /&gt;
* [[Eiffel Sites and Links]]&lt;br /&gt;
* [[Mailing Lists]]&lt;br /&gt;
* [[:Category:News|News]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=13764</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=13764"/>
				<updated>2010-03-25T23:25:33Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]__NOTOC__&lt;br /&gt;
&amp;lt;h1 class=&amp;quot;firstHeading&amp;quot;&amp;gt;EiffelStudio Integrated Development Environment&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:EiffelStudioScreenshot.png|thumb|250px|right|EiffelStudio IDE ([http://eiffel.com/products/studio/screenshots.html more screenshots]) ]]&lt;br /&gt;
&lt;br /&gt;
Welcome to the central resource for EiffelStudio developers and contributors.&lt;br /&gt;
==News==&lt;br /&gt;
*''8 December 2009'': EiffelStudio 6.5 is available at http://www.eiffel.com/downloads&lt;br /&gt;
*''August 2009'': Check out [http://www.bertrandmeyer.com Bertrand Meyer's new blog]&lt;br /&gt;
*Join us on IRC at chat.freenode.net #eiffelstudio&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is an advanced commercial-grade IDE for the [http://en.wikipedia.org/wiki/Eiffel_programming_language Eiffel programming language]. It is maintained and developed mostly by [http://www.eiffel.com  Eiffel Software] and hosted at the [http://se.inf.ethz.ch/ Chair of Software Engineering] at [http://www.ethz.ch/ ETH Zurich].&lt;br /&gt;
&lt;br /&gt;
On April 5th, 2006, Eiffel Software relicensed the EiffelStudio product under the [[Gnu Public License]]. Eiffel Software still offers a commercial variant. Both versions share the same source code.&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is a full-featured IDE offering the following features, many of them unique:&lt;br /&gt;
&lt;br /&gt;
* Complete compiler for the Eiffel programming language, with Design By Contract (DBC) support and both high compile-time speed and high-performance executables, based on the Melting Ice Technology.&lt;br /&gt;
* Full portability (including graphics) across Windows, MacOS X, Linux, *BSD, Solaris and other operating systems&lt;br /&gt;
* Smart code editor&lt;br /&gt;
* Sophisticated multi-view browsing and viewing facilities&lt;br /&gt;
* Interactive debugger&lt;br /&gt;
* Graphical modeling tool for UML and BON with full roundtrip&lt;br /&gt;
* Refactoring support&lt;br /&gt;
* GUI development tool (EiffelBuild) and fully portable GUI library (EiffelVision)&lt;br /&gt;
* Many other libraries of reusable component.&lt;br /&gt;
&lt;br /&gt;
The Eiffel compiler creates C code that is then handed to a standard C compiler. As a result, Eiffel programs have a run-time performance comparable to those directly written in C or C++, but with the benefits of an advanced object-oriented model and strong typing. EiffelStudio uses a highly efficient compacting garbage collector to free the developer from the burden of memory management.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;If you want to know more about the unique features of Eiffel and EiffelStudio, check out our [[Reasons for using Eiffel]] page.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;font-size:80%;&amp;quot; bgcolor=white|&lt;br /&gt;
{| cellspacing=8 width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
* [[Downloads]]&lt;br /&gt;
* [[EiffelStudio 6.5 Releases|Changelog of 6.5 (release branch)]]&lt;br /&gt;
* [http://docs.eiffel.com/eiffelstudio/installation/studio Installing EiffelStudio]&lt;br /&gt;
* [[Compiling Hello World]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Working with EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[Eiffel Glossary]]&lt;br /&gt;
* [[Eiffel Compilation Explained]]&lt;br /&gt;
* [[EiffelStudio Wish List]]&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
== Contributing! ==&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Projects|How to contribute: the Projects page]]&lt;br /&gt;
* [[:Category:Testing|EiffelStudio testing process: you can participate!]]&lt;br /&gt;
* [[EiffelStudio 6.6 Releases|Changelog of latest development version, currently 6.6 (development trunk)]]&lt;br /&gt;
* [[Repository|Getting the source: Subversion repository]]&lt;br /&gt;
* [[Compiling EiffelStudio]]&lt;br /&gt;
* [[:Category:Tools|Developer's tools]]&lt;br /&gt;
* [[Language_Roadmap|Language roadmap]]&lt;br /&gt;
* [[Environment_Roadmap|Environment roadmap]]&lt;br /&gt;
* [[Design_and_coding_rules|Design and coding rules]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.eiffelroom.org EiffelRoom]&lt;br /&gt;
* [[Spread_the_word|Spread the word]]&lt;br /&gt;
* [[Eiffel Sites and Links]]&lt;br /&gt;
* [[Mailing Lists]]&lt;br /&gt;
* [[:Category:News|News]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Class_Structure_Hash&amp;diff=13725</id>
		<title>Class Structure Hash</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Class_Structure_Hash&amp;diff=13725"/>
				<updated>2010-03-05T17:35:01Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Purpose:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
A request for comments on the notion of various equality tests for a class.  The tests can be used in areas such as serialization, proxy/stub calls, versioning, dynamic type loading, etc.&lt;br /&gt;
&lt;br /&gt;
Hash value are a SHA256 hash&lt;br /&gt;
&lt;br /&gt;
'''Class-text hash:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* Complete hash of the text of the class.  Any change including non-processed areas such as `note' or comments would cause the hash value to change.&lt;br /&gt;
&lt;br /&gt;
'''Semantic-text hash:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* Hash value of the semantically-meaningful text of the class.  This would ignore the actual character contents of breaks and would ignore comments and note fields.  If a buggy version of a class is discovered, it could be rejected for serialization or connection by this hash value.&lt;br /&gt;
&lt;br /&gt;
'''Attribute hash:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* Hash value of the attributes of the class.  This would essentially mean anything with an equal attribute hash could be deserialized/serialized without recovery.&lt;br /&gt;
&lt;br /&gt;
'''Feature hash:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* Name, signature, and export hash for a feature&lt;br /&gt;
&lt;br /&gt;
'''Interface-to-class hash:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* Hash value of feature names and signature exported to a specific class.  This would be useful for remote proxying.  A class would have a additional value for each class to which features are exported.  If class A exports features to {ANY}, {A}, {B}, and {NONE} it would have a hash value for each to say whether the interface exported to either ANY, A, or B has changed.  Changes to features exported to A would affect the hash code for {ANY} and {A} but not {B}.  Changes to features exported to NONE would not affect any hash values.&lt;br /&gt;
&lt;br /&gt;
'''Contract hash:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* A hash value for a the contract of a feature.&lt;br /&gt;
&lt;br /&gt;
'''Interface-to-class contract hash:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* A hash value for the contract of all features exported to a class.&lt;br /&gt;
&lt;br /&gt;
'''Additional issues:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* Mutual recursive references.  In some cases two classes reference each other; this could lead to difficulty in creating a hash value for both.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Some traditionally non-semantic areas such as `note' actually have semantic value.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Are 256 bits needed?  Maybe truncate hash to 128 bits or 64 bits.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Class_Structure_Hash&amp;diff=13722</id>
		<title>Class Structure Hash</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Class_Structure_Hash&amp;diff=13722"/>
				<updated>2010-03-04T23:53:09Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: New page: Purpose: A request for comments on the notion of various equality tests for a class.  The tests can be used in areas such as serialization, proxy/stub calls, versioning, dynamic type loadi...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Purpose: A request for comments on the notion of various equality tests for a class.  The tests can be used in areas such as serialization, proxy/stub calls, versioning, dynamic type loading, etc.&lt;br /&gt;
&lt;br /&gt;
Hash value are a SHA256 hash&lt;br /&gt;
&lt;br /&gt;
Class-text hash:&lt;br /&gt;
- Complete hash of the text of the class.  Any change including non-processed areas such as `note' or comments would cause the hash value to change.&lt;br /&gt;
&lt;br /&gt;
Semantic-text hash:&lt;br /&gt;
- Hash value of the semantically-meaningful text of the class.  This would ignore the actual character contents of breaks and would ignore comments and note fields.  If a buggy version of a class is discovered, it could be rejected for serialization or connection by this hash value.&lt;br /&gt;
&lt;br /&gt;
Attribute hash:&lt;br /&gt;
- Hash value of the attributes of the class.  This would essentially mean anything with an equal attribute hash could be deserialized/serialized without recovery.&lt;br /&gt;
&lt;br /&gt;
Feature hash:&lt;br /&gt;
- Name, signature, and export hash for a feature&lt;br /&gt;
&lt;br /&gt;
Interface-to-class hash:&lt;br /&gt;
- Hash value of feature names and signature exported to a specific class.  This would be useful for remote proxying.  A class would have a additional value for each class to which features are exported.  If class A exports features to {ANY}, {A}, {B}, and {NONE} it would have a hash value for each to say whether the interface exported to either ANY, A, or B has changed.  Changes to features exported to A would affect the hash code for {ANY} and {A} but not {B}.  Changes to features exported to NONE would not affect any hash values.&lt;br /&gt;
&lt;br /&gt;
Contract hash:&lt;br /&gt;
- A hash value for a the contract of a feature.&lt;br /&gt;
&lt;br /&gt;
Interface-to-class contract hash:&lt;br /&gt;
- A hash value for the contract of all features exported to a class.&lt;br /&gt;
&lt;br /&gt;
Additional issues:&lt;br /&gt;
- Mutual recursive references.  In some cases two classes reference each other; this could lead to difficulty in creating a hash value for both.&lt;br /&gt;
- Some traditionally non-semantic areas such as `note' actually have semantic value.&lt;br /&gt;
- Are 256 bits needed?  Maybe truncate hash to 128 bits or 64 bits.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Ieee_arithmetic&amp;diff=13685</id>
		<title>Talk:Ieee arithmetic</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Ieee_arithmetic&amp;diff=13685"/>
				<updated>2010-02-10T01:59:47Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 3 February 2010 (UTC)'''&lt;br /&gt;
Most probably C compilers inline functions, but just to be sure, I'd convert them into the macros:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define to_raw_bits(d) *((EIF_NATURAL_64*)&amp;amp;(d))&lt;br /&gt;
 &lt;br /&gt;
#define eif_is_nan_bits(value) ((value &amp;amp; ~RTU64C(0x8000000000000000)) &amp;gt; RTU64C(0x7ff0000000000000))&lt;br /&gt;
 &lt;br /&gt;
#define eif_is_nan(v) ((*((EIF_NATURAL_64 *)&amp;amp;(v)) &amp;amp; ~RTU64C(0x8000000000000000)) &amp;gt; RTU64C(0x7ff0000000000000))&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Does it affect the benchmarks?&lt;br /&gt;
:'''--[[User:Manus|manus]] 17:59, 3 February 2010 (UTC)''' Actually it does not on Windows for sure, I've verified that it was inlined. But you are right that those could be simply defined as macros.&lt;br /&gt;
::'''--[[User:Manus|manus]] 20:25, 3 February 2010 (UTC)''' I've done again some of the benchmarks and on windows at least, some of them are slower when I use a macro. I'm no sure why as I haven't looked at the generated assembly code.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 14:48, 3 February 2010 (UTC)'''&lt;br /&gt;
'''Not IEEE arithmetic, nor maths''', NaN = NaN is never true. And placing NaNs in a sort order isn't write either - REAL_32/64 are not totally ordered types.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 17:57, 3 February 2010 (UTC)''' How do you solve the problem of assertions then in ARRAY.put for example?&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 20:01, 3 February 2010 (UTC)'''&lt;br /&gt;
* Does it mean that &amp;lt;e&amp;gt;REAL_GENERAL&amp;lt;/e&amp;gt; should inherit &amp;lt;e&amp;gt;PART_COMPARABLE&amp;lt;/e&amp;gt; rather than &amp;lt;e&amp;gt;COMPARABLE&amp;lt;/e&amp;gt;?&lt;br /&gt;
* Do we need 2 equality queries: one that tells two objects represent the same value (it is used to ensure &amp;lt;e&amp;gt;copy&amp;lt;/e&amp;gt; does what is expected, and it is used to implement &amp;lt;e&amp;gt;~&amp;lt;/e&amp;gt;) and the other one that tells that the numbers are equal in terms of ordering relation of &amp;lt;e&amp;gt;(PART_)COMPARABLE&amp;lt;/e&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 12:37, 4 February 2010 (UTC)''': '''Postcondition for {ARRAY}.put''' should read:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
inserted: v = v  implies (item (i) = v)&lt;br /&gt;
undefined_case: v /= V implies (item (i) /= item (1))&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 19:50, 4 February 2010 (UTC)''': I'm sure you realize that this is not feasible as there are so many of those assertions in actual Eiffel code.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 12:42, 4 February 2010 (UTC)''': I have previously suggested separating the notion of numerical equality and object equality. Eric said that we use = for three different notions, i think, but I don't remember what these were. Certainly PART_COMPARABLE is better than COMPARABLE for IEEE math types. I'm not sure if that is sufficient or not.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 19:50, 4 February 2010 (UTC)''': The question is not whether or not we adhere to a standard. The question is if that standard makes sense in Eiffel. And clearly it does not. It breaks too much of the good assumption we have been making about equality. In absence of conversion which is pure syntactic sugare, the following is a fundamental aspect of Eiffel: x := y implies x = y.&lt;br /&gt;
&lt;br /&gt;
--[[User:Colin-adams|Colin-adams]] 07:41, 5 February 2010 (UTC)&lt;br /&gt;
I advocate changing all postconditions to that form where necessary. it is perfectly reasonable thing to do.&lt;br /&gt;
The current situation means it is not possible to turn postcondition checking on routinely. This is very bad for Design by Contract in practice. I suffer from this every day at work.&lt;br /&gt;
&lt;br /&gt;
You '''have''' to abide by the standard, as that is what the hardware implements. You can't pretend NaNs don't exist.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Clemahieu|Clemahieu]] 20:09, 9 February 2010 (UTC)''': Wouldn't comparing NAN to NAN be a good use of an exception?&lt;br /&gt;
&lt;br /&gt;
::'''--[[User:Peter gummer|Peter gummer]] 23:53, 9 February 2010 (UTC)''' You mean an exception as in a precondition violation?&lt;br /&gt;
&lt;br /&gt;
:::'''--[[User:Clemahieu|Clemahieu]] 01:59, 10 February 2010 (UTC)''' I was thinking more like divide-by-zero but a &amp;quot;NAN comparison&amp;quot; exception.  This would essentially mean a NAN shouldn't be assigned.  Like if a C function returned &amp;gt;= 0 for success and equality and various &amp;lt; 0 for errors, how do you compare equality in the error region?  Well you don't, it's an error; we use exceptions in Eiffel for errors.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 01:52, 10 February 2010 (UTC)''': I was not around in the discussion from 20 years ago regarding NaN, but reading some reasoning for NaN in the context of scientific computation it is clear that they wanted the value NaN to throw an exception whenever NaN was used in an operation because correctness of the computation was important. Over the years, it was transformed into the missing value paradigm (you put NaN when you actually don't know, and if you do some computation and get NaN, then it means that you don't know the result of the computation). Both approaches are interesting and it all depends on the kind of applications you are creating.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Ieee_arithmetic&amp;diff=13684</id>
		<title>Talk:Ieee arithmetic</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Ieee_arithmetic&amp;diff=13684"/>
				<updated>2010-02-10T01:59:23Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 3 February 2010 (UTC)'''&lt;br /&gt;
Most probably C compilers inline functions, but just to be sure, I'd convert them into the macros:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define to_raw_bits(d) *((EIF_NATURAL_64*)&amp;amp;(d))&lt;br /&gt;
 &lt;br /&gt;
#define eif_is_nan_bits(value) ((value &amp;amp; ~RTU64C(0x8000000000000000)) &amp;gt; RTU64C(0x7ff0000000000000))&lt;br /&gt;
 &lt;br /&gt;
#define eif_is_nan(v) ((*((EIF_NATURAL_64 *)&amp;amp;(v)) &amp;amp; ~RTU64C(0x8000000000000000)) &amp;gt; RTU64C(0x7ff0000000000000))&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Does it affect the benchmarks?&lt;br /&gt;
:'''--[[User:Manus|manus]] 17:59, 3 February 2010 (UTC)''' Actually it does not on Windows for sure, I've verified that it was inlined. But you are right that those could be simply defined as macros.&lt;br /&gt;
::'''--[[User:Manus|manus]] 20:25, 3 February 2010 (UTC)''' I've done again some of the benchmarks and on windows at least, some of them are slower when I use a macro. I'm no sure why as I haven't looked at the generated assembly code.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 14:48, 3 February 2010 (UTC)'''&lt;br /&gt;
'''Not IEEE arithmetic, nor maths''', NaN = NaN is never true. And placing NaNs in a sort order isn't write either - REAL_32/64 are not totally ordered types.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 17:57, 3 February 2010 (UTC)''' How do you solve the problem of assertions then in ARRAY.put for example?&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 20:01, 3 February 2010 (UTC)'''&lt;br /&gt;
* Does it mean that &amp;lt;e&amp;gt;REAL_GENERAL&amp;lt;/e&amp;gt; should inherit &amp;lt;e&amp;gt;PART_COMPARABLE&amp;lt;/e&amp;gt; rather than &amp;lt;e&amp;gt;COMPARABLE&amp;lt;/e&amp;gt;?&lt;br /&gt;
* Do we need 2 equality queries: one that tells two objects represent the same value (it is used to ensure &amp;lt;e&amp;gt;copy&amp;lt;/e&amp;gt; does what is expected, and it is used to implement &amp;lt;e&amp;gt;~&amp;lt;/e&amp;gt;) and the other one that tells that the numbers are equal in terms of ordering relation of &amp;lt;e&amp;gt;(PART_)COMPARABLE&amp;lt;/e&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 12:37, 4 February 2010 (UTC)''': '''Postcondition for {ARRAY}.put''' should read:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
inserted: v = v  implies (item (i) = v)&lt;br /&gt;
undefined_case: v /= V implies (item (i) /= item (1))&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 19:50, 4 February 2010 (UTC)''': I'm sure you realize that this is not feasible as there are so many of those assertions in actual Eiffel code.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 12:42, 4 February 2010 (UTC)''': I have previously suggested separating the notion of numerical equality and object equality. Eric said that we use = for three different notions, i think, but I don't remember what these were. Certainly PART_COMPARABLE is better than COMPARABLE for IEEE math types. I'm not sure if that is sufficient or not.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 19:50, 4 February 2010 (UTC)''': The question is not whether or not we adhere to a standard. The question is if that standard makes sense in Eiffel. And clearly it does not. It breaks too much of the good assumption we have been making about equality. In absence of conversion which is pure syntactic sugare, the following is a fundamental aspect of Eiffel: x := y implies x = y.&lt;br /&gt;
&lt;br /&gt;
--[[User:Colin-adams|Colin-adams]] 07:41, 5 February 2010 (UTC)&lt;br /&gt;
I advocate changing all postconditions to that form where necessary. it is perfectly reasonable thing to do.&lt;br /&gt;
The current situation means it is not possible to turn postcondition checking on routinely. This is very bad for Design by Contract in practice. I suffer from this every day at work.&lt;br /&gt;
&lt;br /&gt;
You '''have''' to abide by the standard, as that is what the hardware implements. You can't pretend NaNs don't exist.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Clemahieu|Clemahieu]] 20:09, 9 February 2010 (UTC)''': Wouldn't comparing NAN to NAN be a good use of an exception?&lt;br /&gt;
&lt;br /&gt;
::'''--[[User:Peter gummer|Peter gummer]] 23:53, 9 February 2010 (UTC)''' You mean an exception as in a precondition violation?&lt;br /&gt;
&lt;br /&gt;
:::'''----''' I was thinking more like divide-by-zero but a &amp;quot;NAN comparison&amp;quot; exception.  This would essentially mean a NAN shouldn't be assigned.  Like if a C function returned &amp;gt;= 0 for success and equality and various &amp;lt; 0 for errors, how do you compare equality in the error region?  Well you don't, it's an error; we use exceptions in Eiffel for errors.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 01:52, 10 February 2010 (UTC)''': I was not around in the discussion from 20 years ago regarding NaN, but reading some reasoning for NaN in the context of scientific computation it is clear that they wanted the value NaN to throw an exception whenever NaN was used in an operation because correctness of the computation was important. Over the years, it was transformed into the missing value paradigm (you put NaN when you actually don't know, and if you do some computation and get NaN, then it means that you don't know the result of the computation). Both approaches are interesting and it all depends on the kind of applications you are creating.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Ieee_arithmetic&amp;diff=13676</id>
		<title>Talk:Ieee arithmetic</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Ieee_arithmetic&amp;diff=13676"/>
				<updated>2010-02-09T20:09:48Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 3 February 2010 (UTC)'''&lt;br /&gt;
Most probably C compilers inline functions, but just to be sure, I'd convert them into the macros:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#define to_raw_bits(d) *((EIF_NATURAL_64*)&amp;amp;(d))&lt;br /&gt;
 &lt;br /&gt;
#define eif_is_nan_bits(value) ((value &amp;amp; ~RTU64C(0x8000000000000000)) &amp;gt; RTU64C(0x7ff0000000000000))&lt;br /&gt;
 &lt;br /&gt;
#define eif_is_nan(v) ((*((EIF_NATURAL_64 *)&amp;amp;(v)) &amp;amp; ~RTU64C(0x8000000000000000)) &amp;gt; RTU64C(0x7ff0000000000000))&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Does it affect the benchmarks?&lt;br /&gt;
:'''--[[User:Manus|manus]] 17:59, 3 February 2010 (UTC)''' Actually it does not on Windows for sure, I've verified that it was inlined. But you are right that those could be simply defined as macros.&lt;br /&gt;
::'''--[[User:Manus|manus]] 20:25, 3 February 2010 (UTC)''' I've done again some of the benchmarks and on windows at least, some of them are slower when I use a macro. I'm no sure why as I haven't looked at the generated assembly code.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 14:48, 3 February 2010 (UTC)'''&lt;br /&gt;
'''Not IEEE arithmetic, nor maths''', NaN = NaN is never true. And placing NaNs in a sort order isn't write either - REAL_32/64 are not totally ordered types.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 17:57, 3 February 2010 (UTC)''' How do you solve the problem of assertions then in ARRAY.put for example?&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 20:01, 3 February 2010 (UTC)'''&lt;br /&gt;
* Does it mean that &amp;lt;e&amp;gt;REAL_GENERAL&amp;lt;/e&amp;gt; should inherit &amp;lt;e&amp;gt;PART_COMPARABLE&amp;lt;/e&amp;gt; rather than &amp;lt;e&amp;gt;COMPARABLE&amp;lt;/e&amp;gt;?&lt;br /&gt;
* Do we need 2 equality queries: one that tells two objects represent the same value (it is used to ensure &amp;lt;e&amp;gt;copy&amp;lt;/e&amp;gt; does what is expected, and it is used to implement &amp;lt;e&amp;gt;~&amp;lt;/e&amp;gt;) and the other one that tells that the numbers are equal in terms of ordering relation of &amp;lt;e&amp;gt;(PART_)COMPARABLE&amp;lt;/e&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 12:37, 4 February 2010 (UTC)''': '''Postcondition for {ARRAY}.put''' should read:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
inserted: v = v  implies (item (i) = v)&lt;br /&gt;
undefined_case: v /= V implies (item (i) /= item (1))&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 19:50, 4 February 2010 (UTC)''': I'm sure you realize that this is not feasible as there are so many of those assertions in actual Eiffel code.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Colin-adams|Colin-adams]] 12:42, 4 February 2010 (UTC)''': I have previously suggested separating the notion of numerical equality and object equality. Eric said that we use = for three different notions, i think, but I don't remember what these were. Certainly PART_COMPARABLE is better than COMPARABLE for IEEE math types. I'm not sure if that is sufficient or not.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 19:50, 4 February 2010 (UTC)''': The question is not whether or not we adhere to a standard. The question is if that standard makes sense in Eiffel. And clearly it does not. It breaks too much of the good assumption we have been making about equality. In absence of conversion which is pure syntactic sugare, the following is a fundamental aspect of Eiffel: x := y implies x = y.&lt;br /&gt;
&lt;br /&gt;
--[[User:Colin-adams|Colin-adams]] 07:41, 5 February 2010 (UTC)&lt;br /&gt;
I advocate changing all postconditions to that form where necessary. it is perfectly reasonable thing to do.&lt;br /&gt;
The current situation means it is not possible to turn postcondition checking on routinely. This is very bad for Design by Contract in practice. I suffer from this every day at work.&lt;br /&gt;
&lt;br /&gt;
You '''have''' to abide by the standard, as that is what the hardware implements. You can't pretend NaNs don't exist.&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Clemahieu|Clemahieu]] 20:09, 9 February 2010 (UTC)''': Wouldn't comparing NAN to NAN be a good use of an exception?&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_FAQ&amp;diff=13532</id>
		<title>Xebra FAQ</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_FAQ&amp;diff=13532"/>
				<updated>2009-11-24T22:44:41Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: /* Template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
[[Xebra About|About]] | [[Xebra Installation|Installation]] |  [[Xebra Documentation|Documentation]] |  [[Xebra Tutorial|Tutorials]] | [[Xebra FAQ|Frequently Asked Questions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Template ==&lt;br /&gt;
&lt;br /&gt;
Please use the following template if you want to add your own question/answer pair:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''Question:'''&amp;lt;/font&amp;gt; I created a new project, xeb file and config.wapp but when I navigate to the .xeb file I get an error: Message:No configuration found for webapp&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;'''Answer:'''&amp;lt;/font&amp;gt; Run the reload command on the Xebra Server, project directories are only searched for on configuration load.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''Question:'''&amp;lt;/font&amp;gt; question text&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;'''Answer:'''&amp;lt;/font&amp;gt; answer text&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:C_Coding_Standard&amp;diff=13012</id>
		<title>Talk:C Coding Standard</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:C_Coding_Standard&amp;diff=13012"/>
				<updated>2009-07-22T02:42:31Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[User:Peter gummer|Peter gummer]] 01:14, 22 July 2009 (UTC) Possibly the most important item in a C coding standard is &amp;quot;do not use jump instructions&amp;quot;. In other words, ''goto'' and ''continue'' must never be used; ''break'' must never be used except in a ''switch'' statement; and ''return'' must never be used except as the final instruction of a non-void function.&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 02:42, 22 July 2009 (UTC)&lt;br /&gt;
Hear hear!&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Server_Administration&amp;diff=12926</id>
		<title>Xebra Server Administration</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Server_Administration&amp;diff=12926"/>
				<updated>2009-07-11T08:28:20Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: /* Run Xebra Server in EiffelStudio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Run Xebra Server=&lt;br /&gt;
If you installed Xebra with the installation script (see [[Xebra Installation|installation]]) then the server is compiled and ready to use&lt;br /&gt;
* Run&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
cd $XEBRA_DEV/eiffel_projects/xebra_server&lt;br /&gt;
EIFGENs/xebra_server/F_code/xebra_server config.ini&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* To see a list of run arguments type&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
EIFGENs/xebra_server/F_code/xebra_server -help&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Stop the server by typing&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 exit&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* For a list of server commands type&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
help&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Run Xebra Server in EiffelStudio=&lt;br /&gt;
&lt;br /&gt;
# Launch estudio and compile the project $XEBRA_DEV/eiffel_projects/xebra_server/xebra_server-voidunsafe.ecf&lt;br /&gt;
# Go to the Execution -&amp;gt; Exceptions Handling dialog.  Check &amp;quot;Filter Exceptions?&amp;quot; and change DEVELOPER_EXCEPTION to &amp;quot;Ignore&amp;quot;.&lt;br /&gt;
# Open the Execution -&amp;gt; Execution Parameters dialog and set &amp;quot;config.ini&amp;quot; as argument (see below for more info about run arguments).&lt;br /&gt;
# Compile&lt;br /&gt;
# Fill in the [[Xebra Server Config File]]&lt;br /&gt;
# Run&lt;br /&gt;
# Browse to http://localhost:55000/helloworld/. The server now translates, generates, compiles and finally runs the helloworld application.&lt;br /&gt;
&lt;br /&gt;
=Modules=&lt;br /&gt;
The server automatically launches the following modules:&lt;br /&gt;
* mod_http: Listens to requests from the http plugin (Apache Module or IIS7 Handler) on port 55001. These request are forwarded to the appropriate webapp.&lt;br /&gt;
* mod_console: Reads input from the console. The commands described below can be invoked. &lt;br /&gt;
* mod_cmd: Listens to command request from the webapps on port 55002.&lt;br /&gt;
&lt;br /&gt;
=Webapps=&lt;br /&gt;
&lt;br /&gt;
==Assume webapps are running==&lt;br /&gt;
If assume_webapps_are_running was set, the server does not translate, compile and run the webapps. It just tries to connect immediately. This should be used when a webapp is launched in estudio for debugging and the server should not try to run and shutdown the webapp.&lt;br /&gt;
&lt;br /&gt;
==Development Mode==&lt;br /&gt;
By default, a webapp is set to Development Mode which means that the server checks everytime a request was made if the webapp needs to be retranslated and compiled. This makes access to the webapp very slow. As soon as development of the webapp stopps, dev_mod should be set to off.&lt;br /&gt;
&lt;br /&gt;
==Fire off a webapp==&lt;br /&gt;
If the server crashed and therefore could not properly shut down all webapps, they will still be running when the server is relaunched. Hence, the socket will be occupied when the server tries to launch a webapp. Use the fire command to fire off a possibly running webapp. The fire command tries to directly connect to the webapp and send a shutdown signal regardless if the webapp process is owned by the server or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Config File=&lt;br /&gt;
* see [[Xebra Server Config File]]&lt;br /&gt;
&lt;br /&gt;
=Run Arguments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 USAGE: &lt;br /&gt;
    xebra_server &amp;lt;config_filename&amp;gt; [-d &amp;lt;debug_level&amp;gt;] [-c] [-r] [-v]&lt;br /&gt;
&lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    -d --debug_level               : Specifies a debug level. 0: No debug output. 10: All debug ouput. (Optional)&lt;br /&gt;
    -c --clean                     : If set, all webapps will be cleaned (Optional)&lt;br /&gt;
    -r --assume_webapps_are_running: If set, the server assumes that the webapps are already running and does not &lt;br /&gt;
                                     translate, compile and run them before connect to them. (Optional)&lt;br /&gt;
    -h --help                      : Display usage information. (Optional)&lt;br /&gt;
    -v --version                   : Displays version information. (Optional)&lt;br /&gt;
&lt;br /&gt;
 ARGUMENTS:&lt;br /&gt;
    &amp;lt;debug_level&amp;gt;: The debug level (0-10)&lt;br /&gt;
&lt;br /&gt;
 NON-SWITCHED ARGUMENTS:&lt;br /&gt;
    &amp;lt;config_filename&amp;gt;: The path of the config.ini file to use.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Console Commands=&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
* 'help':		 Displays a list of commands.&lt;br /&gt;
&lt;br /&gt;
==Webapps==&lt;br /&gt;
* 'clean &amp;lt;name&amp;gt;':        Cleans, re-translates, compiles and launches a webapp.&lt;br /&gt;
* 'dev &amp;lt;name&amp;gt;':          Sets developing mode of a webapp to on.&lt;br /&gt;
* 'dev_all':             Sets dev_mod to on on all webapps.&lt;br /&gt;
* 'dev_off &amp;lt;name&amp;gt;':      Sets developing mode of a webapp to off.&lt;br /&gt;
* 'dev_off_all':         Sets dev_mod to off on all webapps.&lt;br /&gt;
* 'dev_on &amp;lt;name&amp;gt;':       Sets developing mode of a webapp to on.&lt;br /&gt;
* 'disable &amp;lt;name&amp;gt;':      Disables a webapp.&lt;br /&gt;
* 'enable &amp;lt;name&amp;gt;':       Enables a webapp.&lt;br /&gt;
* 'fire &amp;lt;name&amp;gt;':         Sends shutdown signal to webapp.&lt;br /&gt;
* 'get_sessions':        Retrieves the number of sessions of all running webapps. &lt;br /&gt;
* 'shutdown &amp;lt;name&amp;gt;':     Shuts down a webapp.&lt;br /&gt;
* 'translate &amp;lt;name&amp;gt;':    Forces re-translation of webapp.&lt;br /&gt;
* 'webapps':             Displays the available webapps.&lt;br /&gt;
&lt;br /&gt;
==Server Control==&lt;br /&gt;
* 'exit':               Shuts down the server.&lt;br /&gt;
* 'reload':             Reloads the server configuration file.&lt;br /&gt;
* 'shutdown_webapps':   Shuts down all webapps.&lt;br /&gt;
&lt;br /&gt;
==Modules==&lt;br /&gt;
* 'mlaunch &amp;lt;name&amp;gt;':      Re-launches a server module.&lt;br /&gt;
* 'modules':             Displays the available modules.&lt;br /&gt;
* 'mshutdown &amp;lt;name&amp;gt;':    Shuts down a server module.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Server_Config_File&amp;diff=12925</id>
		<title>Xebra Server Config File</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Server_Config_File&amp;diff=12925"/>
				<updated>2009-07-11T08:24:42Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: Undo revision 12924 by Clemahieu (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Properties=&lt;br /&gt;
==finalize_webapps==&lt;br /&gt;
*Type: Boolean&lt;br /&gt;
*Description: If set to True, all webapps are finalized while compiled. (not yet implemented)&lt;br /&gt;
&lt;br /&gt;
==compiler==&lt;br /&gt;
*Type: Path to executable file&lt;br /&gt;
*Description: Set to eiffel compiler (ec or ecb)&lt;br /&gt;
&lt;br /&gt;
==translator==&lt;br /&gt;
*Type: Path to executable file&lt;br /&gt;
*Description: Set to the xebra_translator&lt;br /&gt;
&lt;br /&gt;
==webapps_root==&lt;br /&gt;
*Type: Path to directory&lt;br /&gt;
*Description: Set to the directory that contains all webapps&lt;br /&gt;
&lt;br /&gt;
==taglib==&lt;br /&gt;
*Type: Path to directory&lt;br /&gt;
*Description: Set to the directory that contains all tag lib files&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Example=&lt;br /&gt;
 finalize_webapps=False&lt;br /&gt;
 compiler=/home/user/eiffel64/studio/spec/linux-x86-64/bin/ec&lt;br /&gt;
 translator=/home/user/xebra/eiffel_projects/xebra_translator/EIFGENs/W_code/xebra_translator&lt;br /&gt;
 webapps_root=/home/user/xebra/httpd/htdocs&lt;br /&gt;
 taglib=/home/user/xebra/eiffel_projects/xebra_translator&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Server_Config_File&amp;diff=12924</id>
		<title>Xebra Server Config File</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Server_Config_File&amp;diff=12924"/>
				<updated>2009-07-11T08:24:08Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Properties=&lt;br /&gt;
==finalize_webapps==&lt;br /&gt;
*Type: Boolean&lt;br /&gt;
*Description: If set to True, all webapps are finalized while compiled. (not yet implemented)&lt;br /&gt;
*Example: finalize_webapps=True&lt;br /&gt;
&lt;br /&gt;
==compiler==&lt;br /&gt;
*Type: Path to executable file&lt;br /&gt;
*Description: Set to eiffel compiler (ec or ecb)&lt;br /&gt;
*Example: compiler=$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin/ec&lt;br /&gt;
&lt;br /&gt;
==translator==&lt;br /&gt;
*Type: Path to executable file&lt;br /&gt;
*Description: Set to the xebra_translator&lt;br /&gt;
*Example: translator=$XEBRA_DEV/eiffel_projects/xebra_translator/EIFGENs/xebra_translator/F_code/xebra_translator&lt;br /&gt;
&lt;br /&gt;
==webapps_root==&lt;br /&gt;
*Type: Path to directory&lt;br /&gt;
*Description: Set to the directory that contains all webapps&lt;br /&gt;
*Example: webapps_root=$XEBRA_DEV/httpd/htdocs&lt;br /&gt;
&lt;br /&gt;
==taglib==&lt;br /&gt;
*Type: Path to directory&lt;br /&gt;
*Description: Set to the directory that contains all tag lib files&lt;br /&gt;
*Example: taglib=$XEBRA_DEV/eiffel_projects/xebra_translator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Example=&lt;br /&gt;
 finalize_webapps=False&lt;br /&gt;
 compiler=/home/user/eiffel64/studio/spec/linux-x86-64/bin/ec&lt;br /&gt;
 translator=/home/user/xebra/eiffel_projects/xebra_translator/EIFGENs/W_code/xebra_translator&lt;br /&gt;
 webapps_root=/home/user/xebra/httpd/htdocs&lt;br /&gt;
 taglib=/home/user/xebra/eiffel_projects/xebra_translator&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12923</id>
		<title>Xebra Installation</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12923"/>
				<updated>2009-07-11T08:20:51Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: /* Mac OS X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Installations=&lt;br /&gt;
&lt;br /&gt;
There are two ways to install Xebra:&lt;br /&gt;
*Automatic&lt;br /&gt;
*Manual&lt;br /&gt;
&lt;br /&gt;
{{Note| This tutorial was tested with Xebra revision 79550, EiffelStudio 6.5.7.9500 ($ISE_EIFFEL) and $EIFFEL_SRC revision 79550. The env vars $EIFFEL_SRC, $ISE_EIFFEL, $ISE_PLATFORM and $ISE_LIBRARY are expected to be set.}}&lt;br /&gt;
&lt;br /&gt;
=Automatic Installation (Ubuntu)=&lt;br /&gt;
There is an installation script available at https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/tools/scripts/install_xebra_ubuntu.sh&lt;br /&gt;
&lt;br /&gt;
The script expects $XEBRA_DEV, $EIFFEL_SRC, $ISE_EIFFEL and $ISE_LIBRARY to be set. It will checkout xebra to $XEBRA_DEV, download, install and configure apache 2.2.11 to $XEBRA_DEV/httpd. Apache will be configured to listen on port 55000 (instead of 80) in order to not interfere with an already installed http server. After the script was successfully run see [[Xebra Tutorial|tutorials]] for how to start the server.&lt;br /&gt;
&lt;br /&gt;
=Manual Installation=&lt;br /&gt;
&lt;br /&gt;
==Checkout Xebra==&lt;br /&gt;
* Define $XEBRA_DEV and checkout xebra from https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/ to $XEBRA_DEV&lt;br /&gt;
&lt;br /&gt;
==Install Apache==&lt;br /&gt;
=== Ubuntu 9.04===&lt;br /&gt;
Note:&lt;br /&gt;
* Mod_xebra does currently not run with the apache distribution that comes with ubuntu. &lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/htdocs to your htdocs folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache unix source httpd-2.2.11 from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Extract&lt;br /&gt;
* Define $APACHE2 where you want to install apache, e.g. to $XEBRA_DEV/httpd&lt;br /&gt;
* Run the following commands:&lt;br /&gt;
 CFLAGS=&amp;quot;-ggdb&amp;quot;./configure --prefix={path were apache should be installed}&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
* Compile the module by running&lt;br /&gt;
 cd $XEBRA_DEV/c_projects/apache_mod_xebra&lt;br /&gt;
 $APACHE2/bin/apxs -c -Wc,-ggdb -I$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/include mod_xebra.c mod_xebra.h&lt;br /&gt;
* Install the module to apache by running&lt;br /&gt;
 $APACHE2/bin/apxs -i mod_xebra.la&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The install script also changes the Listen Port from 80 to 55000. Change this if you wish to run this apache parallel to another webserver that uses port 80.&lt;br /&gt;
&lt;br /&gt;
* Restart apache (if necessary, you need to stop and start instead of restart)&lt;br /&gt;
 $APACHE2/bin/apachectl restart&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
* Hint: keep an eye on the apache error log tail -f $APACHE2/logs/error_log&lt;br /&gt;
&lt;br /&gt;
===Windows (currently under development)===&lt;br /&gt;
&lt;br /&gt;
Note&lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/httpd to your httpd folder.&lt;br /&gt;
* mod_xebra.so has a delay-load dependency on the Visual C++ 9.0 debug runtime library, msvcr90d.dll.  This dll comes with Visual Studio 2008 C++ including the free Visual Studio 2008 C++ Express edition.  This file can be copied in to the System32 directory.  If this DLL is not found you will get an Apache error '''Cannot load C:/Xebra/httpd/modules/mod_xebra.so into server: This application has failed to start because the application configuration is incorrect.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache httpd-2.2.11 windows binary from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Install (Choose Custom Installation and install Build Headers and Libraries as well)&lt;br /&gt;
* Copy [https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/c_projects/apache_mod_xebra_win/Debug/mod_xebra.so mod_xebra.so] to your Apache2.2\modules folder.&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Note:&lt;br /&gt;
* If you're using the version of EiffelStudio from MacPorts, environment variables must be set within the startup script.  /Applications/MacPorts/Eiffel64/EiffelStudio/Contents/Resources/EiffelLauncher&lt;br /&gt;
* Save yourself a ton of hassle and just sudo chmod -R 777 * both the $ISE_EIFFEL and $EIFFEL_SRC directories.&lt;br /&gt;
&lt;br /&gt;
* Get Apache V2 from Mac Ports&lt;br /&gt;
  sudo port install apache2&lt;br /&gt;
* Copy $XEBRA_DEV/httpd/* to /opt/local/apache2/htdocs&lt;br /&gt;
* Compile the module by running&lt;br /&gt;
 cd $XEBRA_DEV/c_projects/apache_mod_xebra&lt;br /&gt;
 sudo /opt/local/apache2/bin/apxs -c -Wc,-ggdb -I$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/include mod_xebra.c mod_xebra.h&lt;br /&gt;
* Install the module to apache by running&lt;br /&gt;
 sudo /opt/local/apache2/bin/apxs -i mod_xebra.la&lt;br /&gt;
* Prepare to edit the protected httpd.conf file by running the command:&lt;br /&gt;
  sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit&lt;br /&gt;
  Within TextEdit, which now is running under sudo, open /opt/local/apache2/conf/httpd.conf&lt;br /&gt;
* Add the following lines to /opt/local/apache2/conf/httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The default MacPorts apache install will listen on port 80&lt;br /&gt;
&lt;br /&gt;
* Restart apache (if necessary, you need to stop and start instead of restart)&lt;br /&gt;
 sudo /opt/local/apache2/bin/apachectl restart&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
* Hint: keep an eye on the apache error log tail -f $APACHE2/logs/error_log&lt;br /&gt;
&lt;br /&gt;
===Compile the Xebra Translator===&lt;br /&gt;
* Launch estudio and open the project $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf&lt;br /&gt;
* Compile&lt;br /&gt;
&lt;br /&gt;
Or on linux run:&lt;br /&gt;
 ec -config $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf  -target xebra_translator -c_compile -clean -finalize&lt;br /&gt;
&lt;br /&gt;
===Run the Xebra Server===&lt;br /&gt;
&lt;br /&gt;
See [[Xebra Tutorial]] for how to run the server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation on Windows with IIS7=&lt;br /&gt;
no documentation yet&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12922</id>
		<title>Xebra Installation</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12922"/>
				<updated>2009-07-11T08:19:41Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: Added Mac OSX instructions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Installations=&lt;br /&gt;
&lt;br /&gt;
There are two ways to install Xebra:&lt;br /&gt;
*Automatic&lt;br /&gt;
*Manual&lt;br /&gt;
&lt;br /&gt;
{{Note| This tutorial was tested with Xebra revision 79550, EiffelStudio 6.5.7.9500 ($ISE_EIFFEL) and $EIFFEL_SRC revision 79550. The env vars $EIFFEL_SRC, $ISE_EIFFEL, $ISE_PLATFORM and $ISE_LIBRARY are expected to be set.}}&lt;br /&gt;
&lt;br /&gt;
=Automatic Installation (Ubuntu)=&lt;br /&gt;
There is an installation script available at https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/tools/scripts/install_xebra_ubuntu.sh&lt;br /&gt;
&lt;br /&gt;
The script expects $XEBRA_DEV, $EIFFEL_SRC, $ISE_EIFFEL and $ISE_LIBRARY to be set. It will checkout xebra to $XEBRA_DEV, download, install and configure apache 2.2.11 to $XEBRA_DEV/httpd. Apache will be configured to listen on port 55000 (instead of 80) in order to not interfere with an already installed http server. After the script was successfully run see [[Xebra Tutorial|tutorials]] for how to start the server.&lt;br /&gt;
&lt;br /&gt;
=Manual Installation=&lt;br /&gt;
&lt;br /&gt;
==Checkout Xebra==&lt;br /&gt;
* Define $XEBRA_DEV and checkout xebra from https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/ to $XEBRA_DEV&lt;br /&gt;
&lt;br /&gt;
==Install Apache==&lt;br /&gt;
=== Ubuntu 9.04===&lt;br /&gt;
Note:&lt;br /&gt;
* Mod_xebra does currently not run with the apache distribution that comes with ubuntu. &lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/htdocs to your htdocs folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache unix source httpd-2.2.11 from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Extract&lt;br /&gt;
* Define $APACHE2 where you want to install apache, e.g. to $XEBRA_DEV/httpd&lt;br /&gt;
* Run the following commands:&lt;br /&gt;
 CFLAGS=&amp;quot;-ggdb&amp;quot;./configure --prefix={path were apache should be installed}&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
* Compile the module by running&lt;br /&gt;
 cd $XEBRA_DEV/c_projects/apache_mod_xebra&lt;br /&gt;
 $APACHE2/bin/apxs -c -Wc,-ggdb -I$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/include mod_xebra.c mod_xebra.h&lt;br /&gt;
* Install the module to apache by running&lt;br /&gt;
 $APACHE2/bin/apxs -i mod_xebra.la&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The install script also changes the Listen Port from 80 to 55000. Change this if you wish to run this apache parallel to another webserver that uses port 80.&lt;br /&gt;
&lt;br /&gt;
* Restart apache (if necessary, you need to stop and start instead of restart)&lt;br /&gt;
 $APACHE2/bin/apachectl restart&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
* Hint: keep an eye on the apache error log tail -f $APACHE2/logs/error_log&lt;br /&gt;
&lt;br /&gt;
===Windows (currently under development)===&lt;br /&gt;
&lt;br /&gt;
Note&lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/httpd to your httpd folder.&lt;br /&gt;
* mod_xebra.so has a delay-load dependency on the Visual C++ 9.0 debug runtime library, msvcr90d.dll.  This dll comes with Visual Studio 2008 C++ including the free Visual Studio 2008 C++ Express edition.  This file can be copied in to the System32 directory.  If this DLL is not found you will get an Apache error '''Cannot load C:/Xebra/httpd/modules/mod_xebra.so into server: This application has failed to start because the application configuration is incorrect.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache httpd-2.2.11 windows binary from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Install (Choose Custom Installation and install Build Headers and Libraries as well)&lt;br /&gt;
* Copy [https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/c_projects/apache_mod_xebra_win/Debug/mod_xebra.so mod_xebra.so] to your Apache2.2\modules folder.&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Note:&lt;br /&gt;
* If you're using the version of EiffelStudio from MacPorts, environment variables must be set within the startup script.  /Applications/MacPorts/Eiffel64/EiffelStudio/Contents/Resources/EiffelLauncher&lt;br /&gt;
* Save yourself a ton of hassle and just sudo chmod -R 777 * both the $ISE_EIFFEL and $EIFFEL_SRC directories.&lt;br /&gt;
&lt;br /&gt;
* Get Apache V2 from Mac Ports&lt;br /&gt;
  sudo port install apache2&lt;br /&gt;
* Copy $XEBRA_DEV/httpd/* to /opt/local/apache2/htdocs&lt;br /&gt;
* Compile the module by running&lt;br /&gt;
 cd $XEBRA_DEV/c_projects/apache_mod_xebra&lt;br /&gt;
 /opt/local/apache2/bin/apxs -c -Wc,-ggdb -I$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/include mod_xebra.c mod_xebra.h&lt;br /&gt;
* Install the module to apache by running&lt;br /&gt;
 /opt/local/apache2/bin/apxs -i mod_xebra.la&lt;br /&gt;
* Prepare to edit the protected httpd.conf file by running the command:&lt;br /&gt;
  sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit&lt;br /&gt;
  Within TextEdit, which now is running under sudo, open /opt/local/apache2/conf/httpd.conf&lt;br /&gt;
* Add the following lines to /opt/local/apache2/conf/httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The default MacPorts apache install will listen on port 80&lt;br /&gt;
&lt;br /&gt;
* Restart apache (if necessary, you need to stop and start instead of restart)&lt;br /&gt;
 sudo /opt/local/apache2/bin/apachectl restart&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
* Hint: keep an eye on the apache error log tail -f $APACHE2/logs/error_log&lt;br /&gt;
&lt;br /&gt;
===Compile the Xebra Translator===&lt;br /&gt;
* Launch estudio and open the project $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf&lt;br /&gt;
* Compile&lt;br /&gt;
&lt;br /&gt;
Or on linux run:&lt;br /&gt;
 ec -config $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf  -target xebra_translator -c_compile -clean -finalize&lt;br /&gt;
&lt;br /&gt;
===Run the Xebra Server===&lt;br /&gt;
&lt;br /&gt;
See [[Xebra Tutorial]] for how to run the server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation on Windows with IIS7=&lt;br /&gt;
no documentation yet&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12920</id>
		<title>Xebra Installation</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12920"/>
				<updated>2009-07-11T02:25:19Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: /* Ubuntu 9.04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Installations=&lt;br /&gt;
&lt;br /&gt;
There are two ways to install Xebra:&lt;br /&gt;
*Automatic&lt;br /&gt;
*Manual&lt;br /&gt;
&lt;br /&gt;
{{Note| This tutorial was tested with Xebra revision 79550, EiffelStudio 6.5.7.9500 ($ISE_EIFFEL) and $EIFFEL_SRC revision 79550. The env vars $EIFFEL_SRC, $ISE_EIFFEL, $ISE_PLATFORM and $ISE_LIBRARY are expected to be set.}}&lt;br /&gt;
&lt;br /&gt;
=Automatic Installation (Ubuntu)=&lt;br /&gt;
There is an installation script available at https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/tools/scripts/install_xebra_ubuntu.sh&lt;br /&gt;
&lt;br /&gt;
The script expects $XEBRA_DEV, $EIFFEL_SRC, $ISE_EIFFEL and $ISE_LIBRARY to be set. It will checkout xebra to $XEBRA_DEV, download, install and configure apache 2.2.11 to $XEBRA_DEV/httpd. Apache will be configured to listen on port 55000 (instead of 80) in order to not interfere with an already installed http server. After the script was successfully run see [[Xebra Tutorial|tutorials]] for how to start the server.&lt;br /&gt;
&lt;br /&gt;
=Manual Installation=&lt;br /&gt;
&lt;br /&gt;
==Checkout Xebra==&lt;br /&gt;
* Define $XEBRA_DEV and checkout xebra from https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/ to $XEBRA_DEV&lt;br /&gt;
&lt;br /&gt;
==Install Apache==&lt;br /&gt;
=== Ubuntu 9.04===&lt;br /&gt;
Note:&lt;br /&gt;
* Mod_xebra does currently not run with the apache distribution that comes with ubuntu. &lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/htdocs to your htdocs folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache unix source httpd-2.2.11 from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Extract&lt;br /&gt;
* Define $APACHE2 where you want to install apache, e.g. to $XEBRA_DEV/httpd&lt;br /&gt;
* Run the following commands:&lt;br /&gt;
 CFLAGS=&amp;quot;-ggdb&amp;quot;./configure --prefix={path were apache should be installed}&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
* Compile the module by running&lt;br /&gt;
 cd $XEBRA_DEV/c_projects/apache_mod_xebra&lt;br /&gt;
 $APACHE2/bin/apxs -c -Wc,-ggdb -I$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/include mod_xebra.c mod_xebra.h&lt;br /&gt;
* Install the module to apache by running&lt;br /&gt;
 $APACHE2/bin/apxs -i mod_xebra.la&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The install script also changes the Listen Port from 80 to 55000. Change this if you wish to run this apache parallel to another webserver that uses port 80.&lt;br /&gt;
&lt;br /&gt;
* Restart apache (if necessary, you need to stop and start instead of restart)&lt;br /&gt;
 $APACHE2/bin/apachectl restart&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
* Hint: keep an eye on the apache error log tail -f $APACHE2/logs/error_log&lt;br /&gt;
&lt;br /&gt;
===Windows (currently under development)===&lt;br /&gt;
&lt;br /&gt;
Note&lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/httpd to your httpd folder.&lt;br /&gt;
* mod_xebra.so has a delay-load dependency on the Visual C++ 9.0 debug runtime library, msvcr90d.dll.  This dll comes with Visual Studio 2008 C++ including the free Visual Studio 2008 C++ Express edition.  This file can be copied in to the System32 directory.  If this DLL is not found you will get an Apache error '''Cannot load C:/Xebra/httpd/modules/mod_xebra.so into server: This application has failed to start because the application configuration is incorrect.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache httpd-2.2.11 windows binary from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Install (Choose Custom Installation and install Build Headers and Libraries as well)&lt;br /&gt;
* Copy [https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/c_projects/apache_mod_xebra_win/Debug/mod_xebra.so mod_xebra.so] to your Apache2.2\modules folder.&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Compile the Xebra Translator===&lt;br /&gt;
* Launch estudio and open the project $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf&lt;br /&gt;
* Compile&lt;br /&gt;
&lt;br /&gt;
Or on linux run:&lt;br /&gt;
 ec -config $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf  -target xebra_translator -c_compile -clean -finalize&lt;br /&gt;
&lt;br /&gt;
===Run the Xebra Server===&lt;br /&gt;
&lt;br /&gt;
See [[Xebra Tutorial]] for how to run the server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation on Windows with IIS7=&lt;br /&gt;
no documentation yet&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12919</id>
		<title>Xebra Installation</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12919"/>
				<updated>2009-07-11T02:20:03Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: /* Ubuntu 9.04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Installations=&lt;br /&gt;
&lt;br /&gt;
There are two ways to install Xebra:&lt;br /&gt;
*Automatic&lt;br /&gt;
*Manual&lt;br /&gt;
&lt;br /&gt;
{{Note| This tutorial was tested with Xebra revision 79550, EiffelStudio 6.5.7.9500 ($ISE_EIFFEL) and $EIFFEL_SRC revision 79550. The env vars $EIFFEL_SRC, $ISE_EIFFEL, $ISE_PLATFORM and $ISE_LIBRARY are expected to be set.}}&lt;br /&gt;
&lt;br /&gt;
=Automatic Installation (Ubuntu)=&lt;br /&gt;
There is an installation script available at https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/tools/scripts/install_xebra_ubuntu.sh&lt;br /&gt;
&lt;br /&gt;
The script expects $XEBRA_DEV, $EIFFEL_SRC, $ISE_EIFFEL and $ISE_LIBRARY to be set. It will checkout xebra to $XEBRA_DEV, download, install and configure apache 2.2.11 to $XEBRA_DEV/httpd. Apache will be configured to listen on port 55000 (instead of 80) in order to not interfere with an already installed http server. After the script was successfully run see [[Xebra Tutorial|tutorials]] for how to start the server.&lt;br /&gt;
&lt;br /&gt;
=Manual Installation=&lt;br /&gt;
&lt;br /&gt;
==Checkout Xebra==&lt;br /&gt;
* Define $XEBRA_DEV and checkout xebra from https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/ to $XEBRA_DEV&lt;br /&gt;
&lt;br /&gt;
==Install Apache==&lt;br /&gt;
=== Ubuntu 9.04===&lt;br /&gt;
Note:&lt;br /&gt;
* Mod_xebra does currently not run with the apache distribution that comes with ubuntu. &lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/htdocs to your htdocs folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache unix source httpd-2.2.11 from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Extract&lt;br /&gt;
* Define $APACHE2 where you want to install apache, e.g. to $XEBRA_DEV/httpd&lt;br /&gt;
* Run the following commands:&lt;br /&gt;
 CFLAGS=&amp;quot;-ggdb&amp;quot;./configure --prefix={path were apache should be installed}&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
* Compile the module by running&lt;br /&gt;
 cd $XEBRA_DEV/c_projects/mod_xebra&lt;br /&gt;
 $APACHE2/bin/apxs -c -Wc,-ggdb -I$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/include mod_xebra.c mod_xebra.h&lt;br /&gt;
* Install the module to apache by running&lt;br /&gt;
 $APACHE2/bin/apxs -i mod_xebra.la&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The install script also changes the Listen Port from 80 to 55000. Change this if you wish to run this apache parallel to another webserver that uses port 80.&lt;br /&gt;
&lt;br /&gt;
* Restart apache (if necessary, you need to stop and start instead of restart)&lt;br /&gt;
 $APACHE2/bin/apachectl restart&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
* Hint: keep an eye on the apache error log tail -f $APACHE2/logs/error_log&lt;br /&gt;
&lt;br /&gt;
===Windows (currently under development)===&lt;br /&gt;
&lt;br /&gt;
Note&lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/httpd to your httpd folder.&lt;br /&gt;
* mod_xebra.so has a delay-load dependency on the Visual C++ 9.0 debug runtime library, msvcr90d.dll.  This dll comes with Visual Studio 2008 C++ including the free Visual Studio 2008 C++ Express edition.  This file can be copied in to the System32 directory.  If this DLL is not found you will get an Apache error '''Cannot load C:/Xebra/httpd/modules/mod_xebra.so into server: This application has failed to start because the application configuration is incorrect.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache httpd-2.2.11 windows binary from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Install (Choose Custom Installation and install Build Headers and Libraries as well)&lt;br /&gt;
* Copy [https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/c_projects/apache_mod_xebra_win/Debug/mod_xebra.so mod_xebra.so] to your Apache2.2\modules folder.&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Compile the Xebra Translator===&lt;br /&gt;
* Launch estudio and open the project $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf&lt;br /&gt;
* Compile&lt;br /&gt;
&lt;br /&gt;
Or on linux run:&lt;br /&gt;
 ec -config $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf  -target xebra_translator -c_compile -clean -finalize&lt;br /&gt;
&lt;br /&gt;
===Run the Xebra Server===&lt;br /&gt;
&lt;br /&gt;
See [[Xebra Tutorial]] for how to run the server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation on Windows with IIS7=&lt;br /&gt;
no documentation yet&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Server_Administration&amp;diff=12897</id>
		<title>Xebra Server Administration</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Server_Administration&amp;diff=12897"/>
				<updated>2009-07-07T20:36:24Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Run Xebra Server=&lt;br /&gt;
&lt;br /&gt;
# Note that you should have compiled the translator before you run the server.  &lt;br /&gt;
# If you have not done so, open the file $XEBRA_DEV/eiffel_projects/xebra_server/config.ini and adapt translator, compiler, and webapps_root to your configuration (see [[Xebra Server Config File]]).&lt;br /&gt;
# Launch estudio and compile the project $XEBRA_DEV/eiffel_projects/xebra_server/xebra_server-voidunsafe.ecf&lt;br /&gt;
# Go to the Execution -&amp;gt; Exceptions Handling dialog.  Check &amp;quot;Filter Exceptions?&amp;quot; and change DEVELOPER_EXCEPTION to &amp;quot;Ignore&amp;quot;(this is due to a bug in the NET library that has not been fixed yet).&lt;br /&gt;
# Open the Execution -&amp;gt; Execution Parameters dialog and set &amp;quot;config.ini -d 10&amp;quot; as argument (see below for more info about run arguments).&lt;br /&gt;
# Compile and run&lt;br /&gt;
# Browse to http://localhost:55000/helloworld/. The server now translates, generates, compiles and finally runs the helloworld application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modules=&lt;br /&gt;
The server automatically launches the following modules:&lt;br /&gt;
* mod_http: Listens to requests from the http plugin (Apache Module or IIS7 Handler) on port 55001. These request are forwarded to the appropriate webapp.&lt;br /&gt;
* mod_console: Reads input from the console. The commands described below can be invoked. &lt;br /&gt;
* mod_cmd: Listens to command request from the webapps on port 55002.&lt;br /&gt;
&lt;br /&gt;
=Webapps=&lt;br /&gt;
&lt;br /&gt;
==Assume webapps are running==&lt;br /&gt;
If assume_webapps_are_running was set, the server does not translate, compile and run the webapps. It just tries to connect immediately. This should be used when a webapp is launched in estudio for debugging and the server should not try to run and shutdown the webapp.&lt;br /&gt;
&lt;br /&gt;
==Development Mode==&lt;br /&gt;
By default, a webapp is set to Development Mode which means that the server checks everytime a request was made if the webapp needs to be retranslated and compiled. This makes access to the webapp very slow. As soon as development of the webapp stopps, dev_mod should be set to off.&lt;br /&gt;
&lt;br /&gt;
==Fire off a webapp==&lt;br /&gt;
If the server crashed and therefore could not properly shut down all webapps, they will still be running when the server is relaunched. Hence, the socket will be occupied when the server tries to launch a webapp. Use the fire command to fire off a possibly running webapp. The fire command tries to directly connect to the webapp and send a shutdown signal regardless if the webapp process is owned by the server or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Config File=&lt;br /&gt;
* see [[Xebra Server Config File]]&lt;br /&gt;
&lt;br /&gt;
=Run Arguments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 USAGE: &lt;br /&gt;
    xebra_server &amp;lt;config_filename&amp;gt; [-d &amp;lt;debug_level&amp;gt;] [-c] [-r] [-v]&lt;br /&gt;
&lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    -d --debug_level               : Specifies a debug level. 0: No debug output. 10: All debug ouput. (Optional)&lt;br /&gt;
    -c --clean                     : If set, all webapps will be cleaned (Optional)&lt;br /&gt;
    -r --assume_webapps_are_running: If set, the server assumes that the webapps are already running and does not &lt;br /&gt;
                                     translate, compile and run them before connect to them. (Optional)&lt;br /&gt;
    -h --help                      : Display usage information. (Optional)&lt;br /&gt;
    -v --version                   : Displays version information. (Optional)&lt;br /&gt;
&lt;br /&gt;
 ARGUMENTS:&lt;br /&gt;
    &amp;lt;debug_level&amp;gt;: The debug level (0-10)&lt;br /&gt;
&lt;br /&gt;
 NON-SWITCHED ARGUMENTS:&lt;br /&gt;
    &amp;lt;config_filename&amp;gt;: The path of the config.ini file to use.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Console Commands=&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
* 'help':		 Displays a list of commands.&lt;br /&gt;
&lt;br /&gt;
==Webapps==&lt;br /&gt;
* 'clean &amp;lt;name&amp;gt;':        Cleans, re-translates, compiles and launches a webapp.&lt;br /&gt;
* 'dev &amp;lt;name&amp;gt;':          Sets developing mode of a webapp to on.&lt;br /&gt;
* 'dev_all':             Sets dev_mod to on on all webapps.&lt;br /&gt;
* 'dev_off &amp;lt;name&amp;gt;':      Sets developing mode of a webapp to off.&lt;br /&gt;
* 'dev_off_all':         Sets dev_mod to off on all webapps.&lt;br /&gt;
* 'dev_on &amp;lt;name&amp;gt;':       Sets developing mode of a webapp to on.&lt;br /&gt;
* 'disable &amp;lt;name&amp;gt;':      Disables a webapp.&lt;br /&gt;
* 'enable &amp;lt;name&amp;gt;':       Enables a webapp.&lt;br /&gt;
* 'fire &amp;lt;name&amp;gt;':         Sends shutdown signal to webapp.&lt;br /&gt;
* 'get_sessions':        Retrieves the number of sessions of all running webapps. &lt;br /&gt;
* 'shutdown &amp;lt;name&amp;gt;':     Shuts down a webapp.&lt;br /&gt;
* 'translate &amp;lt;name&amp;gt;':    Forces re-translation of webapp.&lt;br /&gt;
* 'webapps':             Displays the available webapps.&lt;br /&gt;
&lt;br /&gt;
==Server Control==&lt;br /&gt;
* 'exit':               Shuts down the server.&lt;br /&gt;
* 'reload':             Reloads the server configuration file.&lt;br /&gt;
* 'shutdown_webapps':   Shuts down all webapps.&lt;br /&gt;
&lt;br /&gt;
==Modules==&lt;br /&gt;
* 'mlaunch &amp;lt;name&amp;gt;':      Re-launches a server module.&lt;br /&gt;
* 'modules':             Displays the available modules.&lt;br /&gt;
* 'mshutdown &amp;lt;name&amp;gt;':    Shuts down a server module.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Server_Administration&amp;diff=12896</id>
		<title>Xebra Server Administration</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Server_Administration&amp;diff=12896"/>
				<updated>2009-07-07T20:30:53Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Run Xebra Server=&lt;br /&gt;
&lt;br /&gt;
# Note that you should have compiled the translator before you run the server.  &lt;br /&gt;
# If you have not done so, open the file $XEBRA_DEV/eiffel_projects/xebra_server/config.ini and adapt translator, compiler, and webapps_root to your configuration (see [[Xebra Server Config File]]).&lt;br /&gt;
# Launch estudio and compile the project $XEBRA_DEV/eiffel_projects/xebra_server/xebra_server-voidunsafe.ecf&lt;br /&gt;
# Go to the Execution -&amp;gt; Exceptions Handling dialog.  Check &amp;quot;Filter Exceptions?&amp;quot; and disable DEVELOPER_EXCEPTION (this is due to a bug in the NET library that has not been fixed yet).&lt;br /&gt;
# Open the Execution -&amp;gt; Execution Parameters dialog and set &amp;quot;config.ini -d 10&amp;quot; as argument (see below for more info about run arguments).&lt;br /&gt;
# Compile and run&lt;br /&gt;
# Browse to http://localhost:55000/helloworld/. The server now translates, generates, compiles and finally runs the helloworld application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modules=&lt;br /&gt;
The server automatically launches the following modules:&lt;br /&gt;
* mod_http: Listens to requests from the http plugin (Apache Module or IIS7 Handler) on port 55001. These request are forwarded to the appropriate webapp.&lt;br /&gt;
* mod_console: Reads input from the console. The commands described below can be invoked. &lt;br /&gt;
* mod_cmd: Listens to command request from the webapps on port 55002.&lt;br /&gt;
&lt;br /&gt;
=Webapps=&lt;br /&gt;
&lt;br /&gt;
==Assume webapps are running==&lt;br /&gt;
If assume_webapps_are_running was set, the server does not translate, compile and run the webapps. It just tries to connect immediately. This should be used when a webapp is launched in estudio for debugging and the server should not try to run and shutdown the webapp.&lt;br /&gt;
&lt;br /&gt;
==Development Mode==&lt;br /&gt;
By default, a webapp is set to Development Mode which means that the server checks everytime a request was made if the webapp needs to be retranslated and compiled. This makes access to the webapp very slow. As soon as development of the webapp stopps, dev_mod should be set to off.&lt;br /&gt;
&lt;br /&gt;
==Fire off a webapp==&lt;br /&gt;
If the server crashed and therefore could not properly shut down all webapps, they will still be running when the server is relaunched. Hence, the socket will be occupied when the server tries to launch a webapp. Use the fire command to fire off a possibly running webapp. The fire command tries to directly connect to the webapp and send a shutdown signal regardless if the webapp process is owned by the server or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Config File=&lt;br /&gt;
* see [[Xebra Server Config File]]&lt;br /&gt;
&lt;br /&gt;
=Run Arguments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 USAGE: &lt;br /&gt;
    xebra_server &amp;lt;config_filename&amp;gt; [-d &amp;lt;debug_level&amp;gt;] [-c] [-r] [-v]&lt;br /&gt;
&lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    -d --debug_level               : Specifies a debug level. 0: No debug output. 10: All debug ouput. (Optional)&lt;br /&gt;
    -c --clean                     : If set, all webapps will be cleaned (Optional)&lt;br /&gt;
    -r --assume_webapps_are_running: If set, the server assumes that the webapps are already running and does not &lt;br /&gt;
                                     translate, compile and run them before connect to them. (Optional)&lt;br /&gt;
    -h --help                      : Display usage information. (Optional)&lt;br /&gt;
    -v --version                   : Displays version information. (Optional)&lt;br /&gt;
&lt;br /&gt;
 ARGUMENTS:&lt;br /&gt;
    &amp;lt;debug_level&amp;gt;: The debug level (0-10)&lt;br /&gt;
&lt;br /&gt;
 NON-SWITCHED ARGUMENTS:&lt;br /&gt;
    &amp;lt;config_filename&amp;gt;: The path of the config.ini file to use.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Console Commands=&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
* 'help':		 Displays a list of commands.&lt;br /&gt;
&lt;br /&gt;
==Webapps==&lt;br /&gt;
* 'clean &amp;lt;name&amp;gt;':        Cleans, re-translates, compiles and launches a webapp.&lt;br /&gt;
* 'dev &amp;lt;name&amp;gt;':          Sets developing mode of a webapp to on.&lt;br /&gt;
* 'dev_all':             Sets dev_mod to on on all webapps.&lt;br /&gt;
* 'dev_off &amp;lt;name&amp;gt;':      Sets developing mode of a webapp to off.&lt;br /&gt;
* 'dev_off_all':         Sets dev_mod to off on all webapps.&lt;br /&gt;
* 'dev_on &amp;lt;name&amp;gt;':       Sets developing mode of a webapp to on.&lt;br /&gt;
* 'disable &amp;lt;name&amp;gt;':      Disables a webapp.&lt;br /&gt;
* 'enable &amp;lt;name&amp;gt;':       Enables a webapp.&lt;br /&gt;
* 'fire &amp;lt;name&amp;gt;':         Sends shutdown signal to webapp.&lt;br /&gt;
* 'get_sessions':        Retrieves the number of sessions of all running webapps. &lt;br /&gt;
* 'shutdown &amp;lt;name&amp;gt;':     Shuts down a webapp.&lt;br /&gt;
* 'translate &amp;lt;name&amp;gt;':    Forces re-translation of webapp.&lt;br /&gt;
* 'webapps':             Displays the available webapps.&lt;br /&gt;
&lt;br /&gt;
==Server Control==&lt;br /&gt;
* 'exit':               Shuts down the server.&lt;br /&gt;
* 'reload':             Reloads the server configuration file.&lt;br /&gt;
* 'shutdown_webapps':   Shuts down all webapps.&lt;br /&gt;
&lt;br /&gt;
==Modules==&lt;br /&gt;
* 'mlaunch &amp;lt;name&amp;gt;':      Re-launches a server module.&lt;br /&gt;
* 'modules':             Displays the available modules.&lt;br /&gt;
* 'mshutdown &amp;lt;name&amp;gt;':    Shuts down a server module.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Server_Administration&amp;diff=12895</id>
		<title>Xebra Server Administration</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Server_Administration&amp;diff=12895"/>
				<updated>2009-07-07T20:30:19Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
=Run Xebra Server=&lt;br /&gt;
&lt;br /&gt;
# Note that you should have compiled the translator before you run the server.  &lt;br /&gt;
# If you have not done so, open the file $XEBRA_DEV/eiffel_projects/xebra_server/config.ini and adapt translator, compiler, and webapps_root to your configuration (see [[Xebra Server Config File]]).&lt;br /&gt;
# Launch estudio and compile the project $XEBRA_DEV/eiffel_projects/xebra_server/xebra_server-voidunsafe.ecf&lt;br /&gt;
# Go to the Execution -&amp;gt; Exceptions Handling dialog.  Check &amp;quot;Filter Exceptions?&amp;quot; and disable DEVELOPER_EXCEPTION (this is due to a bug in the NET library that has not been fixed yet).&lt;br /&gt;
# Open the Execution Parameters dialog and set &amp;quot;config.ini -d 10&amp;quot; as argument (see below for more info about run arguments).&lt;br /&gt;
# Compile and run&lt;br /&gt;
# Browse to http://localhost:55000/helloworld/. The server now translates, generates, compiles and finally runs the helloworld application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modules=&lt;br /&gt;
The server automatically launches the following modules:&lt;br /&gt;
* mod_http: Listens to requests from the http plugin (Apache Module or IIS7 Handler) on port 55001. These request are forwarded to the appropriate webapp.&lt;br /&gt;
* mod_console: Reads input from the console. The commands described below can be invoked. &lt;br /&gt;
* mod_cmd: Listens to command request from the webapps on port 55002.&lt;br /&gt;
&lt;br /&gt;
=Webapps=&lt;br /&gt;
&lt;br /&gt;
==Assume webapps are running==&lt;br /&gt;
If assume_webapps_are_running was set, the server does not translate, compile and run the webapps. It just tries to connect immediately. This should be used when a webapp is launched in estudio for debugging and the server should not try to run and shutdown the webapp.&lt;br /&gt;
&lt;br /&gt;
==Development Mode==&lt;br /&gt;
By default, a webapp is set to Development Mode which means that the server checks everytime a request was made if the webapp needs to be retranslated and compiled. This makes access to the webapp very slow. As soon as development of the webapp stopps, dev_mod should be set to off.&lt;br /&gt;
&lt;br /&gt;
==Fire off a webapp==&lt;br /&gt;
If the server crashed and therefore could not properly shut down all webapps, they will still be running when the server is relaunched. Hence, the socket will be occupied when the server tries to launch a webapp. Use the fire command to fire off a possibly running webapp. The fire command tries to directly connect to the webapp and send a shutdown signal regardless if the webapp process is owned by the server or not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Config File=&lt;br /&gt;
* see [[Xebra Server Config File]]&lt;br /&gt;
&lt;br /&gt;
=Run Arguments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 USAGE: &lt;br /&gt;
    xebra_server &amp;lt;config_filename&amp;gt; [-d &amp;lt;debug_level&amp;gt;] [-c] [-r] [-v]&lt;br /&gt;
&lt;br /&gt;
 OPTIONS:&lt;br /&gt;
    -d --debug_level               : Specifies a debug level. 0: No debug output. 10: All debug ouput. (Optional)&lt;br /&gt;
    -c --clean                     : If set, all webapps will be cleaned (Optional)&lt;br /&gt;
    -r --assume_webapps_are_running: If set, the server assumes that the webapps are already running and does not &lt;br /&gt;
                                     translate, compile and run them before connect to them. (Optional)&lt;br /&gt;
    -h --help                      : Display usage information. (Optional)&lt;br /&gt;
    -v --version                   : Displays version information. (Optional)&lt;br /&gt;
&lt;br /&gt;
 ARGUMENTS:&lt;br /&gt;
    &amp;lt;debug_level&amp;gt;: The debug level (0-10)&lt;br /&gt;
&lt;br /&gt;
 NON-SWITCHED ARGUMENTS:&lt;br /&gt;
    &amp;lt;config_filename&amp;gt;: The path of the config.ini file to use.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Console Commands=&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
* 'help':		 Displays a list of commands.&lt;br /&gt;
&lt;br /&gt;
==Webapps==&lt;br /&gt;
* 'clean &amp;lt;name&amp;gt;':        Cleans, re-translates, compiles and launches a webapp.&lt;br /&gt;
* 'dev &amp;lt;name&amp;gt;':          Sets developing mode of a webapp to on.&lt;br /&gt;
* 'dev_all':             Sets dev_mod to on on all webapps.&lt;br /&gt;
* 'dev_off &amp;lt;name&amp;gt;':      Sets developing mode of a webapp to off.&lt;br /&gt;
* 'dev_off_all':         Sets dev_mod to off on all webapps.&lt;br /&gt;
* 'dev_on &amp;lt;name&amp;gt;':       Sets developing mode of a webapp to on.&lt;br /&gt;
* 'disable &amp;lt;name&amp;gt;':      Disables a webapp.&lt;br /&gt;
* 'enable &amp;lt;name&amp;gt;':       Enables a webapp.&lt;br /&gt;
* 'fire &amp;lt;name&amp;gt;':         Sends shutdown signal to webapp.&lt;br /&gt;
* 'get_sessions':        Retrieves the number of sessions of all running webapps. &lt;br /&gt;
* 'shutdown &amp;lt;name&amp;gt;':     Shuts down a webapp.&lt;br /&gt;
* 'translate &amp;lt;name&amp;gt;':    Forces re-translation of webapp.&lt;br /&gt;
* 'webapps':             Displays the available webapps.&lt;br /&gt;
&lt;br /&gt;
==Server Control==&lt;br /&gt;
* 'exit':               Shuts down the server.&lt;br /&gt;
* 'reload':             Reloads the server configuration file.&lt;br /&gt;
* 'shutdown_webapps':   Shuts down all webapps.&lt;br /&gt;
&lt;br /&gt;
==Modules==&lt;br /&gt;
* 'mlaunch &amp;lt;name&amp;gt;':      Re-launches a server module.&lt;br /&gt;
* 'modules':             Displays the available modules.&lt;br /&gt;
* 'mshutdown &amp;lt;name&amp;gt;':    Shuts down a server module.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12894</id>
		<title>Xebra Installation</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Xebra_Installation&amp;diff=12894"/>
				<updated>2009-07-07T19:03:57Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Xebra]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Note| This tutorial was tested with Xebra revision 79550, EiffelStudio 6.5.7.9500 ($ISE_EIFFEL) and $EIFFEL_SRC revision 79550. The env vars $EIFFEL_SRC, $ISE_EIFFEL, $ISE_PLATFORM and $ISE_LIBRARY are expected to be set.}}&lt;br /&gt;
&lt;br /&gt;
=Automatic Installation (Ubuntu)=&lt;br /&gt;
There is an installation script available at https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/tools/scripts/install_xebra_ubuntu.sh&lt;br /&gt;
&lt;br /&gt;
The script expects $XEBRA_DEV, $EIFFEL_SRC, $ISE_EIFFEL and $ISE_LIBRARY to be set. It will checkout xebra to $XEBRA_DEV, download, install and configure apache 2.2.11 to $XEBRA_DEV/httpd. Apache will be configured to listen on port 55000 (instead of 80) in order to not interfere with an already installed http server. After the script was successfully run see [[Xebra Tutorial|tutorials]] for how to start the server.&lt;br /&gt;
&lt;br /&gt;
=Manual Installation=&lt;br /&gt;
&lt;br /&gt;
==Checkout Xebra==&lt;br /&gt;
* Define $XEBRA_DEV and checkout xebra from https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/ to $XEBRA_DEV&lt;br /&gt;
&lt;br /&gt;
==Install Apache==&lt;br /&gt;
=== Ubuntu 9.04===&lt;br /&gt;
Note:&lt;br /&gt;
* Mod_xebra does currently not run with the apache distribution that comes with ubuntu. &lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/httpd to your httpd folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache unix source httpd-2.2.11 from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Extract&lt;br /&gt;
* Define $APACHE2 where you want to install apache, e.g. to $XEBRA_DEV/httpd&lt;br /&gt;
* Run the following commands:&lt;br /&gt;
 CFLAGS=&amp;quot;-ggdb&amp;quot;./configure --prefix={path were apache should be installed}&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
* Compile the module by running&lt;br /&gt;
 cd $XEBRA_DEV/c_projects/mod_xebra&lt;br /&gt;
 $APACHE2/bin/apxs -c -Wc,-ggdb -I$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/include mod_xebra.c mod_xebra.h&lt;br /&gt;
* Install the module to apache by running&lt;br /&gt;
 sudo $APACHE2/bin/apxs -i mod_xebra.la&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The install script also changes the Listen Port from 80 to 55000. Change this if you wish to run this apache parallel to another webserver that uses port 80.&lt;br /&gt;
&lt;br /&gt;
* Restart apache (if necessary, you need to stop and start instead of restart)&lt;br /&gt;
 sudo $APACHE2/bin/apachectl restart&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
* Hint: keep an eye on the apache error log tail -f $APACHE2/logs/error_log&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
&lt;br /&gt;
Note&lt;br /&gt;
* If you do not install apache into the $XEBRA_DEV/httpd folder remember to copy the webapps from $XEBRA_DEV/httpd/httpd to your httpd folder.&lt;br /&gt;
* mod_xebra.so has a delay-load dependency on the Visual C++ 9.0 debug runtime library, msvcr90d.dll.  This dll comes with Visual Studio 2008 C++ including the free Visual Studio 2008 C++ Express edition.  This file can be copied in to the System32 directory.  If this DLL is not found you will get an Apache error '''Cannot load C:/Xebra/httpd/modules/mod_xebra.so into server: This application has failed to start because the application configuration is incorrect.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Download apache httpd-2.2.11 windows binary from http://httpd.apache.org/download.cgi&lt;br /&gt;
* Install (Choose Custom Installation and install Build Headers and Libraries as well)&lt;br /&gt;
* Copy [https://svn.origo.ethz.ch/eiffelstudio/trunk/Src/framework/web/xebra/c_projects/apache_mod_xebra_win/Debug/mod_xebra.so mod_xebra.so] to your Apache2.2\modules folder.&lt;br /&gt;
* Add the following lines to Apache2.2\conf\httpd.conf:&lt;br /&gt;
 #Xebra Module&lt;br /&gt;
 LoadModule xebra_module modules/mod_xebra.so&lt;br /&gt;
 &amp;lt;IfModule xebra_module&amp;gt;&lt;br /&gt;
  AddHandler mod_xebra .xeb&lt;br /&gt;
  AddHandler mod_xebra .xrpc&lt;br /&gt;
  XebraServer_port &amp;quot;55001&amp;quot;&lt;br /&gt;
  XebraServer_host &amp;quot;localhost&amp;quot;&lt;br /&gt;
  LogLevel debug&lt;br /&gt;
  DirectoryIndex index.xeb&lt;br /&gt;
  &amp;lt;Files ~ &amp;quot;\.(ini|e|ecf)$&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Files&amp;gt;&lt;br /&gt;
  &amp;lt;Directory ~ &amp;quot;EIFGENs&amp;quot;&amp;gt;&lt;br /&gt;
   Order allow,deny&lt;br /&gt;
   Deny from all&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
* Restart Apache&lt;br /&gt;
* Browse to http://localhost/test.xeb. You should see the Fail Whale and a message saying &amp;quot;Cannot connect to XebraServer. See apache error log.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Compile the Xebra Translator===&lt;br /&gt;
* Launch estudio and open the project $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf&lt;br /&gt;
* Compile&lt;br /&gt;
&lt;br /&gt;
Or on linux run:&lt;br /&gt;
 ec -config $XEBRA_DEV/eiffel_projects/xebra_translator/xebra_translator-voidunsafe.ecf  -target xebra_translator -c_compile -clean&lt;br /&gt;
&lt;br /&gt;
===Run the Xebra Server===&lt;br /&gt;
&lt;br /&gt;
See [[Xebra Tutorial]] for how to run the server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation on Windows with IIS7=&lt;br /&gt;
no documentation yet&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Transient_Attributes&amp;diff=12806</id>
		<title>Talk:Transient Attributes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Transient_Attributes&amp;diff=12806"/>
				<updated>2009-07-01T17:07:13Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 15:28, 30 June 2009 (UTC) What happens when the attribute is inherited? It is still possible to inherit the volatile attribute in an expanded class. Or does the volatile property work only in the class it is declared, i.e. the property of being volatile is not inherited?&lt;br /&gt;
:'''--[[User:Manus|manus]] 15:06, 1 July 2009 (UTC)''' The validity rules are applied for inherited attributes as well, and the volatile property is inherited. In order to not inherit it, you have to redefine the attribute.&lt;br /&gt;
::--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 16:16, 1 July 2009 (UTC) In other words, an expanded class has to redefine any attributes declared in parent class as volatile, right?&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 16:07, 1 July 2009 (UTC)&lt;br /&gt;
What are the semantics around a note clause under an attribute?  This looks like a weaker form of C# attributes, is this intended to be a one-off things for serialization?  EDIT: Are these only accessible within the compiler or are they accessible programatically?&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Transient_Attributes&amp;diff=12793</id>
		<title>Talk:Transient Attributes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Transient_Attributes&amp;diff=12793"/>
				<updated>2009-07-01T16:07:36Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[User:Alexander Kogtenkov|Alexander Kogtenkov]] 15:28, 30 June 2009 (UTC) What happens when the attribute is inherited? It is still possible to inherit the volatile attribute in an expanded class. Or does the volatile property work only in the class it is declared, i.e. the property of being volatile is not inherited?&lt;br /&gt;
:'''--[[User:Manus|manus]] 15:06, 1 July 2009 (UTC)''' The validity rules are applied for inherited attributes as well, and the volatile property is inherited. In order to not inherit it, you have to redefine the attribute.&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 16:07, 1 July 2009 (UTC)&lt;br /&gt;
What are the semantics around a note clause under an attribute?  This looks like a weaker form of C# attributes, is this intended to be a one-off things for serialization?&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_6.4_Releases&amp;diff=12102</id>
		<title>EiffelStudio 6.4 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_6.4_Releases&amp;diff=12102"/>
				<updated>2009-02-26T05:18:48Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 6.4.x Releases=&lt;br /&gt;
&lt;br /&gt;
==6.4.x==&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: speed up C compilation of E1/eskelet.c in workbench mode when using VS 2005 C++ in 64-bit. We went from a benchmark of 3 minutes down to 1 minute. It is definitely a bug in VS since their 32-bit version compiles the same code in just a matter of a few seconds.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*runtime: Fixed eweasel test#conform008 where creating an attached formal generic parameter of a generic type whose actual generic parameter is a TUPLE type would not create the proper TUPLE type.&lt;br /&gt;
*debugger: fixed bug#15218: ~ not supported in the watch window.&lt;br /&gt;
*debugger: improved/fixed expression evaluation related to `a = b' and `a ~ b'. As well conditional breakpoint of type `Has Changed'&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*general: Updated all our libraries to use the new object test syntax.&lt;br /&gt;
*favorites: Data is now kept in project's session data; favorites are kept even after a recompilation from scratch.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.7.7252 (February 23rd 2009)==&lt;br /&gt;
===New features===&lt;br /&gt;
*compiler: Added support for the new syntax for object test, i.e. &amp;lt;e&amp;gt;attached {T} exp as u&amp;lt;/e&amp;gt; instead of &amp;lt;e&amp;gt;{u: T} expr&amp;lt;/e&amp;gt;&lt;br /&gt;
*syntax_updater: Syntax updater will convert the old syntax for object test to the new one, and will also perform some optimizations, such as transforming &amp;lt;e&amp;gt;{t: like x} x&amp;lt;/e&amp;gt; into just &amp;lt;e&amp;gt;attached x as t&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: Supported object tests using the same object test local name in a single feature provided that their scopes do not conflict.&lt;br /&gt;
*compiler: speed up parsing time in compiler that can provide about 3% speed up.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*runtime: Fixed bug#15280 and eweasel test#except034 that {EXCEPTION_MANAGER}.last_exception not cleared after successful retry if melted.&lt;br /&gt;
*compiler: Correctly reported VEVI error for attributes initialized from a creation procedure by calling a once routine because the latter is not guaranteed to be executed on subsequent calls.&lt;br /&gt;
*debugger: Fixed bug#15384: Debugger does not step at correct position (related to require else...)&lt;br /&gt;
*debugger: now the debugger remembers correctly the breakpoint, even when recompiling from scratch.&lt;br /&gt;
*compiler: Fixed some issues with non-conforming inheritance (bug#15224)&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.7.7062 (February 9th 2009)==&lt;br /&gt;
===New features===&lt;br /&gt;
* Eiffel2Java: void-safe, added void-safe example.&lt;br /&gt;
* EiffelWeb: void-safe.&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: attached attribute initialization in creation procedures is now detected not only by inspecting the top-level instructions, but also the nested complex instructions with several possible execution paths, like conditional instruction, multi-branch, etc.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*testing: Fixed a bug where minimization of test was not done resulting in very large regression tests.&lt;br /&gt;
*compiler: Fixed eweasel test#attach047 where type of array of string passed as argument to the creation procedure of the root class should have an attached actual argument type.&lt;br /&gt;
*compiler: Fixed eweasel test#svalid018 where a crash occurred in `process_converted_expr_as' because we failed to verify that the expression still compiles fine even if inherited, because although it might compile fine in the ancestor, in the descendant it might not if they use a different set of options (e.g. non-void-safe in parent and void-safe in descendant).&lt;br /&gt;
*eiffelweb: Fixed issue with `hexa_to_ascii' to make sure we process correctly even incorrectly encoded URL. Added `insert_pair_without_encoding' and `parse_urlencoded_input'. Fixed input_data to return an empty string and not to report an error and the content_length is empty as it is permitted to do so.&lt;br /&gt;
*eiffelweb: Fixed issue bug#15267 by inheriting from SHARED_STDIN and SHARED_STDOUT to provide `stdin' and `output' in CGI_IN_AND_OUT.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*{{Red|base: Made several changes in EiffelBase so that the same version can be compiled in void-safe mode as well as in non-void safe mode. The code that might not be compile anymore is `create {CELL [SOME]}' because default_create is not a creation procedure anymore.}}&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
*studio: The Groups tool and Favorites tool are now based on ESF.&lt;br /&gt;
*studio: Significant changes made in ESF tool foundations to further optimize startup and memory performance. Panels are no longer created unless the panel UI is actually needed.&lt;br /&gt;
&lt;br /&gt;
==6.4.7.6930 (February 2nd 2009)==&lt;br /&gt;
===New features===&lt;br /&gt;
*compiler: for enhanced backward compatibility with 6.3, estudio and ec/ecb have a new command line option `-compat' to launch EiffelStudio or the command line compiler with compilation settings compatible with those of 6.3. On Windows, you also have a new shortcut entry in the start menu for launching EiffelStudio in this compatibility mode.&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: Better explanation for VDPR(3) errors when two or more precursor are available by listing all the precursors.&lt;br /&gt;
*compiler: Non-void arguments are now detected not only when they are specified in the voidness tests in immediate preconditions, but also in inherited ones.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: Fixed eweasel test#attach042 and test#attach043 where type of agent was incorrect when target was of type `like Current' or when the routine had no open arguments, in both cases the compiler generated detachable types when attached were expected.&lt;br /&gt;
*compiler: Fixed some regressions eweasel test#fixed119 and test#incr318.&lt;br /&gt;
*compiler: Fixed invalid precursor missed detection thus fixing eweasel test#valid117.&lt;br /&gt;
*runtime: Fixed eweasel test#runtime011 were a memory corruption could occur when twining a SPECIAL or a TUPLE object under certain circumstances.&lt;br /&gt;
*studio: Fixed a bug where editor will disappear when debugging.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*compiler: renamed VUPR errors to their ECMA name VDPR.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.7.6833 (January 26th 2009)==&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*wel: now void-safe&lt;br /&gt;
*lex: now void-safe&lt;br /&gt;
*encoding: now void-safe&lt;br /&gt;
*process: now void-safe&lt;br /&gt;
*time: added void-safe sample&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*studio: Fixed bug#15253 where editor is missing from docking layout.&lt;br /&gt;
*base: Fixed bug#15266 where we incorrectly merged the code value for {IO_EXCEPTION} and {RUNTIME_IO_EXCEPTION} thus breaking existing code not based on Eiffel exception object. (eweasel test#except035)&lt;br /&gt;
*base: Fixed bug#15273 and eweasel test#except033 that an exception thrown through rescues caused infinite loop.&lt;br /&gt;
*studio: Fixed the bug &amp;quot;Show disambiguated names&amp;quot; and &amp;quot;Show obsolete items&amp;quot; button on completion window did not function correctly and made tooltips on option buttons translatable.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.7.6747 (January 19th 2009)==&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*{{Red|base: Updated the IMMUTABLE_STRING classes to have an efficient string extraction query `shared_substring' which will let you create a substring of an existing immutable string without actually duplicating the data.}}&lt;br /&gt;
*studio: Added option in the new library dialog to show only void-safe libraries, for void-safe projects.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: Fixed a bug with pre/post actions which were always executed regardless of the specified condition.&lt;br /&gt;
*runtime: Fixed eweasel test#store020 where our recoverable store mechanism could not retrieve an object if it was generic and using a formal as actual generic parameter in a generic derivation using an expanded type. This is because in 6.2, we decided not to perform the instantiation of the attribute as it was not working properly when generic derivation is a generic expanded type. For the time being, if there is a mismatch where expected type is a FORMAL_TYPE, we try to instantiate it in the current processed type and if there is a match then we know it is ok, otherwise we reject the code. This also fixes bug#15256.&lt;br /&gt;
*runtime: Fixed eweasel test#store019 where using the SED facilities to store/retrieve attributes which are attached would fail.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.7.6645 (January 12th 2009)==&lt;br /&gt;
===New features===&lt;br /&gt;
*studio: Added compile_all, syntax_updater and Eiffel image embedder tool to the EiffelStudio delivery. They are located under $ISE_EIFFEL/tools/spec/$ISE_PLATFORM/bin.&lt;br /&gt;
*editor: Added `flush' to force a full load of texts.&lt;br /&gt;
===Improvements===&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: Fixed bug#15235 where some C compilers do not like that we generate a C array of size 0.&lt;br /&gt;
*compiler: Fixed correctly location reporting of error classes, using the location where the code is written which differs from the current class being analyzed.&lt;br /&gt;
*compiler: Fixed bug#15139 by checking when parts of a multi-branch conditional instruction even when the inspect expression does not type check (see test#valid228).&lt;br /&gt;
*compiler: Fixed test#attach039 by using written class when evaluating precursor features as the current feature may be inherited.&lt;br /&gt;
*compiler: Fixed bug#15144 by checking that a self-initializing attribute is not processed recursively (see test#term169).&lt;br /&gt;
*compiler: Fixed bug#15129 by using a mixed routine-attribute table for attributes that may be self-initializing (see test#final072).&lt;br /&gt;
*studio: Fixed issue bug#15222 to respected existing note clause tags and values.&lt;br /&gt;
*finish_freezing: Fixed typo reported in bug#15239.&lt;br /&gt;
*net: Move definition of FD_SETSIZE before using the Windows header files so that we can really listen on 256 descriptors (breaking change introduced in the IPv6 version which is now the official).&lt;br /&gt;
===User changes===&lt;br /&gt;
*studio: Added EIS built-in variable &amp;quot;ISE_DOC_UUID&amp;quot; with value of &amp;quot;http://doc.eiffel.com/isedoc/uuid&amp;quot;.&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.7.6592 (January 5th 2009)==&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*studio: Automatic class licenser now preserves all other note clause terms when replacing a license in the class text.&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*studio: Fixed reporting of feature errors to report the correct class name when referring to parent class errors.&lt;br /&gt;
*studio: Fixed EIS tool broken by either compiler changes or improper attachment usage.&lt;br /&gt;
*studio: Fixed a library target compiled as an application target was not editable by EIS.&lt;br /&gt;
*studio: Fixed a bug that note elements were not properly setup when recomputing configuration, which caused missing of some EIS entries.&lt;br /&gt;
===User changes===&lt;br /&gt;
*{{red|net: The IPv6 version of the EiffelNet library is now the official one. The old one has been moved in the obsolete cluster.}}&lt;br /&gt;
*{{red|compiler: The compiler now accepts &amp;lt;e&amp;gt;attribute&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;note&amp;lt;/e&amp;gt; as keyword by default.}}&lt;br /&gt;
*{{red|argument parser: The argument parser library introduces some breaking changes in deferred feature signatures due to the conversion to Void-Safe.}}&lt;br /&gt;
*studio: Added built-in EIS variable &amp;quot;ISE_DOC&amp;quot; with value of &amp;quot;http://doc.eiffel.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.7.6402 (December 27th 2008)==&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: speed up degree 6 by not looking at the content of all .e files to figure out the associated class name. We now assume on the first pass that the file name is the class name. On EiffelStudio, if none of the file were buffered, we went from about 1 minute spent to just less than 3 seconds. The improvement should be even more when classes are on a remote drive.&lt;br /&gt;
*studio: Set current line number as initial line number of the Go to line dialog. This fixed bug#15193.&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: Fixed missing detection of VRFT errors in cases like &amp;quot;&amp;lt;e&amp;gt;a: TUPLE [a: TUPLE [out: INTEGER]]&amp;lt;/e&amp;gt;&amp;quot;. Fixes eweasel test#exec293.&lt;br /&gt;
*compiler: Fixed catcall checker crashing when enabled. Fixes eweasel test#term166.&lt;br /&gt;
*runtime: Fixed eweasel test#exec293 where accessing labels of a Void tuple would not cause a call on Void target exception.&lt;br /&gt;
*studio: Fixed a bug that shortcut preferences with `+'/`Numpad +' could not be modified.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*compiler: now the compiler does not produce the class progress output in batch mode. If you want the old behavior, you have to use -verbose option.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.7.6313 (December 22nd 2008)==&lt;br /&gt;
===New features===&lt;br /&gt;
*base: Added `same_keys' to HASH_TABLE. You can redefine this feature to use a different comparison criterion for the keys.&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: Improved implementation of ~ and expanded comparison to use `is_equal' directly rather than using `equal'.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: Fixed eweasel test#exec292 where type of inherited formals where incorrectly interpreted in descendants.&lt;br /&gt;
*base: Fixed a bug that would not recognize a class name A_SOMETHING as a valid identifier for INTERNAL.&lt;br /&gt;
*studio: New library dialog now correctly sorts the contents base on the library name and not the path.&lt;br /&gt;
*studio: Fixed bug#15173: EiffelStudio crash when selecting library&lt;br /&gt;
*runtime: Fixed eweasel test#runtime010 where certain allocation patterns could cause a major slow down during a garbage collection cycle.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*{{Red|base: We do not use &amp;lt;e&amp;gt;is_equal&amp;lt;/e&amp;gt; in EiffelBase, but instead the ~ operator. This could break some of your code, especially with HASH_TABLE.}}&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==6.4.76164 (December 15th 2008)==&lt;br /&gt;
===New features===&lt;br /&gt;
* studio: In-grid-item selection in Error List tool.&lt;br /&gt;
* editor: Customizing some editor attributes, fonts, line height and etc., per instance.&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*studio: Tabulated format of copied selection from the Error List tool.&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*studio: Fixed bug#14237 where some manipulations on the UI could corrupt the EiffelStudio docking layout.&lt;br /&gt;
*studio: Fixed bug#12453 where VYCQ error would print the feature name in blue rather than in green.&lt;br /&gt;
*studio: Added a protection for bug#15116 where we could still try to access `content' while EiffelStudio has already destroyed the panel.&lt;br /&gt;
*studio: Fixed bug#15073 that Pick and drop from output window didn't work when no class tool was available.&lt;br /&gt;
*compiler: Fixed eweasel test#multicon050 where compiler did not handle renaming of a routine with an alias into a routine without one as it still thought the alias was available.&lt;br /&gt;
*compiler: Added printing of referenced configuration file in which there is a conflict. This fixes bug#15099.&lt;br /&gt;
*compiler: Fixed an incorrect VUTA(2) error being reported when compiling a static access call in void-safe mode. This fixes eweasel test#valid223.&lt;br /&gt;
*compiler: Fixed an incrementality corruption (bug#15061 and eweasel test#incr296) which would occur a feature has an invalid signature for one failed compilation before it is fixed again.&lt;br /&gt;
*compiler: Fixed bug#15027 where if you have a class which was originally only in an override cluster and then keep it in the override cluster but also now in a normal cluster, then we would not remove the compiled information from the override cluster which would cause in a later compilation the class to be forcibly removed from the system even though it is still in use.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*{{Red|base: it is now using the new alias syntax for operators instead of obsolete syntax based on `infix/prefix' keywords. As a result some of your code may not compile.}}&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Local_Declaration_Guidelines&amp;diff=11874</id>
		<title>Talk:Local Declaration Guidelines</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Local_Declaration_Guidelines&amp;diff=11874"/>
				<updated>2009-01-09T19:43:32Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: New page: What about putting the character at the end of variable name instead of the beginning?  Prepending seems similar to prefixing features with the class name which we don't do, or the C way o...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What about putting the character at the end of variable name instead of the beginning?  Prepending seems similar to prefixing features with the class name which we don't do, or the C way of prepending things with _variable.&lt;br /&gt;
&lt;br /&gt;
I don't know, maybe it's just a preference but I don't like l_ at the beginning of all local variables I use.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Named_Inheritance&amp;diff=11732</id>
		<title>Named Inheritance</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Named_Inheritance&amp;diff=11732"/>
				<updated>2008-11-01T23:16:34Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
&lt;br /&gt;
Motivation:&lt;br /&gt;
*Remove the need for adapter classes.&lt;br /&gt;
*Reconcile the relatively loose conventions around agents in to the more strict conventions of inheritance.&lt;br /&gt;
&lt;br /&gt;
Similarity between adapter classes and agents&lt;br /&gt;
----&lt;br /&gt;
Take the starting classes A and B:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
feature&lt;br /&gt;
process_1&lt;br /&gt;
do&lt;br /&gt;
 -- Operate on value_1&lt;br /&gt;
end&lt;br /&gt;
value_1: INTEGER&lt;br /&gt;
test_1: BOOLEAN&lt;br /&gt;
process_2&lt;br /&gt;
do&lt;br /&gt;
 -- Different operation on value_2&lt;br /&gt;
end&lt;br /&gt;
value_2: INTEGER&lt;br /&gt;
test_2: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class B&lt;br /&gt;
feature&lt;br /&gt;
process&lt;br /&gt;
deferred&lt;br /&gt;
end&lt;br /&gt;
value: INTEGER&lt;br /&gt;
deferred&lt;br /&gt;
end&lt;br /&gt;
test: BOOLEAN&lt;br /&gt;
deferred&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And adapters C and D:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class C&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
feature&lt;br /&gt;
make (sourceA: A)&lt;br /&gt;
do&lt;br /&gt;
source := sourceA&lt;br /&gt;
end&lt;br /&gt;
source: A&lt;br /&gt;
process&lt;br /&gt;
do&lt;br /&gt;
source.process_1&lt;br /&gt;
end&lt;br /&gt;
value: INTEGER&lt;br /&gt;
do&lt;br /&gt;
result := source.process_1&lt;br /&gt;
end&lt;br /&gt;
test: INTEGER&lt;br /&gt;
do&lt;br /&gt;
result := source.test_1&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class D&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
feature&lt;br /&gt;
make (sourceA: A)&lt;br /&gt;
do&lt;br /&gt;
source := sourceA&lt;br /&gt;
end&lt;br /&gt;
source: A&lt;br /&gt;
process&lt;br /&gt;
do&lt;br /&gt;
source.process_2&lt;br /&gt;
end&lt;br /&gt;
value: INTEGER&lt;br /&gt;
do&lt;br /&gt;
result := source.value_2&lt;br /&gt;
end&lt;br /&gt;
test: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
result := source.test_2&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using these adapters, if A wanted to provide clients access to itself in 2 different ways through B, the following features could be added to A:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
--Same features as above--&lt;br /&gt;
feature&lt;br /&gt;
one: B&lt;br /&gt;
do&lt;br /&gt;
result := create {C}.make (current)&lt;br /&gt;
end&lt;br /&gt;
two: B&lt;br /&gt;
do&lt;br /&gt;
result := create {D}.make (current)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another way A could provide access to itself similar to B is by use of agents:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
--Same features as above--&lt;br /&gt;
feature&lt;br /&gt;
one: TUPLE [process: PROCEDURE [ANY, []], value: FUNCTION[ANY, [], INTEGER], test: FUNCTION[ANY, [], BOOLEAN]]&lt;br /&gt;
do&lt;br /&gt;
result.process := agent process_1&lt;br /&gt;
result.value := agent value_1&lt;br /&gt;
result.test := agent test_1&lt;br /&gt;
end&lt;br /&gt;
two: TUPLE [process: PROCEDURE [ANY, []], value: FUNCTION[ANY, [], INTEGER], test: FUNCTION[ANY, [], BOOLEAN]]&lt;br /&gt;
do&lt;br /&gt;
result.process := agent process_2&lt;br /&gt;
result.value := agent value_2&lt;br /&gt;
result.test := agent test_2&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Disadvantages of adapters:&lt;br /&gt;
*Requires 1 new class for every way a class wishes to provide facilities to clients.&lt;br /&gt;
&lt;br /&gt;
Disadvantages of agents:&lt;br /&gt;
*Requires a new, though already implemented, language construct `agents'.&lt;br /&gt;
*Strongly typed contracts related to agents are not defined.&lt;br /&gt;
&lt;br /&gt;
Implementation of A using named inheritance:&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
inherit&lt;br /&gt;
one: B&lt;br /&gt;
rename&lt;br /&gt;
process as process_1,&lt;br /&gt;
value as value_1,&lt;br /&gt;
test as test_1&lt;br /&gt;
end&lt;br /&gt;
two: B&lt;br /&gt;
rename&lt;br /&gt;
process as process_2,&lt;br /&gt;
value as value_2,&lt;br /&gt;
test as test_2&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
process_1&lt;br /&gt;
do&lt;br /&gt;
 -- Operate on value_1&lt;br /&gt;
end&lt;br /&gt;
value_1: INTEGER&lt;br /&gt;
test_1: BOOLEAN&lt;br /&gt;
process_2&lt;br /&gt;
do&lt;br /&gt;
 -- Different operation on value_2&lt;br /&gt;
end&lt;br /&gt;
value_2: INTEGER&lt;br /&gt;
test_2: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A client of A could make use of the named inheritance functionality as such:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class APPLICATION&lt;br /&gt;
feature&lt;br /&gt;
make&lt;br /&gt;
local&lt;br /&gt;
obj: A&lt;br /&gt;
one: B&lt;br /&gt;
two: B&lt;br /&gt;
do&lt;br /&gt;
create obj&lt;br /&gt;
one := obj.one&lt;br /&gt;
two := obj.two&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Named_Inheritance&amp;diff=11731</id>
		<title>Named Inheritance</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Named_Inheritance&amp;diff=11731"/>
				<updated>2008-10-31T19:55:51Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
&lt;br /&gt;
Motivation:&lt;br /&gt;
*Remove the need for adapter classes.&lt;br /&gt;
*Reconcile the relatively loose conventions around agents in to the more strict conventions of inheritance.&lt;br /&gt;
&lt;br /&gt;
Similarity between adapter classes and agents&lt;br /&gt;
----&lt;br /&gt;
Take the starting classes A and B:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
feature&lt;br /&gt;
process_1&lt;br /&gt;
do&lt;br /&gt;
 -- Operate on value_1&lt;br /&gt;
end&lt;br /&gt;
value_1: INTEGER&lt;br /&gt;
test_1: BOOLEAN&lt;br /&gt;
process_2&lt;br /&gt;
do&lt;br /&gt;
 -- Different operation on value_2&lt;br /&gt;
end&lt;br /&gt;
value_2: INTEGER&lt;br /&gt;
test_2: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class B&lt;br /&gt;
feature&lt;br /&gt;
process&lt;br /&gt;
deferred&lt;br /&gt;
end&lt;br /&gt;
value: INTEGER&lt;br /&gt;
deferred&lt;br /&gt;
end&lt;br /&gt;
test: BOOLEAN&lt;br /&gt;
deferred&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And adapters C and D:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class C&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
feature&lt;br /&gt;
make (sourceA: A)&lt;br /&gt;
do&lt;br /&gt;
source := sourceA&lt;br /&gt;
end&lt;br /&gt;
source: A&lt;br /&gt;
process&lt;br /&gt;
do&lt;br /&gt;
source.process_1&lt;br /&gt;
end&lt;br /&gt;
value: INTEGER&lt;br /&gt;
do&lt;br /&gt;
result := source.process_1&lt;br /&gt;
end&lt;br /&gt;
test: INTEGER&lt;br /&gt;
do&lt;br /&gt;
result := source.test_1&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class D&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
feature&lt;br /&gt;
make (sourceA: A)&lt;br /&gt;
do&lt;br /&gt;
source := sourceA&lt;br /&gt;
end&lt;br /&gt;
source: A&lt;br /&gt;
process&lt;br /&gt;
do&lt;br /&gt;
source.process_2&lt;br /&gt;
end&lt;br /&gt;
value: INTEGER&lt;br /&gt;
do&lt;br /&gt;
result := source.value_2&lt;br /&gt;
end&lt;br /&gt;
test: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
result := source.test_2&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using these adapters, if A wanted to provide clients access to itself in 2 different ways through B, the following features could be added to A:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
--Same features as above--&lt;br /&gt;
feature&lt;br /&gt;
one: B&lt;br /&gt;
do&lt;br /&gt;
result := create {C}.make (current)&lt;br /&gt;
end&lt;br /&gt;
two: B&lt;br /&gt;
do&lt;br /&gt;
result := create {D}.make (current)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another way A could provide access to itself similar to B is by use of agents:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
--Same features as above--&lt;br /&gt;
feature&lt;br /&gt;
one: TUPLE [process: PROCEDURE [ANY, []], value: FUNCTION[ANY, [], INTEGER], test: FUNCTION[ANY, [], BOOLEAN]]&lt;br /&gt;
do&lt;br /&gt;
result.process := agent process_1&lt;br /&gt;
result.value := agent value_1&lt;br /&gt;
result.test := agent test_1&lt;br /&gt;
end&lt;br /&gt;
two: TUPLE [process: PROCEDURE [ANY, []], value: FUNCTION[ANY, [], INTEGER], test: FUNCTION[ANY, [], BOOLEAN]]&lt;br /&gt;
do&lt;br /&gt;
result.process := agent process_2&lt;br /&gt;
result.value := agent value_2&lt;br /&gt;
result.test := agent test_2&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Disadvantages of adapters:&lt;br /&gt;
*Requires 1 new class for every way a class wishes to provide facilities to clients.&lt;br /&gt;
&lt;br /&gt;
Disadvantages of agents:&lt;br /&gt;
*Requires a new, though already implemented, language construct `agents'.&lt;br /&gt;
*Strongly typed contracts related to agents are not defined.&lt;br /&gt;
&lt;br /&gt;
Implementation of A using named inheritance:&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
inherit&lt;br /&gt;
one: B&lt;br /&gt;
rename&lt;br /&gt;
process as process_1,&lt;br /&gt;
value as value_1,&lt;br /&gt;
test as test_1&lt;br /&gt;
end&lt;br /&gt;
two: B&lt;br /&gt;
rename&lt;br /&gt;
process as process_2,&lt;br /&gt;
value as value_2,&lt;br /&gt;
test as test_2&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
process_1&lt;br /&gt;
do&lt;br /&gt;
 -- Operate on value_1&lt;br /&gt;
end&lt;br /&gt;
value_1: INTEGER&lt;br /&gt;
test_1: BOOLEAN&lt;br /&gt;
process_2&lt;br /&gt;
do&lt;br /&gt;
 -- Different operation on value_2&lt;br /&gt;
end&lt;br /&gt;
value_2: INTEGER&lt;br /&gt;
test_2: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A client of A could make use of the named inheritance functionality as such:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class APPLICATION&lt;br /&gt;
feature&lt;br /&gt;
make&lt;br /&gt;
local&lt;br /&gt;
obj: A&lt;br /&gt;
one: B&lt;br /&gt;
two: B&lt;br /&gt;
do&lt;br /&gt;
create A&lt;br /&gt;
one := a.one&lt;br /&gt;
two := a.two&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Covariance_and_generics_case_study&amp;diff=11281</id>
		<title>Talk:Covariance and generics case study</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Covariance_and_generics_case_study&amp;diff=11281"/>
				<updated>2008-07-03T17:26:05Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[User:Peter gummer|Peter gummer]] 17:53, 13 April 2008 (PDT)&lt;br /&gt;
This is a really good comparison!&lt;br /&gt;
&lt;br /&gt;
The explosion of complex declarations in the generic cases could be defused by declaring new classes. It's similar to how you had to declare new classes to redefine features covariantly. Those new classes would encapsulate the generic parameters, saving clients the trouble of worrying about the generics.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
I tried doing this and it worked well for routine parameters but broke down with function returns.  The functions wanted to return the complex generic class but I couldn't downcast these to the simplified versions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
For example if I had a class operating on complex generic parameters:&lt;br /&gt;
&lt;br /&gt;
class SIMPLE&lt;br /&gt;
inherit (complex generic type)&lt;br /&gt;
&lt;br /&gt;
encrypt (in: (complex generic type))&lt;br /&gt;
is do end&lt;br /&gt;
&lt;br /&gt;
make_new_key: (complex generic type)&lt;br /&gt;
is do end&lt;br /&gt;
&lt;br /&gt;
I could put SIMPLE in to the encrypt feature, however, I could not assign the return from make_new_key to SIMPLE.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Repository&amp;diff=11090</id>
		<title>Repository</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Repository&amp;diff=11090"/>
				<updated>2008-05-18T01:57:57Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:SVN]]&lt;br /&gt;
==Prerequisite==&lt;br /&gt;
Before getting the actual source code you need to get familiar with subversion and its tools. Visit the [[Subversion_Reference|subversion reference]] to discover the basics about subversion and the [[Subversion_Settings| subversion configuration page]] to configure subversion properly for this project.&lt;br /&gt;
&lt;br /&gt;
==Getting the source code==&lt;br /&gt;
The URL for the repository used to host EiffelStudio's source code is https://svn.eiffel.com/eiffelstudio/ .&lt;br /&gt;
&lt;br /&gt;
To get all the source code at once simply do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svn co https://svn.eiffel.com/eiffelstudio/trunk EiffelStudio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a '''EiffelStudio''' directory in the directory where the above command was entered.&lt;br /&gt;
&lt;br /&gt;
However to compile EiffelStudio you don't have to checkout the whole repository. Check [[Compiling_EiffelStudio|Compiling EiffelStudio]] page for more details.&lt;br /&gt;
&lt;br /&gt;
==Getting the source code with TortoiseSVN (Windows)==&lt;br /&gt;
First install [http://switch.dl.sourceforge.net/sourceforge/tortoisesvn/TortoiseSVN-1.3.3.6219-svn-1.3.1.msi TortoiseSVN].&lt;br /&gt;
Then create a new folder for the source code. In this folder you choose &amp;quot;file &amp;gt; tortoiseSVN &amp;gt; Import&amp;quot;.&lt;br /&gt;
URL for Repository is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://svn.eiffel.com/eiffelstudio/trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
after that, you click on the dots (...) where you can choose what to download (maybe only src?).&lt;br /&gt;
on the folder you need, you click right and then &amp;quot;export&amp;quot;, enter the path to you code-folder and you're done.&lt;br /&gt;
&lt;br /&gt;
==Getting the source code with SCPlugin (OSX)==&lt;br /&gt;
First get the latest version of SCPlugin from http://scplugin.tigris.org/.  The install will require you to log off and log on to enable the Subversion context menu within Finder.&amp;lt;br/&amp;gt;&lt;br /&gt;
Create a new folder for the source code.  Right click on your desktop and click New Folder.&amp;lt;br/&amp;gt;&lt;br /&gt;
As of SCPlugin 0.7.1 you need to do an initial checkout from the command line in order to accept the SSL certificate from origo.ethz.ch&amp;lt;br/&amp;gt;&lt;br /&gt;
Open up Terminal and change directory to your newly created folder from above.&amp;lt;br/&amp;gt;&lt;br /&gt;
Do an initial checkout &amp;quot;svn checkout https://svn.eiffel.com/eiffelstudio/trunk&amp;quot; It will ask you if you want to reject the certificate, accept it temporarily or permanently.  Push 'p' for Permanently.&amp;lt;br/&amp;gt;&lt;br /&gt;
You can now use the Subversion context menu by right clicking on your folder created above -&amp;gt; More -&amp;gt; Subversion.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==How to get the old releases==&lt;br /&gt;
The SVN repository also contains old releases of the EiffelStudio environment (up to version 5.4). Those versions can only be compiled with the version of EiffelStudio for that release.&lt;br /&gt;
&lt;br /&gt;
The source code can be found in the subdirectories of the branches directory of the svn repository. The naming convention is `Eiffel_YY' where YY is the release version (e.g. 57 for 5.7).&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Repository&amp;diff=11089</id>
		<title>Repository</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Repository&amp;diff=11089"/>
				<updated>2008-05-18T01:56:44Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: Mac instructions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:SVN]]&lt;br /&gt;
==Prerequisite==&lt;br /&gt;
Before getting the actual source code you need to get familiar with subversion and its tools. Visit the [[Subversion_Reference|subversion reference]] to discover the basics about subversion and the [[Subversion_Settings| subversion configuration page]] to configure subversion properly for this project.&lt;br /&gt;
&lt;br /&gt;
==Getting the source code==&lt;br /&gt;
The URL for the repository used to host EiffelStudio's source code is https://svn.eiffel.com/eiffelstudio/ .&lt;br /&gt;
&lt;br /&gt;
To get all the source code at once simply do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 svn co https://svn.eiffel.com/eiffelstudio/trunk EiffelStudio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a '''EiffelStudio''' directory in the directory where the above command was entered.&lt;br /&gt;
&lt;br /&gt;
However to compile EiffelStudio you don't have to checkout the whole repository. Check [[Compiling_EiffelStudio|Compiling EiffelStudio]] page for more details.&lt;br /&gt;
&lt;br /&gt;
==Getting the source code with TortoiseSVN (Windows)==&lt;br /&gt;
First install [http://switch.dl.sourceforge.net/sourceforge/tortoisesvn/TortoiseSVN-1.3.3.6219-svn-1.3.1.msi TortoiseSVN].&lt;br /&gt;
Then create a new folder for the source code. In this folder you choose &amp;quot;file &amp;gt; tortoiseSVN &amp;gt; Import&amp;quot;.&lt;br /&gt;
URL for Repository is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://svn.eiffel.com/eiffelstudio/trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
after that, you click on the dots (...) where you can choose what to download (maybe only src?).&lt;br /&gt;
on the folder you need, you click right and then &amp;quot;export&amp;quot;, enter the path to you code-folder and you're done.&lt;br /&gt;
&lt;br /&gt;
==Getting the source code with SCPlugin (OSX)==&lt;br /&gt;
First get the latest version of SCPlugin from http://scplugin.tigris.org/.  The install will require you to log off and log on to enable the Subversion context menu within Finder.&lt;br /&gt;
Create a new folder for the source code.  Right click on your desktop and click New Folder.&lt;br /&gt;
As of 0.7.1 you need to do an initial checkout from the command line in order to accept the SSL certificate from origo.ethz.ch&lt;br /&gt;
Open up Terminal and change directory to your newly created folder from above.&lt;br /&gt;
Do an initial checkout &amp;quot;svn checkout https://svn.eiffel.com/eiffelstudio/trunk&amp;quot; It will ask you if you want to reject the certificate, accept it temporarily or permanently.  Push 'p' for Permanently.&lt;br /&gt;
You can now use the Subversion context menu by right clicking on your folder created above -&amp;gt; More -&amp;gt; Subversion.&lt;br /&gt;
&lt;br /&gt;
==How to get the old releases==&lt;br /&gt;
The SVN repository also contains old releases of the EiffelStudio environment (up to version 5.4). Those versions can only be compiled with the version of EiffelStudio for that release.&lt;br /&gt;
&lt;br /&gt;
The source code can be found in the subdirectories of the branches directory of the svn repository. The naming convention is `Eiffel_YY' where YY is the release version (e.g. 57 for 5.7).&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Comparison_of_catcall_solutions&amp;diff=11052</id>
		<title>Talk:Comparison of catcall solutions</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Comparison_of_catcall_solutions&amp;diff=11052"/>
				<updated>2008-05-06T17:05:59Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Do any of these methods cover covariance only through non-conforming inheritance?  I think B. Schoeller touched on non-conforming inheritance at http://www.fams.de/text/type-safe-eiffel.html and others, I've read so many existing suggestions I can't remember where I found them.&lt;br /&gt;
&lt;br /&gt;
If it were restricted to non-conforming inheritance it would obviously get rid of the export restriction problems.&lt;br /&gt;
&lt;br /&gt;
Combining nc-inheritance and rechecking would allow even more than covariant redefinition, you could redefine an anchored type to any other type as long as the class text in the subclass was valid.  This would essentially be equating redefinition in non-conforming inheritance to a textural insertion in subclasses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
feature&lt;br /&gt;
b: INTEGER&lt;br /&gt;
double: like b is&lt;br /&gt;
do&lt;br /&gt;
result := b + b&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
--This could be a valid redefinition of A.b even though REAL does not conform to INTEGER since {REAL}b + {REAL}b is as valid as {INTEGER}b + {INTEGER}b&lt;br /&gt;
class C&lt;br /&gt;
inherit{NONE}&lt;br /&gt;
A&lt;br /&gt;
redefine&lt;br /&gt;
b&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
b: REAL&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It doesn't solve the generic case, however.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Comparison_of_catcall_solutions&amp;diff=11051</id>
		<title>Talk:Comparison of catcall solutions</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Comparison_of_catcall_solutions&amp;diff=11051"/>
				<updated>2008-05-06T17:04:40Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Do any of these methods cover covariance only through non-conforming inheritance?  I think B. Schoeller touched on non-conforming inheritance at http://www.fams.de/text/type-safe-eiffel.html&lt;br /&gt;
&lt;br /&gt;
If it were restricted to non-conforming inheritance it would obviously get rid of the export restriction problems.&lt;br /&gt;
&lt;br /&gt;
Combining nc-inheritance and rechecking would allow even more than covariant redefinition, you could redefine an anchored type to any other type as long as the class text in the subclass was valid.  This would essentially be equating redefinition in non-conforming inheritance to a textural insertion in subclasses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
feature&lt;br /&gt;
b: INTEGER&lt;br /&gt;
double: like b is&lt;br /&gt;
do&lt;br /&gt;
result := b + b&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
--This could be a valid redefinition of A.b even though REAL does not conform to INTEGER since {REAL}b + {REAL}b is as valid as {INTEGER}b + {INTEGER}b&lt;br /&gt;
class C&lt;br /&gt;
inherit{NONE}&lt;br /&gt;
A&lt;br /&gt;
redefine&lt;br /&gt;
b&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
b: REAL&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It doesn't solve the generic case, however.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Covariance_and_generics_case_study&amp;diff=10962</id>
		<title>Talk:Covariance and generics case study</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Covariance_and_generics_case_study&amp;diff=10962"/>
				<updated>2008-04-21T15:38:41Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[User:Peter gummer|Peter gummer]] 17:53, 13 April 2008 (PDT)&lt;br /&gt;
This is a really good comparison!&lt;br /&gt;
&lt;br /&gt;
The explosion of complex declarations in the generic cases could be defused by declaring new classes. It's similar to how you had to declare new classes to redefine features covariantly. Those new classes would encapsulate the generic parameters, saving clients the trouble of worrying about the generics.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
I tried doing this and it worked well for routine parameters but broke down with function returns.  The functions wanted to return the complex generic class but I couldn't downcast these to the simplified versions.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Wish_CHARACTER_16&amp;diff=10949</id>
		<title>Wish CHARACTER 16</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Wish_CHARACTER_16&amp;diff=10949"/>
				<updated>2008-04-14T20:14:17Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: Fixed typeos.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Projects]]&lt;br /&gt;
'''[[User:Colin-adams|Colin Paul Adams]] 07:05, 18 January 2007 (CET)''':&lt;br /&gt;
On the [[EiffelStudio_Wish_List|wish-list]], there is a request for a class CHARACTER_16.&lt;br /&gt;
&lt;br /&gt;
I wrote some reasons there why it is bad, but due to space limitations, it doesn't read very well. I thought it well worth the time to write a proper answer here.&lt;br /&gt;
&lt;br /&gt;
First, the requestor's justification for the class:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Smaller footprint than CHARACTER_32, UTF-16 is the default internal text representation for Windows/.Net/OS X/Java so conversion from CHARACTER_32 is costly, particular when dealing with large amounts of text&amp;quot; &lt;br /&gt;
&lt;br /&gt;
There are a number of unjustified assumptions here.&lt;br /&gt;
&lt;br /&gt;
First:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;conversion from CHARACTER_32 is costly&amp;quot;&lt;br /&gt;
&lt;br /&gt;
But you are not starting with CHARACTER_32, you are starting with STRING_32.&lt;br /&gt;
&lt;br /&gt;
There is nothing in ECMA that specifies that STRING_32 must be UTF-32 (though it is perhaps intended - there are a large number of points related to Unicode in ECMA that are unclear or under-specified. I have written a report for the ECMA committee detailing these).&lt;br /&gt;
&lt;br /&gt;
So as it stands, an implementor is free to implement STRING_32 as&lt;br /&gt;
UTF-16 encoded. In which case there would be zero conversion cost (let us put aside the possible endianess conversion).&lt;br /&gt;
&lt;br /&gt;
But let us suppose that the ECMA committee clarifies the standard to say that STRING_32 is indeed meant to be implemented as UTF-32. Is there then a need for CHARACTER_16?&lt;br /&gt;
&lt;br /&gt;
No. In fact, it makes no sense at all.&lt;br /&gt;
&lt;br /&gt;
First, let us assume that in the interests of conversion efficiency, we have a class representing UTF-16 encoded strings. Let us call it for the sake of argument UC_UTF_16 (STRING_16 might suggest 16-bit characters, which is not the case for UTF-16).&lt;br /&gt;
&lt;br /&gt;
What then will you get if you call `item' on this class? To explore the answer, let us look at the definition of `item' in STRING_32:&lt;br /&gt;
&amp;lt;code&amp;gt;item, infix &amp;quot;@&amp;quot; (i: INTEGER): WIDE_CHARACTER assign put is&lt;br /&gt;
		-- Character at position `i'&lt;br /&gt;
	do&lt;br /&gt;
		Result := area.item (i - 1)&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Clicking on WIDE_CHARACTER gives me CHARACTER_32)&lt;br /&gt;
&lt;br /&gt;
The point is the header comment - you get a character, not a Unicode code point.&lt;br /&gt;
&lt;br /&gt;
Now if we call `item' on our hypothetical class UC_UTF_16, what should we get back? Again, a character. Should it be CHARACTER_32 or the requested CHARACTER_16?&lt;br /&gt;
&lt;br /&gt;
The answer is that it must be CHARACTER_32. In UTF-16, a single character may be represented by a pair of 16-bit numbers, but the components of this pair are not individual characters - the code points that these individual 16-bit numbers represent are technically known as surrogate code points, and they are defined in The Unicode Standard to be non-characters. So if you were somehow able to get a&lt;br /&gt;
CHARACTER_16 for each of these surrogate code points, then you would have an Eiffel object that supposedly represents a character, which does not do so.&lt;br /&gt;
&lt;br /&gt;
So the whole idea of CHARACTER_16 is a nonsense.&lt;br /&gt;
&lt;br /&gt;
In some scenarios you may need access to the individual code points&lt;br /&gt;
(UTF-16 debugging, for instance), but to address this, the correct queries should be something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;is_surrogate_pair (a_index: INTEGER): BOOLEAN&lt;br /&gt;
 &lt;br /&gt;
lower_surrogate (a_index: INTEGER): NATURAL_16&lt;br /&gt;
  require&lt;br /&gt;
    surrogate_pair: is_surrogate_pair (a_index)&lt;br /&gt;
 &lt;br /&gt;
upper_surrogate (a_index: INTEGER): NATURAL_16&lt;br /&gt;
  require&lt;br /&gt;
    surrogate_pair: is_surrogate_pair (a_index)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I hope that whoever added CHARACTER_16 to the wish list will now remove it, and replace it with a request for a UTF-16 class (which should NOT be called STRING_16 - I would suggest UTF_16_STRING).)&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;diff=10947</id>
		<title>Covariance and generics case study</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;diff=10947"/>
				<updated>2008-04-13T07:54:33Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are some observations I had when comparing using generics and covariant redefinition in a project I'm working on.  I had implemented it using generics but as I was progressing the usage of generics was becoming increasingly tedious and in the end, wasn't saving me any time or making things easier to understand.&lt;br /&gt;
&lt;br /&gt;
Feel free to comment, edit, add.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Class text length and complexity is similar between generics and covariants equivalents&lt;br /&gt;
&amp;lt;e&amp;gt;class&lt;br /&gt;
THING[G]&lt;br /&gt;
feature&lt;br /&gt;
item: G&lt;br /&gt;
put(new: G) is&lt;br /&gt;
do&lt;br /&gt;
item := new&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;
THING&lt;br /&gt;
feature&lt;br /&gt;
&lt;br /&gt;
item: ANY&lt;br /&gt;
put(new: like item) is&lt;br /&gt;
do&lt;br /&gt;
item := new&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Differences in creating derived types&lt;br /&gt;
To create a new generic class:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
item_list: THING[INTEGER]&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To create a new covariant thing class requires a class definition:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
THING&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Covariantly redefined classes are not cross-assignable like their generic counterparts:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
LIBRARY_A_INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
THING&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&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;
LIBRARY_B_INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
LIST&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
feature&lt;br /&gt;
covariant_cross_assign(a: LIBRARY_A_INTEGER_THING) is&lt;br /&gt;
local&lt;br /&gt;
b: LIBRARY_B_INTEGER_THING&lt;br /&gt;
do&lt;br /&gt;
b := a -- Doesn't compile even though they are semantically equal.&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
feature&lt;br /&gt;
generic_cross_assign(library_a_list: THING[INTEGER]) is&lt;br /&gt;
local&lt;br /&gt;
library_b_list: THING[INTEGER]&lt;br /&gt;
do&lt;br /&gt;
library_b_list := library_a_list&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Generic parameterization geometrically increases text of type definition at usage points as inheritence depth increases:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
params: ECDOMAINPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP], ECPRIVATEKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]]&lt;br /&gt;
ecdsa: ECDSA_SIGNER [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
keys: LINKED_LIST[ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP], ECPRIVATEKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]]]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Covariant redefinition greatly simplifies typing at usage points:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
params: ECDOMAINPARAMETERS&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS&lt;br /&gt;
pair: ECKEYPAIR&lt;br /&gt;
ecdsa: ECDSA_SIGNER&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER&lt;br /&gt;
keys: LINKED_LIST[ECKEYPAIR]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can &amp;quot;cheat&amp;quot; the generics solution and use the anchored type keyword 'like' as a shorthand for types.  This is using the 'like' keyword as a macro instead of an anchored type.  This shortens text but doesn't decrease complexity at the usage point and isn't using the keyword for what it was designed for.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
c: ECCURVE[ECFIELDELEMENTFP]&lt;br /&gt;
p: ECPOINT[ECFIELDELEMENTFP]&lt;br /&gt;
e: ECFIELDELEMENTFP&lt;br /&gt;
params: ECDOMAINPARAMETERS [like c, like p, like e]&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR [like c, like p, like e]&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS [like c, like p, like e]&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [like c, like p, like e], ECPRIVATEKEYPARAMETERS [like c, like p, like e]]&lt;br /&gt;
ecdsa: ECDSA_SIGNER [like c, like p, like e]&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER [like c, like p, like e]&lt;br /&gt;
keys: LINKED_LIST[like pair]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Intermediate classes need to carry the generics of their suppliers and heirs causing geometric type definition increase&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
ECCURVE [G -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
feature&lt;br /&gt;
a: G&lt;br /&gt;
b: G&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECPUBLICKEYPARAMETERS [G -&amp;gt; ECCURVE[I], H -&amp;gt; ECPOINT[I], I -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
inherit&lt;br /&gt;
ECKEYPARAMETERS [G, H, I]&lt;br /&gt;
feature&lt;br /&gt;
make_q_parameters(q_new: H params_new: ECDOMAINPARAMETERS [G, H, I]) is&lt;br /&gt;
do&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECKEYPAIRGENERATOR [G -&amp;gt; ECCURVE[I], H -&amp;gt; ECPOINT[I], I -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
inherit&lt;br /&gt;
ASYMMETRICCIPHERKEYPAIRGENERATOR [ECKEYGENERATIONPARAMETERS [G, H, I], ECPUBLICKEYPARAMETERS [G, H, I], ECPRIVATEKEYPARAMETERS [G, H, I]]&lt;br /&gt;
ECCONSTANTS&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [G, H, I], ECPRIVATEKEYPARAMETERS [G, H, I]]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Covariants redefinition does not require generic pass-alongs&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
ECCURVE&lt;br /&gt;
feature&lt;br /&gt;
a: ECFIELDELEMENT&lt;br /&gt;
b: ECFIELDELEMENT&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECPUBLICKEYPARAMETERS&lt;br /&gt;
inherit&lt;br /&gt;
ECKEYPARAMETERS&lt;br /&gt;
feature -- Creation procedures&lt;br /&gt;
make_q_parameters(q_new: ECPOINT params_new: ECDOMAINPARAMETERS) is&lt;br /&gt;
do&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECKEYPAIRGENERATOR&lt;br /&gt;
inherit&lt;br /&gt;
ASYMMETRICCIPHERKEYPAIRGENERATOR&lt;br /&gt;
redefine&lt;br /&gt;
pair&lt;br /&gt;
end&lt;br /&gt;
ECCONSTANTS&lt;br /&gt;
feature&lt;br /&gt;
pair: ECKEYPAIR&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;diff=10946</id>
		<title>Covariance and generics case study</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_and_generics_case_study&amp;diff=10946"/>
				<updated>2008-04-13T07:53:47Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are some observations I had when comparing using generics and covariant redefinition in a project I'm working on.  I had implemented it using generics but as I was progressing the usage of generics was becoming increasingly tedious and in the end, wasn't saving me any time or making things easier to understand.&lt;br /&gt;
&lt;br /&gt;
Feel free to comment, edit, add.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Class text length and complexity is similar between generics and covariants equivalents&lt;br /&gt;
&amp;lt;e&amp;gt;class&lt;br /&gt;
THING[G]&lt;br /&gt;
feature&lt;br /&gt;
item: G&lt;br /&gt;
put(new: G) is&lt;br /&gt;
do&lt;br /&gt;
item := new&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;
THING&lt;br /&gt;
feature&lt;br /&gt;
&lt;br /&gt;
item: ANY&lt;br /&gt;
put(new: like item) is&lt;br /&gt;
do&lt;br /&gt;
item := new&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Differences in creating derived types&lt;br /&gt;
To create a new generic class:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
item_list: THING[INTEGER]&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To create a new covariant list class requires a class definition:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
THING&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Covariantly redefined classes are not cross-assignable like their generic counterparts:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
LIBRARY_A_INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
THING&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&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;
LIBRARY_B_INTEGER_THING&lt;br /&gt;
inherit&lt;br /&gt;
LIST&lt;br /&gt;
redefine&lt;br /&gt;
item&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
item: INTEGER&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
feature&lt;br /&gt;
covariant_cross_assign(a: LIBRARY_A_INTEGER_THING) is&lt;br /&gt;
local&lt;br /&gt;
b: LIBRARY_B_INTEGER_THING&lt;br /&gt;
do&lt;br /&gt;
b := a -- Doesn't compile even though they are semantically equal.&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
feature&lt;br /&gt;
generic_cross_assign(library_a_list: THING[INTEGER]) is&lt;br /&gt;
local&lt;br /&gt;
library_b_list: THING[INTEGER]&lt;br /&gt;
do&lt;br /&gt;
library_b_list := library_a_list&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Generic parameterization geometrically increases text of type definition at usage points as inheritence depth increases:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
params: ECDOMAINPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP], ECPRIVATEKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]]&lt;br /&gt;
ecdsa: ECDSA_SIGNER [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]&lt;br /&gt;
keys: LINKED_LIST[ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP], ECPRIVATEKEYPARAMETERS [ECCURVE[ECFIELDELEMENTFP], ECPOINT[ECFIELDELEMENTFP], ECFIELDELEMENTFP]]]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Covariant redefinition greatly simplifies typing at usage points:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
params: ECDOMAINPARAMETERS&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS&lt;br /&gt;
pair: ECKEYPAIR&lt;br /&gt;
ecdsa: ECDSA_SIGNER&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER&lt;br /&gt;
keys: LINKED_LIST[ECKEYPAIR]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can &amp;quot;cheat&amp;quot; the generics solution and use the anchored type keyword 'like' as a shorthand for types.  This is using the 'like' keyword as a macro instead of an anchored type.  This shortens text but doesn't decrease complexity at the usage point and isn't using the keyword for what it was designed for.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
c: ECCURVE[ECFIELDELEMENTFP]&lt;br /&gt;
p: ECPOINT[ECFIELDELEMENTFP]&lt;br /&gt;
e: ECFIELDELEMENTFP&lt;br /&gt;
params: ECDOMAINPARAMETERS [like c, like p, like e]&lt;br /&gt;
pGen: ECKEYPAIRGENERATOR [like c, like p, like e]&lt;br /&gt;
genParam: ECKEYGENERATIONPARAMETERS [like c, like p, like e]&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [like c, like p, like e], ECPRIVATEKEYPARAMETERS [like c, like p, like e]]&lt;br /&gt;
ecdsa: ECDSA_SIGNER [like c, like p, like e]&lt;br /&gt;
ecdsa_verifier: ECDSA_VERIFIER [like c, like p, like e]&lt;br /&gt;
keys: LINKED_LIST[like pair]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Intermediate classes need to carry the generics of their suppliers and heirs causing geometric type definition increase&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
ECCURVE [G -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
feature&lt;br /&gt;
a: G&lt;br /&gt;
b: G&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECPUBLICKEYPARAMETERS [G -&amp;gt; ECCURVE[I], H -&amp;gt; ECPOINT[I], I -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
inherit&lt;br /&gt;
ECKEYPARAMETERS [G, H, I]&lt;br /&gt;
feature&lt;br /&gt;
make_q_parameters(q_new: H params_new: ECDOMAINPARAMETERS [G, H, I]) is&lt;br /&gt;
do&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECKEYPAIRGENERATOR [G -&amp;gt; ECCURVE[I], H -&amp;gt; ECPOINT[I], I -&amp;gt; ECFIELDELEMENT]&lt;br /&gt;
inherit&lt;br /&gt;
ASYMMETRICCIPHERKEYPAIRGENERATOR [ECKEYGENERATIONPARAMETERS [G, H, I], ECPUBLICKEYPARAMETERS [G, H, I], ECPRIVATEKEYPARAMETERS [G, H, I]]&lt;br /&gt;
ECCONSTANTS&lt;br /&gt;
pair: ASYMMETRICCIPHERKEYPAIR [ECPUBLICKEYPARAMETERS [G, H, I], ECPRIVATEKEYPARAMETERS [G, H, I]]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Covariants redefinition does not require generic pass-alongs&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
ECCURVE&lt;br /&gt;
feature&lt;br /&gt;
a: ECFIELDELEMENT&lt;br /&gt;
b: ECFIELDELEMENT&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECPUBLICKEYPARAMETERS&lt;br /&gt;
inherit&lt;br /&gt;
ECKEYPARAMETERS&lt;br /&gt;
feature -- Creation procedures&lt;br /&gt;
make_q_parameters(q_new: ECPOINT params_new: ECDOMAINPARAMETERS) is&lt;br /&gt;
do&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
ECKEYPAIRGENERATOR&lt;br /&gt;
inherit&lt;br /&gt;
ASYMMETRICCIPHERKEYPAIRGENERATOR&lt;br /&gt;
redefine&lt;br /&gt;
pair&lt;br /&gt;
end&lt;br /&gt;
ECCONSTANTS&lt;br /&gt;
feature&lt;br /&gt;
pair: ECKEYPAIR&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10851</id>
		<title>Implicit class</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10851"/>
				<updated>2008-03-19T01:29:45Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Research}}&lt;br /&gt;
&lt;br /&gt;
Requesting comments on the notion of an implicit class. &lt;br /&gt;
&lt;br /&gt;
The basic idea would be performing the exact same functionality as the `Renaming' clause in formal generic constraints and allowing new features to be applied to an object without modifying the original class text.  Instead of defining the multiple conformance inline within the text of the class containing the formal generic that is constrained, the generic would have its own class file.  Any class that inherits from B and C could statically downcast that object to A.  A validity constraint on the downcast would be class A cannot contain new attributes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
rename&lt;br /&gt;
is_equal as b_is_equal&lt;br /&gt;
end&lt;br /&gt;
C&lt;br /&gt;
rename&lt;br /&gt;
is_equal as c_is_equal&lt;br /&gt;
end&lt;br /&gt;
feature&lt;br /&gt;
new_op: INTEGER is&lt;br /&gt;
  do&lt;br /&gt;
    result := b.val + c.val&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following class:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class F&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
C&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Could then be used like:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
feature operation is&lt;br /&gt;
local&lt;br /&gt;
  item: F&lt;br /&gt;
  container: LINKED_LIST[A]&lt;br /&gt;
  val: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
  val := {A}item.b_is_equals(void)&lt;br /&gt;
  val := {A}item.c_is_equals(void)&lt;br /&gt;
  create container.make&lt;br /&gt;
  container.put({A}item)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; A]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would be identical to ECMA&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; {B rename is_equal as b_is_equal end, C rename is_equal as b_is_equal_end}]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any class inheriting from B and C could be downcast to A.  This simple change would facilitate clarity and reuse in formal generic parameters.&lt;br /&gt;
&lt;br /&gt;
This would also allow multiple constraints to be easily adaptable to actual generic parameters.&lt;br /&gt;
container: LIST[A] would allow objects inheriting from B and C to be placed in `container' and features in B and C to be called on these objects inside of `container' using the renaming policy defined in `A'&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10850</id>
		<title>Implicit class</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10850"/>
				<updated>2008-03-19T01:27:58Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Research}}&lt;br /&gt;
&lt;br /&gt;
Requesting comments on the notion of an implicit class. &lt;br /&gt;
&lt;br /&gt;
The basic idea would be performing the exact same functionality as the `Renaming' clause in formal generic constraints.  Instead of defining the multiple conformance inline within the text of the class containing the formal generic that is constrained, the generic would have its own class file.  Any class that inherits from B and C could statically downcast that object to A.  A validity constraint on the downcast would be class A cannot contain new attributes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
rename&lt;br /&gt;
is_equal as b_is_equal&lt;br /&gt;
end&lt;br /&gt;
C&lt;br /&gt;
rename&lt;br /&gt;
is_equal as c_is_equal&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following class:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class F&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
C&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Could then be used like:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
feature operation is&lt;br /&gt;
local&lt;br /&gt;
  item: F&lt;br /&gt;
  container: LINKED_LIST[A]&lt;br /&gt;
  val: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
  val := {A}item.b_is_equals(void)&lt;br /&gt;
  val := {A}item.c_is_equals(void)&lt;br /&gt;
  create container.make&lt;br /&gt;
  container.put({A}item)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; A]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would be identical to ECMA&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; {B rename is_equal as b_is_equal end, C rename is_equal as b_is_equal_end}]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any class inheriting from B and C could be downcast to A.  This simple change would facilitate clarity and reuse in formal generic parameters.&lt;br /&gt;
&lt;br /&gt;
This would also allow multiple constraints to be easily adaptable to actual generic parameters.&lt;br /&gt;
container: LIST[A] would allow objects inheriting from B and C to be placed in `container' and features in B and C to be called on these objects inside of `container' using the renaming policy defined in `A'&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10849</id>
		<title>Talk:Objectless Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10849"/>
				<updated>2008-03-19T01:25:27Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Why couldn't the client needing to validate parameters inherit{NONE} from A_VALIDATOR instead of creating an instance?&lt;br /&gt;
&lt;br /&gt;
Also your validation feature doesn't have a postcondition so it's really an incomplete contract.  If your validation feature is supposed to ensure something, it needs to state that, otherwise you're just saying, in order to create this object it needs to satisfy this routine which can be overidden and since there's no postcondition, it could be overridden to mean anything including nothing and that's a bug.&lt;br /&gt;
&lt;br /&gt;
Non-polymorphic inheritance shouldn't have a performance hit unless it's not being optimized, by definition they're monomorphic calls so they can be static and inlined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 14:43, 14 March 2008 (PDT)&lt;br /&gt;
:[[User:Paulb|Paulb]] 08:40, 18 March 2008 (PDT) Yes, the client class could inherit A_VALIDATOR but I used the model to indicate a latter point.&lt;br /&gt;
&lt;br /&gt;
:In regards to the postconditions, this we me trying to be quick. We are polishing our release off and we are all busy. I just wanted to get something going in the domain of objectless calls.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A_CLIENT&lt;br /&gt;
inherit{NONE}&lt;br /&gt;
A_VALIDATOR&lt;br /&gt;
feature&lt;br /&gt;
process (a_value: ?VALUE)&lt;br /&gt;
    local&lt;br /&gt;
        l_a: A&lt;br /&gt;
    do&lt;br /&gt;
        if is_valid_value (a_value) then&lt;br /&gt;
            create l_a.make (a_value)&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 04:42, 15 March 2008 (PDT) The redefinition of &amp;lt;e&amp;gt;is_valid_value&amp;lt;/e&amp;gt; is strengthening the precondition. This is contrary to Design by Contract. I think you have a valid point, Paul, but you need to come up with a decent example!&lt;br /&gt;
&lt;br /&gt;
:[[User:Paulb|Paulb]] 08:50, 18 March 2008 (PDT) Yes, sorry, as I mention above, it was a quick implementation because of the release. It could have just as easily weakened.&lt;br /&gt;
&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 05:19, 15 March 2008 (PDT) I don't like your preferred placement of the '''objectless''' keyword, Paul, in front of the feature name. I think I would prefer it in the place of the &amp;lt;e&amp;gt;do&amp;lt;/e&amp;gt;; this is an alternative that you did not propose:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;feature -- Access&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
        objectless&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A problem with this is that it precludes the possibility of objectless once functions or objectless externals.&lt;br /&gt;
&lt;br /&gt;
I can think of another possibility: in place of &amp;lt;e&amp;gt;feature&amp;lt;/e&amp;gt;. This would be out of step with any other Eiffel keyword; but considering that your whole proposal is out of step with Eiffel's insistence that all calls be targeted to an object, maybe it's appropriate!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;objectless -- Access&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
        do&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think I like this. (In fact, why isn't &amp;lt;e&amp;gt;frozen&amp;lt;/e&amp;gt; like this?)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
:--[[User:Ericb|Ericb]] 14:01, 16 March 2008 (PDT): Because one can write:&lt;br /&gt;
:&amp;lt;e&amp;gt;&lt;br /&gt;
copy, frozen standard_copy (other: like Current)&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::--[[User:Peter gummer|Peter gummer]] 17:54, 16 March 2008 (PDT) Ha, good point, Eric! That is useful. So Paul's preferred notation would be advantageous only if someone can see any useful reason to have two synonyms for a routine, one object-oriented and the other class-oriented. Sounds like a very bad idea to me, because &amp;lt;e&amp;gt;Current&amp;lt;/e&amp;gt; would be meaningless in an objectless routine (unless Eiffel specified that it be a reference to the enclosing class, as Delphi and Smalltalk do for '''self''' in ''class methods''; but Eiffel does not have class reference variables, so this won't work in Eiffel; and it would be a pretty stupid idea anyway, for the meaning of &amp;lt;e&amp;gt;Current&amp;lt;/e&amp;gt; to change like that within the same routine). Methinks this would be a defect, then, in Paul's preferred notation! This leaves two possible places for the proposed '''objectless''' keyword: to replace or qualify either &amp;lt;e&amp;gt;do&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;feature&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
::[[User:Paulb|Paulb]] 08:50, 18 March 2008 (PDT) What about if I wanted an objectless once, deferred and even though it is redundant because it's implicit, an external?&lt;br /&gt;
&lt;br /&gt;
:::--[[User:Peter gummer|Peter gummer]] 16:38, 18 March 2008 (PDT) Yes, I suppose '''objectless once''' would be useful; and people would definitely want '''objectless external'''; and although '''objectless deferred''' may be dangerous, as mentioned below, the syntax should not preclude its possibility in the future. I think that your '''objectless do''' syntax proposal may be the best, although we would might format it with '''objectless''' on its own line (like &amp;lt;e&amp;gt;obsolete&amp;lt;/e&amp;gt;) or even on the same line as the feature names (like &amp;lt;e&amp;gt;assign&amp;lt;/e&amp;gt;). Maybe it would fit into the grammar somewhere near &amp;lt;e&amp;gt;obsolete&amp;lt;/e&amp;gt;, before the header comment. Then it would probably work for objectless attributes too.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 05:33, 15 March 2008 (PDT) Paul, you wrote, &amp;quot;Unlike other languages, it should be possible to redefine any objectless routine.&amp;quot; Uh, ''which'' other languages? Well ok, I know exactly which languages you are thinking of: C#, etc. I just want to point out that there are other languages out there that ''do'' allow redefinition of objectless routines. The obvious one is the big grandma of OO languages, Smalltalk, where polymorphic class methods are common (or so I believe, never having programmed in Smalltalk myself). Another is Delphi, which I programmed in for about 6 years, and polymorphic class methods are the biggest thing that I miss from the Delphi language. They are incredibly powerful when used in combination with class reference variables (which is something else that Eiffel lacks, although the new &amp;lt;e&amp;gt;TYPE&amp;lt;/e&amp;gt; class and related mechanisms may be a worthy substitute: I'm not sure yet.)&lt;br /&gt;
&lt;br /&gt;
:[[User:Paulb|Paulb]] 08:50, 18 March 2008 (PDT) Yes things like C#, as I said, like other languages, not ''all'' languages.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Ericb|Ericb]] 14:14, 16 March 2008 (PDT): Paul, you said that this was overlooked when defining the ECMA standard. I attended the ECMA meetings and I don't share your opinion. The fact that it is not in the current version of the ECMA standard does not mean that it has been overlooked. That being said, I'm glad you wrote this wiki page so that the topic can be brought back again at ECMA. However there is something that is desperately missing in your proposal: where are the validity rules? There is only one which states that we can redefine an objectless routine (BTW, why not simply call them static routines?) to a non-objectless routine. Personally I think that it should be the reverse, but it's hard to be sure since you don't put down the other validity routines. For example, what should be the conditions that a routine should satisfy in order to be valid to declare it as objectless? My first impression is that it should not use 'Current' nor call non-objectless features, to the very least.&lt;br /&gt;
&lt;br /&gt;
:[[User:Paulb|Paulb]] 08:50, 18 March 2008 (PDT) I was going based on the reaction here at Eiffel Software. I was given no indication anything of sorts was raised in ECMA and I'm not a member of the committee.&lt;br /&gt;
&lt;br /&gt;
:I'm just trying to get something out there. Granted there are not validity rules so it's not a full proposal. I really do not have the time but I've been wanting to mention objectless calls for over a year, so I took an hour out and wrote the wiki page. I've talked this over with Manu an the validity rules you specified are those that we discussed.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
I'm not on the ECMA committee, but I've always seen static functions as poor design.  I still question whether the problems stated are valid.&lt;br /&gt;
-There is no performance hit from creating A_VALIDATOR because you don't need to create an instance, you can use non-conforming inheritance.&lt;br /&gt;
-The example strengthens a precondition so any pattern in existing code following type B in this example is questionable.&lt;br /&gt;
-The &amp;quot;overuse of inheritance&amp;quot; is shown as a problem, I see it as code reuse.  I hope the suggestion isn't to make global static functions, more than likely it's suggested to be referenced by a {CLASS}.function in which case you're just using composition rather than inheritance so all inheritance just moves to composition.  There shouldn't be a performance hit of dynamic dispatch when using non-conforming inheritance because they're non-polymorphic calls.&lt;br /&gt;
-There is no double object creation, use non-conforming inheritance, and there should be no dynamic calls to monomorphic non-conforming inheritance features.&lt;br /&gt;
&lt;br /&gt;
****Please tell me if I'm missing why these functions need to by dynamic in non-conforming inheritance!****&lt;br /&gt;
&lt;br /&gt;
Static functions that are part of a class basically are there for namespace reasons since they don't represent operations on an instance of the class; The class name because the namespace of the function, essentially.  They don't help create an ADT which is the entire purpose of a pure OO language.&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 16:44, 16 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 17:54, 16 March 2008 (PDT)&lt;br /&gt;
To answer Eric's question, &amp;quot;Why not simply call them static routines?&amp;quot;: because '''they are not static routines'''!&lt;br /&gt;
&lt;br /&gt;
Static routines in C++, C#, Java, etc. cannot be redefined, as I discovered to my dismay when I moved from Delphi to C#. Static routines in those languages are nothing more than class-scoped global routines. Yechh! ''Evil!'' What Paul is proposing -- and what I found so useful in Delphi -- are known as ''class methods'' in languages that are influenced by Smalltalk. They can be redefined. When assigned to a class reference variable in those languages, they become polymorphic. This is extremely powerful. One thing they were great for in Delphi is in object factories: it took me a long time to figure out why the GoF Design Patterns book was describing in such a long-winded way how to do class factories, until finally I understood that I had been doing them for a long time in Delphi, but with only a line or two of code thanks to the combination of class methods, class references and polymorphic constructors. (Unlike the brain-dead constructors in C++, C# and Java, Delphi constructors can be redefined, just like Eiffel creation routines.)&lt;br /&gt;
&lt;br /&gt;
This is anything but &amp;quot;static&amp;quot;!&lt;br /&gt;
&lt;br /&gt;
I don't know whether objectless routines would fit well within Eiffel, but I would certainly be pleased to see them. It would simplify a lot of code: whole classes would disappear, and ten lines would collapse down to one or two in many cases, especially if the &amp;lt;e&amp;gt;TYPE&amp;lt;/e&amp;gt; class turns out to be as useful as class references are in Smalltalk, etc. Bertrand Meyer has written in the past about the dangers of backsliding into procedural code, so maybe there is too much resistance in the Eiffel community. On the other hand, the unwieldiness of the current approach of inheriting &amp;lt;e&amp;gt;SHARED_*&amp;lt;/e&amp;gt; classes is probably a deterrent to many prospective Eiffel programmers.&lt;br /&gt;
&lt;br /&gt;
I would recommend studying patterns of usage of class methods in Smalltalk. A bit of googling I've just done also suggests that Ruby might also be worth looking at. But most instructive, perhaps, would be Delphi, which is syntactically closer to Eiffel and is type-safe. (Although Delphi is not, in general, as type-safe as Eiffel, class methods are done in a type-safe manner).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Ericb|Ericb]] 00:59, 17 March 2008 (PDT): In Eiffel, when a feature cannot be redefined, we use frozen, not static. In Eiffel, static is used in opposition to dynamic. For example, dynamic binding vs. static binding. In case of class methods (hmmm, class features I should say!), unless I miss something we would have static binding. I agree that this does not convey the notion of call with no target object, but objectless looks very ugly to me as a keyword.&lt;br /&gt;
&lt;br /&gt;
I'm still waiting for the validity rules to be stated. Here is another example of such rule: an objectless feature cannot be deferred. The same rule applies to frozen features.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 19:08, 17 March 2008 (PDT) I would want these '''objectless''' features to be dynamically bound, Eric. Unless I misread him, I'm sure that's what Paul is asking for too. This would therefore be valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;feature&lt;br /&gt;
&lt;br /&gt;
    frozen i_am_statically_bound&lt;br /&gt;
        objectless&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    i_must_be_defined_in_effected_descendants&lt;br /&gt;
        objectless deferred&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Except that I don't like that double-barrelled &amp;lt;e&amp;gt;objectless deferred&amp;lt;/e&amp;gt; syntax! Anyway, whatever the syntax, if I remember rightly Delphi allows &amp;quot;abstract class methods&amp;quot;, and I see no reason to forbid '''deferred objectless routines'''.&lt;br /&gt;
&lt;br /&gt;
Paul's proposed '''objectless''' keyword looks ugly to me too, Eric. But I do like the fact that it is explicit about what it is, and I also like that it probably won't conflict with identifiers in existing software. Why does Eiffel always have to invent its own idiosyncratic terminology? Why not just use the keyword that some other languages are already using for this concept: &amp;lt;e&amp;gt;class&amp;lt;/e&amp;gt;? It's brief, accurate, won't conflict with identifiers in existing code, and will be instantly understood by thousands of Smalltalk and Delphi programmers. Let's see how it would look:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;feature&lt;br /&gt;
&lt;br /&gt;
    f: STRING&lt;br /&gt;
        class&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hmmm, looks ok to me. Another possible keyword would be '''singleton''', which apparently is Ruby's keyword for its closest equivalent to Smalltalk class methods.&lt;br /&gt;
&lt;br /&gt;
Another issue: why just routines? Why not '''deferred objectless attributes'''? Smalltalk has them, and I think Delphi has them too these days.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
:--[[User:Ericb|Ericb]] 02:16, 18 March 2008 (PDT): My understanding of objectless features is that for &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt; to be valid, &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; has to be declared as objectless in class A. What would be the semantics of such expression if &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; is deferred? When I say that it is statically bound, I mean that the type &amp;lt;e&amp;gt;{A}&amp;lt;/e&amp;gt; is a static type, known at compilation time. Therefore the compiler knows which version of &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; to call. Of course calling &amp;lt;e&amp;gt;a.f&amp;lt;/e&amp;gt; where &amp;lt;e&amp;gt;a&amp;lt;/e&amp;gt; can be attached to an object of a descendant type of A will still be dynamically bound.&lt;br /&gt;
&lt;br /&gt;
::--[[User:Peter gummer|Peter gummer]] 14:45, 18 March 2008 (PDT)&lt;br /&gt;
::I imagine that, if &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; is deferred in class A, then &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt; would be an invalid call. Because &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt; is statically bound, the ''compiler'' can report this error. That's the trivial case.&lt;br /&gt;
&lt;br /&gt;
::The case of calling &amp;lt;e&amp;gt;a.f&amp;lt;/e&amp;gt; where &amp;lt;e&amp;gt;a&amp;lt;/e&amp;gt; is attached to an object descending from A is dynamically bound. Because &amp;lt;e&amp;gt;a&amp;lt;/e&amp;gt; cannot, by Eiffel's existing validity rules, be attached to a deferred type, this case is type-safe and the semantics are clear.&lt;br /&gt;
&lt;br /&gt;
::What I'm most interested in, however, is in being allowed to call &amp;lt;e&amp;gt;c.f&amp;lt;/e&amp;gt;, where &amp;lt;e&amp;gt;c&amp;lt;/e&amp;gt; is attached to an object conforming to &amp;lt;e&amp;gt;TYPE [A]&amp;lt;/e&amp;gt;. The question arises, then, of what would happen if &amp;lt;e&amp;gt;c&amp;lt;/e&amp;gt; were attached to an object of type &amp;lt;e&amp;gt;TYPE [A]&amp;lt;/e&amp;gt;, where &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; is deferred in class A? The answer isn't nice: calling &amp;lt;e&amp;gt;c.f&amp;lt;/e&amp;gt; would produce a ''run-time error''. Ok, I bet I'm scaring people now: I'm poking another little hole into the Eiffel type system which you guys have been working so hard for a decade or more to construct on more solid foundations. But having seen the power of this facility in Delphi, I'd love to have it in Eiffel.&lt;br /&gt;
&lt;br /&gt;
::Maybe the best thing to do would be '''forbid deferred objectless features'''. This would avoid the need for the compiler to detect the trivial validity error in &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt;; it would prevent the nasty type hole in &amp;lt;e&amp;gt;c.f&amp;lt;/e&amp;gt;; and it would save us all the effort of trying to figure out what might be the best syntax for declaring a feature '''objectless deferred'''. At some future date, someone might discover that objectless deferred features can be added without jeopardising the integrity of the type system; in the meantime, I believe it's best to forbid them.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
You mean global variables?&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 23:12, 17 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
:--[[User:Peter gummer|Peter gummer]] 15:24, 18 March 2008 (PDT) I wouldn't want '''deferred objectless attributes''', because of the possible type hole that I mentioned above. But why not '''objectless attributes'''? These are not global variables, although they would be very close to them when called statically, as in &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt;. Even then they differ from global variables in two respects: they are scoped within class A (like static variables in C#, Java, etc.); and they are read-only except within descendants of class A (thanks to Eiffel's normal rules of encapsulation). When called dynamically, as in &amp;lt;e&amp;gt;a.f&amp;lt;/e&amp;gt;, they acquire a new power due to Eiffel's redefinition mechanisms.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
I think a generic definition of the problem case, where people like to use static functions, is a situation like one I ran in to.  I wanted a way to convert an integer to an array of bytes to send over a network.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Most people would say, create a static function int_to_bytes(i: INTEGER): ARRAY[NATURAL_8].  The English phrasing of this: you're applying a function INTEGER -&amp;gt; ARRAY[NATURAL_8] to your variable `i'. This could be put in a new class INT_UTILITY and statically accessed or inherited from.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt; A more correct and object oriented way would be to edit the INTEGER class and add this feature in.  The English phrasing of this: you are asking this instance of INTEGER to convert itself to ARRAY[NATURAL_8].&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Two issues can arise with this, if this is a pre-existing library you need to edit a class that is supposed to be consumed unmodified.  The other issue is the number of permutation of this in infinite.  There are an infinite number of ways to manipulate INTEGER and most are problem domain specific, so if in fact you could add this to the INTEGER class, there would be an unlimited number of additions to this class which is not feasible.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Evidently a solution to this was brought up at ECMA before, as I discovered when I posted http://dev.eiffel.com/Implicit_class  What we're looking to do is add features to an existing class without modifying the class.  A statically-checkable downcast would allow you to use a new feature on an existing class in an object oriented way new.f instead of a functional way new(f).&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;  I like the solution of an implicit class, or whatever it could be called, for a couple other reasons.  It cleans up the renaming definition of multiple generic constraints and would allow multiple actual generic parameters like LIST[{COMPARABLE, HASHABLE}].  Wasn't it Bertrand that said the most elegant solutions solve multiple problems?&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;As for the original rationale of a performance issue.  If you allow redefinition with the same power Eiffel allows in other places, we'd run in to issues of dynamic calls.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;We English speakers also have an issue of differentiating between one and anything more than one.  We want *the* number PI, not an instance of REAL that is close to 3.14159265.  We want to #define this so we are sure that *the* version of it is used everywhere.  This is a misnomer because ever though we call it static and think there is only one version, it's still one version within the domain of the executing process.  If we start another instance of the program, it's no longer the only copy.  Information hiding and creating abstract data types is the primary purpose of moving to OO languages.  Attaching semantics to the class as opposed to an instance of a class, an object, makes it one instance of something accessible to everything instead of operating on a specific instance of something.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The issue of the singleton object like PI is actually a compiler optimization issue.  We could optimize all (create {NATURAL}.make(3.141592)) to be one object, created at compile time and put in to the image of the executable, but our compiler writers are too busy writing implementation of new language specifications to do this!  We should be able to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class PI&lt;br /&gt;
inherit&lt;br /&gt;
  REAL&lt;br /&gt;
create&lt;br /&gt;
  default_create&lt;br /&gt;
feature&lt;br /&gt;
  default_create is&lt;br /&gt;
    do&lt;br /&gt;
      make(3.14159265)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt; The compiler should be able to see that only one version of this is ever creatable, create it at compile time and put it in to the executable image as an *optimization*.  This optimization could be applied to any object that's created from basic types in the language, integers, strings.  In fact arrays could have been done this way instead of manifest arrays.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  list: ARRAY[INTEGER]&lt;br /&gt;
do&lt;br /&gt;
  create list.make(1, 2)&lt;br /&gt;
  list[1] := 8&lt;br /&gt;
  list[2] := 73&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
This could be optimized at compile time instead of making a manifest array construct in the language definition, but I digress.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Creating new language features to solve specific optimization problems isn't always a good idea, that's what caused the C preprocessor.  I see a need for adding features to a class without modifying the class and I see it should be done differently than static methods.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10793</id>
		<title>Talk:Objectless Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10793"/>
				<updated>2008-03-18T06:12:39Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Why couldn't the client needing to validate parameters inherit{NONE} from A_VALIDATOR instead of creating an instance?&lt;br /&gt;
&lt;br /&gt;
Also your validation feature doesn't have a postcondition so it's really an incomplete contract.  If your validation feature is supposed to ensure something, it needs to state that, otherwise you're just saying, in order to create this object it needs to satisfy this routine which can be overidden and since there's no postcondition, it could be overridden to mean anything including nothing and that's a bug.&lt;br /&gt;
&lt;br /&gt;
Non-polymorphic inheritance shouldn't have a performance hit unless it's not being optimized, by definition they're monomorphic calls so they can be static and inlined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 14:43, 14 March 2008 (PDT)&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A_CLIENT&lt;br /&gt;
inherit{NONE}&lt;br /&gt;
A_VALIDATOR&lt;br /&gt;
feature&lt;br /&gt;
process (a_value: ?VALUE)&lt;br /&gt;
    local&lt;br /&gt;
        l_a: A&lt;br /&gt;
    do&lt;br /&gt;
        if is_valid_value (a_value) then&lt;br /&gt;
            create l_a.make (a_value)&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 04:42, 15 March 2008 (PDT) The redefinition of &amp;lt;e&amp;gt;is_valid_value&amp;lt;/e&amp;gt; is strengthening the precondition. This is contrary to Design by Contract. I think you have a valid point, Paul, but you need to come up with a decent example!&lt;br /&gt;
&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 05:19, 15 March 2008 (PDT) I don't like your preferred placement of the '''objectless''' keyword, Paul, in front of the feature name. I think I would prefer it in the place of the &amp;lt;e&amp;gt;do&amp;lt;/e&amp;gt;; this is an alternative that you did not propose:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;feature -- Access&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
        objectless&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A problem with this is that it precludes the possibility of objectless once functions or objectless externals.&lt;br /&gt;
&lt;br /&gt;
I can think of another possibility: in place of &amp;lt;e&amp;gt;feature&amp;lt;/e&amp;gt;. This would be out of step with any other Eiffel keyword; but considering that your whole proposal is out of step with Eiffel's insistence that all calls be targeted to an object, maybe it's appropriate!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;objectless -- Access&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
        do&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think I like this. (In fact, why isn't &amp;lt;e&amp;gt;frozen&amp;lt;/e&amp;gt; like this?)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
:--[[User:Ericb|Ericb]] 14:01, 16 March 2008 (PDT): Because one can write:&lt;br /&gt;
:&amp;lt;e&amp;gt;&lt;br /&gt;
copy, frozen standard_copy (other: like Current)&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::--[[User:Peter gummer|Peter gummer]] 17:54, 16 March 2008 (PDT) Ha, good point, Eric! That is useful. So Paul's preferred notation would be advantageous only if someone can see any useful reason to have two synonyms for a routine, one object-oriented and the other class-oriented. Sounds like a very bad idea to me, because &amp;lt;e&amp;gt;Current&amp;lt;/e&amp;gt; would be meaningless in an objectless routine (unless Eiffel specified that it be a reference to the enclosing class, as Delphi and Smalltalk do for '''self''' in ''class methods''; but Eiffel does not have class reference variables, so this won't work in Eiffel; and it would be a pretty stupid idea anyway, for the meaning of &amp;lt;e&amp;gt;Current&amp;lt;/e&amp;gt; to change like that within the same routine). Methinks this would be a defect, then, in Paul's preferred notation! This leaves two possible places for the proposed '''objectless''' keyword: to replace or qualify either &amp;lt;e&amp;gt;do&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;feature&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 05:33, 15 March 2008 (PDT) Paul, you wrote, &amp;quot;Unlike other languages, it should be possible to redefine any objectless routine.&amp;quot; Uh, ''which'' other languages? Well ok, I know exactly which languages you are thinking of: C#, etc. I just want to point out that there are other languages out there that ''do'' allow redefinition of objectless routines. The obvious one is the big grandma of OO languages, Smalltalk, where polymorphic class methods are common (or so I believe, never having programmed in Smalltalk myself). Another is Delphi, which I programmed in for about 6 years, and polymorphic class methods are the biggest thing that I miss from the Delphi language. They are incredibly powerful when used in combination with class reference variables (which is something else that Eiffel lacks, although the new &amp;lt;e&amp;gt;TYPE&amp;lt;/e&amp;gt; class and related mechanisms may be a worthy substitute: I'm not sure yet.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Ericb|Ericb]] 14:14, 16 March 2008 (PDT): Paul, you said that this was overlooked when defining the ECMA standard. I attended the ECMA meetings and I don't share your opinion. The fact that it is not in the current version of the ECMA standard does not mean that it has been overlooked. That being said, I'm glad you wrote this wiki page so that the topic can be brought back again at ECMA. However there is something that is desperately missing in your proposal: where are the validity rules? There is only one which states that we can redefine an objectless routine (BTW, why not simply call them static routines?) to a non-objectless routine. Personally I think that it should be the reverse, but it's hard to be sure since you don't put down the other validity routines. For example, what should be the conditions that a routine should satisfy in order to be valid to declare it as objectless? My first impression is that it should not use 'Current' nor call non-objectless features, to the very least.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
I'm not on the ECMA committee, but I've always seen static functions as poor design.  I still question whether the problems stated are valid.&lt;br /&gt;
-There is no performance hit from creating A_VALIDATOR because you don't need to create an instance, you can use non-conforming inheritance.&lt;br /&gt;
-The example strengthens a precondition so any pattern in existing code following type B in this example is questionable.&lt;br /&gt;
-The &amp;quot;overuse of inheritance&amp;quot; is shown as a problem, I see it as code reuse.  I hope the suggestion isn't to make global static functions, more than likely it's suggested to be referenced by a {CLASS}.function in which case you're just using composition rather than inheritance so all inheritance just moves to composition.  There shouldn't be a performance hit of dynamic dispatch when using non-conforming inheritance because they're non-polymorphic calls.&lt;br /&gt;
-There is no double object creation, use non-conforming inheritance, and there should be no dynamic calls to monomorphic non-conforming inheritance features.&lt;br /&gt;
&lt;br /&gt;
****Please tell me if I'm missing why these functions need to by dynamic in non-conforming inheritance!****&lt;br /&gt;
&lt;br /&gt;
Static functions that are part of a class basically are there for namespace reasons since they don't represent operations on an instance of the class; The class name because the namespace of the function, essentially.  They don't help create an ADT which is the entire purpose of a pure OO language.&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 16:44, 16 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 17:54, 16 March 2008 (PDT)&lt;br /&gt;
To answer Eric's question, &amp;quot;Why not simply call them static routines?&amp;quot;: because '''they are not static routines'''!&lt;br /&gt;
&lt;br /&gt;
Static routines in C++, C#, Java, etc. cannot be redefined, as I discovered to my dismay when I moved from Delphi to C#. Static routines in those languages are nothing more than class-scoped global routines. Yechh! ''Evil!'' What Paul is proposing -- and what I found so useful in Delphi -- are known as ''class methods'' in languages that are influenced by Smalltalk. They can be redefined. When assigned to a class reference variable in those languages, they become polymorphic. This is extremely powerful. One thing they were great for in Delphi is in object factories: it took me a long time to figure out why the GoF Design Patterns book was describing in such a long-winded way how to do class factories, until finally I understood that I had been doing them for a long time in Delphi, but with only a line or two of code thanks to the combination of class methods, class references and polymorphic constructors. (Unlike the brain-dead constructors in C++, C# and Java, Delphi constructors can be redefined, just like Eiffel creation routines.)&lt;br /&gt;
&lt;br /&gt;
This is anything but &amp;quot;static&amp;quot;!&lt;br /&gt;
&lt;br /&gt;
I don't know whether objectless routines would fit well within Eiffel, but I would certainly be pleased to see them. It would simplify a lot of code: whole classes would disappear, and ten lines would collapse down to one or two in many cases, especially if the &amp;lt;e&amp;gt;TYPE&amp;lt;/e&amp;gt; class turns out to be as useful as class references are in Smalltalk, etc. Bertrand Meyer has written in the past about the dangers of backsliding into procedural code, so maybe there is too much resistance in the Eiffel community. On the other hand, the unwieldiness of the current approach of inheriting &amp;lt;e&amp;gt;SHARED_*&amp;lt;/e&amp;gt; classes is probably a deterrent to many prospective Eiffel programmers.&lt;br /&gt;
&lt;br /&gt;
I would recommend studying patterns of usage of class methods in Smalltalk. A bit of googling I've just done also suggests that Ruby might also be worth looking at. But most instructive, perhaps, would be Delphi, which is syntactically closer to Eiffel and is type-safe. (Although Delphi is not, in general, as type-safe as Eiffel, class methods are done in a type-safe manner).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Ericb|Ericb]] 00:59, 17 March 2008 (PDT): In Eiffel, when a feature cannot be redefined, we use frozen, not static. In Eiffel, static is used in opposition to dynamic. For example, dynamic binding vs. static binding. In case of class methods (hmmm, class features I should say!), unless I miss something we would have static binding. I agree that this does not convey the notion of call with no target object, but objectless looks very ugly to me as a keyword.&lt;br /&gt;
&lt;br /&gt;
I'm still waiting for the validity rules to be stated. Here is another example of such rule: an objectless feature cannot be deferred. The same rule applies to frozen features.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 19:08, 17 March 2008 (PDT) I would want these '''objectless''' features to be dynamically bound, Eric. Unless I misread him, I'm sure that's what Paul is asking for too. This would therefore be valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;feature&lt;br /&gt;
&lt;br /&gt;
    frozen i_am_statically_bound&lt;br /&gt;
        objectless&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    i_must_be_defined_in_effected_descendants&lt;br /&gt;
        objectless deferred&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Except that I don't like that double-barrelled &amp;lt;e&amp;gt;objectless deferred&amp;lt;/e&amp;gt; syntax! Anyway, whatever the syntax, if I remember rightly Delphi allows &amp;quot;abstract class methods&amp;quot;, and I see no reason to forbid '''deferred objectless routines'''.&lt;br /&gt;
&lt;br /&gt;
Paul's proposed '''objectless''' keyword looks ugly to me too, Eric. But I do like the fact that it is explicit about what it is, and I also like that it probably won't conflict with identifiers in existing software. Why does Eiffel always have to invent its own idiosyncratic terminology? Why not just use the keyword that some other languages are already using for this concept: &amp;lt;e&amp;gt;class&amp;lt;/e&amp;gt;? It's brief, accurate, won't conflict with identifiers in existing code, and will be instantly understood by thousands of Smalltalk and Delphi programmers. Let's see how it would look:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;feature&lt;br /&gt;
&lt;br /&gt;
    f: STRING&lt;br /&gt;
        class&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hmmm, looks ok to me. Another possible keyword would be '''singleton''', which apparently is Ruby's keyword for its closest equivalent to Smalltalk class methods.&lt;br /&gt;
&lt;br /&gt;
Another issue: why just routines? Why not '''deferred objectless attributes'''? Smalltalk has them, and I think Delphi has them too these days.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
You mean global variables?&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 23:12, 17 March 2008 (PDT)&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10786</id>
		<title>Talk:Objectless Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10786"/>
				<updated>2008-03-16T23:44:06Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Why couldn't the client needing to validate parameters inherit{NONE} from A_VALIDATOR instead of creating an instance?&lt;br /&gt;
&lt;br /&gt;
Also your validation feature doesn't have a postcondition so it's really an incomplete contract.  If your validation feature is supposed to ensure something, it needs to state that, otherwise you're just saying, in order to create this object it needs to satisfy this routine which can be overidden and since there's no postcondition, it could be overridden to mean anything including nothing and that's a bug.&lt;br /&gt;
&lt;br /&gt;
Non-polymorphic inheritance shouldn't have a performance hit unless it's not being optimized, by definition they're monomorphic calls so they can be static and inlined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 14:43, 14 March 2008 (PDT)&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A_CLIENT&lt;br /&gt;
inherit{NONE}&lt;br /&gt;
A_VALIDATOR&lt;br /&gt;
feature&lt;br /&gt;
process (a_value: ?VALUE)&lt;br /&gt;
    local&lt;br /&gt;
        l_a: A&lt;br /&gt;
    do&lt;br /&gt;
        if is_valid_value (a_value) then&lt;br /&gt;
            create l_a.make (a_value)&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 04:42, 15 March 2008 (PDT) The redefinition of &amp;lt;e&amp;gt;is_valid_value&amp;lt;/e&amp;gt; is strengthening the precondition. This is contrary to Design by Contract. I think you have a valid point, Paul, but you need to come up with a decent example!&lt;br /&gt;
&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 05:19, 15 March 2008 (PDT) I don't like your preferred placement of the '''objectless''' keyword, Paul, in front of the feature name. I think I would prefer it in the place of the &amp;lt;e&amp;gt;do&amp;lt;/e&amp;gt;; this is an alternative that you did not propose:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;feature -- Access&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
        objectless&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A problem with this is that it precludes the possibility of objectless once functions or objectless externals.&lt;br /&gt;
&lt;br /&gt;
I can think of another possibility: in place of &amp;lt;e&amp;gt;feature&amp;lt;/e&amp;gt;. This would be out of step with any other Eiffel keyword; but considering that your whole proposal is out of step with Eiffel's insistence that all calls be targeted to an object, maybe it's appropriate!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;objectless -- Access&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
        do&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think I like this. (In fact, why isn't &amp;lt;e&amp;gt;frozen&amp;lt;/e&amp;gt; like this?)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
:--[[User:Ericb|Ericb]] 14:01, 16 March 2008 (PDT): Because one can write:&lt;br /&gt;
:&amp;lt;e&amp;gt;&lt;br /&gt;
copy, frozen standard_copy (other: like Current)&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 05:33, 15 March 2008 (PDT) Paul, you wrote, &amp;quot;Unlike other languages, it should be possible to redefine any objectless routine.&amp;quot; Uh, ''which'' other languages? Well ok, I know exactly which languages you are thinking of: C#, etc. I just want to point out that there are other languages out there that ''do'' allow redefinition of objectless routines. The obvious one is the big grandma of OO languages, Smalltalk, where polymorphic class methods are common (or so I believe, never having programmed in Smalltalk myself). Another is Delphi, which I programmed in for about 6 years, and polymorphic class methods are the biggest thing that I miss from the Delphi language. They are incredibly powerful when used in combination with class reference variables (which is something else that Eiffel lacks, although the new &amp;lt;e&amp;gt;TYPE&amp;lt;/e&amp;gt; class and related mechanisms may be a worthy substitute: I'm not sure yet.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Ericb|Ericb]] 14:14, 16 March 2008 (PDT): Paul, you said that this was overlooked when defining the ECMA standard. I attended the ECMA meetings and I don't share your opinion. The fact that it is not in the current version of the ECMA standard does not mean that it has been overlooked. That being said, I'm glad you wrote this wiki page so that the topic can be brought back again at ECMA. However there is something that is desperately missing in your proposal: where are the validity rules? There is only one which states that we can redefine an objectless routine (BTW, why not simply call them static routines?) to a non-objectless routine. Personally I think that it should be the reverse, but it's hard to be sure since you don't put down the other validity routines. For example, what should be the conditions that a routine should satisfy in order to be valid to declare it as objectless? My first impression is that it should not use 'Current' nor call non-objectless features, to the very least.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
I'm not on the ECMA committee, but I've always seen static functions as poor design.  I still question whether the problems stated are valid.&lt;br /&gt;
-There is no performance hit from creating A_VALIDATOR because you don't need to create an instance, you can use non-conforming inheritance.&lt;br /&gt;
-The example strengthens a precondition so any pattern in existing code following type B in this example is questionable.&lt;br /&gt;
-The &amp;quot;overuse of inheritance&amp;quot; is shown as a problem, I see it as code reuse.  I hope the suggestion isn't to make global static functions, more than likely it's suggested to be referenced by a {CLASS}.function in which case you're just using composition rather than inheritance so all inheritance just moves to composition.  There shouldn't be a performance hit of dynamic dispatch when using non-conforming inheritance because they're non-polymorphic calls.&lt;br /&gt;
-There is no double object creation, use non-conforming inheritance, and there should be no dynamic calls to monomorphic non-conforming inheritance features.&lt;br /&gt;
&lt;br /&gt;
****Please tell me if I'm missing why these functions need to by dynamic in non-conforming inheritance!****&lt;br /&gt;
&lt;br /&gt;
Static functions that are part of a class basically are there for namespace reasons since they don't represent operations on an instance of the class; The class name because the namespace of the function, essentially.  They don't help create an ADT which is the entire purpose of a pure OO language.&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 16:44, 16 March 2008 (PDT)&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10785</id>
		<title>Talk:Objectless Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10785"/>
				<updated>2008-03-16T23:43:53Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Why couldn't the client needing to validate parameters inherit{NONE} from A_VALIDATOR instead of creating an instance?&lt;br /&gt;
&lt;br /&gt;
Also your validation feature doesn't have a postcondition so it's really an incomplete contract.  If your validation feature is supposed to ensure something, it needs to state that, otherwise you're just saying, in order to create this object it needs to satisfy this routine which can be overidden and since there's no postcondition, it could be overridden to mean anything including nothing and that's a bug.&lt;br /&gt;
&lt;br /&gt;
Non-polymorphic inheritance shouldn't have a performance hit unless it's not being optimized, by definition they're monomorphic calls so they can be static and inlined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 14:43, 14 March 2008 (PDT)&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A_CLIENT&lt;br /&gt;
inherit{NONE}&lt;br /&gt;
A_VALIDATOR&lt;br /&gt;
feature&lt;br /&gt;
process (a_value: ?VALUE)&lt;br /&gt;
    local&lt;br /&gt;
        l_a: A&lt;br /&gt;
    do&lt;br /&gt;
        if is_valid_value (a_value) then&lt;br /&gt;
            create l_a.make (a_value)&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 04:42, 15 March 2008 (PDT) The redefinition of &amp;lt;e&amp;gt;is_valid_value&amp;lt;/e&amp;gt; is strengthening the precondition. This is contrary to Design by Contract. I think you have a valid point, Paul, but you need to come up with a decent example!&lt;br /&gt;
&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 05:19, 15 March 2008 (PDT) I don't like your preferred placement of the '''objectless''' keyword, Paul, in front of the feature name. I think I would prefer it in the place of the &amp;lt;e&amp;gt;do&amp;lt;/e&amp;gt;; this is an alternative that you did not propose:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;feature -- Access&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
        objectless&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A problem with this is that it precludes the possibility of objectless once functions or objectless externals.&lt;br /&gt;
&lt;br /&gt;
I can think of another possibility: in place of &amp;lt;e&amp;gt;feature&amp;lt;/e&amp;gt;. This would be out of step with any other Eiffel keyword; but considering that your whole proposal is out of step with Eiffel's insistence that all calls be targeted to an object, maybe it's appropriate!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;objectless -- Access&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
        do&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think I like this. (In fact, why isn't &amp;lt;e&amp;gt;frozen&amp;lt;/e&amp;gt; like this?)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
:--[[User:Ericb|Ericb]] 14:01, 16 March 2008 (PDT): Because one can write:&lt;br /&gt;
:&amp;lt;e&amp;gt;&lt;br /&gt;
copy, frozen standard_copy (other: like Current)&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Peter gummer|Peter gummer]] 05:33, 15 March 2008 (PDT) Paul, you wrote, &amp;quot;Unlike other languages, it should be possible to redefine any objectless routine.&amp;quot; Uh, ''which'' other languages? Well ok, I know exactly which languages you are thinking of: C#, etc. I just want to point out that there are other languages out there that ''do'' allow redefinition of objectless routines. The obvious one is the big grandma of OO languages, Smalltalk, where polymorphic class methods are common (or so I believe, never having programmed in Smalltalk myself). Another is Delphi, which I programmed in for about 6 years, and polymorphic class methods are the biggest thing that I miss from the Delphi language. They are incredibly powerful when used in combination with class reference variables (which is something else that Eiffel lacks, although the new &amp;lt;e&amp;gt;TYPE&amp;lt;/e&amp;gt; class and related mechanisms may be a worthy substitute: I'm not sure yet.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
--[[User:Ericb|Ericb]] 14:14, 16 March 2008 (PDT): Paul, you said that this was overlooked when defining the ECMA standard. I attended the ECMA meetings and I don't share your opinion. The fact that it is not in the current version of the ECMA standard does not mean that it has been overlooked. That being said, I'm glad you wrote this wiki page so that the topic can be brought back again at ECMA. However there is something that is desperately missing in your proposal: where are the validity rules? There is only one which states that we can redefine an objectless routine (BTW, why not simply call them static routines?) to a non-objectless routine. Personally I think that it should be the reverse, but it's hard to be sure since you don't put down the other validity routines. For example, what should be the conditions that a routine should satisfy in order to be valid to declare it as objectless? My first impression is that it should not use 'Current' nor call non-objectless features, to the very least.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
I'm not on the ECMA committee, but I've always seen static functions as poor design.  I still question whether the problems stated are valid.&lt;br /&gt;
-There is no performance hit from creating A_VALIDATOR because you don't need to create an instance, you can use non-conforming inheritance.&lt;br /&gt;
-The example strengthens a precondition so any pattern in existing code following type B in this example is questionable.&lt;br /&gt;
-The &amp;quot;overuse of inheritance&amp;quot; is shown as a problem, I see it as code reuse.  I hope the suggestion isn't to make global static functions, more than likely it's suggested to be referenced by a {CLASS}.function in which case you're just using composition rather than inheritance so all inheritance just moves to composition.  There shouldn't be a performance hit of dynamic dispatch when using non-conforming inheritance because they're non-polymorphic calls.&lt;br /&gt;
-There is no double object creation, use non-conforming inheritance, and there should be no dynamic calls to monomorphic non-conforming inheritance features.&lt;br /&gt;
&lt;br /&gt;
****Please tell me if I'm missing why these functions need to by dynamic in non-conforming inheritance!****&lt;br /&gt;
&lt;br /&gt;
Static functions that are part of a class basically are there for namespace reasons since they don't represent operations on an instance of the class; The class name because the namespace of the function, essentially.  They don't help create an ADT which is the entire purpose of a pure OO language.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10772</id>
		<title>Talk:Objectless Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10772"/>
				<updated>2008-03-14T21:43:36Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Why couldn't the client needing to validate parameters inherit{NONE} from A_VALIDATOR instead of creating an instance?&lt;br /&gt;
&lt;br /&gt;
Also your validation feature doesn't have a postcondition so it's really an incomplete contract.  If your validation feature is supposed to ensure something, it needs to state that, otherwise you're just saying, in order to create this object it needs to satisfy this routine which can be overidden and since there's no postcondition, it could be overridden to mean anything including nothing and that's a bug.&lt;br /&gt;
&lt;br /&gt;
Non-polymorphic inheritance shouldn't have a performance hit unless it's not being optimized, by definition they're monomorphic calls so they can be static and inlined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 14:43, 14 March 2008 (PDT)&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A_CLIENT&lt;br /&gt;
inherit{NONE}&lt;br /&gt;
A_VALIDATOR&lt;br /&gt;
feature&lt;br /&gt;
process (a_value: ?VALUE)&lt;br /&gt;
    local&lt;br /&gt;
        l_a: A&lt;br /&gt;
    do&lt;br /&gt;
        if is_valid_value (a_value) then&lt;br /&gt;
            create l_a.make (a_value)&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10771</id>
		<title>Talk:Objectless Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10771"/>
				<updated>2008-03-14T21:43:22Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Why couldn't the client needing to validate parameters inherit{NONE} from A_VALIDATOR instead of creating an instance?&lt;br /&gt;
&lt;br /&gt;
Also your validation feature doesn't have a postcondition so it's really an incomplete contract.  If your validation feature is supposed to ensure something, it needs to state that, otherwise you're just saying, in order to create this object it needs to satisfy this routine which can be overidden and since there's no postcondition, it could be overridden to mean anything including nothing and that's a bug.&lt;br /&gt;
&lt;br /&gt;
Non-polymorphic inheritance shouldn't have a performance hit unless it's not being optimized, by definition they're monomorphic calls so they can be static and inlined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Clemahieu|Clemahieu]] 14:43, 14 March 2008 (PDT)&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A_CLIENT&lt;br /&gt;
inherit{NONE}&lt;br /&gt;
A_VALIDATOR&lt;br /&gt;
process (a_value: ?VALUE)&lt;br /&gt;
    local&lt;br /&gt;
        l_a: A&lt;br /&gt;
    do&lt;br /&gt;
        if is_valid_value (a_value) then&lt;br /&gt;
            create l_a.make (a_value)&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10758</id>
		<title>Talk:Objectless Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Objectless_Calls&amp;diff=10758"/>
				<updated>2008-03-14T19:10:42Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Why couldn't the client needing to validate parameters inherit{NONE} from A_VALIDATOR instead of creating an instance?&lt;br /&gt;
&lt;br /&gt;
Also your validation feature doesn't have a postcondition so it's really an incomplete contract.  If your validation feature is supposed to ensure something, it needs to state that, otherwise you're just saying, in order to create this object it needs to satisfy this routine which can be overidden and since there's no postcondition, it could be overridden to mean anything including nothing and that's a bug.&lt;br /&gt;
&lt;br /&gt;
Non-polymorphic inheritance shouldn't have a performance hit unless it's not being optimized, by definition they're monomorphic calls so they can be static and inlined.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Objectless_Calls&amp;diff=10755</id>
		<title>Objectless Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Objectless_Calls&amp;diff=10755"/>
				<updated>2008-03-14T18:58:12Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: Typeo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UnderConstruction}}&lt;br /&gt;
In the proposal the author highlight some of the advantages of adding a new mechanism to the Eiffel language to permit objectless (known as static in C/C++ and derivative languages) calls. The introduction of objectless calls in Eiffel resolves issues regarding contract guarantees, creation contracts, overuse of &amp;quot;shared&amp;quot; inheritance and can solve a performance related issue using dynamic dispatch.&lt;br /&gt;
&lt;br /&gt;
It is in the author's opinion that objectless calls are a necessary addition for the continued improvement of the Eiffel language, and were overlooked when defining the ECMA standard.&lt;br /&gt;
&lt;br /&gt;
== The Creation Problem ==&lt;br /&gt;
To date the Eiffel language suffers from a problem whereby creation contracts cannot be specified correctly or can be specified but not guarenteed. Take the following code with a creation routine needing to validate a creation argument using a class query:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make&lt;br /&gt;
    &lt;br /&gt;
feature {NONE} -- Initialization&lt;br /&gt;
&lt;br /&gt;
    make (a_arg: ?VALUE)&lt;br /&gt;
        require&lt;br /&gt;
            a_arg_is_valid_value: is_valid_value (a_arg)&lt;br /&gt;
        do&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
feature -- Query&lt;br /&gt;
&lt;br /&gt;
    is_valid_value (a_value: ?VALUE): BOOLEAN&lt;br /&gt;
            -- Determines if an argument is valid&lt;br /&gt;
        do&lt;br /&gt;
            Result := a_value /= Void and then a_value.has_value&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here there is the classic chicken and egg problem; A client needs to validate any prospective creation argument to create an instance of &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; but requires an instance of &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; in order to validate it.&lt;br /&gt;
&lt;br /&gt;
There is a solution, but it is far from elegant, fragments class design and opens avenues to bugs. The solution is to refactor and pull up &amp;lt;e&amp;gt;is_valid_value&amp;lt;/e&amp;gt; into a validation &amp;quot;helper&amp;quot; class to assist &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class A_VALIDATION&lt;br /&gt;
        &lt;br /&gt;
feature -- Query&lt;br /&gt;
&lt;br /&gt;
    is_valid_value (a_value: ?VALUE): BOOLEAN&lt;br /&gt;
            -- Determines if an argument is valid&lt;br /&gt;
        do&lt;br /&gt;
            Result := a_value /= Void and then a_value.has_value&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now there has been a validator class defined, with implementation that actually belongs in &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; can now be defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class A&lt;br /&gt;
&lt;br /&gt;
inherit {NONE}&lt;br /&gt;
    A_VALIDATION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make&lt;br /&gt;
    &lt;br /&gt;
feature {NONE} -- Initialization&lt;br /&gt;
&lt;br /&gt;
    make (a_arg: ?VALUE)&lt;br /&gt;
        require&lt;br /&gt;
            a_arg_is_valid_value: is_valid_value (a_arg)&lt;br /&gt;
        do&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A client now has to create an instance of &amp;lt;e&amp;gt;A_VALIDATOR&amp;lt;/e&amp;gt; in order to create an instance of &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt;. The result is a performance hit because of an additional object creation and heap allocation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;process (a_value: ?VALUE)&lt;br /&gt;
    local&lt;br /&gt;
        l_a: A&lt;br /&gt;
    do&lt;br /&gt;
        if (create {A_VALIDATOR}).is_valid_value (a_value) then&lt;br /&gt;
            create l_a.make (a_value)&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Apart from the fragmentation and additional creation, it seems like the problem is solved. However, take the following adjustments likely to transpire when an developer other than the orginal (maybe event the orginal developer) subclasses &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; to create a new type &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class B&lt;br /&gt;
&lt;br /&gt;
inherit &lt;br /&gt;
    A redefine make, is_valid_value end&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make&lt;br /&gt;
    &lt;br /&gt;
feature {NONE} -- Initialization&lt;br /&gt;
&lt;br /&gt;
    make (a_arg: ?VALUE)&lt;br /&gt;
        do&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
feature -- Query&lt;br /&gt;
&lt;br /&gt;
    is_valid_value (a_value: ?VALUE): BOOLEAN&lt;br /&gt;
            -- Determines if an argument is valid&lt;br /&gt;
        do&lt;br /&gt;
            Result := Precursor {A} (a_value) and then a_value.value.is_equal (&amp;quot;predefined&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The affect isn't that obvious. This is a common scenario and is actually a bug because the implementation does not follow the existing model of &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt;, that is to say fragment and implement an additional class &amp;lt;e&amp;gt;B_VALIDATOR&amp;lt;/e&amp;gt;. The real implementation should have been:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class B_VALIDATION&lt;br /&gt;
        &lt;br /&gt;
inherit&lt;br /&gt;
    A_VALIDATOR redefine is_valid_value end&lt;br /&gt;
    &lt;br /&gt;
feature -- Query&lt;br /&gt;
&lt;br /&gt;
    is_valid_value (a_value: ?VALUE): BOOLEAN&lt;br /&gt;
            -- Determines if an argument is valid&lt;br /&gt;
        do&lt;br /&gt;
            Result := Precursor {A} (a_value) and then a_value.value.is_equal (&amp;quot;predefined&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now there has been a validator class defined, with implementation that actually belongs in &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt; can now be defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class B&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
    A redefine make, is_valid_value end&lt;br /&gt;
&lt;br /&gt;
inherit {NONE}&lt;br /&gt;
    B_VALIDATION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make&lt;br /&gt;
    &lt;br /&gt;
feature {NONE} -- Initialization&lt;br /&gt;
&lt;br /&gt;
    make (a_arg: ?VALUE)&lt;br /&gt;
        require&lt;br /&gt;
            a_arg_is_valid_value: is_valid_value (a_arg)&lt;br /&gt;
        do&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only now can a client safely create an instance of &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt;, but this time using &amp;lt;e&amp;gt;B_VALIDATOR&amp;lt;/e&amp;gt;. So for a simple two class model there now exists four classes and an additional performace hit for the creation (or instance access of using a once function) for the validator instance.&lt;br /&gt;
&lt;br /&gt;
== Overuse of Inheritance ==&lt;br /&gt;
Due to the lack of an objectless routine mechanism in the Eiffel language there is tenancy to overuse inheritance because it is required. There is a need to use &amp;quot;shared&amp;quot; objects which expose a single instance of a class through a once function. If there was an objectless mechanism classes could just use the a objectless once function. The Eiffel compiler and EiffelStudio IDE make heavy use of shared classes, prefixed &amp;lt;e&amp;gt;SHARED_&amp;lt;/e&amp;gt;. In a recent code review &amp;lt;e&amp;gt;FEATURE_I&amp;lt;/e&amp;gt; inherits 24 parent classes, only 6 are actual affecting the model and functionality of the class. That is 18 classes inherited for shared access alone! &lt;br /&gt;
&lt;br /&gt;
The use of inheritance causes another problem, performance degradation.&lt;br /&gt;
&lt;br /&gt;
== The Performance Problem ==&lt;br /&gt;
&lt;br /&gt;
== A Proposal ==&lt;br /&gt;
In order to complete this document the author indicates a proposal for such a mechanism for permitting objectless calls.&lt;br /&gt;
&lt;br /&gt;
Due to objectless calls being a language mechanism rather than a run-time attribute (such as a once's process/thread status) a new keyword is going to be required, minimizing possible conflicts with feature names use in existing systems. For this proposal the author suggest ''objectless'', indicating a objectless call.&lt;br /&gt;
&lt;br /&gt;
Objectless class should be permitted on function, both regular and once functions. It is up to debate to indicate if procedures and class attributes are permitted to be objectless&lt;br /&gt;
&lt;br /&gt;
The '''objectless''' keyword should appear as a routine modifier, as with the &amp;lt;e&amp;gt;frozen&amp;lt;/e&amp;gt; keyword. Just as the use of &amp;lt;e&amp;gt;frozen&amp;lt;/e&amp;gt; is used to dictate to subclasses a routine cannot be redefined/undefined, '''objectless''' has a similar standing when being called, indicating (not dictating) to clients to use the static calling convention. Secondary to the argument such placement is clear to a reader the call is objectless. The only alternative foreseeable placement for an '''objectless''' keyword would be a prior to a routine's type keyword &amp;lt;e&amp;gt;do, once, deferred, external&amp;lt;/e&amp;gt;, however in the case of the previous arguments of readability, it's the author's opinion the keyword should not appear there. There may be a suggestion to using a routine's &amp;lt;e&amp;gt;note&amp;lt;/e&amp;gt; clause to indicate objectless status but this is a bad idea, not only for readability but because note clauses are informative structures that should not change routine semantics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class A&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
    objectless f: STRING_8&lt;br /&gt;
            -- Proposal for an objectless function.&lt;br /&gt;
            -- This seems much more readable&lt;br /&gt;
        do&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
    f: STRING_8&lt;br /&gt;
            -- Proposal for an objectless function, alternative style.&lt;br /&gt;
            -- Less readable as an objectless call&lt;br /&gt;
        objectless do&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using '''objectless''' is an indication to client, use the static calling convention is permitted but is not necessary. Making the same call on an attached entity will make &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Solving the Creation Problem ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make&lt;br /&gt;
    &lt;br /&gt;
feature {NONE} -- Initialization&lt;br /&gt;
&lt;br /&gt;
    make (a_arg: ?VALUE)&lt;br /&gt;
        require&lt;br /&gt;
            a_arg_is_valid_value: is_valid_value (a_arg)&lt;br /&gt;
        do&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
feature -- Query&lt;br /&gt;
&lt;br /&gt;
    objectless is_valid_value (a_value: ?VALUE): BOOLEAN&lt;br /&gt;
            -- Determines if an argument is valid&lt;br /&gt;
        do&lt;br /&gt;
            Result := a_value /= Void and then a_value.has_value&lt;br /&gt;
        ensure&lt;br /&gt;
            a_value_attached: Result implies a_value /= Void&lt;br /&gt;
            a_value_has_value: Result implies a_value.has_value&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For clients wanting to create an instance of &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt;, the following code can now be written and guarenteed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;process (a_value: ?VALUE)&lt;br /&gt;
        -- Processes a value node.&lt;br /&gt;
    local&lt;br /&gt;
        l_a: A&lt;br /&gt;
    do&lt;br /&gt;
        if {A}.is_valid_value (a_value) then&lt;br /&gt;
                -- The value is valid, so we can safely create an instance of {A}.&lt;br /&gt;
            create l_a.make (a_value)&lt;br /&gt;
            ...&lt;br /&gt;
        end&lt;br /&gt;
    end&amp;lt;/e&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
=== Extensions ===&lt;br /&gt;
One extension to the proposal and possible advantage over languages with a similar mechanism is the possibility to redefine a objectless routine. The semantics of this have clear rules that govern the behavoir of calls and the calling convention used. This extension requires consideration now because of impacts on user code in the future if the language is to adopt the extension.&lt;br /&gt;
&lt;br /&gt;
For the purpose of explaining the semantics of redefinition, the following classes are used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class A&lt;br /&gt;
    &lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
    objectless f: STRING do ... end&lt;br /&gt;
        &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class B&lt;br /&gt;
&lt;br /&gt;
inherit &lt;br /&gt;
    A&lt;br /&gt;
        &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Objectless Redefinition ====&lt;br /&gt;
An objectless routine may be redefined objectlessly with redefined functionality.&lt;br /&gt;
&lt;br /&gt;
When used as a client, calling &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt; will '''always''' take the version from &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt;. When calling &amp;lt;e&amp;gt;{B}.f&amp;lt;/e&amp;gt; the version from &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; will be called unless &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt; redefines &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class B&lt;br /&gt;
&lt;br /&gt;
inherit &lt;br /&gt;
    A redefine f end&lt;br /&gt;
        &lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
    objectless f: STRING do ... end&lt;br /&gt;
        &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Still, when call &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt; the version from &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; will be taken, but calling &amp;lt;e&amp;gt;{B}.f&amp;lt;/e&amp;gt; will call the version from &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt; as &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; has been redefined objectlessly.&lt;br /&gt;
&lt;br /&gt;
==== Instance Redefinition ====&lt;br /&gt;
An objectless routine may be redefined to an instance routine but not the other way around. This is permitted because the original objectless routine requires no access to instance attributes or instance routines of the class. An instance redefined objectless routine may call the precursor safely in this respect.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;class B&lt;br /&gt;
&lt;br /&gt;
inherit &lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            f&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
    f: STRING&lt;br /&gt;
        do&lt;br /&gt;
            Result := Precursor {A}.twin&lt;br /&gt;
            Result.as_lower&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In instance redefinition, when call &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt; the version from &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; will be taken because a client called &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; using the static calling convention. However, attempting to call &amp;lt;e&amp;gt;{B}.f&amp;lt;/e&amp;gt; will result in a compile-time error because &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; is not accessible statically, since it has been redefined as an instance routine.&lt;br /&gt;
&lt;br /&gt;
==== Instance Call Semantics ====&lt;br /&gt;
When calling &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; on an attached entity, of type &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; or a subtype, the call semantics behave in the same way as every other call - using dynamic dispatch. If an instance of &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt; is polymorphically assigned to an instance of &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt; redefines &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt;, either objectlessly or otherwise, the call is made on the dynamic type of the attached entity, in this case &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
From within the confines of &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt;, or a subclass of it, an an unqualified call to &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; the call should be treated in the same way as using an attached entity &amp;lt;e&amp;gt;Current.f&amp;lt;/e&amp;gt;, that is, the call is dynamically dispatched. This behavoir can be overridden using the static access calling convention.&lt;br /&gt;
&lt;br /&gt;
For example, when &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt; redefines &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt;, in &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt;, it can be written &amp;lt;e&amp;gt;{A}.f&amp;lt;/e&amp;gt; to ensure the version of &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; in &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; is called. Conversely in &amp;lt;e&amp;gt;A&amp;lt;/e&amp;gt; calling &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt; unqualified will dispatch the call, resulting in &amp;lt;e&amp;gt;f&amp;lt;/e&amp;gt;'s implementation in &amp;lt;e&amp;gt;B&amp;lt;/e&amp;gt; being called.&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10016</id>
		<title>Implicit class</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10016"/>
				<updated>2007-11-21T16:38:35Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Research}}&lt;br /&gt;
&lt;br /&gt;
Requesting comments on the notion of an implicit class. &lt;br /&gt;
&lt;br /&gt;
The basic idea would be performing the exact same functionality as the `Renaming' clause in formal generic constraints.  Instead of defining the multiple conformance inline within the text of the class containing the formal generic that is constrained, the generic would have its own class file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
implicit class A&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
rename&lt;br /&gt;
is_equal as b_is_equal&lt;br /&gt;
end&lt;br /&gt;
C&lt;br /&gt;
rename&lt;br /&gt;
is_equal as c_is_equal&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following class:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class F&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
C&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Could then be used like:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
feature operation is&lt;br /&gt;
local&lt;br /&gt;
  item: F&lt;br /&gt;
  container: LINKED_LIST[A]&lt;br /&gt;
  val: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
  val := {A}item.b_is_equals(void)&lt;br /&gt;
  val := {A}item.c_is_equals(void)&lt;br /&gt;
  create container.make&lt;br /&gt;
  container.put({A}item)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; A]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would be identical to ECMA&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; {B rename is_equal as b_is_equal end, C rename is_equal as b_is_equal_end}]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any class inheriting from B and C could be downcast to A.  This simple change would facilitate clarity and reuse in formal generic parameters.&lt;br /&gt;
&lt;br /&gt;
This would also allow multiple constraints to be easily adaptable to actual generic parameters.&lt;br /&gt;
container: LIST[A] would allow objects inheriting from B and C to be placed in `container' and features in B and C to be called on these objects inside of `container' using the renaming policy defined in `A'&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10015</id>
		<title>Implicit class</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10015"/>
				<updated>2007-11-20T23:13:15Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Research}}&lt;br /&gt;
&lt;br /&gt;
Requesting comments on the notion of an implicit class. &lt;br /&gt;
&lt;br /&gt;
The basic idea would be performing the exact same functionality as the `Renaming' clause in formal generic constraints.  Instead of defining the multiple conformance inline within the text of the class containing the formal generic that is constrained, the generic would have its own class file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
implicit class A&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
rename&lt;br /&gt;
is_equal as b_is_equal&lt;br /&gt;
end&lt;br /&gt;
C&lt;br /&gt;
rename&lt;br /&gt;
is_equal as c_is_equal&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following class:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class F&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
C&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Could then be used like:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
feature operation is&lt;br /&gt;
local&lt;br /&gt;
  item: F&lt;br /&gt;
do&lt;br /&gt;
  {A}item.b_is_equals&lt;br /&gt;
  {A}item.c_is_equals&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; A]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would be identical to ECMA&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; {B rename is_equal as b_is_equal end, C rename is_equal as b_is_equal_end}]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any class inheriting from B and C could be downcast to A.  This simple change would facilitate clarity and reuse in formal generic parameters.&lt;br /&gt;
&lt;br /&gt;
This would also allow multiple constraints to be easily adaptable to actual generic parameters.&lt;br /&gt;
container: LIST[A] would allow objects inheriting from B and C to be placed in `container' and features in B and C to be called on these objects inside of `container' using the renaming policy defined in `A'&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10014</id>
		<title>Implicit class</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10014"/>
				<updated>2007-11-20T23:12:59Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Research}}&lt;br /&gt;
&lt;br /&gt;
Requesting comments on the notion of an implicit class. &lt;br /&gt;
&lt;br /&gt;
The basic idea would be performing the exact same functionality as the `Renaming' clause in formal generic constraints.  Instead of defining the multiple conformance inline within the text of the class containing the formal generic that is constrained, the generic would have its own class file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
implicit class A&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
rename&lt;br /&gt;
is_equal as b_is_equal&lt;br /&gt;
end&lt;br /&gt;
C&lt;br /&gt;
rename&lt;br /&gt;
is_equal as c_is_equal&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following class:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class F&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
C&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Could then be used like:&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
feature operation is&lt;br /&gt;
local&lt;br /&gt;
  item: F&lt;br /&gt;
do&lt;br /&gt;
  {A}item.b_is_equals&lt;br /&gt;
  {A}item.c_is_equals&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; A]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would be identical to ECMA&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; {B rename is_equal as b_is_equal end, C rename is_equal as b_is_equal_end}]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any class inheriting from B and C could be downcast to A.  This simple change would facilitate clarity and reuse in formal generic parameters.&lt;br /&gt;
&lt;br /&gt;
This would also allow multiple constraints to be easily adaptable to actual generic parameters.&lt;br /&gt;
container: LIST[A] would allow objects inheriting from B and C to be placed in `container' and features in B and C to be called on these objects inside of `container' using the renaming policy defined in `A'&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10013</id>
		<title>Implicit class</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Implicit_class&amp;diff=10013"/>
				<updated>2007-11-20T23:06:33Z</updated>
		
		<summary type="html">&lt;p&gt;Clemahieu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Research}}&lt;br /&gt;
&lt;br /&gt;
Requesting comments on the notion of an implicit class. &lt;br /&gt;
&lt;br /&gt;
The basic idea would be performing the exact same functionality as the `Renaming' clause in formal generic constraints.  Instead of defining the multiple conformance inline within the text of the class containing the formal generic that is constrained, the generic would have its own class file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
implicit class A&lt;br /&gt;
inherit&lt;br /&gt;
B&lt;br /&gt;
rename&lt;br /&gt;
is_equal as b_is_equal&lt;br /&gt;
end&lt;br /&gt;
C&lt;br /&gt;
rename&lt;br /&gt;
is_equal as c_is_equal&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; A]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would be identical to ECMA&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class CONTAINER [G -&amp;gt; {B rename is_equal as b_is_equal end, C rename is_equal as b_is_equal_end}]&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any class inheriting from B and C could be downcast to A.  This simple change would facilitate clarity and reuse in formal generic parameters.&lt;br /&gt;
&lt;br /&gt;
This would also allow multiple constraints to be easily adaptable to actual generic parameters.&lt;br /&gt;
container: LIST[A] would allow objects inheriting from B and C to be placed in `container' and features in B and C to be called on these objects inside of `container' using the renaming policy defined in `A'&lt;/div&gt;</summary>
		<author><name>Clemahieu</name></author>	</entry>

	</feed>