<?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=Schoelle</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=Schoelle"/>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/Special:Contributions/Schoelle"/>
		<updated>2026-05-06T01:11:51Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=15469</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=15469"/>
				<updated>2017-02-03T22:15:20Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Contributing! */&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;
*''January 2017'': EiffelStudio [[EiffelStudio 17.01 Releases|17.01]] is available for download at https://www.eiffel.org/downloads&lt;br /&gt;
*''May 2016'': EiffelStudio [[EiffelStudio 16.05 Releases|16.05]] is available for download at https://www.eiffel.org/downloads&lt;br /&gt;
*''Dec 2015'': EiffelStudio [[EiffelStudio 15.12 Releases|15.12]] is available for download at https://www.eiffel.org/downloads&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is an open-source IDE for the [http://en.wikipedia.org/wiki/Eiffel_programming_language Eiffel programming language]. [http://www.eiffel.com Eiffel Software] is the principal contributor and hosts the subversion repository. EiffelStudio is maintained and developed by Eiffel Software as well many contributors, including ETH Zurich.&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 Releases|Changelog of current release (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 17.01 Releases|Changelog of latest version, currently 17.01]]&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;
* [https://www.eiffel.org Eiffel.org]&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;
* Join us on gitter https://gitter.im/EiffelSoftware/EiffelStudio or through https://groups.eiffel.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Catcall_Test_Proposal&amp;diff=9980</id>
		<title>Talk:Catcall Test Proposal</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Catcall_Test_Proposal&amp;diff=9980"/>
				<updated>2007-11-06T11:26:37Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Can you give an example of when using the variant keyword makes sense?&lt;br /&gt;
&lt;br /&gt;
As for the frozen keyword, doesn't this break the open/closed principle yet again (I know the example shows an attribute, but the wording suggests a routine could also be marked with a frozen type - does this limit redeclaration)?&lt;br /&gt;
&lt;br /&gt;
What is supposed to happen in the multiple constraint case (if the compiler didn't have a limitation)?&lt;br /&gt;
--[[User:Colin-adams|Colin-adams]] 00:09, 6 November 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
: The 'variant' keyword is nearly the same as the wildcard types introduced in Java. The only difference is the use of a global analysis (i.e. non-modular) to check certain corner cases that are valid although generics are used in the arguments. --[[User:Schoelle|Schoelle]] 03:26, 6 November 2007 (PST)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Catcall_Test_Proposal&amp;diff=9979</id>
		<title>Talk:Catcall Test Proposal</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Catcall_Test_Proposal&amp;diff=9979"/>
				<updated>2007-11-06T11:26:21Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Can you give an example of when using the variant keyword makes sense?&lt;br /&gt;
&lt;br /&gt;
As for the frozen keyword, doesn't this break the open/closed principle yet again (I know the example shows an attribute, but the wording suggests a routine could also be marked with a frozen type - does this limit redeclaration)?&lt;br /&gt;
&lt;br /&gt;
What is supposed to happen in the multiple constraint case (if the compiler didn't have a limitation)?&lt;br /&gt;
--[[User:Colin-adams|Colin-adams]] 00:09, 6 November 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
: The 'variant' keyword is nearly the same as the wildcard types introduced in Java. The only difference is the use of a global analysis (i.e. non-modular) to check certain corner cases that are valid although generics are used in the arguments.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=9880</id>
		<title>EiffelStudio Wish List</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=9880"/>
				<updated>2007-10-12T15:37:57Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* IDE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Projects]]&lt;br /&gt;
Welcome to the Eiffel/EiffelStudio Wish List. This is the place where you, the community, get a chance to tell us what you think is important to include in the future versions of the Eiffel compiler and EiffelStudio IDE.&lt;br /&gt;
&lt;br /&gt;
Please use this list responsibly and try to correctly categorize your wishes. A brief description may help us evaluate your requirements but please be brief.&lt;br /&gt;
&lt;br /&gt;
Our stock pile of genie snared, dusty gold lamps is running low for our next release ([[EiffelStudio Releases]]) but we'll be sure to scour the lands for more.&lt;br /&gt;
&lt;br /&gt;
== Compiler ==&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID !! Short Summary !! Pros !! Cons !! More info&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Source &amp;amp; Generated Files in an RDBMS and (optionally) Compile directly from database &lt;br /&gt;
| Use an RDBMS to store all sources,libraries and generated files instead of a filesystem.  Optionally directly compile from the database. Repository can be shared amongst multiple users &lt;br /&gt;
|| Pro's:&lt;br /&gt;
* Easy queriable&lt;br /&gt;
* Much more appropriate to use a database to store relations (dependencies) between objects.&lt;br /&gt;
* Easier for using a shared repository amongst multiple users&lt;br /&gt;
||&lt;br /&gt;
* Sophisticated collaboration tools already exist for sharing project source e.g. SVN, CVS&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Shared EIFGEN&lt;br /&gt;
| Allow sharing of EIFGENs (in read-only mode)|| || ||]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! On-demand tab loading&lt;br /&gt;
| Allow creation of an EV_NOTEBOOK tab with an agent to be called to fill the tab when it is first loaded|| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enum&lt;br /&gt;
| A way to author Enum-like class for typed options or flags. Currently using INTEGER and a bag of analogous constants doesn't make Eiffel &amp;quot;elegant&amp;quot;. || ||&lt;br /&gt;
* The best practice way to get a value that only needs to be defined once is by using the &amp;quot;once&amp;quot; keyword in combination with a feature.&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Decimal&lt;br /&gt;
|Addition of a decimal type / REAL_128 for 28 digit precision -  || MA_DECIMAL is not efficient || MA_DECIMAL already covers this||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!User types&lt;br /&gt;
|I want to be able to define types .e.g. a decimal type as mentioned above. I know all built in types can be defined from scratch, except I a way to initialise from literals. So we need a way to define them as well. Suggest a new defered class with create methods from_literal( s:STRING), and queries is_interger_ok:BOOLIAN, is_real_ok:BOOLIAN, is_arbitary_string_ok:BOOLIAN, is_type_string_ok:BOOLIAN (we would define a new type of string just for this). The compiler when generating optimised code will have to compile the new types and dynamicaly bind to them to create an object that can be embeded into the code. I beleave this would let us write code like: x:DECIMAL; x=1.23 (without a conversion from REAL (float base2)) || || ||   &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! CHARACTER_16&lt;br /&gt;
| CHARACTER_16 type || 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 || Please No! CHARACTER_32 covers this already. And UTF-8 is more space-efficient than UTF-16, which is an abomination. What will happen if you have a character from above the BMP? You will then have two CHARACTER_16s in the string for one real character - neither of which is a valid character - then `count' and `item' are all wrong. If you must have UTF-16 STRINGs, then let item return a CHARACTER_32. But note that having a UTF_16 STRING in itself won't eliminate all conversion costs - there is still the endian problem - this could be tackled by each individual UTF-16 STRING knowing whether it is UTF-16BE or UTF-16LE, but you may still need to convert. Comparing two such strings with different endianness would then have to be done using the codes - in what way is that going to be more efficient than using UTF-32? See [[Wish_CHARACTER_16]] for more details on why it is not ok.||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 7-bit ASCII&lt;br /&gt;
| 7-bit (US) ASCII_CHARACTER and ASCII_STRING which extends upon an ARRAY [ASCII_CHARACTER] with values of 0-127, removing the need for UTF8 conversion/checking when passing basic char values to C (gtk interfacing for example when connecting to signals) || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! MUTEX&lt;br /&gt;
| Make MUTEX recursive on non-windows platforms or at least provide a mutex and separate recursive mutex for all platforms. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Multiple Precompiled.&lt;br /&gt;
| Ability for multiple precompiles in a system. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Ability to compile/debug for both 32/64 bit systems via project settings || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Ability for for a fully optimal finalization for systems marked as 'client only', so that unused variables will not get generated in the finalized C Code. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Ability for Eiffel Studio to cross compile || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Ability to be able to control all user settable options in studio without having to resort to manually editing files, this is mainly for C compilation options || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Have a smarter C code generation system that can launch a C compilation of any module as soon as the C code is generated, this way we can also be smarter when monitoring C compilation progress || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Ability for ANY to generate a unique id for each object for referencing and hashability || ||&lt;br /&gt;
Objects that are hashable should implement HASHABLE&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| With hashable ability of ANY, change object graph traversal for serialization so that multiple threads can serialize at the same time without having to wait linearly (lock_marking/unlock_marking). This may also require a reworking of the mismatch corrector facility as this does not appear to be thread-safe when magically called by the run-time|| || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Ability for Studio to work and compile with Cygwin || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Ability to get a list of file dependencies in the form of a file listing to stdout. This list would contain a) all .e files used in the system, b) all .lib/.so files explicitly listed in the ECF/Ace file and c) all .h files referenced in external features (ideally that have not been subjected to dead code removal). Preferably, this feature should be able to be used without performing a full compilation (level 4?). || || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== .NET ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID !! Short Summary !! Pros !! Cons !! More info&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Consume .NET generics. Not being able to use them is becoming harder.&amp;lt;br/&amp;gt;We cannot write Atlas (AJAX) based web applications because of it. The Visual Studio SDK, used by EiffelEnvision, is increasing it's use of generics and preventing use from supporting some features. The people who want to use the .NET framework classes instead of the Eiffel ones cannot use generics and have to resort to using the non-generic versions of list, which bulks implementation and leads ambiguity. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Emit .NET generics types for Eiffel generic classes. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Allow direct access to member of TYPED_POINTER [xxx] item out/ref routine arguments. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Allow direct setting of TYPED_POINTER [xxx] item for out/ref routine arguments. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Optimized ''call.do_nothing'' as a IL pop instruction to removed returned value. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Custom attributes on routine arguments and Result. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| An ability to call a parent .NET constructor from an Eiffel creation routine. || || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IDE ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID !! Short Summary !! Pros !! Cons !! More info&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Halt repainting for the GUI library while the GUI is assembled or changed. &lt;br /&gt;
|| || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Give the user control over which classes will be compiled over the GUI (say: click on grey class and it becomes yellow and will be compiled always from now on, even though it may not be used at all. This is good for development of classes which are not added over GUI in ES.) || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| While searching for word or after a double click on a word, it would be nice if all words would be highlighted in pastel color style. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Allow arguments and locals of a routine to be pickable so that they can be renamed via the refactoring tool. || || || In the case of arguments it might be interesting to allow&lt;br /&gt;
renaming in ancestor and descendant versions of the feature.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| It's a pain to pick`n`drop huge features source code into the context window for setting break point. What about the following: Pick on the right side of the class text picks the feature as well? (Pick on the left side of the class text picks already the feature call). || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Make editor and grid more theme compliant in terms of color and font || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Remove all use of EV_TREE and EV_MULTI_COLUMN_LIST from studio so that all list widgets are drawn by vision2, this will make porting easier, we can also use the grid items to be able to change names of clusters, classes and features inline via the tree items. || || To which other platform would it make porting easier? For the Mac OS port that's completely unnecessary I think. Also it would make the tree view look uglier (not as other tree views etc on the same platform) and inline editing can be made accessible in other ways (at least in OS X that's quite easy) ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Extended Static Checking&lt;br /&gt;
| Extended static checking integrated into the IDE. || Provides more immediate feedback on potential contract violations. || ||See, for example, [http://secure.ucd.ie/products/opensource/ESCJava2/ ESC/Java2] and the associated Eclipse plugin, or Spec# integration into VisualStudio [http://download.microsoft.com/download/9/4/1/94138e2a-d9dc-435a-9240-bcd985bf5bd7/MikeBarnett-SpecSharp.wmv]. Eiffel has most of the necessary language constructs already and doesn't require annotations. See also [http://fm06.mcmaster.ca/es-verify.pdf ES-Verify]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Rearrange widgets of ''search tool'' so that they use free space on the right. Currently it uses too much vertical space. || || I don't see free space on the right. Has this already been done? ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Add an option to show the target name before the current edited class in the application title bar. When multiple projects are open, it's not possible to identify an EStudio session based on the title that appears on the tray bar|| || |||&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
!Step-by-step debugging&lt;br /&gt;
| It would be useful in step-by-step debugging to be able to follow the execution cursor when checking the invariants as it is done for the preconditions and postconditions of a routine.  This way, it would be easy to step into the right features and skip some (or all) of those present in the invariant. || || |||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Integrated Designer&lt;br /&gt;
| It would be nice to have an integrated visual designer so that building business applications where visual design is very import can be created more easily. || || || &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Drag-n-Drop&lt;br /&gt;
| Allow the alternative of using drag and drop everywhere instead of pick and drop. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Code annotation tags support&lt;br /&gt;
| Log the tags contained in comments.  For example, when using Eclipse, it is useful to leave TODO comments behind to ensure that a part that is not implemented will be eventually.  When the time comes to clean up the TODO tags, a tool can list them all along with the descriptions and the locations of the comments.  || || || Similar approach can be applied to indexing/note tags.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Token locations in flat-view&lt;br /&gt;
| When debugging, I always look at flat view of a feature, then I found something that I want to change, so I have to go back to basic view. Buf often, I need to search the basic view to relocate the code. It would be nice if I can somehow pick a location in flat view and drop it into the right location in basic view. &lt;br /&gt;
|| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! External commands in context menu&lt;br /&gt;
| Suppose there is an external command &amp;quot;tortoisediff $file_name&amp;quot; to show diff of a file from its working base, then when a context menu for a class is displayed, this command will be in it, and before launch this command, the  $file_name placeholder will be replaced by the actual file name. Also, some special placeholders starting with # will be recognized. They represent open arguments. So before launching the command, a dialog will prompt out asking for those values. &lt;br /&gt;
|Easy to use, no need to go to Console tool anymore. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Outline&lt;br /&gt;
| When a mouse pointer is over a class name, a feature name, etc., it would be nice to see in a pop-up tooltip some basic information about it like description, header comment, signature, etc. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Current value of a variable&lt;br /&gt;
| When a mouse pointer is over a variable in debug mode if would be nice to see in a pop-up tooltip its value. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Immediate syntax checks&lt;br /&gt;
| It would be nice if editor can detect syntax errors and warnings and highlight them inline as well as outline (using a vertical bar, an icon of a particular color, etc.). || || || Syntax warnings include obsolete language constructs as well as unused code (such as unused local variables). For them it should be possible to suggest a replacement, so that manual editing is not required.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Refactoring: unused inheritance&lt;br /&gt;
| A new tool can be introduced to check if a given inheritance path is actually used in a project and if not, would suggest to remove it. || || || It would be great to be able to run such tools in background, so that the checks are invisible to the user that only gets a warning and a suggestion to remove the unused parent clause. This way some other similar tools can be added.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Refactoring: unused arguments&lt;br /&gt;
| A new tool can be introduced to check if all arguments of a feature are used (including all versions of the feature) and would suggest to remove those that are never used. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Refactoring: more interactive renaming&lt;br /&gt;
| Renaming tool can be changed to prompt for renaming in comments and strings (one by one) rather than to apply renaming for all of them silently. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Improve search tool&lt;br /&gt;
| Progress of search operation could be shown when performing search on a project and would ensure that the IDE remains responsible at that time. It should be also possible for a user to break the search operation. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Automatic source format&lt;br /&gt;
| There could be an option to tell the editor to reformat the code according to user preference settings.  Those can address the multi-line expression format and the exceptions to the comb format (like for a class' name), for example.  The reformat feature can be made to affect only the display so that different project members can view the source as it pleases them in an uniform way. || || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Language ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID !! Short Summary !! Pros !! Cons !! More info&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Allow to use '''?''' in assigner declaration For instance &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?) is&lt;br /&gt;
     do&lt;br /&gt;
         Result := values.item (&amp;quot;foo&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
 &lt;br /&gt;
 values: HASH_TABLE [STRING, STRING]&lt;br /&gt;
 &lt;br /&gt;
 set_key_value (k: STRING; v: STRING) is&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v,k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Convenient Number Syntax&lt;br /&gt;
|| Adalike syntax for numbers, e.g. 2#101010 = 10#42 = 2#10_10_10 and 100_000_000 = 100000000. || effectively reduces silly bugs when reading and writing numbers || Eiffel allows underscores within numbers to allow digit grouping e.g. 8_961_226||see annotated ada reference manual   ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Exceptions mentioned in method interface&lt;br /&gt;
|| syntax for telling developers about exceptions thrown by a method. e.g.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
foo( a : B) : C is&lt;br /&gt;
     require&lt;br /&gt;
         a /= Void&lt;br /&gt;
     exceptions&lt;br /&gt;
         Net_Unreachable, Net_Timeout&lt;br /&gt;
     do&lt;br /&gt;
         Result := values.item (&amp;quot;foo&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|| Clear and elegant syntax, no more looking into the implementation to find out which exceptions might occur and which of them might be handled at which level.&lt;br /&gt;
|| 1) new keyword. 2) new compiler option necessary (using this interface extension is fully useful only if enforced by the compiler which would break older code). 3) Does not scale well with sub classing and redefining features.  Redefined versions may have fewer exceptions, in which some stated exceptions won't occur anymore, or more exceptions, where the feature would no longer conform to the signature and a hack would need to be made or redefining the base class in which case you have a fragile base class problem.  The Eiffel way of handling exceptions with the paradigm &amp;quot;a feature either satisfies its contract or an exception is thrown&amp;quot; is really an elegant way of handling the unknown, although it takes some getting used to when coming from Java.  ECMA exceptions as objects and the type multibranch instructions will help with non-trivial exception handling.&lt;br /&gt;
|| &lt;br /&gt;
Could this be included only on generated views. Not in typed in code, as this can cause a maintinance problem having to propogate changes.&lt;br /&gt;
||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID !! Short Summary !! Pros !! Cons !! More info&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Make every effective EiffelBase class implement default_create so that it can be used to instantiate any class with default values. || || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Provide a WEAK_REFERENCE [G] class to abstract away the implementation details currently provided by IDENTIFIED for implementing weak references. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Locale support to determine what the default charset is (or whether it is UTF-8 or not) || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Build an object storing database with built-in record locking so that multiple systems can have access to the same 'objects' || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Make base.ecf rely on smaller ecf's (kernel.ecf, structures.ecf, support.ecf) so that these smaller dependancies can be compiled in only if needs be.  It would be good if ANY could be optimized so that it doesn't have any references to io (or print) or mismatch information (only needed when storable is employed) as these bring in a lot of overhead when compiling a simple system.  The smaller ecf could also link in with the object files of the runtime to avoid linking against a monolithic runtime (cecil, storable, etc) when you only want to print (&amp;quot;Hello World&amp;quot;) || ||&lt;br /&gt;
* Unused features are already eliminated in the dead code removal step when finalizing a system.&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! XXX&lt;br /&gt;
| Put more of the run-time code in to inline C code reducing the size of the executable if you are not using certain features, ideally the linked against runtime should only contain the core functionality needed to create objects, perform simple operations and garbage collect, any other features can be brought in on a class/library/configuration level. || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Additional Classes&lt;br /&gt;
| It would be nice to have classes in the basic eiffel libraries for handling serial port communication, zip compression, encryption, smtp, pop3, ftp, http, TCP/IP, usb, pdf generation, print engine for report writing.  I am sure their are others but the basic idea is that it would be nice to have a complete multi-OS tool for developing business applications with quick access to classes needed.  Presently you have to search the internet to find some of these classes.  It would be nicer to have a more complete library available from within the IDE. || || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Single-level_call_rule_and_generics&amp;diff=9018</id>
		<title>Talk:Single-level call rule and generics</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Single-level_call_rule_and_generics&amp;diff=9018"/>
				<updated>2007-07-15T12:02:50Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Look very close to my suggestion, only that I had suggested to reuse the keyword 'invariant' instead of introducing a new keyword 'monomorphic', that not average developer will understand --[[User:Schoelle|Schoelle]] 14:02, 15 July 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Interval_types&amp;diff=8996</id>
		<title>Talk:Interval types</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Interval_types&amp;diff=8996"/>
				<updated>2007-07-11T20:22:29Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''--[[User:Schoelle|Schoelle]] 12:33, 8 July 2007 (CEST)''': Could somebody illustrate how this solves the problem of convariant argument redefinition using 'like Current' or similar? &lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 18:14, 8 July 2007 (CEST)''': This case is just a typical case of implicit covariance. The rules are the same and therefore any feature involving `like Current' in its arguments will most likely be rejected in some cases unless the target is monomorphic. Dont' forget that it is mostly the case with `is_equal' and `copy' which are getting new signatures in the new ECMA standard. For COMPARABLE then it just mean that you won't be able to compare apple with oranges which is exactly what we are trying to avoid.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Schoelle|Schoelle]] 15:30, 10 July 2007 (CEST)''' Thanks for the answer, this was enlighting. Second question: can anybody give examples from the practice that are different from A..A and A..NONE ? Something like A..B that really is needed and makes sense?&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Seilerm|Seilerm]] 20:33, 10 July 2007 (CEST)''': I think this comes down to the very question where covariance on ordinary types is needed. If you want I can give a lot of examples for generics, probably because it is the main source where I personally use covariance. Besides that: I have seen code where one uses anchored types (i.e. the like keyword) to anchor argument types to the type of queries (mostly attributes). And then the query result type is redefined covariantly. This might be interesting if otherwise you would need a lot of generic parameters, but you only redefine a few times different query (attribute) types in your class hierarchy. That being said, I personally don't like this style of coding.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Schoelle|Schoelle]] 12:13, 11 July 2007 (CEST)''' Ok, lets me see if I can correctly summarize, relating to my article [http://www.fams.de/text/type-safe-eiffel.html]. I am not doing this to advertise for my solution, but just because it is easier for me to understand something new by relating it to something that I have understood.&lt;br /&gt;
&lt;br /&gt;
For ''Covariant arguments and anchored types'', we are (more or less) removing covariance from the language (the conformance rules have been made so restrictive that the BOAT/SKIPPER/CAT/CAT_SKIPPER example becomes illegal), as demanded in my article.      '''(1)'''&lt;br /&gt;
&lt;br /&gt;
For ''Genericity'', we are using rules similar to Wildcard types in Java, which disallows calls to features with arguments of a generic type (X[A..A] is X&amp;lt;A&amp;gt; in Java, X[A..NONE] is X&amp;lt;? extends A&amp;gt; in Java).     '''(2)'''&lt;br /&gt;
&lt;br /&gt;
I think that the approach of invariant arguments described in my paper is more elegant (I am probably just locked into own ideas), as the decision of using a generic parameter covariantly is made by the supplier and not the client, i.e. it becomes part of the library design. But if Java people can live with Wildcard types, so can we ... ;-)        '''(3)'''&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Juliant|Juliant]] 19:01, 11 July 2007 (CEST)''' &lt;br /&gt;
:for '''(1)''': Actually it's not the conformance rules that have been restricted, but the feature call rules. Per default you still have full conformance between normal types, but you mostly cannot call covariant features. In the end it is the same, restricting covariance as much as you probably won't use it anymore.&lt;br /&gt;
:for '''(2)''': Yes, they are very similar.&lt;br /&gt;
:for '''(3)''': The problem with the [[definition-site variance#Conclusion|invariant arguments]] you described is that they break the library for sure. Since one of the criterias for a catcall solution is backwards compatibility, this is not an option. If you would be starting from scratch, it may be a good option as the use of a generic is dictated by the library designer and it could be easier to use by the programmer.&lt;br /&gt;
&lt;br /&gt;
::'''--[[User:Schoelle|Schoelle]] 22:22, 11 July 2007 (CEST)''' This needs to be seen. Both approaches break existing code. I do not know which one breaks more. I think that invariant arguments are easier to fix, as they are fixed on the supplier side, and not on the client side.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Interval_types&amp;diff=8987</id>
		<title>Talk:Interval types</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Interval_types&amp;diff=8987"/>
				<updated>2007-07-11T10:13:57Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''--[[User:Schoelle|Schoelle]] 12:33, 8 July 2007 (CEST)''': Could somebody illustrate how this solves the problem of convariant argument redefinition using 'like Current' or similar? &lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 18:14, 8 July 2007 (CEST)''': This case is just a typical case of implicit covariance. The rules are the same and therefore any feature involving `like Current' in its arguments will most likely be rejected in some cases unless the target is monomorphic. Dont' forget that it is mostly the case with `is_equal' and `copy' which are getting new signatures in the new ECMA standard. For COMPARABLE then it just mean that you won't be able to compare apple with oranges which is exactly what we are trying to avoid.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Schoelle|Schoelle]] 15:30, 10 July 2007 (CEST)''' Thanks for the answer, this was enlighting. Second question: can anybody give examples from the practice that are different from A..A and A..NONE ? Something like A..B that really is needed and makes sense?&lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Seilerm|Seilerm]] 20:33, 10 July 2007 (CEST)''': I think this comes down to the very question where covariance on ordinary types is needed. If you want I can give a lot of examples for generics, probably because it is the main source where I personally use covariance. Besides that: I have seen code where one uses anchored types (i.e. the like keyword) to anchor argument types to the type of queries (mostly attributes). And then the query result type is redefined covariantly. This might be interesting if otherwise you would need a lot of generic parameters, but you only redefine a few times different query (attribute) types in your class hierarchy. That being said, I personally don't like this style of coding.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Schoelle|Schoelle]] 12:13, 11 July 2007 (CEST)''' Ok, lets me see if I can correctly summarize, relating to my article [http://www.fams.de/text/type-safe-eiffel.html]. I am not doing this to advertise for my solution, but just because it is easier for me to understand something new by relating it to something that I have understood.&lt;br /&gt;
&lt;br /&gt;
For ''Covariant arguments and anchored types'', we are (more or less) removing covariance from the language (the conformance rules have been made so restrictive that the BOAT/SKIPPER/CAT/CAT_SKIPPER example becomes illegal), as demanded in my article. &lt;br /&gt;
&lt;br /&gt;
For ''Genericity'', we are using rules similar to Wildcard types in Java, which disallows calls to features with arguments of a generic type (X[A..A] is X&amp;lt;A&amp;gt; in Java, X[A..NONE] is X&amp;lt;? extends A&amp;gt; in Java). &lt;br /&gt;
&lt;br /&gt;
I think that the approach of invariant arguments described in my paper is more elegant (I am probably just locked into own ideas), as the decision of using a generic parameter covariantly is made by the supplier and not the client, i.e. it becomes part of the library design. But if Java people can live with Wildcard types, so can we ... ;-)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Interval_types&amp;diff=8979</id>
		<title>Talk:Interval types</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Interval_types&amp;diff=8979"/>
				<updated>2007-07-10T13:30:43Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''--[[User:Schoelle|Schoelle]] 12:33, 8 July 2007 (CEST)''': Could somebody illustrate how this solves the problem of convariant argument redefinition using 'like Current' or similar? &lt;br /&gt;
&lt;br /&gt;
:'''--[[User:Manus|manus]] 18:14, 8 July 2007 (CEST)''': This case is just a typical case of implicit covariance. The rules are the same and therefore any feature involving `like Current' in its arguments will most likely be rejected in some cases unless the target is monomorphic. Dont' forget that it is mostly the case with `is_equal' and `copy' which are getting new signatures in the new ECMA standard. For COMPARABLE then it just mean that you won't be able to compare apple with oranges which is exactly what we are trying to avoid.&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Schoelle|Schoelle]] 15:30, 10 July 2007 (CEST)''' Thanks for the answer, this was enlighting. Second question: can anybody give examples from the practice that are different from A..A and A..NONE ? Something like A..B that really is needed an makes sense?&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Interval_types&amp;diff=8967</id>
		<title>Talk:Interval types</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Interval_types&amp;diff=8967"/>
				<updated>2007-07-08T10:33:28Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Could somebody illustrate how this solves the problem of convariant argument redefinition using 'like Current' or similar? --[[User:Schoelle|Schoelle]] 12:33, 8 July 2007 (CEST)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:How_to_add_a_tool_to_Eiffel_Studio&amp;diff=7702</id>
		<title>Talk:How to add a tool to Eiffel Studio</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:How_to_add_a_tool_to_Eiffel_Studio&amp;diff=7702"/>
				<updated>2007-03-23T07:07:36Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Looking forward to some content --[[User:Schoelle|Schoelle]] 08:07, 23 March 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Debugging_Eiffel_Applications_with_gdb&amp;diff=7686</id>
		<title>Talk:Debugging Eiffel Applications with gdb</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Debugging_Eiffel_Applications_with_gdb&amp;diff=7686"/>
				<updated>2007-03-22T10:32:30Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thanks, nice to have - but think you text got a little bit mixed up at the end. --[[User:Schoelle|Schoelle]] 11:32, 22 March 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7654</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7654"/>
				<updated>2007-03-18T10:13:49Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: No construction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call? The error comes from strengthening the precondition of eat through the type system. The precondition in ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition in COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also do to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have renamed 'eat' to 'animal_eat', to create space for a different feature 'eat' that is adequate for cows. We implement 'animal_eat' in terms of 'eat' if the supplied food is the right one. Otherwise, we have the conditions of a CAT call and raise an exception.&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;br /&gt;
&lt;br /&gt;
Also, we '''do not address the problems of CAT calls through genericity and change of export status'''. These problems need a different treatment (for example though the restriction of the interface though readonly types).&lt;br /&gt;
&lt;br /&gt;
Interestingly, the approach can be used to model any change of signature, including covariant, contravariant arguments, covariant and contravariant return types and even the change of existing or the introduction of new arguments. It is thus more powerful than the covariant mechansims available in Eiffel.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7632</id>
		<title>Talk:Compile EiffelStudio with Automatic Build Scripts</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7632"/>
				<updated>2007-03-15T08:48:23Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''--[[User:Manus|manus]] 05:43, 11 March 2007 (CET)''' Three things:&lt;br /&gt;
# On Windows, you should let follow the instructions at [[Installing Microsoft C compiler]]&lt;br /&gt;
# Is the bash version relevant?&lt;br /&gt;
# I always recommend installing cygwin using DOS/Windows style file otherwise you end up with text file that contains a mixture of DOS and Unix newline. So why do you need UNIX end of file?&lt;br /&gt;
&lt;br /&gt;
: I have carified the documentation concerning the BASH issues. We have indeed experienced problems with the current version of BASH. AFAIK, it is a known issues, but I just could not google the source. I hope that is ok like that. Also I have added a reference to [[Installing Microsoft C compiler]]. --[[User:Schoelle|Schoelle]] 09:48, 15 March 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7631</id>
		<title>Compile EiffelStudio with Automatic Build Scripts</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7631"/>
				<updated>2007-03-15T08:33:34Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Prerequisites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:EiffelStudio]]&lt;br /&gt;
&lt;br /&gt;
'''WARNING!'''&lt;br /&gt;
&lt;br /&gt;
'''THIS DOCUMENT IS UNDER HEAVY DEVELOPMENT AND CORRESPONDS ONLY TO THE ES-MAKE BRANCH'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Linux-x86=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory /home/user/eiffel. That means the binary EiffelStudio&lt;br /&gt;
would be installed at /home/user/eiffel/Eiffel60 and the trunk at /home/user/eiffel/trunk. This&lt;br /&gt;
documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the&lt;br /&gt;
precompiled EiffelStudio installation) on your machine. The current source tree requires at least&lt;br /&gt;
version 6.0 of EiffelStudio. You can download the precompiled version from&lt;br /&gt;
http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install&lt;br /&gt;
EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need subversion installed.&lt;br /&gt;
&lt;br /&gt;
Also be sure to have the the gtk2.0 development library (for Ubuntu it would be the package&lt;br /&gt;
libgtk2.0-dev) and the xtst development library (ubuntu: libxtst-dev) installed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (/home/user/eiffel). Now&lt;br /&gt;
check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/user/eiffel&lt;br /&gt;
svn co https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should&lt;br /&gt;
already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, GOBO. As well the binary paths&lt;br /&gt;
for gobo and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
There are two different ways for doing this: either set it temporary for this session (don't restart the&lt;br /&gt;
terminal) or set it permanently in your .bashrc&lt;br /&gt;
&lt;br /&gt;
* Temporary&lt;br /&gt;
'''(don't restart the terminal during the compilation, all variables will be lost!)'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export EIFFEL_SRC=/home/user/eiffel/trunk/Src&lt;br /&gt;
export ISE_EIFFEL=/home/user/eiffel/Eiffel60&lt;br /&gt;
export ISE_PLATFORM=linux-x86&lt;br /&gt;
export ISE_LIBRARY=${EIFFEL_SRC}&lt;br /&gt;
export GOBO=${EIFFEL_SRC}/library/gobo/svn&lt;br /&gt;
export PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Permanent&lt;br /&gt;
edit your /home/user/.bashrc and add these lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EIFFEL_SRC=&amp;quot;/home/user/eiffel/trunk/Src&amp;quot;&lt;br /&gt;
ISE_EIFFEL=&amp;quot;/home/user/eiffel/Eiffel60&amp;quot;&lt;br /&gt;
ISE_PLATFORM=&amp;quot;linux-x86&amp;quot;&lt;br /&gt;
ISE_LIBRARY=&amp;quot;${EIFFEL_SRC}&amp;quot;&lt;br /&gt;
GOBO=&amp;quot;/home/user/eiffel/trunk/Src/library/gobo/svn&lt;br /&gt;
PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
export ISE_EIFFEL ISE_PLATFORM EIFFEL_SRC ISE_LIBRARY PATH GOBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''IMPORTANT: You need to restart the terminal for the changes to take effect'''&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. &lt;br /&gt;
For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $GOBO/work/bootstrap&lt;br /&gt;
sh bootstrap.sh gcc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to trunk/Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says „Setup check complete. Your configuration seems ok!“ Now you can start compiling.Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Windows=&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory C:\Programme\EiffelSoftware\. That means the binary EiffelStudio would be installed at C:\Programme\EiffelSoftware\Eiffel60 and the trunk at C:\Programme\EiffelSoftware\trunk. Cygwin is located in C:\cygwin. This documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
At first you need a C compiler on your system. We recommend to install Microsoft Visual Studio .NET as it has all included and is easy to install. Instead you can install the Microsoft SDK from http://download.microsoft.com/download/a/7/7/a7767f09-0136-4a96-a1f8-276bf0ee31fa/Setup.exe . Please also see the documentation that is available under [[Installing Microsoft C compiler]].&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the precompiled EiffelStudio installation) on your machine. The current source tree requires at least version 6.0 of EiffelStudio. You can download the precompiled version from http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need a subversion client installed (for example TortoiseSVN).&lt;br /&gt;
&lt;br /&gt;
As the compilation needs a working bash on the system you need to install cygwin. It is important that you choose Unix/binary as Default Text File Type during the installation and select a bash version 3.1-6 (in the package selection screen --&amp;gt; Shells /bash, click on version number to change). The latest version of Bash (while writing this documentation) had some troubles with Windows newlines. Future versions should be fine, too, but if you have trouble running the scripts, this might be the first thing to check.&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code ==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (C:\Programme\EiffelSoftware\). Now check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
right-click in the folder, choose SVN Checkout&lt;br /&gt;
URL of repository: https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make&lt;br /&gt;
Checkout directory: C:\Programme\EiffelSoftware\trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
possibly you need to kill TSVNcache.exe ... memory leak&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables ==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, ISE_C_COMPILER, GOBO. As well the binary-paths for gobo, cygwin and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
Goto Systemsteuerung, open the 'System' Dialogue, in 'erweitert' you can click on 'Umgebungsvariabeln' In the upper Box enter each of the new environmental variables by clicking new:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		name					value&lt;br /&gt;
&lt;br /&gt;
	EIFFEL_SRC				C:\Programme\EiffelSoftware\trunk\Src&lt;br /&gt;
	ISE_EIFFEL				C:\Programme\EiffelSoftware\Eiffel60&lt;br /&gt;
	ISE_PLATFORM				windows&lt;br /&gt;
	ISE_LIBRARY				%EIFFEL_SRC%&lt;br /&gt;
	ISE_C_COMPILER				msc&lt;br /&gt;
	GOBO					C:\Programme\EiffelSoftware\trunk\Src\library\gobo\svn&lt;br /&gt;
	Path					%Path%;%ISE_EIFFEL%\studio\spec\%ISE_PLATFORM%\bin;%GOBO%\bin;C:\cygwin\bin;&lt;br /&gt;
						C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
You should really use the Command Prompt included in Microsoft Visual Studio .NET. The regular Windows Command Prompt should work as well but you had to set all the binary paths for Visual Studio.&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %GOBO%\work\bootstrap&lt;br /&gt;
bootstrap.bat msc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to C:\Programme\EiffelSoftware\trunk\Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says &amp;quot;Setup check complete. Your configuration seems ok!&amp;quot; Now you can start compiling. Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7630</id>
		<title>Compile EiffelStudio with Automatic Build Scripts</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7630"/>
				<updated>2007-03-15T08:32:29Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Prerequisites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:EiffelStudio]]&lt;br /&gt;
&lt;br /&gt;
'''WARNING!'''&lt;br /&gt;
&lt;br /&gt;
'''THIS DOCUMENT IS UNDER HEAVY DEVELOPMENT AND CORRESPONDS ONLY TO THE ES-MAKE BRANCH'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Linux-x86=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory /home/user/eiffel. That means the binary EiffelStudio&lt;br /&gt;
would be installed at /home/user/eiffel/Eiffel60 and the trunk at /home/user/eiffel/trunk. This&lt;br /&gt;
documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the&lt;br /&gt;
precompiled EiffelStudio installation) on your machine. The current source tree requires at least&lt;br /&gt;
version 6.0 of EiffelStudio. You can download the precompiled version from&lt;br /&gt;
http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install&lt;br /&gt;
EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need subversion installed.&lt;br /&gt;
&lt;br /&gt;
Also be sure to have the the gtk2.0 development library (for Ubuntu it would be the package&lt;br /&gt;
libgtk2.0-dev) and the xtst development library (ubuntu: libxtst-dev) installed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (/home/user/eiffel). Now&lt;br /&gt;
check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/user/eiffel&lt;br /&gt;
svn co https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should&lt;br /&gt;
already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, GOBO. As well the binary paths&lt;br /&gt;
for gobo and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
There are two different ways for doing this: either set it temporary for this session (don't restart the&lt;br /&gt;
terminal) or set it permanently in your .bashrc&lt;br /&gt;
&lt;br /&gt;
* Temporary&lt;br /&gt;
'''(don't restart the terminal during the compilation, all variables will be lost!)'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export EIFFEL_SRC=/home/user/eiffel/trunk/Src&lt;br /&gt;
export ISE_EIFFEL=/home/user/eiffel/Eiffel60&lt;br /&gt;
export ISE_PLATFORM=linux-x86&lt;br /&gt;
export ISE_LIBRARY=${EIFFEL_SRC}&lt;br /&gt;
export GOBO=${EIFFEL_SRC}/library/gobo/svn&lt;br /&gt;
export PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Permanent&lt;br /&gt;
edit your /home/user/.bashrc and add these lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EIFFEL_SRC=&amp;quot;/home/user/eiffel/trunk/Src&amp;quot;&lt;br /&gt;
ISE_EIFFEL=&amp;quot;/home/user/eiffel/Eiffel60&amp;quot;&lt;br /&gt;
ISE_PLATFORM=&amp;quot;linux-x86&amp;quot;&lt;br /&gt;
ISE_LIBRARY=&amp;quot;${EIFFEL_SRC}&amp;quot;&lt;br /&gt;
GOBO=&amp;quot;/home/user/eiffel/trunk/Src/library/gobo/svn&lt;br /&gt;
PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
export ISE_EIFFEL ISE_PLATFORM EIFFEL_SRC ISE_LIBRARY PATH GOBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''IMPORTANT: You need to restart the terminal for the changes to take effect'''&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. &lt;br /&gt;
For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $GOBO/work/bootstrap&lt;br /&gt;
sh bootstrap.sh gcc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to trunk/Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says „Setup check complete. Your configuration seems ok!“ Now you can start compiling.Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Windows=&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory C:\Programme\EiffelSoftware\. That means the binary EiffelStudio would be installed at C:\Programme\EiffelSoftware\Eiffel60 and the trunk at C:\Programme\EiffelSoftware\trunk. Cygwin is located in C:\cygwin. This documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
At first you need a C compiler on your system. We recommend to install Microsoft Visual Studio .NET as it has all included and is easy to install. Instead you can install the Microsoft SDK from http://download.microsoft.com/download/a/7/7/a7767f09-0136-4a96-a1f8-276bf0ee31fa/Setup.exe . Please also see the documentation that is available under [[Installing Microsoft C compiler]].&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the precompiled EiffelStudio installation) on your machine. The current source tree requires at least version 6.0 of EiffelStudio. You can download the precompiled version from http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need a subversion client installed (for example TortoiseSVN).&lt;br /&gt;
&lt;br /&gt;
As the compilation needs a working bash on the system you need to install cygwin. It is important that you choose Unix/binary as Default Text File Type during the installation and select a bash version 3.1-6 (in the package selection screen --&amp;gt; Shells /bash, click on version number to change). The latest version while writing had some troubles with Windows newlines. Future versions should be fine, too, but if you have trouble running the scripts, this might be the first thing to check.&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code ==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (C:\Programme\EiffelSoftware\). Now check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
right-click in the folder, choose SVN Checkout&lt;br /&gt;
URL of repository: https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make&lt;br /&gt;
Checkout directory: C:\Programme\EiffelSoftware\trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
possibly you need to kill TSVNcache.exe ... memory leak&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables ==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, ISE_C_COMPILER, GOBO. As well the binary-paths for gobo, cygwin and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
Goto Systemsteuerung, open the 'System' Dialogue, in 'erweitert' you can click on 'Umgebungsvariabeln' In the upper Box enter each of the new environmental variables by clicking new:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		name					value&lt;br /&gt;
&lt;br /&gt;
	EIFFEL_SRC				C:\Programme\EiffelSoftware\trunk\Src&lt;br /&gt;
	ISE_EIFFEL				C:\Programme\EiffelSoftware\Eiffel60&lt;br /&gt;
	ISE_PLATFORM				windows&lt;br /&gt;
	ISE_LIBRARY				%EIFFEL_SRC%&lt;br /&gt;
	ISE_C_COMPILER				msc&lt;br /&gt;
	GOBO					C:\Programme\EiffelSoftware\trunk\Src\library\gobo\svn&lt;br /&gt;
	Path					%Path%;%ISE_EIFFEL%\studio\spec\%ISE_PLATFORM%\bin;%GOBO%\bin;C:\cygwin\bin;&lt;br /&gt;
						C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
You should really use the Command Prompt included in Microsoft Visual Studio .NET. The regular Windows Command Prompt should work as well but you had to set all the binary paths for Visual Studio.&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %GOBO%\work\bootstrap&lt;br /&gt;
bootstrap.bat msc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to C:\Programme\EiffelSoftware\trunk\Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says &amp;quot;Setup check complete. Your configuration seems ok!&amp;quot; Now you can start compiling. Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7629</id>
		<title>Compile EiffelStudio with Automatic Build Scripts</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7629"/>
				<updated>2007-03-15T08:29:18Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Prerequisites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:EiffelStudio]]&lt;br /&gt;
&lt;br /&gt;
'''WARNING!'''&lt;br /&gt;
&lt;br /&gt;
'''THIS DOCUMENT IS UNDER HEAVY DEVELOPMENT AND CORRESPONDS ONLY TO THE ES-MAKE BRANCH'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Linux-x86=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory /home/user/eiffel. That means the binary EiffelStudio&lt;br /&gt;
would be installed at /home/user/eiffel/Eiffel60 and the trunk at /home/user/eiffel/trunk. This&lt;br /&gt;
documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the&lt;br /&gt;
precompiled EiffelStudio installation) on your machine. The current source tree requires at least&lt;br /&gt;
version 6.0 of EiffelStudio. You can download the precompiled version from&lt;br /&gt;
http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install&lt;br /&gt;
EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need subversion installed.&lt;br /&gt;
&lt;br /&gt;
Also be sure to have the the gtk2.0 development library (for Ubuntu it would be the package&lt;br /&gt;
libgtk2.0-dev) and the xtst development library (ubuntu: libxtst-dev) installed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (/home/user/eiffel). Now&lt;br /&gt;
check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/user/eiffel&lt;br /&gt;
svn co https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should&lt;br /&gt;
already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, GOBO. As well the binary paths&lt;br /&gt;
for gobo and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
There are two different ways for doing this: either set it temporary for this session (don't restart the&lt;br /&gt;
terminal) or set it permanently in your .bashrc&lt;br /&gt;
&lt;br /&gt;
* Temporary&lt;br /&gt;
'''(don't restart the terminal during the compilation, all variables will be lost!)'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export EIFFEL_SRC=/home/user/eiffel/trunk/Src&lt;br /&gt;
export ISE_EIFFEL=/home/user/eiffel/Eiffel60&lt;br /&gt;
export ISE_PLATFORM=linux-x86&lt;br /&gt;
export ISE_LIBRARY=${EIFFEL_SRC}&lt;br /&gt;
export GOBO=${EIFFEL_SRC}/library/gobo/svn&lt;br /&gt;
export PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Permanent&lt;br /&gt;
edit your /home/user/.bashrc and add these lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EIFFEL_SRC=&amp;quot;/home/user/eiffel/trunk/Src&amp;quot;&lt;br /&gt;
ISE_EIFFEL=&amp;quot;/home/user/eiffel/Eiffel60&amp;quot;&lt;br /&gt;
ISE_PLATFORM=&amp;quot;linux-x86&amp;quot;&lt;br /&gt;
ISE_LIBRARY=&amp;quot;${EIFFEL_SRC}&amp;quot;&lt;br /&gt;
GOBO=&amp;quot;/home/user/eiffel/trunk/Src/library/gobo/svn&lt;br /&gt;
PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
export ISE_EIFFEL ISE_PLATFORM EIFFEL_SRC ISE_LIBRARY PATH GOBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''IMPORTANT: You need to restart the terminal for the changes to take effect'''&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. &lt;br /&gt;
For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $GOBO/work/bootstrap&lt;br /&gt;
sh bootstrap.sh gcc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to trunk/Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says „Setup check complete. Your configuration seems ok!“ Now you can start compiling.Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Windows=&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory C:\Programme\EiffelSoftware\. That means the binary EiffelStudio would be installed at C:\Programme\EiffelSoftware\Eiffel60 and the trunk at C:\Programme\EiffelSoftware\trunk. Cygwin is located in C:\cygwin. This documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
At first you need a C compiler on your system. We recommend to install Microsoft Visual Studio .NET as it has all included and is easy to install. Instead you can install the Microsoft SDK from http://download.microsoft.com/download/a/7/7/a7767f09-0136-4a96-a1f8-276bf0ee31fa/Setup.exe . Please also see the documentation that is available under [[Installing Microsoft C compiler]].&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the precompiled EiffelStudio installation) on your machine. The current source tree requires at least version 6.0 of EiffelStudio. You can download the precompiled version from http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need a subversion client installed (for example TortoiseSVN).&lt;br /&gt;
&lt;br /&gt;
As the compilation needs a working bash on the system you need to install cygwin. It is important that you choose Unix/binary as Default Text File Type during the installation and select a bash version 3.1-6 (in the package selection screen --&amp;gt; Shells /bash, click on version number to change). There should not be such a problem with other versions, but if you have trouble running the scripts, this might be the first thing to check.&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code ==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (C:\Programme\EiffelSoftware\). Now check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
right-click in the folder, choose SVN Checkout&lt;br /&gt;
URL of repository: https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make&lt;br /&gt;
Checkout directory: C:\Programme\EiffelSoftware\trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
possibly you need to kill TSVNcache.exe ... memory leak&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables ==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, ISE_C_COMPILER, GOBO. As well the binary-paths for gobo, cygwin and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
Goto Systemsteuerung, open the 'System' Dialogue, in 'erweitert' you can click on 'Umgebungsvariabeln' In the upper Box enter each of the new environmental variables by clicking new:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		name					value&lt;br /&gt;
&lt;br /&gt;
	EIFFEL_SRC				C:\Programme\EiffelSoftware\trunk\Src&lt;br /&gt;
	ISE_EIFFEL				C:\Programme\EiffelSoftware\Eiffel60&lt;br /&gt;
	ISE_PLATFORM				windows&lt;br /&gt;
	ISE_LIBRARY				%EIFFEL_SRC%&lt;br /&gt;
	ISE_C_COMPILER				msc&lt;br /&gt;
	GOBO					C:\Programme\EiffelSoftware\trunk\Src\library\gobo\svn&lt;br /&gt;
	Path					%Path%;%ISE_EIFFEL%\studio\spec\%ISE_PLATFORM%\bin;%GOBO%\bin;C:\cygwin\bin;&lt;br /&gt;
						C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
You should really use the Command Prompt included in Microsoft Visual Studio .NET. The regular Windows Command Prompt should work as well but you had to set all the binary paths for Visual Studio.&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %GOBO%\work\bootstrap&lt;br /&gt;
bootstrap.bat msc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to C:\Programme\EiffelSoftware\trunk\Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says &amp;quot;Setup check complete. Your configuration seems ok!&amp;quot; Now you can start compiling. Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7628</id>
		<title>Compile EiffelStudio with Automatic Build Scripts</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7628"/>
				<updated>2007-03-15T08:24:54Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Prerequisites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:EiffelStudio]]&lt;br /&gt;
&lt;br /&gt;
'''WARNING!'''&lt;br /&gt;
&lt;br /&gt;
'''THIS DOCUMENT IS UNDER HEAVY DEVELOPMENT AND CORRESPONDS ONLY TO THE ES-MAKE BRANCH'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Linux-x86=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory /home/user/eiffel. That means the binary EiffelStudio&lt;br /&gt;
would be installed at /home/user/eiffel/Eiffel60 and the trunk at /home/user/eiffel/trunk. This&lt;br /&gt;
documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the&lt;br /&gt;
precompiled EiffelStudio installation) on your machine. The current source tree requires at least&lt;br /&gt;
version 6.0 of EiffelStudio. You can download the precompiled version from&lt;br /&gt;
http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install&lt;br /&gt;
EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need subversion installed.&lt;br /&gt;
&lt;br /&gt;
Also be sure to have the the gtk2.0 development library (for Ubuntu it would be the package&lt;br /&gt;
libgtk2.0-dev) and the xtst development library (ubuntu: libxtst-dev) installed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (/home/user/eiffel). Now&lt;br /&gt;
check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/user/eiffel&lt;br /&gt;
svn co https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should&lt;br /&gt;
already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, GOBO. As well the binary paths&lt;br /&gt;
for gobo and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
There are two different ways for doing this: either set it temporary for this session (don't restart the&lt;br /&gt;
terminal) or set it permanently in your .bashrc&lt;br /&gt;
&lt;br /&gt;
* Temporary&lt;br /&gt;
'''(don't restart the terminal during the compilation, all variables will be lost!)'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export EIFFEL_SRC=/home/user/eiffel/trunk/Src&lt;br /&gt;
export ISE_EIFFEL=/home/user/eiffel/Eiffel60&lt;br /&gt;
export ISE_PLATFORM=linux-x86&lt;br /&gt;
export ISE_LIBRARY=${EIFFEL_SRC}&lt;br /&gt;
export GOBO=${EIFFEL_SRC}/library/gobo/svn&lt;br /&gt;
export PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Permanent&lt;br /&gt;
edit your /home/user/.bashrc and add these lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EIFFEL_SRC=&amp;quot;/home/user/eiffel/trunk/Src&amp;quot;&lt;br /&gt;
ISE_EIFFEL=&amp;quot;/home/user/eiffel/Eiffel60&amp;quot;&lt;br /&gt;
ISE_PLATFORM=&amp;quot;linux-x86&amp;quot;&lt;br /&gt;
ISE_LIBRARY=&amp;quot;${EIFFEL_SRC}&amp;quot;&lt;br /&gt;
GOBO=&amp;quot;/home/user/eiffel/trunk/Src/library/gobo/svn&lt;br /&gt;
PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
export ISE_EIFFEL ISE_PLATFORM EIFFEL_SRC ISE_LIBRARY PATH GOBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''IMPORTANT: You need to restart the terminal for the changes to take effect'''&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. &lt;br /&gt;
For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $GOBO/work/bootstrap&lt;br /&gt;
sh bootstrap.sh gcc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to trunk/Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says „Setup check complete. Your configuration seems ok!“ Now you can start compiling.Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Windows=&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory C:\Programme\EiffelSoftware\. That means the binary EiffelStudio would be installed at C:\Programme\EiffelSoftware\Eiffel60 and the trunk at C:\Programme\EiffelSoftware\trunk. Cygwin is located in C:\cygwin. This documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
At first you need a C compiler on your system. We recommend to install Microsoft Visual Studio .NET as it has all included and is easy to install. Instead you can install the Microsoft SDK from http://download.microsoft.com/download/a/7/7/a7767f09-0136-4a96-a1f8-276bf0ee31fa/Setup.exe . Please also see the documentation that is available under [[Installing Microsoft C compiler]].&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the precompiled EiffelStudio installation) on your machine. The current source tree requires at least version 6.0 of EiffelStudio. You can download the precompiled version from http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need a subversion client installed (for example TortoiseSVN).&lt;br /&gt;
&lt;br /&gt;
As the compilation needs a working bash on the system you need to install cygwin. It is important that you choose Unix/binary as Default Text File Type during the installation and select a bash version 3.1-6 (in the package selection screen --&amp;gt; Shells /bash, click on version number to change)&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code ==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (C:\Programme\EiffelSoftware\). Now check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
right-click in the folder, choose SVN Checkout&lt;br /&gt;
URL of repository: https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make&lt;br /&gt;
Checkout directory: C:\Programme\EiffelSoftware\trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
possibly you need to kill TSVNcache.exe ... memory leak&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables ==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, ISE_C_COMPILER, GOBO. As well the binary-paths for gobo, cygwin and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
Goto Systemsteuerung, open the 'System' Dialogue, in 'erweitert' you can click on 'Umgebungsvariabeln' In the upper Box enter each of the new environmental variables by clicking new:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		name					value&lt;br /&gt;
&lt;br /&gt;
	EIFFEL_SRC				C:\Programme\EiffelSoftware\trunk\Src&lt;br /&gt;
	ISE_EIFFEL				C:\Programme\EiffelSoftware\Eiffel60&lt;br /&gt;
	ISE_PLATFORM				windows&lt;br /&gt;
	ISE_LIBRARY				%EIFFEL_SRC%&lt;br /&gt;
	ISE_C_COMPILER				msc&lt;br /&gt;
	GOBO					C:\Programme\EiffelSoftware\trunk\Src\library\gobo\svn&lt;br /&gt;
	Path					%Path%;%ISE_EIFFEL%\studio\spec\%ISE_PLATFORM%\bin;%GOBO%\bin;C:\cygwin\bin;&lt;br /&gt;
						C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
You should really use the Command Prompt included in Microsoft Visual Studio .NET. The regular Windows Command Prompt should work as well but you had to set all the binary paths for Visual Studio.&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %GOBO%\work\bootstrap&lt;br /&gt;
bootstrap.bat msc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to C:\Programme\EiffelSoftware\trunk\Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says &amp;quot;Setup check complete. Your configuration seems ok!&amp;quot; Now you can start compiling. Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7623</id>
		<title>Compile EiffelStudio with Automatic Build Scripts</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Compile_EiffelStudio_with_Automatic_Build_Scripts&amp;diff=7623"/>
				<updated>2007-03-14T11:49:32Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Setting Environmental Variables */  Typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:EiffelStudio]]&lt;br /&gt;
&lt;br /&gt;
'''WARNING!'''&lt;br /&gt;
&lt;br /&gt;
'''THIS DOCUMENT IS UNDER HEAVY DEVELOPMENT AND CORRESPONDS ONLY TO THE ES-MAKE BRANCH'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Linux-x86=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory /home/user/eiffel. That means the binary EiffelStudio&lt;br /&gt;
would be installed at /home/user/eiffel/Eiffel60 and the trunk at /home/user/eiffel/trunk. This&lt;br /&gt;
documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the&lt;br /&gt;
precompiled EiffelStudio installation) on your machine. The current source tree requires at least&lt;br /&gt;
version 6.0 of EiffelStudio. You can download the precompiled version from&lt;br /&gt;
http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install&lt;br /&gt;
EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need subversion installed.&lt;br /&gt;
&lt;br /&gt;
Also be sure to have the the gtk2.0 development library (for Ubuntu it would be the package&lt;br /&gt;
libgtk2.0-dev) and the xtst development library (ubuntu: libxtst-dev) installed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (/home/user/eiffel). Now&lt;br /&gt;
check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /home/user/eiffel&lt;br /&gt;
svn co https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should&lt;br /&gt;
already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, GOBO. As well the binary paths&lt;br /&gt;
for gobo and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
There are two different ways for doing this: either set it temporary for this session (don't restart the&lt;br /&gt;
terminal) or set it permanently in your .bashrc&lt;br /&gt;
&lt;br /&gt;
* Temporary&lt;br /&gt;
'''(don't restart the terminal during the compilation, all variables will be lost!)'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export EIFFEL_SRC=/home/user/eiffel/trunk/Src&lt;br /&gt;
export ISE_EIFFEL=/home/user/eiffel/Eiffel60&lt;br /&gt;
export ISE_PLATFORM=linux-x86&lt;br /&gt;
export ISE_LIBRARY=${EIFFEL_SRC}&lt;br /&gt;
export GOBO=${EIFFEL_SRC}/library/gobo/svn&lt;br /&gt;
export PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Permanent&lt;br /&gt;
edit your /home/user/.bashrc and add these lines:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EIFFEL_SRC=&amp;quot;/home/user/eiffel/trunk/Src&amp;quot;&lt;br /&gt;
ISE_EIFFEL=&amp;quot;/home/user/eiffel/Eiffel60&amp;quot;&lt;br /&gt;
ISE_PLATFORM=&amp;quot;linux-x86&amp;quot;&lt;br /&gt;
ISE_LIBRARY=&amp;quot;${EIFFEL_SRC}&amp;quot;&lt;br /&gt;
GOBO=&amp;quot;/home/user/eiffel/trunk/Src/library/gobo/svn&lt;br /&gt;
PATH=${PATH}:${ISE_EIFFEL}/studio/spec/${ISE_PLATFORM}/bin:${EIFFEL_SRC}/library/gobo/svn/bin&lt;br /&gt;
export ISE_EIFFEL ISE_PLATFORM EIFFEL_SRC ISE_LIBRARY PATH GOBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''IMPORTANT: You need to restart the terminal for the changes to take effect'''&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. &lt;br /&gt;
For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $GOBO/work/bootstrap&lt;br /&gt;
sh bootstrap.sh gcc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to trunk/Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says „Setup check complete. Your configuration seems ok!“ Now you can start compiling.Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $EIFFEL_SRC&lt;br /&gt;
make build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Windows=&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
In this example we use the example directory C:\Programme\EiffelSoftware\. That means the binary EiffelStudio would be installed at C:\Programme\EiffelSoftware\Eiffel60 and the trunk at C:\Programme\EiffelSoftware\trunk. Cygwin is located in C:\cygwin. This documentation will have these paths as examples, so please replace them if you use different paths.&lt;br /&gt;
&lt;br /&gt;
At first you need a C compiler on your system. We recommend to install Microsoft Visual Studio .NET as it has all included and is easy to install. Instead you can install the Microsoft SDK from http://download.microsoft.com/download/a/7/7/a7767f09-0136-4a96-a1f8-276bf0ee31fa/Setup.exe&lt;br /&gt;
&lt;br /&gt;
To compile EiffelStudio, you need an already working EiffelStudio compiler (which comes with the precompiled EiffelStudio installation) on your machine. The current source tree requires at least version 6.0 of EiffelStudio. You can download the precompiled version from http://eiffelsoftware.origo.ethz.ch/downloads/builds/. Read the existing documentation to install EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
To checkout the latest source code from the repository, you need a subversion client installed (for example TortoiseSVN).&lt;br /&gt;
&lt;br /&gt;
As the compilation needs a working bash on the system you need to install cygwin. It is important that you choose Unix/binary as Default Text File Type during the installation and select a bash version 3.1-6 (in the package selection screen --&amp;gt; Shells /bash, click on version number to change)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloading Source Code ==&lt;br /&gt;
&lt;br /&gt;
Go to the directory where you want to have the EiffelStudio source code (C:\Programme\EiffelSoftware\). Now check out the sources from the repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
right-click in the folder, choose SVN Checkout&lt;br /&gt;
URL of repository: https://eiffelsoftware.origo.ethz.ch/svn/es/branches/es-make&lt;br /&gt;
Checkout directory: C:\Programme\EiffelSoftware\trunk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
possibly you need to kill TSVNcache.exe ... memory leak&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting Environmental Variables ==&lt;br /&gt;
&lt;br /&gt;
These environmental variables need to be set: ISE_EIFFEL, ISE_PLATFORM (these two should already be set from EiffelStudio installation), ISE_LIBRARY, EIFFEL_SRC, ISE_C_COMPILER, GOBO. As well the binary-paths for gobo, cygwin and EiffelStudio need to be added to the PATH variable.&lt;br /&gt;
&lt;br /&gt;
Goto Systemsteuerung, open the 'System' Dialogue, in 'erweitert' you can click on 'Umgebungsvariabeln' In the upper Box enter each of the new environmental variables by clicking new:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		name					value&lt;br /&gt;
&lt;br /&gt;
	EIFFEL_SRC				C:\Programme\EiffelSoftware\trunk\Src&lt;br /&gt;
	ISE_EIFFEL				C:\Programme\EiffelSoftware\Eiffel60&lt;br /&gt;
	ISE_PLATFORM				windows&lt;br /&gt;
	ISE_LIBRARY				%EIFFEL_SRC%&lt;br /&gt;
	ISE_C_COMPILER				msc&lt;br /&gt;
	GOBO					C:\Programme\EiffelSoftware\trunk\Src\library\gobo\svn&lt;br /&gt;
	Path					%Path%;%ISE_EIFFEL%\studio\spec\%ISE_PLATFORM%\bin;%GOBO%\bin;C:\cygwin\bin;&lt;br /&gt;
						C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling and Installing Gobo tools ==&lt;br /&gt;
&lt;br /&gt;
You should really use the Command Prompt included in Microsoft Visual Studio .NET. The regular Windows Command Prompt should work as well but you had to set all the binary paths for Visual Studio.&lt;br /&gt;
&lt;br /&gt;
The Gobo tools source code is already included in the SVN checkout of the Eiffel source. But we still need to bootstrap it. For further information about the different valid compilers please read the Readme.txt in the bootstrap directory or execute the bootstrap script without any arguments.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %GOBO%\work\bootstrap&lt;br /&gt;
bootstrap.bat msc ise&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
Now go to C:\Programme\EiffelSoftware\trunk\Src and run the check_setup script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat check_setup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all tests were successful, it says &amp;quot;Setup check complete. Your configuration seems ok!&amp;quot; Now you can start compiling. Otherwise check the error messages and fix the problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd %EIFFEL_SRC%&lt;br /&gt;
Makefile.bat build_delivery&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this will take a while)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GOOD LUCK!&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Glossary&amp;diff=7615</id>
		<title>Eiffel Glossary</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Glossary&amp;diff=7615"/>
				<updated>2007-03-13T10:40:08Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: Removed content, that was moved to eiffelroom&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: General]]&lt;br /&gt;
Eiffel uses a precisely defined terminology. That terminology sometimes sounds strange to programmers used to other languages, but it's only because (1) there has been a systematic effort to classify object-oriented concepts in a logical way; (2) some of the terms predate terminology that is used in other languages. You will see, however, that behind every choice of term there is a carefully devised rationale.&lt;br /&gt;
&lt;br /&gt;
The new, community-based Eiffel glossary has been moved and is now available at http://www.eiffelroom.org/glossary &lt;br /&gt;
&lt;br /&gt;
Also, there is a glossary of Eiffel terminology for .NET developers available at http://docs.eiffel.com/eiffelstudio/technologies/dotnet/eiffel_dotnet_language/10_conventions/10_terminology.html&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=7552</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=7552"/>
				<updated>2007-03-05T15:52:15Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Getting Started */ Added the EiffelRoom&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__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 homepage and Wiki of the EiffelStudio IDE open-source project. EiffelStudio is a full-featured, 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 Inc.] and hosted at the [http://se.inf.ethz.ch/ Chair of Software Engineering] at the [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 modern IDE that offers the following features:&lt;br /&gt;
&lt;br /&gt;
* Complete and efficient compiler for the Eiffel programming language&lt;br /&gt;
* Support for Windows, MacOS X, Linux, *BSD, Solaris and other operating systems&lt;br /&gt;
* Editor for Eiffel code&lt;br /&gt;
* Different browsing and viewing facilities&lt;br /&gt;
* Interactive debugger&lt;br /&gt;
* Graphical modelling tool for UML and BON with full roundtrip&lt;br /&gt;
* Refactoring support&lt;br /&gt;
* GUI development tool and fully portable GUI library&lt;br /&gt;
&lt;br /&gt;
The Eiffel compiler creates C code that is then handed to a standard C compiler. As a result, the programs have a performance comparable to programs directly written in C or C++. At the same time, Eiffel is an object-oriented and strongly typed language. EiffelStudio uses a highly efficient moving 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 5.7 Releases|Changelog of 5.7 (release branch)]]&lt;br /&gt;
* [http://docs.eiffel.com/eiffelstudio/installation/studio57 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;
== EiffelStudio's Development ==&lt;br /&gt;
&lt;br /&gt;
* [[EiffelStudio 6.0 Releases|Changelog of 6.x (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;
* [[Contributing|How to contribute]]&lt;br /&gt;
* [[:Category:Eweasel|Regression testing]]&lt;br /&gt;
* [[:Category:Projects|Projects]]&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.com EiffelRoom]&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>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Covariance_through_renaming&amp;diff=7519</id>
		<title>Talk:Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Covariance_through_renaming&amp;diff=7519"/>
				<updated>2007-02-22T18:54:02Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The key insight here is that it is inappropriate and unworkable to try to use the type system to model the eating habits of herbivores. Any real-world animals will have eating preferences too complex to model through the type system anyway, even if it did not cause catcalls.&lt;br /&gt;
&lt;br /&gt;
The precondition &amp;quot;likes&amp;quot; solves the problem. And once you have the problem solved this way, there is no need for the renaming and the introduction of new, unrelated 'eat' features in descendants. Just redefine &amp;quot;likes&amp;quot; for each kind of animal. [[User:Eiffel|Eiffel]] 12:38, 22 February 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
: Which does not solve the problem of covariant arguments, for example when you want to add a postcondition to 'eat' the needs to talk about the fact that grass was eaten. --[[User:Schoelle|Schoelle]] 15:08, 22 February 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
'''--[[User:Manus|manus]] 17:43, 22 February 2007 (CET)''' One of the issue of the proposal is that it is more or less what the other languages are currently using to fake covariance. So Eiffel would not be in a better position, this is why I think we should find a solution not involving the addition of new routines.&lt;br /&gt;
&lt;br /&gt;
: I really cannot understand what 'fake covariance' is. We are facing a modelling problem and that needs to be adequately solved. My suggestion tries to show that there is a certain class of problems that are normally called good examples for the need of covariance (CAT_SKIPPER, ANIMAL/COW) that can be solved purely by renaming, without any loss of precision or generality. The problem of 'implicit covariance' through generic parameters seems to be the only reason to support covariance (although this is indeed a hard problem). --[[User:Schoelle|Schoelle]] 19:54, 22 February 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Covariance_through_renaming&amp;diff=7515</id>
		<title>Talk:Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Covariance_through_renaming&amp;diff=7515"/>
				<updated>2007-02-22T14:08:21Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The key insight here is that it is inappropriate and unworkable to try to use the type system to model the eating habits of herbivores. Any real-world animals will have eating preferences too complex to model through the type system anyway, even if it did not cause catcalls.&lt;br /&gt;
&lt;br /&gt;
The precondition &amp;quot;likes&amp;quot; solves the problem. And once you have the problem solved this way, there is no need for the renaming and the introduction of new, unrelated 'eat' features in descendants. Just redefine &amp;quot;likes&amp;quot; for each kind of animal. [[User:Eiffel|Eiffel]] 12:38, 22 February 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
: Which does not solve the problem of covariant arguments, for example when you want to add a postcondition to 'eat' the needs to talk about the fact that grass was eaten. --[[User:Schoelle|Schoelle]] 15:08, 22 February 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7490</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7490"/>
				<updated>2007-02-21T14:47:32Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Discussion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''Warning''': Article under development}}&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call? The error comes from strengthening the precondition of eat through the type system. The precondition in ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition in COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also do to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have renamed 'eat' to 'animal_eat', to create space for a different feature 'eat' that is adequate for cows. We implement 'animal_eat' in terms of 'eat' if the supplied food is the right one. Otherwise, we have the conditions of a CAT call and raise an exception.&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;br /&gt;
&lt;br /&gt;
Also, we '''do not address the problems of CAT calls through genericity and change of export status'''. These problems need a different treatment (for example though the restriction of the interface though readonly types).&lt;br /&gt;
&lt;br /&gt;
Interestingly, the approach can be used to model any change of signature, including covariant, contravariant arguments, covariant and contravariant return types and even the change of existing or the introduction of new arguments. It is thus more powerful than the covariant mechansims available in Eiffel.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Forget_/_Keep_Mechanism&amp;diff=7489</id>
		<title>Talk:Forget / Keep Mechanism</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Forget_/_Keep_Mechanism&amp;diff=7489"/>
				<updated>2007-02-21T14:45:24Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouch, this seems to produce many problems. Specially the introduction of all these parameters for types. Also, I am not sure that this approach is sound and modular. It also looks difficult to teach. --[[User:Schoelle|Schoelle]] 15:45, 21 February 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7488</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7488"/>
				<updated>2007-02-21T14:43:30Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Discussion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''Warning''': Article under development}}&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call? The error comes from strengthening the precondition of eat through the type system. The precondition in ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition in COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also do to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have renamed 'eat' to 'animal_eat', to create space for a different feature 'eat' that is adequate for cows. We implement 'animal_eat' in terms of 'eat' if the supplied food is the right one. Otherwise, we have the conditions of a CAT call and raise an exception.&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;br /&gt;
&lt;br /&gt;
Also, we do not address the problems of CAT calls through genericity and change of export status. These problems need a different treatment (for example though the restriction of the interface though readonly types).&lt;br /&gt;
&lt;br /&gt;
Interestingly, the approach can be used to model any change of signature, including covariant, contravariant arguments, covariant and contravariant return types and even the change of existing or the introduction of new arguments. It is thus more powerful than the covariant mechansims available in Eiffel.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7487</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7487"/>
				<updated>2007-02-21T14:40:57Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Solution 1: explicit exception */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''Warning''': Article under development}}&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call? The error comes from strengthening the precondition of eat through the type system. The precondition in ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition in COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also do to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have renamed 'eat' to 'animal_eat', to create space for a different feature 'eat' that is adequate for cows. We implement 'animal_eat' in terms of 'eat' if the supplied food is the right one. Otherwise, we have the conditions of a CAT call and raise an exception.&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;br /&gt;
&lt;br /&gt;
Also, we do not address the problems of CAT calls through genericity and change of export status. These problems need a different treatment (for example though the restriction of the interface though readonly types).&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7486</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7486"/>
				<updated>2007-02-21T14:32:41Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''Warning''': Article under development}}&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call? The error comes from strengthening the precondition of eat through the type system. The precondition in ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition in COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also do to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;br /&gt;
&lt;br /&gt;
Also, we do not address the problems of CAT calls through genericity and change of export status. These problems need a different treatment (for example though the restriction of the interface though readonly types).&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7485</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7485"/>
				<updated>2007-02-21T14:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''Warning''': Article under development}}&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call? The error comes from strengthening of the precondition of eat through the type system. The precondition in ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition in COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also do to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;br /&gt;
&lt;br /&gt;
Also, we do not address the problems of CAT calls through genericity and change of export status. These problems need a different treatment (for example though the restriction of the interface though readonly types).&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7484</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7484"/>
				<updated>2007-02-21T14:30:51Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Discussion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''Warning''': Article under development}}&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call? The error comes from strengthening of the precondition of eat through the type system. The precondition in ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition in COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also to to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;br /&gt;
&lt;br /&gt;
Also, we do not address the problems of CAT calls through genericity and change of export status. These problems need a different treatment (for example though the restriction of the interface though readonly types).&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7483</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7483"/>
				<updated>2007-02-21T14:25:14Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''Warning''': Article under development}}&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call? The error comes from strengthening of the precondition of eat through the type system. The precondition in ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition in COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also to to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7482</id>
		<title>Covariance through renaming</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Covariance_through_renaming&amp;diff=7482"/>
				<updated>2007-02-21T14:22:34Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''Warning''': Article under development}}&lt;br /&gt;
&lt;br /&gt;
Covariant arguments are part of the Eiffel language, introducing the known problems of CAT calls and global analysis. This page summarizes how to solve a classic covariant problem purely though the well-known and understood renaming mechanism in Eiffel. We will see that this solution is more verbose than the covariant solution, but has a set of advantages, including the explicit need to rework the contract, define handlers for CAT calls or the explicit creation of exceptions.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
A class ANIMAL defines a command called 'eat' with an argument 'food':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we introduce the food class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
interface class&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  is_vegetarian: BOOLEAN&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we want to model the fact that cows only eat grass, a vegetarian food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    redefine&lt;br /&gt;
      eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&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;
interface class&lt;br /&gt;
  GRASS&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  FOOD&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  grass_is_vegetarian: is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We have a potential CAT call, as we can regard a COW as an ANIMAL. An ANIMAL can be fed with any food:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
  a_cow: COW&lt;br /&gt;
  a_animal: ANIMAL&lt;br /&gt;
do&lt;br /&gt;
  create a_cow&lt;br /&gt;
  an_animal := a_cow&lt;br /&gt;
  an_animal.eat (create {FOOD}) -- CAT call!&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the origin of the CAT call ? The error comes from a strengthening of the precondition of eat through the type system. The precondition of ANIMAL states something like &amp;quot;I will eat everything, as long as it is FOOD&amp;quot;, while the precondition of COW states: &amp;quot;I will eat everything, as long as it is GRASS.&amp;quot; - so we are faceing a miss-use of the inheritance relation, as a COW is not an ANIMAL - at least not when it comes to food consumption. &lt;br /&gt;
&lt;br /&gt;
It is a very typical problem of object-oriented modelling, as the subtype relation not only describes a 'COW is an ANIMAL' (observation) but also a 'what we can do to an ANIMAL, we can also to to a COW' (modification) relation.&lt;br /&gt;
&lt;br /&gt;
== Solution 1: explicit exception ==&lt;br /&gt;
&lt;br /&gt;
We start by clearly stating through the code when a CAT call happens. This solution does not require any further thinking and could be regarded as a ''flattened'' form of covariance (though this should be rejected, as this would take away the benefits of making exceptions explicit).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: g /= Void&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      if g /= Void then&lt;br /&gt;
        eat (g)&lt;br /&gt;
      else&lt;br /&gt;
        raise (1,&amp;quot;CAT call&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The advantage of this solution is that it does clearly show that it is possible to get an exception through calling 'animal_eat' in COWs. It does not help preventing the exception from occuring, but it shows that there is a deficiency in the code that needs to be taken care of.&lt;br /&gt;
&lt;br /&gt;
== Solution 2: stronger precondition ==&lt;br /&gt;
&lt;br /&gt;
The deeper insight is that ANIMAL is not a correct model of an animal. The contract is too weak: we know from reality that not every animal will eat every food. Animals are picky. We model this by a test predicate that checks if the animal will actually like our food.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class &lt;br /&gt;
  ANIMAL&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
  last_food: FOOD&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    require&lt;br /&gt;
      not_void: f /= Void&lt;br /&gt;
    do&lt;br /&gt;
      Result := True&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (f: FOOD) is&lt;br /&gt;
    require&lt;br /&gt;
      likes (f)&lt;br /&gt;
    do&lt;br /&gt;
      last_food := f&lt;br /&gt;
    ensure&lt;br /&gt;
      last_food = f&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;
  COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
  ANIMAL&lt;br /&gt;
    rename&lt;br /&gt;
      eat as animal_eat&lt;br /&gt;
    redefine&lt;br /&gt;
      animal_eat,&lt;br /&gt;
      likes&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
  likes (f: FOOD): BOOLEAN is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f&lt;br /&gt;
      Result := (g /= Void)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
  eat (g: GRASS) is&lt;br /&gt;
    do&lt;br /&gt;
      last_food := g&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  animal_eat (f: FOOD) is&lt;br /&gt;
    local&lt;br /&gt;
      g: GRASS&lt;br /&gt;
    do&lt;br /&gt;
      g ?= f -- We can assume that this will succeed from the local definition of `likes'.&lt;br /&gt;
      eat (g)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
invariant&lt;br /&gt;
  only_eats_vegetarian: last_food /= Void implies last_food.is_vegetarian&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
From the perspective of the interface, the covariant and the renaming solutions all have the same interface, with the exception that in the renaming cases, COW also has an `animal_eat' command that it inherits from ANIMAL. Though this may seem unwanted, it makes the generation of flattened forms easier and also shows that the 'eat' of ANIMAL and 'eat' of COW are not the same features.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Forget_/_Keep_Mechanism&amp;diff=7481</id>
		<title>Talk:Forget / Keep Mechanism</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Forget_/_Keep_Mechanism&amp;diff=7481"/>
				<updated>2007-02-21T12:48:57Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouch --[[User:Schoelle|Schoelle]] 13:48, 21 February 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=7292</id>
		<title>Reasons for using Eiffel</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=7292"/>
				<updated>2007-01-31T17:18:38Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Reasons for EiffelStudio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]&lt;br /&gt;
The step away from the main stream of languages is a difficult one. Leaving common ground is worrying. There is always the need to justify unorthodox decisions. This page tries to capture reasons to convince you, your friends, you boss, your client or your grandmother to use Eiffel and EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
You can also read the following articles from Eiffel Software for more reasons:&lt;br /&gt;
* [http://docs.eiffel.com/eiffelstudio/general/guided_tour/other/why_eiffel.html Why your next project should use Eiffel]&lt;br /&gt;
* [http://docs.eiffel.com/eiffelstudio/general/guided_tour/other/one_minute.html 1-Minute Summary]&lt;br /&gt;
&lt;br /&gt;
== Reasons for Eiffel ==&lt;br /&gt;
&lt;br /&gt;
; Eiffel is object-oriented : While you might think that every modern language is calls itself object-oriented, there are very few languages that have the object-oriented paradigm so deeply integrated into the language as in Eiffel. Eiffel was built around object-orientation. Objects just feel right in Eiffel. Contracts make you understand inheritance. Even if you will change to another language later, object-orientation will never be the same to you once you have developed in Eiffel.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is fast : Eiffel compiles to C, which is then directly translated to the machine code of your target platform. With that you can exploit the full speed of your target architecture. Eiffel can be used in embedded environments or on mainframes. Eiffel competes with C and C++ in terms of speed, not with Java or C#.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has a garbage collector : Memory management is very error prone. Detecting memory leaks is a tedious job that can endanger the reliability of the application. Eiffel was designed from the start to be a language that uses garbage collection. That way, developers do not have to free memory explicitly. EiffelStudio offers a fast moving garbage collector.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is mature : Development on Eiffel started in 1985, long before Java (1991) or C# (2001). During more than two decades, Eiffel has been constantly improved and revised.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is standard : Eiffel is standardized by ECMA standard 367, ISO/IEC DIS 25436&lt;br /&gt;
&lt;br /&gt;
; Eiffel is strongly typed : Eiffel offers a static type system. By this, it can detect conceptual errors much easier than with language with a weak or no type system like C++ or Smalltalk.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has powerful constructs : Eiffel offers constructs like generics (somewhat like Templates) or agents (also known as delegates), constructs that were only recently added to Java 1.5 or C# 2.0. Also, Eiffel has some unique concepts like Design by Contract or full-featured multiple inheritance.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is highly portable : EiffelStudio has been ported to nearly all major operating systems, from Windows, MacOS X, Linux, FreeBSD to VMS. Portable libraries like EiffelVision2 make it possible to write applications for one platform and compile it for any other platform.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is built on 'Design by Contract' : Design by Contract (DbC) is what made Eiffel famous. Using DbC, you can clearly define what your implementation expects from and what it provides to the caller. This behavior is checked at run-time, making it much easier to find bugs. The contracts are also used from documentation and play an important role for inheritance.&lt;br /&gt;
&lt;br /&gt;
== Reasons for EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is open-source : EiffelStudio has been released under the well-known Gnu Public License, making sure that the source code will be available in the future and giving you the power to read and modify the system if you need.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is supported by a company : Eiffel Software remains the driving force behind EiffelStudio. A horde of full-time employees are working to improve EiffelStudio, react on you questions and provide commercial support if needed.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a power IDE : EiffelStudio features everything that you can expect from a modern IDE, starting with syntax highlighting, organization of your classes, interface extraction of features and classes, hypertext-like browsing, refactoring, and many more.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio offers incremental compilation : Changed just a single line in your huge system ? No need to wait for minutes or even hours for a recompilation. Even for a million lines of code, recompilation is a matter of seconds.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio adds run-time checking : Run-time checks of contracts and assertions are an inherit part of Design by Contract. With EiffelStudio, you get a tool for enabling efficient checks for just parts, or for the full system. Problems get reported where they happen, when they happen.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a powerful interactive debugger : The IDE integrates a full-featured debugger that makes it easy to trace what is really happening during execution.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio allows you to draw UML and BON diagrams : Sometimes a picture can say more than a 1000 words. EiffelStudio integrates an interactive tool to draw UML and BON diagrams. The tool features full round-trip engineering: Any change in the diagram is directly reflected in the code, and any change in the code is directly reflected in the diagram. So, your diagrams never become outdated.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=7291</id>
		<title>Reasons for using Eiffel</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=7291"/>
				<updated>2007-01-31T17:18:01Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Reasons for EiffelStudio */  Some reasons for EiffelStudio added.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]&lt;br /&gt;
The step away from the main stream of languages is a difficult one. Leaving common ground is worrying. There is always the need to justify unorthodox decisions. This page tries to capture reasons to convince you, your friends, you boss, your client or your grandmother to use Eiffel and EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
You can also read the following articles from Eiffel Software for more reasons:&lt;br /&gt;
* [http://docs.eiffel.com/eiffelstudio/general/guided_tour/other/why_eiffel.html Why your next project should use Eiffel]&lt;br /&gt;
* [http://docs.eiffel.com/eiffelstudio/general/guided_tour/other/one_minute.html 1-Minute Summary]&lt;br /&gt;
&lt;br /&gt;
== Reasons for Eiffel ==&lt;br /&gt;
&lt;br /&gt;
; Eiffel is object-oriented : While you might think that every modern language is calls itself object-oriented, there are very few languages that have the object-oriented paradigm so deeply integrated into the language as in Eiffel. Eiffel was built around object-orientation. Objects just feel right in Eiffel. Contracts make you understand inheritance. Even if you will change to another language later, object-orientation will never be the same to you once you have developed in Eiffel.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is fast : Eiffel compiles to C, which is then directly translated to the machine code of your target platform. With that you can exploit the full speed of your target architecture. Eiffel can be used in embedded environments or on mainframes. Eiffel competes with C and C++ in terms of speed, not with Java or C#.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has a garbage collector : Memory management is very error prone. Detecting memory leaks is a tedious job that can endanger the reliability of the application. Eiffel was designed from the start to be a language that uses garbage collection. That way, developers do not have to free memory explicitly. EiffelStudio offers a fast moving garbage collector.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is mature : Development on Eiffel started in 1985, long before Java (1991) or C# (2001). During more than two decades, Eiffel has been constantly improved and revised.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is standard : Eiffel is standardized by ECMA standard 367, ISO/IEC DIS 25436&lt;br /&gt;
&lt;br /&gt;
; Eiffel is strongly typed : Eiffel offers a static type system. By this, it can detect conceptual errors much easier than with language with a weak or no type system like C++ or Smalltalk.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has powerful constructs : Eiffel offers constructs like generics (somewhat like Templates) or agents (also known as delegates), constructs that were only recently added to Java 1.5 or C# 2.0. Also, Eiffel has some unique concepts like Design by Contract or full-featured multiple inheritance.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is highly portable : EiffelStudio has been ported to nearly all major operating systems, from Windows, MacOS X, Linux, FreeBSD to VMS. Portable libraries like EiffelVision2 make it possible to write applications for one platform and compile it for any other platform.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is built on 'Design by Contract' : Design by Contract (DbC) is what made Eiffel famous. Using DbC, you can clearly define what your implementation expects from and what it provides to the caller. This behavior is checked at run-time, making it much easier to find bugs. The contracts are also used from documentation and play an important role for inheritance.&lt;br /&gt;
&lt;br /&gt;
== Reasons for EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is open-source : EiffelStudio has been released under the well-known Gnu Public License, making sure that the source code will be available in the future and giving you the power to read and modify the system if you need.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is supported by a company : Eiffel Software remains the driving force behind EiffelStudio. A horde of full-time employees are working to improve EiffelStudio, react on you questions and provide commercial support if needed.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a power IDE : EiffelStudio features everything that you can expect from a moder IDE, starting with syntax highlighting, organization of your classes, interface extraction of features and classes, hypertext-like browsing, refactoring, and many more.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio offers incremental compilation : Changed just a single line in your huge system ? No need to wait for minutes or even hours for a recompilation. Even for a million lines of code, recompilation is a matter of seconds.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio adds run-time checking : Run-time checks of contracts and assertions are an inherit part of Design by Contract. With EiffelStudio, you get a tool for enabling efficient checks for just parts, or for the full system. Problems get reported where they happen, when they happen.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a powerful interactive debugger : The IDE integrates a full-featured debugger that makes it easy to trace what is really happening during execution.&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio allows you to draw UML and BON diagrams : Sometimes a picture can say more than a 1000 words. EiffelStudio integrates an interactive tool to draw UML and BON diagrams. The tool features full round-trip engineering: Any change in the diagram is directly reflected in the code, and any change in the code is directly reflected in the diagram. So, your diagrams never become outdated.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=User:Trosim&amp;diff=6839</id>
		<title>User:Trosim</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=User:Trosim&amp;diff=6839"/>
				<updated>2007-01-18T21:49:03Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There should not be a red link here!&lt;br /&gt;
&lt;br /&gt;
 Identifier: Martino Trosi&lt;br /&gt;
 Computer science branch: web, database&lt;br /&gt;
 Preferred linux-box: Gentoo&lt;br /&gt;
&lt;br /&gt;
''I got doly fan is mach!''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I am involved in the following projects:&lt;br /&gt;
&lt;br /&gt;
* [[Internationalization]]&lt;br /&gt;
* [[Build tool]]&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=User:Trosim&amp;diff=6838</id>
		<title>User:Trosim</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=User:Trosim&amp;diff=6838"/>
				<updated>2007-01-18T21:48:57Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There should not be a red link here!&lt;br /&gt;
&lt;br /&gt;
 Identifier: Martino Trosi&lt;br /&gt;
 Computer science branch: web, database&lt;br /&gt;
 Preferred linux-box: Gentoo&lt;br /&gt;
&lt;br /&gt;
''I got doly fan is mach!''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I am involved in the following projects:&lt;br /&gt;
&lt;br /&gt;
* [[Internationalization]]&lt;br /&gt;
* [[Build tool]&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Build_tool&amp;diff=6837</id>
		<title>Build tool</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Build_tool&amp;diff=6837"/>
				<updated>2007-01-18T21:43:23Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Projects]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The whole build process of EiffelStudio is rather tedious at the moment. This project aims to simplify this by various means:&lt;br /&gt;
&lt;br /&gt;
* Tight integration of '''GOBO geant''' into the build process&lt;br /&gt;
* '''Setup checker''' - a script that checks that the current development environment is correctly setup for the development on EiffelStudio&lt;br /&gt;
* Fully automated '''build scripts''' that enable the compilation of the runtime, libraries and EiffelStudio with a single command&lt;br /&gt;
* Automatic generation of an '''Eiffel delivery''' from a successful compilation, including all necessary tools&lt;br /&gt;
&lt;br /&gt;
This will lead to a better overall build infrastructure, automated (nightly) builds, and things alike. We work on our own branch of the sourcecode, but will sync it from time to time with the EiffelStudio SVN trunk.&lt;br /&gt;
&lt;br /&gt;
Other goals of the effort include:&lt;br /&gt;
&lt;br /&gt;
* Transition of EiffelStudio from GOBO 3.4 to a more current GOBO release.&lt;br /&gt;
* Extension of geant tasks as seen necessary.&lt;br /&gt;
* Minimization of foreign software tools required for the compilation.&lt;br /&gt;
** Specially to get rid of the dependency on Cygwin on Windows.&lt;br /&gt;
* Production a one-click-and-go script for easy installation and compilation.&lt;br /&gt;
&lt;br /&gt;
We aim to have a compact build process by using only Eiffel related tools (mainly geant scripts).&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
There are already a number of GEANT scripts available in the 'scripts' directory. These scripts cover compilation of EiffelStudio, the runtime and the libraries. An existing GOBO installation will be used if available. The setup checker script checks for major problems in the setup.&lt;br /&gt;
&lt;br /&gt;
== Todo == &lt;br /&gt;
&lt;br /&gt;
* makefile/batchfile for getting the installation started (for users unexperienced with gobo/geant)&lt;br /&gt;
* expand setup-checker&lt;br /&gt;
** find more dependencies on windows&lt;br /&gt;
* automatical use of existing gobo-installations&lt;br /&gt;
* full migration of the tree to current GOBO&lt;br /&gt;
* building a delivery&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* [[User:schoelle]] &lt;br /&gt;
* [[User:sanakan]] &lt;br /&gt;
* [[User:trosim]]&lt;br /&gt;
* [[User:jfiat]]&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=User:Schoelle&amp;diff=6836</id>
		<title>User:Schoelle</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=User:Schoelle&amp;diff=6836"/>
				<updated>2007-01-18T21:39:47Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Homepage: http://se.inf.ethz.ch/people/schoeller&lt;br /&gt;
&lt;br /&gt;
I am involved in the following projects:&lt;br /&gt;
&lt;br /&gt;
* [[Internationalization]]&lt;br /&gt;
* [[Build tool]]&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Build_tool&amp;diff=6835</id>
		<title>Build tool</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Build_tool&amp;diff=6835"/>
				<updated>2007-01-18T21:30:26Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Projects]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The whole build process of EiffelStudio is rather tedious at the moment. This project aims to simplify this by various means:&lt;br /&gt;
&lt;br /&gt;
* Tight integration of '''GOBO geant''' into the build process&lt;br /&gt;
* '''Setup checker''' - a script that checks that the current development environment is correctly setup for the development on EiffelStudio&lt;br /&gt;
* Fully automated '''build scripts''' that enable the compilation of the runtime, libraries and EiffelStudio with a single command&lt;br /&gt;
* Automatic generation of an '''Eiffel delivery''' from a successful compilation, including all necessary tools&lt;br /&gt;
&lt;br /&gt;
This will lead to a better overall build infrastructure, automated (nightly) builds, and things alike. We work on our own branch of the sourcecode, but will sync it from time to time with the EiffelStudio SVN trunk.&lt;br /&gt;
&lt;br /&gt;
Other side-products of the effort are:&lt;br /&gt;
&lt;br /&gt;
* Transition of EiffelStudio from GOBO 3.4 to a more current GOBO release&lt;br /&gt;
* Extension of geant tasks&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
We aim to have a compact build process by using only Eiffel related tools (mainly geant scripts) and thus minimizing the needed (alien) tools to get an EiffelStudio compilation going.&lt;br /&gt;
&lt;br /&gt;
== Steps ==&lt;br /&gt;
* produce a one-click-and-go script for easy installation&lt;br /&gt;
* get rid of windows dependency for bash&lt;br /&gt;
* remove script-only tools like finish_freezing, Makefile.sh, etc.&lt;br /&gt;
&lt;br /&gt;
== Done ==&lt;br /&gt;
&lt;br /&gt;
* first draft of geant scripts to build c-libraries&lt;br /&gt;
* first draft of setup-checker tool&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
== Todo == &lt;br /&gt;
* makefile/batchfile for getting the installation started (for users unexperienced with gobo/geant)&lt;br /&gt;
* expand setup-checker&lt;br /&gt;
** find more dependencies on windows&lt;br /&gt;
* automatical use of existing gobo-installations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Contributors&amp;diff=6481</id>
		<title>Contributors</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Contributors&amp;diff=6481"/>
				<updated>2006-12-03T12:41:50Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: Removed unnecessary disclaimer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Contributions]]&lt;br /&gt;
Welcome to the contributors page. You will find here names of people that we would like to thank for their contribution.&lt;br /&gt;
&lt;br /&gt;
To have your name here, start contributing. The best place to start is to look at the [[Open_Projects| list of open projects]] we have, or the list of all [[:Category:Projects|projects]].&lt;br /&gt;
&lt;br /&gt;
==Top Contributors==&lt;br /&gt;
&lt;br /&gt;
==Contributors==&lt;br /&gt;
* '''S&amp;amp;eacute;bastien Bernard''' is providing his [http://sunsolve.sun.com/handbook_pub/Systems/U60/U60.html Ultra 60] workstation for porting EiffelStudio on Linux-sparc.&lt;br /&gt;
* '''Francesco Ferreri''' is taking care of the port for FreeBSD 64-bit on AMD64.&lt;br /&gt;
* '''David Hollenberg''' is the creator of '''[[Eweasel|eweasel]]''', the regression test tool used for the Eiffel Software compiler.&lt;br /&gt;
* '''Raphael Manfredi''' was the inventor of the Eiffel runtime as we know it today. He also contributed '''jmake''' which is still used by the runtime to produce portable Makefiles.&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Main_Page&amp;diff=6428</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Main_Page&amp;diff=6428"/>
				<updated>2006-11-30T08:36:54Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: Removed old talk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''--[[User:Juliant|Juliant]] 23:22, 28 November 2006 (CET)'''&lt;br /&gt;
&lt;br /&gt;
Just that it doesn't get forgotten and since someone of the admins has to change navigation I post this here again (From [[Talk:New Main Page]]):&lt;br /&gt;
&lt;br /&gt;
Also a new page logo (at least withouth the white border) and a new navigation would look better. I would split the navigation to a 'normal navigation' part and a 'developers' part (see below).&lt;br /&gt;
&lt;br /&gt;
Navigation proposal:&lt;br /&gt;
&lt;br /&gt;
* Navigation&lt;br /&gt;
** Home      (not sure if this is needed because the logo alredy points to the main page)&lt;br /&gt;
** Categories&lt;br /&gt;
** Downloads&lt;br /&gt;
** Version history&lt;br /&gt;
** FAQ&lt;br /&gt;
** Mailing lists&lt;br /&gt;
** Eiffel links&lt;br /&gt;
&lt;br /&gt;
* Developement&lt;br /&gt;
** Recent changes&lt;br /&gt;
** Changelog of 6.x&lt;br /&gt;
** SVN repository&lt;br /&gt;
** Compiling&lt;br /&gt;
** How to contribute&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Talk:Agent_problems&amp;diff=6292</id>
		<title>Talk:Agent problems</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Talk:Agent_problems&amp;diff=6292"/>
				<updated>2006-11-21T08:26:10Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Is CAT Call ==&lt;br /&gt;
&lt;br /&gt;
First comment: I assume you are missing a 'l_f := f'. &lt;br /&gt;
&lt;br /&gt;
Second comment: this is a well known CAT call, caused by the (unsound) inheritance relation 'X[A] is subtype of X[B]' if 'A is subtype of B'. --[[User:Schoelle|Schoelle]] 09:26, 21 November 2006 (CET)&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6280</id>
		<title>Reasons for using Eiffel</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6280"/>
				<updated>2006-11-20T13:27:16Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Reasons for Eiffel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]&lt;br /&gt;
The step away from the main stream of languages is a difficult one. Leaving common ground is worrying. There is always the need to justify unorthodox decisions. This page tries to capture reasons to convince you, your friends, you boss, your client or your grandmother to use Eiffel and EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
== Reasons for Eiffel ==&lt;br /&gt;
&lt;br /&gt;
; Eiffel is object-oriented : While you might think that every modern language is calls itself object-oriented, there are very few languages that have the object-oriented paradigm so deeply integrated into the language as in Eiffel. Eiffel was built around object-orientation. Objects just feel right in Eiffel. Contracts make you understand inheritance. Even if you will change to another language later, object-orientation will never be the same to you once you have developed in Eiffel.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is fast : Eiffel compiles to C, which is then directly translated to the machine code of your target platform. With that you can exploit the full speed of your target architecture. Eiffel can be used in embedded environments or on mainframes. Eiffel competes with C and C++ in terms of speed, not with Java or C#.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has a garbage collector : Memory management is very error prone. Detecting memory leaks is a tedious job that can endanger the reliability of the application. Eiffel was designed from the start to be a language that uses garbage collection. That way, developers do not have to free memory explicitly. EiffelStudio offers a fast moving garbage collector.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is mature : Development on Eiffel started in 1985, long before Java (1991) or C# (2001). During more than two decades, Eiffel has been constantly improved and revised.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is standard : Eiffel is standardized by ECMA standard 367, ISO/IEC DIS 25436&lt;br /&gt;
&lt;br /&gt;
; Eiffel is strongly typed : Eiffel offers a static type system. By this, it can detect conceptual errors much easier than with language with a weak or no type system like C++ or Smalltalk.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has powerful constructs : Eiffel offers constructs like generics (somewhat like Templates) or agents (also known as delegates), constructs that were only recently added to Java 1.5 or C# 2.0. Also, Eiffel has some unique concepts like Design by Contract or full-featured multiple inheritance.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is highly portable : EiffelStudio has been ported to nearly all major operating systems, from Windows, MacOS X, Linux, FreeBSD to VMS. Portable libraries like EiffelVision2 make it possible to write applications for one platform and compile it for any other platform.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is built on 'Design by Contract' : Design by Contract (DbC) is what made Eiffel famous. Using DbC, you can clearly define what your implementation expects from and what it provides to the caller. This behavior is checked at run-time, making it much easier to find bugs. The contracts are also used from documentation and play an important role for inheritance.&lt;br /&gt;
&lt;br /&gt;
== Reasons for EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is open-source : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is supported by a company : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a power IDE : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio offers incremental compilation : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio adds run-time checking : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a powerful interactive debugger : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio allows you to draw UML and BON diagrams : ...&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6279</id>
		<title>Reasons for using Eiffel</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6279"/>
				<updated>2006-11-20T13:26:03Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Reasons for Eiffel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]&lt;br /&gt;
The step away from the main stream of languages is a difficult one. Leaving common ground is worrying. There is always the need to justify unorthodox decisions. This page tries to capture reasons to convince you, your friends, you boss, your client or your grandmother to use Eiffel and EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
== Reasons for Eiffel ==&lt;br /&gt;
&lt;br /&gt;
; Eiffel is object-oriented : While you might think that every modern language is calls itself object-oriented, there are very few languages that have the object-oriented paradigm so deeply integrated into the language as in Eiffel. Eiffel was built around object-orientation. Objects just feel right in Eiffel. Contracts make you understand inheritance. Even if you will change to another language later, object-orientation will never be the same to you once you have developed in Eiffel.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is fast : Eiffel compiles to C, which is then directly translated to the machine code of your target platform. With that you can exploit the full speed of your target architecture. Eiffel can be used in embedded environments or on mainframes. Eiffel competes with C and C++ in terms of speed, not with Java or C#.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has a garbage collector : Memory management is very error prone. Detecting memory leaks is a tedious job that can endanger the reliability of the application. Eiffel was designed from the start to be a language that uses garbage collection. That way, developers do not have to free memory explicitly. EiffelStudio offers a fast moving garbage collector.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is mature : Development on Eiffel started in 1985, long before Java (1991) or C# (2001). During more than two decades, Eiffel has been constantly improved and revised.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is standard : Eiffel is standardized by ECMA standard 367, ISO/IEC DIS 25436&lt;br /&gt;
&lt;br /&gt;
; Eiffel is strongly typed : Eiffel offers a static type system. By this, it can detect conceptual errors much easier than with language with a weak or no type system like C++ or Smalltalk.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has powerful constructs : Eiffel offers constructs like generics (somewhat like Templates) or agents (also known as delegates), constructs where have only recently been added to Java 1.5 or C# 2.0. Also, Eiffel has some unique concepts like Design by Contract or full-featured multiple inheritance.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is highly portable : EiffelStudio has been ported to nearly all major operating systems, from Windows, MacOS X, Linux, FreeBSD to VMS. Portable libraries like EiffelVision2 make it possible to write applications for one platform and compile it for any other platform.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is built on 'Design by Contract' : Design by Contract (DbC) is what made Eiffel famous. Using DbC, you can clearly define what your implementation expects from and what it provides to the caller. This behavior is checked at run-time, making it much easier to find bugs. The contracts are also used from documentation and play an important role for inheritance.&lt;br /&gt;
&lt;br /&gt;
== Reasons for EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is open-source : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is supported by a company : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a power IDE : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio offers incremental compilation : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio adds run-time checking : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a powerful interactive debugger : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio allows you to draw UML and BON diagrams : ...&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6278</id>
		<title>Reasons for using Eiffel</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6278"/>
				<updated>2006-11-20T13:23:56Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Reasons for Eiffel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]&lt;br /&gt;
The step away from the main stream of languages is a difficult one. Leaving common ground is worrying. There is always the need to justify unorthodox decisions. This page tries to capture reasons to convince you, your friends, you boss, your client or your grandmother to use Eiffel and EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
== Reasons for Eiffel ==&lt;br /&gt;
&lt;br /&gt;
; Eiffel is object-oriented : While you might think that every modern language is calls itself object-oriented, there are very few languages that have the object-oriented paradigm so deeply integrated into the language as in Eiffel. Eiffel was built around object-orientation. Objects just feel right in Eiffel. Contracts make you understand inheritance. Even if you will change to another language later, object-orientation will never be the same to you once you have developed in Eiffel.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is fast : Eiffel compiles to C, which is then directly translated to the machine code of your target platform. With that you can exploit the full speed of your target architecture. Eiffel can be used in embedded environments or on mainframes. Eiffel competes with C and C++ in terms of speed, not with Java or C#.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has a garbage collector : Memory management is very error prone. Detecting memory leaks is a tedious job that can endanger the reliability of the application. Eiffel was designed from the start to be a language that uses garbage collection. That way, developers do not have to free memory explicitly. EiffelStudio offers a fast moving garbage collector.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is mature : Development on Eiffel started in 1985, long before Java (1991) or C# (2001). During more than two decades, Eiffel has been constantly improved and revised.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is standard : Eiffel is standardized by ECMA standard 367, ISO/IEC DIS 25436&lt;br /&gt;
&lt;br /&gt;
; Eiffel is strongly typed : Eiffel offers strongly typed. By this, it can detect conceptual errors much easier than C++ or Smalltalk.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has powerful constructs : Eiffel offers constructs like generics (somewhat like Templates) or agents (also known as delegates), constructs where have only recently been added to Java 1.5 or C# 2.0. Also, Eiffel has some unique concepts like Design by Contract or full-featured multiple inheritance.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is highly portable : EiffelStudio has been ported to nearly all major operating systems, from Windows, MacOS X, Linux, FreeBSD to VMS. Portable libraries like EiffelVision2 make it possible to write applications for one platform and compile it for any other platform.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is built on 'Design by Contract' : Design by Contract (DbC) is what made Eiffel famous. Using DbC, you can clearly define what your implementation expects from and what it provides to the caller. This behavior is checked at run-time, making it much easier to find bugs. The contracts are also used from documentation and play an important role for inheritance.&lt;br /&gt;
&lt;br /&gt;
== Reasons for EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is open-source : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is supported by a company : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a power IDE : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio offers incremental compilation : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio adds run-time checking : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a powerful interactive debugger : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio allows you to draw UML and BON diagrams : ...&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6277</id>
		<title>Reasons for using Eiffel</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6277"/>
				<updated>2006-11-20T13:21:49Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]&lt;br /&gt;
The step away from the main stream of languages is a difficult one. Leaving common ground is worrying. There is always the need to justify unorthodox decisions. This page tries to capture reasons to convince you, your friends, you boss, your client or your grandmother to use Eiffel and EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
== Reasons for Eiffel ==&lt;br /&gt;
&lt;br /&gt;
; Eiffel is object-oriented : While you might think that every modern language is calls itself object-oriented, there are very few languages that have the object-oriented paradigm so deeply integrated into the language as in Eiffel. Eiffel was built around object-orientation. Objects just feel right in Eiffel. Contracts make you understand inheritance. Even if you will change to another language later, object-orientation will never be the same to you once you have developed in Eiffel.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is fast : Eiffel compiles to C, which is then directly translated to the machine code of your target platform. With that you can exploit the full speed of your target architecture. Eiffel can be used in embedded environments, in &lt;br /&gt;
&lt;br /&gt;
; Eiffel has a garbage collector : Memory management is very error prone. Detecting memory leaks is a tedious job that can endanger the reliability of the application. Eiffel was designed from the start to be a language that uses garbage collection. That way, developers do not have to free memory explicitly. EiffelStudio offers a fast moving garbage collector.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is mature : Development on Eiffel started in 1985, long before Java (1991) or C# (2001). During more than two decades, Eiffel has been constantly improved and revised.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is standard : Eiffel is standarized by ECMA standard 367, ISO/IEC DIS 25436&lt;br /&gt;
&lt;br /&gt;
; Eiffel is strongly typed : Eiffel offers strongly typed. By this, it can detect conceptual errors much easier than C++ or Smalltalk.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has powerful constructs : Eiffel offers constructs like generics (somewhat like Templates) or agents (also known as delegates), constructs where have only recently been added to Java 1.5 or C# 2.0. Also, Eiffel has some unique concepts like Design by Contract or full-featured multiple inheritance.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is highly portable : EiffelStudio has been ported to nearly all major operating systems, from Windows, MacOS X, Linux, FreeBSD to VMS. Protable libraries like EiffelVision2 make it possible to write applications for one platform and compile it for any other platform.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is built on 'Design by Contract' : Design by Contract (DbC) is what made Eiffel famous. Using DbC, you can clearly define what your implementation expects from and what it provides to the caller. This behavior is checked at run-time, making it much easier to find bugs. The contracts are also used from documentation and play an important role for inheritance.&lt;br /&gt;
&lt;br /&gt;
== Reasons for EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is open-source : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is supported by a company : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a power IDE : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio offers incremental compilation : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio adds run-time checking : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a powerful interactive debugger : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio allows you to draw UML and BON diagrams : ...&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6276</id>
		<title>Reasons for using Eiffel</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Reasons_for_using_Eiffel&amp;diff=6276"/>
				<updated>2006-11-20T13:19:23Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: /* Reasons for Eiffel */  More reasons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]&lt;br /&gt;
The step away from the main stream of languages is a difficult one. Leaving common group makes one feel insecure. There is always the need to justify unorthodox decisions. This page tries to capture reasons to convince you, your friends, you boss, your client or your grandmother to use Eiffel and EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
== Reasons for Eiffel ==&lt;br /&gt;
&lt;br /&gt;
; Eiffel is object-oriented : While you might think that every modern language is calls itself object-oriented, there are very few languages that have the object-oriented paradigm so deeply integrated into the language as in Eiffel. Eiffel was built around object-orientation. Objects just feel right in Eiffel. Contracts make you understand inheritance. Even if you will change to another language later, object-orientation will never be the same to you once you have developed in Eiffel.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is fast : Eiffel compiles to C, which is then directly translated to the machine code of your target platform. With that you can exploit the full speed of your target architecture. Eiffel can be used in embedded environments, in &lt;br /&gt;
&lt;br /&gt;
; Eiffel has a garbage collector : Memory management is very error prone. Detecting memory leaks is a tedious job that can endanger the reliability of the application. Eiffel was designed from the start to be a language that uses garbage collection. That way, developers do not have to free memory explicitly. EiffelStudio offers a fast moving garbage collector.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is mature : Development on Eiffel started in 1985, long before Java (1991) or C# (2001). During more than two decades, Eiffel has been constantly improved and revised.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is standard : Eiffel is standarized by ECMA standard 367, ISO/IEC DIS 25436&lt;br /&gt;
&lt;br /&gt;
; Eiffel is strongly typed : Eiffel offers strongly typed. By this, it can detect conceptual errors much easier than C++ or Smalltalk.&lt;br /&gt;
&lt;br /&gt;
; Eiffel has powerful constructs : Eiffel offers constructs like generics (somewhat like Templates) or agents (also known as delegates), constructs where have only recently been added to Java 1.5 or C# 2.0. Also, Eiffel has some unique concepts like Design by Contract or full-featured multiple inheritance.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is highly portable : EiffelStudio has been ported to nearly all major operating systems, from Windows, MacOS X, Linux, FreeBSD to VMS. Protable libraries like EiffelVision2 make it possible to write applications for one platform and compile it for any other platform.&lt;br /&gt;
&lt;br /&gt;
; Eiffel is built on 'Design by Contract' : Design by Contract (DbC) is what made Eiffel famous. Using DbC, you can clearly define what your implementation expects from and what it provides to the caller. This behavior is checked at run-time, making it much easier to find bugs. The contracts are also used from documentation and play an important role for inheritance.&lt;br /&gt;
&lt;br /&gt;
== Reasons for EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is open-source : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio is supported by a company : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a power IDE : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio offers incremental compilation : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio adds run-time checking : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio has a powerful interactive debugger : ...&lt;br /&gt;
&lt;br /&gt;
; EiffelStudio allows you to draw UML and BON diagrams : ...&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Mailing_Lists&amp;diff=6274</id>
		<title>Mailing Lists</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Mailing_Lists&amp;diff=6274"/>
				<updated>2006-11-19T10:20:29Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: Made the archive more explicit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here are the various mailing lists you can subscribe to at http://origo.ethz.ch/cgi-bin/mailman/listinfo:&lt;br /&gt;
* es-announce@origo.ethz.ch: Announcement (moderated, low traffic)&lt;br /&gt;
* es-users@origo.ethz.ch: It is intended for all users of EiffelStudio and its libraries.&lt;br /&gt;
* es-devel@origo.ethz.ch: It is intended for all developers of EiffelStudio and its libraries.&lt;br /&gt;
* es-changes@origo.ethz.ch: It is intended for those who wants the evolution of the software on a daily basis.&lt;br /&gt;
&lt;br /&gt;
In addition of all those mailing lists, you may find project's specific mailing lists. Consult http://origo.ethz.ch/cgi-bin/mailman/listinfo for the complete list.&lt;br /&gt;
&lt;br /&gt;
== Archive ==&lt;br /&gt;
&lt;br /&gt;
You can read old postings of the mailinglists in the archives:&lt;br /&gt;
&lt;br /&gt;
* es-users@origo.ethz.ch: [news://origo.ethz.ch/eiffel.eiffelstudio.users Newsgroup] [http://www.nabble.com/Eiffel-Software-Users-f16963.html Nabble.com]&lt;br /&gt;
* es-devel@origo.ethz.ch: [news://origo.ethz.ch/eiffel.eiffelstudio.devel Newsgroup] [http://www.nabble.com/Eiffel-Software-Development-f16977.html Nabble.com]&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=6244</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=6244"/>
				<updated>2006-11-17T22:57:41Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;font size=&amp;quot;+2&amp;quot;&amp;gt;EiffelStudio Integrated Development Environment&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:EiffelStudioScreenshot.png|thumb|250px|right|GUI of the EiffelStudio IDE ([http://eiffel.com/products/studio/screenshots.html more screenshots]) ]]&lt;br /&gt;
&lt;br /&gt;
Welcome to the homepage and Wiki of the EiffelStudio IDE open-source project. EiffelStudio is a full-featured, 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 Inc.] and hosted at the [http://se.inf.ethz.ch/ Chair of Software Engineering] at the [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 modern IDE that offers the following features:&lt;br /&gt;
&lt;br /&gt;
* Complete and efficient compiler for the Eiffel programming language&lt;br /&gt;
* Support for Windows, MacOS X, Linux, *BSD, Solaris and other operating systems&lt;br /&gt;
* Editor for Eiffel code&lt;br /&gt;
* Different browsing and viewing facilities&lt;br /&gt;
* Interactive debugger&lt;br /&gt;
* Graphical modelling tool for UML and BON with full roundtrip&lt;br /&gt;
* Refactoring support&lt;br /&gt;
* GUI development tool and fully portable GUI library&lt;br /&gt;
&lt;br /&gt;
The Eiffel compiler creates C code that is then handed to a standard C compiler. As a result, the programs have a performance comparable to programs directly written in C or C++. At the same time, Eiffel is an object-oriented and strongly typed language. EiffelStudio uses a highly efficient moving 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=3 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;#ededed&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:.4em;padding-top:0.5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
* [[Downloads]]&lt;br /&gt;
* [[EiffelStudio 5.7 Releases|Changelog of 5.7 (release branch)]]&lt;br /&gt;
* [[Installing EiffelStudio]]&lt;br /&gt;
* [[Compiling Hello World]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#ededed&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:.4em;padding-top:0.5em;&amp;quot;|&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;
{|style=&amp;quot;font-size:80%;&amp;quot; bgcolor=white|&lt;br /&gt;
{| cellspacing=3 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;#ededed&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:.4em;padding-top:0.5em;&amp;quot;|&lt;br /&gt;
== EiffelStudio's Development ==&lt;br /&gt;
&lt;br /&gt;
* [[EiffelStudio 6.0 Releases|Changelog of 6.x (development trunk)]]&lt;br /&gt;
* [[Repository|Getting the source: Subversion repository]]&lt;br /&gt;
* [[Compiling EiffelStudio]]&lt;br /&gt;
* [[Contributing|How to contribute]]&lt;br /&gt;
* [[:Category:Projects|Projects]]&lt;br /&gt;
&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#ededed&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:.4em;padding-top:0.5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
* [[Eiffel Sites and Links]]&lt;br /&gt;
* [[Mailing Lists]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=6243</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=6243"/>
				<updated>2006-11-17T22:52:54Z</updated>
		
		<summary type="html">&lt;p&gt;Schoelle: Replaced by new main page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;font size=&amp;quot;+2&amp;quot;&amp;gt;EiffelStudio Integrated Development Environment&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:EiffelStudioScreenshot.png|thumb|250px|right|GUI of the EiffelStudio IDE ([http://eiffel.com/products/studio/screenshots.html more screenshots]) ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Welcome to the homepage and Wiki of the EiffelStudio IDE open-source project. EiffelStudio is a full-features, 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 Inc.] and hosted at the [http://se.inf.ethz.ch/ Chair of Software Engineering] at the [http://www.ethz.ch/ ETH Zurich].&lt;br /&gt;
&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 modern IDE that offers the following features:&lt;br /&gt;
&lt;br /&gt;
* Complete and efficient compiler for the Eiffel programming language&lt;br /&gt;
* Support for Windows, MacOS X, Linux, *BSD, Solaris and other operating systems&lt;br /&gt;
* Editor for Eiffel code&lt;br /&gt;
* Different browsing and viewing facilities&lt;br /&gt;
* Interactive debugger&lt;br /&gt;
* Graphical modelling tool for UML and BON with full roundtrip&lt;br /&gt;
* Refactoring support&lt;br /&gt;
* GUI development tool and fully portable GUI library&lt;br /&gt;
&lt;br /&gt;
The Eiffel compiler creates C code that is then handed to a standard C compiler. As a result, the programs have a performance comparable to programs directly written in C or C++. At the same time, Eiffel is an object-oriented and strongly typed language. EiffelStudio uses a highly efficient moving 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=3 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;#ededed&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:.4em;padding-top:0.5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
* [[Downloads]]&lt;br /&gt;
* [[EiffelStudio 5.7 Releases|Changelog of 5.7 (release branch)]]&lt;br /&gt;
* [[Installing EiffelStudio]]&lt;br /&gt;
* [[Compiling Hello World]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#ededed&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:.4em;padding-top:0.5em;&amp;quot;|&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;
{|style=&amp;quot;font-size:80%;&amp;quot; bgcolor=white|&lt;br /&gt;
{| cellspacing=3 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;#ededed&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:.4em;padding-top:0.5em;&amp;quot;|&lt;br /&gt;
== EiffelStudio's Development ==&lt;br /&gt;
&lt;br /&gt;
* [[EiffelStudio 6.0 Releases|Changelog of 6.x (development trunk)]]&lt;br /&gt;
* [[Repository|Getting the source: Subversion repository]]&lt;br /&gt;
* [[Compiling EiffelStudio]]&lt;br /&gt;
* [[Contributing|How to contribute]]&lt;br /&gt;
* [[:Category:Projects|Projects]]&lt;br /&gt;
&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#ededed&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:.4em;padding-top:0.5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
* [[Eiffel Sites and Links]]&lt;br /&gt;
* [[Mailing Lists]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Schoelle</name></author>	</entry>

	</feed>