<?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=Conaclos</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=Conaclos"/>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/Special:Contributions/Conaclos"/>
		<updated>2026-05-24T16:09:26Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15232</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=15232"/>
				<updated>2014-08-03T12:55:15Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Remove unecessary precisions&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10 loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class  A feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface A feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clauses are inherited if they are not redefined.&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;Documentation.&amp;quot;&lt;br /&gt;
            option: stable&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit A redefine something end feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;New documentation.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The `what' clause is not inheried since it is redefined. However the `option' clause is inherited.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Replace obsolete keyword with a simple note clause&lt;br /&gt;
| A note clause could replace the obsolete keyword&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            obsolete: &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
instead of:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        obsolete&lt;br /&gt;
            &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
| A keyword removed; simpler feature definition&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
where (test: PREDICATE [ANY, TUPLE [G]]): like Current&lt;br /&gt;
        -- Items satisfying `test'&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
slice_until, slice_after, ... (test: PREDICATE [ANY, TUPLE [G]]): like Current&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute query result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
abs: NATURAL_32&lt;br /&gt;
        -- (from INTEGER_32_REF)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `factorial', `even', and `odd' queries&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
factorial: like Current ...&lt;br /&gt;
&lt;br /&gt;
even: BOOLEAN ...&lt;br /&gt;
&lt;br /&gt;
odd: BOOLEAN ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15231</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=15231"/>
				<updated>2014-08-03T12:51:58Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Removing personal proposal&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10 loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
&lt;br /&gt;
A consequence is that expanded types are no longer generic creation ready.&lt;br /&gt;
Generic creation ready type could be frozen types with `default_create' as creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class  A feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface A feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clauses are inherited if they are not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;Documentation.&amp;quot;&lt;br /&gt;
            option: stable&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit A redefine something end feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;New documentation.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The `what' clause is not inheried since it is redefined. However the `option' clause is inherited.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Replace obsolete keyword with a simple note clause&lt;br /&gt;
| A note clause could replace the obsolete keyword&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            obsolete: &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
instead of:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        obsolete&lt;br /&gt;
            &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
| A keyword removed; simpler feature definition&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
where (test: PREDICATE [ANY, TUPLE [G]]): like Current&lt;br /&gt;
        -- Items satisfying `test'&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
slice_until, slice_after, ... (test: PREDICATE [ANY, TUPLE [G]]): like Current&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute query result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
abs: NATURAL_32&lt;br /&gt;
        -- (from INTEGER_32_REF)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `factorial', `even', and `odd' queries&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
factorial: like Current ...&lt;br /&gt;
&lt;br /&gt;
even: BOOLEAN ...&lt;br /&gt;
&lt;br /&gt;
odd: BOOLEAN ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Exceptions_as_Objects&amp;diff=15222</id>
		<title>Exceptions as Objects</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Exceptions_as_Objects&amp;diff=15222"/>
				<updated>2014-07-02T21:59:03Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Syntax update 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Exception]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
This article describes many aspects of Exceptions as Objects (ECMA-367 8.26) which will be implemented in ISE Eiffel. All exceptions will be raised as objects which can be accessed by `last_exception'. Exceptions as objects are known as type EXCEPTION and its descendants. EXCEPTION_MANAGER is introduced to handle common exception class operations, i.e. catch, and ignore.&lt;br /&gt;
&lt;br /&gt;
This doc is from the original working version: http://docs.google.com/Doc?docid=dckspcv8_9htpfm4&amp;amp;hl=en&lt;br /&gt;
&lt;br /&gt;
== Exception class hierarchy ==&lt;br /&gt;
  {{Red|EXCEPTION}}&lt;br /&gt;
     {{Red|SYSTEM_EXCEPTION}}&lt;br /&gt;
        {{Red|MACHINE_EXCEPTION}}&lt;br /&gt;
           {{Red|OPERATING_SYSTEM_EXCEPTION}}&lt;br /&gt;
              {{Red|COM_FAILURE}}&lt;br /&gt;
              {{Red|OPERATING_SYSTEM_FAILURE}}&lt;br /&gt;
              {{Red|OPERATING_SYSTEM_SIGNAL_FAILURE}}&lt;br /&gt;
           {{Red|HARDWARE_EXCEPTION}}&lt;br /&gt;
              {{Red|FLOATING_POINT_FAILURE}}&lt;br /&gt;
        {{Red|EIFFEL_EXCEPTION}}&lt;br /&gt;
           {{Red|LANGUAGE_EXCEPTION}}&lt;br /&gt;
              {{Red|BAD_INSPECT_VALUE}}&lt;br /&gt;
              {{Red|VOID_TARGET}}&lt;br /&gt;
              {{Red|VOID_ASSIGNED_TO_EXPANDED}}&lt;br /&gt;
              {{Red|ROUTINE_FAILURE}}&lt;br /&gt;
              EIFFELSTUDIO_SPECIFIC_LANGUAGE_EXCEPTION&lt;br /&gt;
                 CREATE_ON_DEFERRED&lt;br /&gt;
                 ADDRESS_APPLIED_TO_MELTED_FEATURE&lt;br /&gt;
           {{Red|EIFFEL_RUNTIME_EXCEPTION}}&lt;br /&gt;
              NO_MORE_MEMORY&lt;br /&gt;
              DATA_EXCEPTION&lt;br /&gt;
                 IO_FAILURE&lt;br /&gt;
                 SERIALIZATION_FAILURE&lt;br /&gt;
                 MISMATCH_FAILURE&lt;br /&gt;
              EXTERNAL_FAILURE-- Only used for threads at the moment&lt;br /&gt;
              EIFFEL_RUNTIME_PANIC               &lt;br /&gt;
    {{Red|ASSERTION_VIOLATION}}&lt;br /&gt;
       {{Red|INVARIANT_VIOLATION}}&lt;br /&gt;
       {{Red|PRECONDITION_VIOLATION}}&lt;br /&gt;
       {{Red|POSTCONDITION_VIOLATION}}&lt;br /&gt;
       {{Red|CHECK_VIOLATION}}&lt;br /&gt;
       {{Red|VARIANT_VIOLATION}}&lt;br /&gt;
       {{Red|OLD_VIOLATION}}&lt;br /&gt;
       {{Red|LOOP_INVARIANT_VIOLATION}}&lt;br /&gt;
    {{Red|DEVELOPER_EXCEPTION}}&lt;br /&gt;
    {{Red|OBSOLETE_EXCEPTION}}     &lt;br /&gt;
       RESUMPTION_FAILURE Was RESUMPTION_FAILED.&lt;br /&gt;
       RESCUE_FAILURE --------- SHOULD NOT APPLY ANY MORE WITH ISO/ECMA, CHECK!!!&lt;br /&gt;
       EXCEPTION_IN_SIGNAL_HANDLER_FAILURE&lt;br /&gt;
&lt;br /&gt;
Classes in red plus EXCEPTION_MANAGER will be placed at base\elks\kernel\exceptions\.&lt;br /&gt;
The rests are ise specific.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Terminology'''&lt;br /&gt;
We use _EXCEPTION for intermediate nodes in the hierarchy; when we need a term in the leaves of the hierarchy we don't use EXCEPTION but&lt;br /&gt;
  &lt;br /&gt;
    * _VIOLATION for assertions (also used for ASSERTION_VIOLATION, an intermediate node)&lt;br /&gt;
    * _FAILURE otherwise&lt;br /&gt;
  &lt;br /&gt;
  This is consistent with Eiffel exception terminology since from the viewpoint of Eiffel these things have failed, for example a signal was not handled properly. The Eiffel runtime is causing an exception in the Eiffel code as a result, but the original event was a failure.  Hence SERIALIZATION_FAILURE etc.&lt;br /&gt;
&lt;br /&gt;
== Raise and catch an exception ==&lt;br /&gt;
&lt;br /&gt;
==== Catching an exception ====&lt;br /&gt;
All exceptions can possibly be caught. `is_caught' is set by default. Only the given type of exception is `ignore'd in EXCEPTION_MANAGER if possible, it hence is not caught.&lt;br /&gt;
The caught exception can be accessed by `last_exception'.&lt;br /&gt;
&lt;br /&gt;
==== Raising an exception ====&lt;br /&gt;
There are two types of exceptions concerning how an exception is raised.&lt;br /&gt;
* System raised&lt;br /&gt;
Exception raised through the runtime. Most exceptions of this type are predefine as classes in base library. i.e. assertion violations, no memory exceptions and routine failures.&lt;br /&gt;
* User raised&lt;br /&gt;
User raised exceptions are initialized by users and raised by explicit call of {EXCEPTION}.raise.&lt;br /&gt;
&lt;br /&gt;
Theoretically the runtime can raise any exceptions known. A user can only raise an EXCEPTION that is `is_raisable'. `is_raisable' is possible true only when the exception is of DEVELOPER_EXCEPTION. This means only raising a DEVELOPER_EXCEPTION or its descendant is guaranteed correct.&lt;br /&gt;
&lt;br /&gt;
== Ignoring, continuing an exception ==&lt;br /&gt;
&lt;br /&gt;
Quote from ECMA 8.26.12:&lt;br /&gt;
  It is possible, through routines of the Kernel Library class EXCEPTION, to ensure that exceptions of certain types be:&lt;br /&gt;
  &lt;br /&gt;
  * Ignored: lead to no change of non-exception semantics.&lt;br /&gt;
  * Continued: lead to execution of a programmer-specified routine, then to continuation of the execution according to non-exception semantics.&lt;br /&gt;
&lt;br /&gt;
An ignorable exception can be ignored. When an exception is ignored, the raising does nothing as if non-exception semantics.&lt;br /&gt;
What are the exceptions not ignorable?&lt;br /&gt;
&lt;br /&gt;
Related queries in EXCEPTION:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
is_ignored: BOOLEAN&lt;br /&gt;
is_caught: BOOLEAN&lt;br /&gt;
is_ignorable: BOOLEAN&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Related routines in EXCEPTION_MANAGER:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
is_caught (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
is_ignored (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
is_ignorable (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
catch (a_exception: TYPE [EXCEPTION]) &lt;br /&gt;
ignore (a_exception: TYPE [EXCEPTION]) &lt;br /&gt;
set_is_ignored (a_exception: TYPE [EXCEPTION]; a_ignored: BOOLEAN)&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== `origin' VS `cause' ==&lt;br /&gt;
&lt;br /&gt;
* The origin of an exception is, among all exceptions that have so far been triggered but not handled, the most recent one that is not a ROUTINE_FAILURE. Because a ROUTINE_FAILURE is always the result of an exception of another kind, the `origin' is always defined.&lt;br /&gt;
&lt;br /&gt;
* The `cause' of an exception is only interesting in the case of an exception triggered in a rescue clause. In that case the exception is the result of incomplete handling of another exception (which might be a ROUTINE_FAILURE or any other kind). Then the `cause' is that other exception.&lt;br /&gt;
&lt;br /&gt;
* If an exception was not triggered in a rescue clause, its `cause' is the exception itself.&lt;br /&gt;
&lt;br /&gt;
== Exception at rescue clause ==&lt;br /&gt;
See the following diagram:&lt;br /&gt;
&lt;br /&gt;
[[Image:exception_in_rescue.png]]&lt;br /&gt;
&lt;br /&gt;
Exception e2 is kept as `cause' at d.f4 in which e3 is raised, and being called in rescue clause r2. In this case e3 is accessible by `last_exception' and e2 is accessible by `cause' of e3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&lt;br /&gt;
A behavior should be clarified, that when an exception occurs deep in execution level of a rescue clause, `last_exception' is understood as &amp;quot;last unhandled exception&amp;quot;.&lt;br /&gt;
&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. A new exception causes &amp;quot;last_exception&amp;quot; to be saved somewhere before&lt;br /&gt;
entering &amp;quot;rescue&amp;quot; clause. After that the new exception object is attached to&lt;br /&gt;
&amp;quot;last_exception&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
2. If an exception is not handled (there is no rescue clause or &amp;quot;retry&amp;quot; is not&lt;br /&gt;
performed), a new exception object &amp;quot;ROUTINE_FAILURE&amp;quot; is created, its attribute&lt;br /&gt;
&amp;quot;original_exception&amp;quot; is set to &amp;quot;last_exception&amp;quot;, and &amp;quot;last_exception&amp;quot; is set to&lt;br /&gt;
this new &amp;quot;ROUTINE_FAILURE&amp;quot; object.&lt;br /&gt;
&lt;br /&gt;
3. If an exception is handled (&amp;quot;retry&amp;quot; is executed), &amp;quot;last_exception&amp;quot; is attached&lt;br /&gt;
a value saved in step 1.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
If &amp;quot;last_exception&amp;quot; in the following code snippet is modified&lt;br /&gt;
by the call to feature &amp;quot;h&amp;quot; that raises an exception internally and handles it?&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
        rescue&lt;br /&gt;
                -- &amp;quot;last_exception&amp;quot; is set to &amp;quot;X&amp;quot;.&lt;br /&gt;
                -- Call feature that raises exception &amp;quot;Y&amp;quot;, but handles it.&lt;br /&gt;
            h&lt;br /&gt;
&lt;br /&gt;
                -- Is &amp;quot;last_exception&amp;quot; set to &amp;quot;X&amp;quot; or to &amp;quot;Y&amp;quot;?&lt;br /&gt;
                -- The answer is X.&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OLD_VIOLATION ==&lt;br /&gt;
&lt;br /&gt;
OLD_VIOLATION behaves similarly with ROUTINE_FAILURE. In other words, OLD_VIOLATION is never a &amp;quot;root&amp;quot; exception of an exception chain. According to ECMA 8.26.11, OLD_VIOLATION should be treated as a &amp;quot;root&amp;quot; exception. But I believe it is more interesting to know the cause (original exception) of the old voilation. This will be clarified soon.&lt;br /&gt;
&lt;br /&gt;
== Class ANY ==&lt;br /&gt;
This is now done in EXCEPTION_MANAGER.&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class ANY&lt;br /&gt;
...&lt;br /&gt;
feature -- Exception&lt;br /&gt;
&lt;br /&gt;
    frozen last_exception: EXCEPTION&lt;br /&gt;
            -- Last exception&lt;br /&gt;
        external&lt;br /&gt;
            &amp;quot;built_in&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Class EXCEPTION ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
deferred class interface&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	code: INTEGER_32&lt;br /&gt;
			-- Code of the exception.&lt;br /&gt;
			-- |Maybe we don't need this anymore&lt;br /&gt;
&lt;br /&gt;
	exception_trace: STRING_8&lt;br /&gt;
			-- String representation of current exception trace&lt;br /&gt;
&lt;br /&gt;
	meaning: STRING_8&lt;br /&gt;
			-- A message in English describing what `except' is&lt;br /&gt;
&lt;br /&gt;
	message: STRING_8&lt;br /&gt;
			-- Tag of current exception&lt;br /&gt;
&lt;br /&gt;
	original: EXCEPTION&lt;br /&gt;
			-- Original exception that triggered current exception&lt;br /&gt;
&lt;br /&gt;
	cause: EXCEPTION&lt;br /&gt;
			-- Unhandled exception before current exception was triggered in a rescue clause&lt;br /&gt;
&lt;br /&gt;
	recipient_name: STRING_8&lt;br /&gt;
			-- Name of the routine whose execution was&lt;br /&gt;
			-- interrupted by current exception&lt;br /&gt;
&lt;br /&gt;
	type_name: STRING_8&lt;br /&gt;
			-- Name of the class that includes the recipient&lt;br /&gt;
			-- of original form of current exception&lt;br /&gt;
	&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	is_caught: BOOLEAN&lt;br /&gt;
			-- If set, exception is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_caught_implies_is_ignorable: not Result implies is_ignorable&lt;br /&gt;
			not_is_ignored: not is_ignored&lt;br /&gt;
&lt;br /&gt;
	is_ignorable: BOOLEAN&lt;br /&gt;
			-- Is current exception ignorable?&lt;br /&gt;
&lt;br /&gt;
	is_ignored: BOOLEAN&lt;br /&gt;
			-- If set, no exception is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored_implies_is_ignorable: Result implies is_ignorable&lt;br /&gt;
			not_is_caught: not is_caught&lt;br /&gt;
&lt;br /&gt;
	is_raisable: BOOLEAN&lt;br /&gt;
			-- Is current exception raisable by raise?&lt;br /&gt;
	&lt;br /&gt;
feature -- Raise&lt;br /&gt;
&lt;br /&gt;
	raise&lt;br /&gt;
			-- Raise current exception&lt;br /&gt;
		require&lt;br /&gt;
			is_raisable: is_raisable&lt;br /&gt;
	&lt;br /&gt;
end -- class EXCEPTION&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Class EXCEPTION_MANAGER ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class interface&lt;br /&gt;
	EXCEPTION_MANAGER&lt;br /&gt;
&lt;br /&gt;
create &lt;br /&gt;
	default_create&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	frozen last_exception: EXCEPTION&lt;br /&gt;
			-- Last exception&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	is_caught (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_ignored: not is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	is_ignorable (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is ignorable.&lt;br /&gt;
&lt;br /&gt;
	is_ignored (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is not raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_caught: not is_caught (a_exception)&lt;br /&gt;
	&lt;br /&gt;
feature -- Status setting&lt;br /&gt;
&lt;br /&gt;
	catch (a_exception: TYPE [EXCEPTION])&lt;br /&gt;
			-- Set type of `a_exception' is_ignored.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored: not is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	ignore (a_exception: TYPE [EXCEPTION])&lt;br /&gt;
			-- Make sure that any exception of code `code' will be&lt;br /&gt;
			-- ignored. This is not the default.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
			is_ignorable: is_ignorable (a_exception)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_caught: is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	set_is_ignored (a_exception: TYPE [EXCEPTION]; a_ignored: BOOLEAN)&lt;br /&gt;
			-- Set type of `a_exception' to be `a_ignored'.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
			a_ignored_implies_is_ignorable: a_ignored implies is_ignorable (a_exception)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored_set: is_ignored (a_exception) = a_ignored&lt;br /&gt;
	&lt;br /&gt;
end -- class EXCEPTION_MANAGER&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default rescue ==&lt;br /&gt;
As specified in ECMA, `default_rescue' in ANY or its descendant is called as unqualified when an internal routine or an attributes with no rescue clause fails.&lt;br /&gt;
We choose not to invoke it when it is not redefined, or this will be too expensive.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class ANY&lt;br /&gt;
...&lt;br /&gt;
    default_rescue&lt;br /&gt;
       do&lt;br /&gt;
       end&lt;br /&gt;
...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample code: Raising and catching developer exception ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    MY_EXCEPTION&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
    DEVELOPER_EXCEPTION&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    A&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
&lt;br /&gt;
    f&lt;br /&gt;
        local&lt;br /&gt;
            retried: BOOLEAN&lt;br /&gt;
        do&lt;br /&gt;
            if not retried then&lt;br /&gt;
                my_exception.raise   -- Raise user-defined exception.&lt;br /&gt;
            end&lt;br /&gt;
        rescue&lt;br /&gt;
            if last_exception = my_exception then   -- Check the exception object was the one user defined.&lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    my_exception: MY_EXCEPTION&lt;br /&gt;
        once&lt;br /&gt;
            create Result&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    APPLICATION&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
    A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
            -- Run application.&lt;br /&gt;
        local&lt;br /&gt;
            a: A&lt;br /&gt;
            retried: BOOLEAN&lt;br /&gt;
        do&lt;br /&gt;
            if not retried then&lt;br /&gt;
                create a&lt;br /&gt;
                a.f&lt;br /&gt;
            end&lt;br /&gt;
        rescue&lt;br /&gt;
            retried := True&lt;br /&gt;
                &lt;br /&gt;
            -- `last_exception' is an object of ROUTINE_FAILURE?&lt;br /&gt;
            if attached {ROUTINE_FAILURE} (create {EXCEPTION_MANAGER}).last_exception as l_exception then&lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
                &lt;br /&gt;
            -- `original' exception is the one caused `last_exception'?&lt;br /&gt;
            if last_exception.original = my_exception then   &lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
            retry&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end -- class APPLICATION&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Exceptions_as_Objects&amp;diff=15221</id>
		<title>Exceptions as Objects</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Exceptions_as_Objects&amp;diff=15221"/>
				<updated>2014-07-02T21:58:13Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Style update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Exception]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
This article describes many aspects of Exceptions as Objects (ECMA-367 8.26) which will be implemented in ISE Eiffel. All exceptions will be raised as objects which can be accessed by `last_exception'. Exceptions as objects are known as type EXCEPTION and its descendants. EXCEPTION_MANAGER is introduced to handle common exception class operations, i.e. catch, and ignore.&lt;br /&gt;
&lt;br /&gt;
This doc is from the original working version: http://docs.google.com/Doc?docid=dckspcv8_9htpfm4&amp;amp;hl=en&lt;br /&gt;
&lt;br /&gt;
== Exception class hierarchy ==&lt;br /&gt;
  {{Red|EXCEPTION}}&lt;br /&gt;
     {{Red|SYSTEM_EXCEPTION}}&lt;br /&gt;
        {{Red|MACHINE_EXCEPTION}}&lt;br /&gt;
           {{Red|OPERATING_SYSTEM_EXCEPTION}}&lt;br /&gt;
              {{Red|COM_FAILURE}}&lt;br /&gt;
              {{Red|OPERATING_SYSTEM_FAILURE}}&lt;br /&gt;
              {{Red|OPERATING_SYSTEM_SIGNAL_FAILURE}}&lt;br /&gt;
           {{Red|HARDWARE_EXCEPTION}}&lt;br /&gt;
              {{Red|FLOATING_POINT_FAILURE}}&lt;br /&gt;
        {{Red|EIFFEL_EXCEPTION}}&lt;br /&gt;
           {{Red|LANGUAGE_EXCEPTION}}&lt;br /&gt;
              {{Red|BAD_INSPECT_VALUE}}&lt;br /&gt;
              {{Red|VOID_TARGET}}&lt;br /&gt;
              {{Red|VOID_ASSIGNED_TO_EXPANDED}}&lt;br /&gt;
              {{Red|ROUTINE_FAILURE}}&lt;br /&gt;
              EIFFELSTUDIO_SPECIFIC_LANGUAGE_EXCEPTION&lt;br /&gt;
                 CREATE_ON_DEFERRED&lt;br /&gt;
                 ADDRESS_APPLIED_TO_MELTED_FEATURE&lt;br /&gt;
           {{Red|EIFFEL_RUNTIME_EXCEPTION}}&lt;br /&gt;
              NO_MORE_MEMORY&lt;br /&gt;
              DATA_EXCEPTION&lt;br /&gt;
                 IO_FAILURE&lt;br /&gt;
                 SERIALIZATION_FAILURE&lt;br /&gt;
                 MISMATCH_FAILURE&lt;br /&gt;
              EXTERNAL_FAILURE-- Only used for threads at the moment&lt;br /&gt;
              EIFFEL_RUNTIME_PANIC               &lt;br /&gt;
    {{Red|ASSERTION_VIOLATION}}&lt;br /&gt;
       {{Red|INVARIANT_VIOLATION}}&lt;br /&gt;
       {{Red|PRECONDITION_VIOLATION}}&lt;br /&gt;
       {{Red|POSTCONDITION_VIOLATION}}&lt;br /&gt;
       {{Red|CHECK_VIOLATION}}&lt;br /&gt;
       {{Red|VARIANT_VIOLATION}}&lt;br /&gt;
       {{Red|OLD_VIOLATION}}&lt;br /&gt;
       {{Red|LOOP_INVARIANT_VIOLATION}}&lt;br /&gt;
    {{Red|DEVELOPER_EXCEPTION}}&lt;br /&gt;
    {{Red|OBSOLETE_EXCEPTION}}     &lt;br /&gt;
       RESUMPTION_FAILURE Was RESUMPTION_FAILED.&lt;br /&gt;
       RESCUE_FAILURE --------- SHOULD NOT APPLY ANY MORE WITH ISO/ECMA, CHECK!!!&lt;br /&gt;
       EXCEPTION_IN_SIGNAL_HANDLER_FAILURE&lt;br /&gt;
&lt;br /&gt;
Classes in red plus EXCEPTION_MANAGER will be placed at base\elks\kernel\exceptions\.&lt;br /&gt;
The rests are ise specific.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Terminology'''&lt;br /&gt;
We use _EXCEPTION for intermediate nodes in the hierarchy; when we need a term in the leaves of the hierarchy we don't use EXCEPTION but&lt;br /&gt;
  &lt;br /&gt;
    * _VIOLATION for assertions (also used for ASSERTION_VIOLATION, an intermediate node)&lt;br /&gt;
    * _FAILURE otherwise&lt;br /&gt;
  &lt;br /&gt;
  This is consistent with Eiffel exception terminology since from the viewpoint of Eiffel these things have failed, for example a signal was not handled properly. The Eiffel runtime is causing an exception in the Eiffel code as a result, but the original event was a failure.  Hence SERIALIZATION_FAILURE etc.&lt;br /&gt;
&lt;br /&gt;
== Raise and catch an exception ==&lt;br /&gt;
&lt;br /&gt;
==== Catching an exception ====&lt;br /&gt;
All exceptions can possibly be caught. `is_caught' is set by default. Only the given type of exception is `ignore'd in EXCEPTION_MANAGER if possible, it hence is not caught.&lt;br /&gt;
The caught exception can be accessed by `last_exception'.&lt;br /&gt;
&lt;br /&gt;
==== Raising an exception ====&lt;br /&gt;
There are two types of exceptions concerning how an exception is raised.&lt;br /&gt;
* System raised&lt;br /&gt;
Exception raised through the runtime. Most exceptions of this type are predefine as classes in base library. i.e. assertion violations, no memory exceptions and routine failures.&lt;br /&gt;
* User raised&lt;br /&gt;
User raised exceptions are initialized by users and raised by explicit call of {EXCEPTION}.raise.&lt;br /&gt;
&lt;br /&gt;
Theoretically the runtime can raise any exceptions known. A user can only raise an EXCEPTION that is `is_raisable'. `is_raisable' is possible true only when the exception is of DEVELOPER_EXCEPTION. This means only raising a DEVELOPER_EXCEPTION or its descendant is guaranteed correct.&lt;br /&gt;
&lt;br /&gt;
== Ignoring, continuing an exception ==&lt;br /&gt;
&lt;br /&gt;
Quote from ECMA 8.26.12:&lt;br /&gt;
  It is possible, through routines of the Kernel Library class EXCEPTION, to ensure that exceptions of certain types be:&lt;br /&gt;
  &lt;br /&gt;
  * Ignored: lead to no change of non-exception semantics.&lt;br /&gt;
  * Continued: lead to execution of a programmer-specified routine, then to continuation of the execution according to non-exception semantics.&lt;br /&gt;
&lt;br /&gt;
An ignorable exception can be ignored. When an exception is ignored, the raising does nothing as if non-exception semantics.&lt;br /&gt;
What are the exceptions not ignorable?&lt;br /&gt;
&lt;br /&gt;
Related queries in EXCEPTION:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
is_ignored: BOOLEAN&lt;br /&gt;
is_caught: BOOLEAN&lt;br /&gt;
is_ignorable: BOOLEAN&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Related routines in EXCEPTION_MANAGER:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
is_caught (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
is_ignored (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
is_ignorable (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
catch (a_exception: TYPE [EXCEPTION]) &lt;br /&gt;
ignore (a_exception: TYPE [EXCEPTION]) &lt;br /&gt;
set_is_ignored (a_exception: TYPE [EXCEPTION]; a_ignored: BOOLEAN)&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== `origin' VS `cause' ==&lt;br /&gt;
&lt;br /&gt;
* The origin of an exception is, among all exceptions that have so far been triggered but not handled, the most recent one that is not a ROUTINE_FAILURE. Because a ROUTINE_FAILURE is always the result of an exception of another kind, the `origin' is always defined.&lt;br /&gt;
&lt;br /&gt;
* The `cause' of an exception is only interesting in the case of an exception triggered in a rescue clause. In that case the exception is the result of incomplete handling of another exception (which might be a ROUTINE_FAILURE or any other kind). Then the `cause' is that other exception.&lt;br /&gt;
&lt;br /&gt;
* If an exception was not triggered in a rescue clause, its `cause' is the exception itself.&lt;br /&gt;
&lt;br /&gt;
== Exception at rescue clause ==&lt;br /&gt;
See the following diagram:&lt;br /&gt;
&lt;br /&gt;
[[Image:exception_in_rescue.png]]&lt;br /&gt;
&lt;br /&gt;
Exception e2 is kept as `cause' at d.f4 in which e3 is raised, and being called in rescue clause r2. In this case e3 is accessible by `last_exception' and e2 is accessible by `cause' of e3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&lt;br /&gt;
A behavior should be clarified, that when an exception occurs deep in execution level of a rescue clause, `last_exception' is understood as &amp;quot;last unhandled exception&amp;quot;.&lt;br /&gt;
&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. A new exception causes &amp;quot;last_exception&amp;quot; to be saved somewhere before&lt;br /&gt;
entering &amp;quot;rescue&amp;quot; clause. After that the new exception object is attached to&lt;br /&gt;
&amp;quot;last_exception&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
2. If an exception is not handled (there is no rescue clause or &amp;quot;retry&amp;quot; is not&lt;br /&gt;
performed), a new exception object &amp;quot;ROUTINE_FAILURE&amp;quot; is created, its attribute&lt;br /&gt;
&amp;quot;original_exception&amp;quot; is set to &amp;quot;last_exception&amp;quot;, and &amp;quot;last_exception&amp;quot; is set to&lt;br /&gt;
this new &amp;quot;ROUTINE_FAILURE&amp;quot; object.&lt;br /&gt;
&lt;br /&gt;
3. If an exception is handled (&amp;quot;retry&amp;quot; is executed), &amp;quot;last_exception&amp;quot; is attached&lt;br /&gt;
a value saved in step 1.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
If &amp;quot;last_exception&amp;quot; in the following code snippet is modified&lt;br /&gt;
by the call to feature &amp;quot;h&amp;quot; that raises an exception internally and handles it?&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
        rescue&lt;br /&gt;
                -- &amp;quot;last_exception&amp;quot; is set to &amp;quot;X&amp;quot;.&lt;br /&gt;
                -- Call feature that raises exception &amp;quot;Y&amp;quot;, but handles it.&lt;br /&gt;
            h&lt;br /&gt;
&lt;br /&gt;
                -- Is &amp;quot;last_exception&amp;quot; set to &amp;quot;X&amp;quot; or to &amp;quot;Y&amp;quot;?&lt;br /&gt;
                -- The answer is X.&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OLD_VIOLATION ==&lt;br /&gt;
&lt;br /&gt;
OLD_VIOLATION behaves similarly with ROUTINE_FAILURE. In other words, OLD_VIOLATION is never a &amp;quot;root&amp;quot; exception of an exception chain. According to ECMA 8.26.11, OLD_VIOLATION should be treated as a &amp;quot;root&amp;quot; exception. But I believe it is more interesting to know the cause (original exception) of the old voilation. This will be clarified soon.&lt;br /&gt;
&lt;br /&gt;
== Class ANY ==&lt;br /&gt;
This is now done in EXCEPTION_MANAGER.&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class ANY&lt;br /&gt;
...&lt;br /&gt;
feature -- Exception&lt;br /&gt;
&lt;br /&gt;
    frozen last_exception: EXCEPTION&lt;br /&gt;
            -- Last exception&lt;br /&gt;
        external&lt;br /&gt;
            &amp;quot;built_in&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Class EXCEPTION ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
deferred class interface&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	code: INTEGER_32&lt;br /&gt;
			-- Code of the exception.&lt;br /&gt;
			-- |Maybe we don't need this anymore&lt;br /&gt;
&lt;br /&gt;
	exception_trace: STRING_8&lt;br /&gt;
			-- String representation of current exception trace&lt;br /&gt;
&lt;br /&gt;
	meaning: STRING_8&lt;br /&gt;
			-- A message in English describing what `except' is&lt;br /&gt;
&lt;br /&gt;
	message: STRING_8&lt;br /&gt;
			-- Tag of current exception&lt;br /&gt;
&lt;br /&gt;
	original: EXCEPTION&lt;br /&gt;
			-- Original exception that triggered current exception&lt;br /&gt;
&lt;br /&gt;
	cause: EXCEPTION&lt;br /&gt;
			-- Unhandled exception before current exception was triggered in a rescue clause&lt;br /&gt;
&lt;br /&gt;
	recipient_name: STRING_8&lt;br /&gt;
			-- Name of the routine whose execution was&lt;br /&gt;
			-- interrupted by current exception&lt;br /&gt;
&lt;br /&gt;
	type_name: STRING_8&lt;br /&gt;
			-- Name of the class that includes the recipient&lt;br /&gt;
			-- of original form of current exception&lt;br /&gt;
	&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	is_caught: BOOLEAN&lt;br /&gt;
			-- If set, exception is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_caught_implies_is_ignorable: not Result implies is_ignorable&lt;br /&gt;
			not_is_ignored: not is_ignored&lt;br /&gt;
&lt;br /&gt;
	is_ignorable: BOOLEAN&lt;br /&gt;
			-- Is current exception ignorable?&lt;br /&gt;
&lt;br /&gt;
	is_ignored: BOOLEAN&lt;br /&gt;
			-- If set, no exception is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored_implies_is_ignorable: Result implies is_ignorable&lt;br /&gt;
			not_is_caught: not is_caught&lt;br /&gt;
&lt;br /&gt;
	is_raisable: BOOLEAN&lt;br /&gt;
			-- Is current exception raisable by raise?&lt;br /&gt;
	&lt;br /&gt;
feature -- Raise&lt;br /&gt;
&lt;br /&gt;
	raise&lt;br /&gt;
			-- Raise current exception&lt;br /&gt;
		require&lt;br /&gt;
			is_raisable: is_raisable&lt;br /&gt;
	&lt;br /&gt;
end -- class EXCEPTION&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Class EXCEPTION_MANAGER ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class interface&lt;br /&gt;
	EXCEPTION_MANAGER&lt;br /&gt;
&lt;br /&gt;
create &lt;br /&gt;
	default_create&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	frozen last_exception: EXCEPTION&lt;br /&gt;
			-- Last exception&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	is_caught (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_ignored: not is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	is_ignorable (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is ignorable.&lt;br /&gt;
&lt;br /&gt;
	is_ignored (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is not raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_caught: not is_caught (a_exception)&lt;br /&gt;
	&lt;br /&gt;
feature -- Status setting&lt;br /&gt;
&lt;br /&gt;
	catch (a_exception: TYPE [EXCEPTION])&lt;br /&gt;
			-- Set type of `a_exception' is_ignored.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored: not is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	ignore (a_exception: TYPE [EXCEPTION])&lt;br /&gt;
			-- Make sure that any exception of code `code' will be&lt;br /&gt;
			-- ignored. This is not the default.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
			is_ignorable: is_ignorable (a_exception)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_caught: is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	set_is_ignored (a_exception: TYPE [EXCEPTION]; a_ignored: BOOLEAN)&lt;br /&gt;
			-- Set type of `a_exception' to be `a_ignored'.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
			a_ignored_implies_is_ignorable: a_ignored implies is_ignorable (a_exception)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored_set: is_ignored (a_exception) = a_ignored&lt;br /&gt;
	&lt;br /&gt;
end -- class EXCEPTION_MANAGER&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default rescue ==&lt;br /&gt;
As specified in ECMA, `default_rescue' in ANY or its descendant is called as unqualified when an internal routine or an attributes with no rescue clause fails.&lt;br /&gt;
We choose not to invoke it when it is not redefined, or this will be too expensive.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class ANY&lt;br /&gt;
...&lt;br /&gt;
    default_rescue is&lt;br /&gt;
       do&lt;br /&gt;
       end&lt;br /&gt;
...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample code: Raising and catching developer exception ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    MY_EXCEPTION&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
    DEVELOPER_EXCEPTION&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    A&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
&lt;br /&gt;
    f&lt;br /&gt;
        local&lt;br /&gt;
            retried: BOOLEAN&lt;br /&gt;
        do&lt;br /&gt;
            if not retried then&lt;br /&gt;
                my_exception.raise   -- Raise user-defined exception.&lt;br /&gt;
            end&lt;br /&gt;
        rescue&lt;br /&gt;
            if last_exception = my_exception then   -- Check the exception object was the one user defined.&lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    my_exception: MY_EXCEPTION&lt;br /&gt;
        once&lt;br /&gt;
            create Result&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    APPLICATION&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
    A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
            -- Run application.&lt;br /&gt;
        local&lt;br /&gt;
            a: A&lt;br /&gt;
            retried: BOOLEAN&lt;br /&gt;
        do&lt;br /&gt;
            if not retried then&lt;br /&gt;
                create a&lt;br /&gt;
                a.f&lt;br /&gt;
            end&lt;br /&gt;
        rescue&lt;br /&gt;
            retried := True&lt;br /&gt;
                &lt;br /&gt;
            -- `last_exception' is an object of ROUTINE_FAILURE?&lt;br /&gt;
            if attached {ROUTINE_FAILURE} (create {EXCEPTION_MANAGER}).last_exception as l_exception then&lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
                &lt;br /&gt;
            -- `original' exception is the one caused `last_exception'?&lt;br /&gt;
            if last_exception.original = my_exception then   &lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
            retry&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end -- class APPLICATION&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Exceptions_as_Objects&amp;diff=15220</id>
		<title>Exceptions as Objects</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Exceptions_as_Objects&amp;diff=15220"/>
				<updated>2014-07-02T21:47:36Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Update syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Exception]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
This article describes many aspects of Exceptions as Objects (ECMA-367 8.26) which will be implemented in ISE Eiffel. All exceptions will be raised as objects which can be accessed by `last_exception'. Exceptions as objects are known as type EXCEPTION and its descendants. EXCEPTION_MANAGER is introduced to handle common exception class operations, i.e. catch, and ignore.&lt;br /&gt;
&lt;br /&gt;
This doc is from the original working version: http://docs.google.com/Doc?docid=dckspcv8_9htpfm4&amp;amp;hl=en&lt;br /&gt;
&lt;br /&gt;
== Exception class hierarchy ==&lt;br /&gt;
  {{Red|EXCEPTION}}&lt;br /&gt;
     {{Red|SYSTEM_EXCEPTION}}&lt;br /&gt;
        {{Red|MACHINE_EXCEPTION}}&lt;br /&gt;
           {{Red|OPERATING_SYSTEM_EXCEPTION}}&lt;br /&gt;
              {{Red|COM_FAILURE}}&lt;br /&gt;
              {{Red|OPERATING_SYSTEM_FAILURE}}&lt;br /&gt;
              {{Red|OPERATING_SYSTEM_SIGNAL_FAILURE}}&lt;br /&gt;
           {{Red|HARDWARE_EXCEPTION}}&lt;br /&gt;
              {{Red|FLOATING_POINT_FAILURE}}&lt;br /&gt;
        {{Red|EIFFEL_EXCEPTION}}&lt;br /&gt;
           {{Red|LANGUAGE_EXCEPTION}}&lt;br /&gt;
              {{Red|BAD_INSPECT_VALUE}}&lt;br /&gt;
              {{Red|VOID_TARGET}}&lt;br /&gt;
              {{Red|VOID_ASSIGNED_TO_EXPANDED}}&lt;br /&gt;
              {{Red|ROUTINE_FAILURE}}&lt;br /&gt;
              EIFFELSTUDIO_SPECIFIC_LANGUAGE_EXCEPTION&lt;br /&gt;
                 CREATE_ON_DEFERRED&lt;br /&gt;
                 ADDRESS_APPLIED_TO_MELTED_FEATURE&lt;br /&gt;
           {{Red|EIFFEL_RUNTIME_EXCEPTION}}&lt;br /&gt;
              NO_MORE_MEMORY&lt;br /&gt;
              DATA_EXCEPTION&lt;br /&gt;
                 IO_FAILURE&lt;br /&gt;
                 SERIALIZATION_FAILURE&lt;br /&gt;
                 MISMATCH_FAILURE&lt;br /&gt;
              EXTERNAL_FAILURE-- Only used for threads at the moment&lt;br /&gt;
              EIFFEL_RUNTIME_PANIC               &lt;br /&gt;
    {{Red|ASSERTION_VIOLATION}}&lt;br /&gt;
       {{Red|INVARIANT_VIOLATION}}&lt;br /&gt;
       {{Red|PRECONDITION_VIOLATION}}&lt;br /&gt;
       {{Red|POSTCONDITION_VIOLATION}}&lt;br /&gt;
       {{Red|CHECK_VIOLATION}}&lt;br /&gt;
       {{Red|VARIANT_VIOLATION}}&lt;br /&gt;
       {{Red|OLD_VIOLATION}}&lt;br /&gt;
       {{Red|LOOP_INVARIANT_VIOLATION}}&lt;br /&gt;
    {{Red|DEVELOPER_EXCEPTION}}&lt;br /&gt;
    {{Red|OBSOLETE_EXCEPTION}}     &lt;br /&gt;
       RESUMPTION_FAILURE Was RESUMPTION_FAILED.&lt;br /&gt;
       RESCUE_FAILURE --------- SHOULD NOT APPLY ANY MORE WITH ISO/ECMA, CHECK!!!&lt;br /&gt;
       EXCEPTION_IN_SIGNAL_HANDLER_FAILURE&lt;br /&gt;
&lt;br /&gt;
Classes in red plus EXCEPTION_MANAGER will be placed at base\elks\kernel\exceptions\.&lt;br /&gt;
The rests are ise specific.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Terminology'''&lt;br /&gt;
We use _EXCEPTION for intermediate nodes in the hierarchy; when we need a term in the leaves of the hierarchy we don't use EXCEPTION but&lt;br /&gt;
  &lt;br /&gt;
    * _VIOLATION for assertions (also used for ASSERTION_VIOLATION, an intermediate node)&lt;br /&gt;
    * _FAILURE otherwise&lt;br /&gt;
  &lt;br /&gt;
  This is consistent with Eiffel exception terminology since from the viewpoint of Eiffel these things have failed, for example a signal was not handled properly. The Eiffel runtime is causing an exception in the Eiffel code as a result, but the original event was a failure.  Hence SERIALIZATION_FAILURE etc.&lt;br /&gt;
&lt;br /&gt;
== Raise and catch an exception ==&lt;br /&gt;
&lt;br /&gt;
==== Catching an exception ====&lt;br /&gt;
All exceptions can possibly be caught. `is_caught' is set by default. Only the given type of exception is `ignore'd in EXCEPTION_MANAGER if possible, it hence is not caught.&lt;br /&gt;
The caught exception can be accessed by `last_exception'.&lt;br /&gt;
&lt;br /&gt;
==== Raising an exception ====&lt;br /&gt;
There are two types of exceptions concerning how an exception is raised.&lt;br /&gt;
* System raised&lt;br /&gt;
Exception raised through the runtime. Most exceptions of this type are predefine as classes in base library. i.e. assertion violations, no memory exceptions and routine failures.&lt;br /&gt;
* User raised&lt;br /&gt;
User raised exceptions are initialized by users and raised by explicit call of {EXCEPTION}.raise.&lt;br /&gt;
&lt;br /&gt;
Theoretically the runtime can raise any exceptions known. A user can only raise an EXCEPTION that is `is_raisable'. `is_raisable' is possible true only when the exception is of DEVELOPER_EXCEPTION. This means only raising a DEVELOPER_EXCEPTION or its descendant is guaranteed correct.&lt;br /&gt;
&lt;br /&gt;
== Ignoring, continuing an exception ==&lt;br /&gt;
&lt;br /&gt;
Quote from ECMA 8.26.12:&lt;br /&gt;
  It is possible, through routines of the Kernel Library class EXCEPTION, to ensure that exceptions of certain types be:&lt;br /&gt;
  &lt;br /&gt;
  * Ignored: lead to no change of non-exception semantics.&lt;br /&gt;
  * Continued: lead to execution of a programmer-specified routine, then to continuation of the execution according to non-exception semantics.&lt;br /&gt;
&lt;br /&gt;
An ignorable exception can be ignored. When an exception is ignored, the raising does nothing as if non-exception semantics.&lt;br /&gt;
What are the exceptions not ignorable?&lt;br /&gt;
&lt;br /&gt;
Related queries in EXCEPTION:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
is_ignored: BOOLEAN&lt;br /&gt;
is_caught: BOOLEAN&lt;br /&gt;
is_ignorable: BOOLEAN&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Related routines in EXCEPTION_MANAGER:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
is_caught (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
is_ignored (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
is_ignorable (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
catch (a_exception: TYPE [EXCEPTION]) &lt;br /&gt;
ignore (a_exception: TYPE [EXCEPTION]) &lt;br /&gt;
set_is_ignored (a_exception: TYPE [EXCEPTION]; a_ignored: BOOLEAN)&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== `origin' VS `cause' ==&lt;br /&gt;
&lt;br /&gt;
* The origin of an exception is, among all exceptions that have so far been triggered but not handled, the most recent one that is not a ROUTINE_FAILURE. Because a ROUTINE_FAILURE is always the result of an exception of another kind, the `origin' is always defined.&lt;br /&gt;
&lt;br /&gt;
* The `cause' of an exception is only interesting in the case of an exception triggered in a rescue clause. In that case the exception is the result of incomplete handling of another exception (which might be a ROUTINE_FAILURE or any other kind). Then the `cause' is that other exception.&lt;br /&gt;
&lt;br /&gt;
* If an exception was not triggered in a rescue clause, its `cause' is the exception itself.&lt;br /&gt;
&lt;br /&gt;
== Exception at rescue clause ==&lt;br /&gt;
See the following diagram:&lt;br /&gt;
&lt;br /&gt;
[[Image:exception_in_rescue.png]]&lt;br /&gt;
&lt;br /&gt;
Exception e2 is kept as `cause' at d.f4 in which e3 is raised, and being called in rescue clause r2. In this case e3 is accessible by `last_exception' and e2 is accessible by `cause' of e3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&lt;br /&gt;
A behavior should be clarified, that when an exception occurs deep in execution level of a rescue clause, `last_exception' is understood as &amp;quot;last unhandled exception&amp;quot;.&lt;br /&gt;
&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. A new exception causes &amp;quot;last_exception&amp;quot; to be saved somewhere before&lt;br /&gt;
entering &amp;quot;rescue&amp;quot; clause. After that the new exception object is attached to&lt;br /&gt;
&amp;quot;last_exception&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
2. If an exception is not handled (there is no rescue clause or &amp;quot;retry&amp;quot; is not&lt;br /&gt;
performed), a new exception object &amp;quot;ROUTINE_FAILURE&amp;quot; is created, its attribute&lt;br /&gt;
&amp;quot;original_exception&amp;quot; is set to &amp;quot;last_exception&amp;quot;, and &amp;quot;last_exception&amp;quot; is set to&lt;br /&gt;
this new &amp;quot;ROUTINE_FAILURE&amp;quot; object.&lt;br /&gt;
&lt;br /&gt;
3. If an exception is handled (&amp;quot;retry&amp;quot; is executed), &amp;quot;last_exception&amp;quot; is attached&lt;br /&gt;
a value saved in step 1.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
If &amp;quot;last_exception&amp;quot; in the following code snippet is modified&lt;br /&gt;
by the call to feature &amp;quot;h&amp;quot; that raises an exception internally and handles it?&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
        rescue&lt;br /&gt;
                -- &amp;quot;last_exception&amp;quot; is set to &amp;quot;X&amp;quot;.&lt;br /&gt;
                -- Call feature that raises exception &amp;quot;Y&amp;quot;, but handles it.&lt;br /&gt;
            h&lt;br /&gt;
&lt;br /&gt;
                -- Is &amp;quot;last_exception&amp;quot; set to &amp;quot;X&amp;quot; or to &amp;quot;Y&amp;quot;?&lt;br /&gt;
                -- The answer is X.&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OLD_VIOLATION ==&lt;br /&gt;
&lt;br /&gt;
OLD_VIOLATION behaves similarly with ROUTINE_FAILURE. In other words, OLD_VIOLATION is never a &amp;quot;root&amp;quot; exception of an exception chain. According to ECMA 8.26.11, OLD_VIOLATION should be treated as a &amp;quot;root&amp;quot; exception. But I believe it is more interesting to know the cause (original exception) of the old voilation. This will be clarified soon.&lt;br /&gt;
&lt;br /&gt;
== Class ANY ==&lt;br /&gt;
This is now done in EXCEPTION_MANAGER.&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class ANY&lt;br /&gt;
...&lt;br /&gt;
feature -- Exception&lt;br /&gt;
&lt;br /&gt;
    frozen last_exception: EXCEPTION&lt;br /&gt;
            -- Last exception&lt;br /&gt;
        external&lt;br /&gt;
            &amp;quot;built_in&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Class EXCEPTION ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
deferred class interface&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	code: INTEGER_32&lt;br /&gt;
			-- Code of the exception.&lt;br /&gt;
			-- |Maybe we don't need this anymore&lt;br /&gt;
&lt;br /&gt;
	exception_trace: STRING_8&lt;br /&gt;
			-- String representation of current exception trace&lt;br /&gt;
&lt;br /&gt;
	meaning: STRING_8&lt;br /&gt;
			-- A message in English describing what `except' is&lt;br /&gt;
&lt;br /&gt;
	message: STRING_8&lt;br /&gt;
			-- Tag of current exception&lt;br /&gt;
&lt;br /&gt;
	original: EXCEPTION&lt;br /&gt;
			-- Original exception that triggered current exception&lt;br /&gt;
&lt;br /&gt;
	cause: EXCEPTION&lt;br /&gt;
			-- Unhandled exception before current exception was triggered in a rescue clause&lt;br /&gt;
&lt;br /&gt;
	recipient_name: STRING_8&lt;br /&gt;
			-- Name of the routine whose execution was&lt;br /&gt;
			-- interrupted by current exception&lt;br /&gt;
&lt;br /&gt;
	type_name: STRING_8&lt;br /&gt;
			-- Name of the class that includes the recipient&lt;br /&gt;
			-- of original form of current exception&lt;br /&gt;
	&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	is_caught: BOOLEAN&lt;br /&gt;
			-- If set, exception is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_caught_implies_is_ignorable: not Result implies is_ignorable&lt;br /&gt;
			not_is_ignored: not is_ignored&lt;br /&gt;
&lt;br /&gt;
	is_ignorable: BOOLEAN&lt;br /&gt;
			-- Is current exception ignorable?&lt;br /&gt;
&lt;br /&gt;
	is_ignored: BOOLEAN&lt;br /&gt;
			-- If set, no exception is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored_implies_is_ignorable: Result implies is_ignorable&lt;br /&gt;
			not_is_caught: not is_caught&lt;br /&gt;
&lt;br /&gt;
	is_raisable: BOOLEAN&lt;br /&gt;
			-- Is current exception raisable by raise?&lt;br /&gt;
	&lt;br /&gt;
feature -- Raise&lt;br /&gt;
&lt;br /&gt;
	raise&lt;br /&gt;
			-- Raise current exception&lt;br /&gt;
		require&lt;br /&gt;
			is_raisable: is_raisable&lt;br /&gt;
	&lt;br /&gt;
end -- class EXCEPTION&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Class EXCEPTION_MANAGER ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class interface&lt;br /&gt;
	EXCEPTION_MANAGER&lt;br /&gt;
&lt;br /&gt;
create &lt;br /&gt;
	default_create&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	frozen last_exception: EXCEPTION&lt;br /&gt;
			-- Last exception&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	is_caught (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_ignored: not is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	is_ignorable (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is ignorable.&lt;br /&gt;
&lt;br /&gt;
	is_ignored (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is not raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_caught: not is_caught (a_exception)&lt;br /&gt;
	&lt;br /&gt;
feature -- Status setting&lt;br /&gt;
&lt;br /&gt;
	catch (a_exception: TYPE [EXCEPTION])&lt;br /&gt;
			-- Set type of `a_exception' is_ignored.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored: not is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	ignore (a_exception: TYPE [EXCEPTION])&lt;br /&gt;
			-- Make sure that any exception of code `code' will be&lt;br /&gt;
			-- ignored. This is not the default.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
			is_ignorable: is_ignorable (a_exception)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_caught: is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	set_is_ignored (a_exception: TYPE [EXCEPTION]; a_ignored: BOOLEAN)&lt;br /&gt;
			-- Set type of `a_exception' to be `a_ignored'.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
			a_ignored_implies_is_ignorable: a_ignored implies is_ignorable (a_exception)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored_set: is_ignored (a_exception) = a_ignored&lt;br /&gt;
	&lt;br /&gt;
end -- class EXCEPTION_MANAGER&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default rescue ==&lt;br /&gt;
As specified in ECMA, `default_rescue' in ANY or its descendant is called as unqualified when an internal routine or an attributes with no rescue clause fails.&lt;br /&gt;
We choose not to invoke it when it is not redefined, or this will be too expensive.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class ANY&lt;br /&gt;
...&lt;br /&gt;
    default_rescue is&lt;br /&gt;
       do&lt;br /&gt;
       end&lt;br /&gt;
...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample code: Raising and catching developer exception ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
    class&lt;br /&gt;
        MY_EXCEPTION&lt;br /&gt;
&lt;br /&gt;
    inherit&lt;br /&gt;
        DEVELOPER_EXCEPTION&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
    class&lt;br /&gt;
        A&lt;br /&gt;
&lt;br /&gt;
    feature&lt;br /&gt;
&lt;br /&gt;
        f is&lt;br /&gt;
            local&lt;br /&gt;
                retried: BOOLEAN&lt;br /&gt;
            do&lt;br /&gt;
                if not retried then&lt;br /&gt;
                    my_exception.raise   -- Raise user-defined exception.&lt;br /&gt;
                end&lt;br /&gt;
            rescue&lt;br /&gt;
                if last_exception = my_exception then   -- Check the exception object was the one user defined.&lt;br /&gt;
                    print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
                else&lt;br /&gt;
                    print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
        my_exception: MY_EXCEPTION is&lt;br /&gt;
            once&lt;br /&gt;
                create Result&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
    class&lt;br /&gt;
        APPLICATION&lt;br /&gt;
&lt;br /&gt;
    inherit&lt;br /&gt;
        A&lt;br /&gt;
&lt;br /&gt;
    create&lt;br /&gt;
        make&lt;br /&gt;
&lt;br /&gt;
    feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
        make is&lt;br /&gt;
                -- Run application.&lt;br /&gt;
            local&lt;br /&gt;
                a: A&lt;br /&gt;
                retried: BOOLEAN&lt;br /&gt;
            do&lt;br /&gt;
                if not retried then&lt;br /&gt;
                    create a&lt;br /&gt;
                    a.f&lt;br /&gt;
                end&lt;br /&gt;
            rescue&lt;br /&gt;
                retried := True&lt;br /&gt;
                &lt;br /&gt;
                -- `last_exception' is an object of ROUTINE_FAILURE?&lt;br /&gt;
                if attached {ROUTINE_FAILURE} (create {EXCEPTION_MANAGER}).last_exception as l_exception then&lt;br /&gt;
                    print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
                else&lt;br /&gt;
                    print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
                end&lt;br /&gt;
                &lt;br /&gt;
                -- `original' exception is the one caused `last_exception'?&lt;br /&gt;
                if last_exception.original = my_exception then   &lt;br /&gt;
                    print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
                else&lt;br /&gt;
                    print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
                end&lt;br /&gt;
                retry&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
    end -- class APPLICATION&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15186</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=15186"/>
				<updated>2014-05-16T21:56:53Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: readability improvement&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10 loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
&lt;br /&gt;
A consequence is that expanded types are no longer generic creation ready.&lt;br /&gt;
Generic creation ready type could be frozen types with `default_create' as creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class PROPOSITION feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class CURRENT_STANDARD feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
* How express type interval?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class  A feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface A feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clauses are inherited if they are not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;Documentation.&amp;quot;&lt;br /&gt;
            option: stable&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit A redefine something end feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;New documentation.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The `what' clause is not inheried since it is redefined. However the `option' clause is inherited.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Replace obsolete keyword with a simple note clause&lt;br /&gt;
| A note clause could replace the obsolete keyword&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            obsolete: &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
instead of:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        obsolete&lt;br /&gt;
            &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
| A keyword removed; simpler feature definition&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
where (test: PREDICATE [ANY, TUPLE [G]]): like Current&lt;br /&gt;
        -- Items satisfying `test'&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
slice_until, slice_after, ... (test: PREDICATE [ANY, TUPLE [G]]): like Current&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute query result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
abs: NATURAL_32&lt;br /&gt;
        -- (from INTEGER_32_REF)&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `factorial', `even', and `odd' queries&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
factorial: like Current ...&lt;br /&gt;
&lt;br /&gt;
even: BOOLEAN ...&lt;br /&gt;
&lt;br /&gt;
odd: BOOLEAN ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15185</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=15185"/>
				<updated>2014-05-16T21:48:35Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Fix terminolgy&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10 loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
&lt;br /&gt;
A consequence is that expanded types are no longer generic creation ready.&lt;br /&gt;
Generic creation ready type could be frozen types with `default_create' as creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class PROPOSITION feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class CURRENT_STANDARD feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
* How express type interval?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class  A feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface A feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clauses are inherited if they are not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;Documentation.&amp;quot;&lt;br /&gt;
            option: stable&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit A redefine something end feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;New documentation.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The `what' clause is not inheried since it is redefined. However the `option' clause is inherited.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Replace obsolete keyword with a simple note clause&lt;br /&gt;
| A note clause could replace the obsolete keyword&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            obsolete: &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
instead of:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        obsolete&lt;br /&gt;
            &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
| A keyword removed; simpler feature definition&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even', and 'odd' queries&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
factorial: like Current ...&lt;br /&gt;
&lt;br /&gt;
even: BOOLEAN ...&lt;br /&gt;
&lt;br /&gt;
odd: BOOLEAN ...&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15184</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=15184"/>
				<updated>2014-05-16T21:43:38Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Adding cons for Empty braces exportation notation&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10 loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
&lt;br /&gt;
A consequence is that expanded types are no longer generic creation ready.&lt;br /&gt;
Generic creation ready type could be frozen types with `default_create' as creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class PROPOSITION feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class CURRENT_STANDARD feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
* How express type interval?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class  A feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface A feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clauses are inherited if they are not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;Documentation.&amp;quot;&lt;br /&gt;
            option: stable&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit A redefine something end feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;New documentation.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The `what' clause is not inheried since it is redefined. However the `option' clause is inherited.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Replace obsolete keyword with a simple note clause&lt;br /&gt;
| A note clause could replace the obsolete keyword&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            obsolete: &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
instead of:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        obsolete&lt;br /&gt;
            &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
| A keyword removed; simpler feature definition&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=15183</id>
		<title>Default and explicit variance</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=15183"/>
				<updated>2014-05-11T17:09:31Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Discard the extaended variant typing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Catcall]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
In first the variant typing is exposed. It checks all catcall checkpoints.&lt;br /&gt;
In second the inroduced mechanism is compared against other.&lt;br /&gt;
&lt;br /&gt;
== Variant typing ==&lt;br /&gt;
What is the advantages of covariance compared to a novariant typing?&lt;br /&gt;
* explicit and adaptative interface&lt;br /&gt;
* One routine&lt;br /&gt;
&lt;br /&gt;
=== Variant typing ===&lt;br /&gt;
* A variant entity has '''the most restrictive type'''. &lt;br /&gt;
* A variant entity requires a simple object test to use the entity with the '''expected type'''.&lt;br /&gt;
&lt;br /&gt;
Examples are available in next sections.&lt;br /&gt;
&lt;br /&gt;
=== Feature redefinition ===&lt;br /&gt;
* Covariant redefinition of request result is allowed (as currently).&lt;br /&gt;
* Covariant redefinition of feature argument requires a variant typing on redefined argument or first definition.&lt;br /&gt;
'''The most restrictive type''' for a variant type argument is the type of the first definition.&lt;br /&gt;
&lt;br /&gt;
The first rule is a stronger postcondition. The current semantic is not changed.&lt;br /&gt;
&lt;br /&gt;
'''example 1:''' covariant redefinition of feature argument with 'variant' typing on redefined argument&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* The object test is not needed.&lt;br /&gt;
* the type is not repeated in the object test.&lt;br /&gt;
* In the class interface the 'variant' is removed. Indeed, it is not possible to call 'eat' on an entity of type COW with a parameter of type 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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: like last)&lt;br /&gt;
		require&lt;br /&gt;
			True&lt;br /&gt;
		do&lt;br /&gt;
			last := f&lt;br /&gt;
		ensure&lt;br /&gt;
			True&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		redefine all end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last) -- or eat (f: variant GRASS)&lt;br /&gt;
		require else&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = expected type. Here: GRASS&lt;br /&gt;
		do&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				-- 'expected' type = expected type. Here: GRASS&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&lt;br /&gt;
		ensure then&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''example 2:''' covariant redefinition of feature argument with 'variant' typing on first feature definition.&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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last)&lt;br /&gt;
		do&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&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;
		redefine last end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
Default: a generic is novariant&lt;br /&gt;
&lt;br /&gt;
If a genric must be variant (covariant or contravariant or both) then the formal generic must be prefixed with the 'variant' mark.&lt;br /&gt;
&lt;br /&gt;
The compiler must ensure that the variant generic checks one next rule:&lt;br /&gt;
* Generic used only on feature argument is contravariant.&lt;br /&gt;
* Generic used only on request result or feature argument with variant typing is covariant.&lt;br /&gt;
* Generic not used is both contravariant and covariant.&lt;br /&gt;
&lt;br /&gt;
'''The most restrictive type''' for a variant generic argument is the constrained inheritance type.&lt;br /&gt;
'''&lt;br /&gt;
example:'''&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	EXAMPLE [variant K, variant G]&lt;br /&gt;
		-- K is contravariant and G is covariant&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	first: G&lt;br /&gt;
	&lt;br /&gt;
	item (i: K): G&lt;br /&gt;
		deferred&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: EXAMPLE [INTEGER, COMPARABLE]; b: EXAMPLE [NUMERIC, STRING]&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
As explained for [[Usage-site variance]] the generic 'OPEN_ARGS' from ROUTINE, PROCEDURE, FUNCTION, PREDICATE must be contravariant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	ROUTINE [BASE_TYPE, variant OPEN_ARGS -&amp;gt; detachable TUPLE create default_create end]&lt;br /&gt;
-- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic 'OPEN_ARGS' is used on feature arguments, but also on request result.&lt;br /&gt;
&lt;br /&gt;
The class should probably be redesigned. Indeed if contravariant is allowed then there may be a new contravariant catcall on request result.&lt;br /&gt;
&lt;br /&gt;
In these classes there are only two requests using the generic as type:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second request is not used internally and may be problematic for creation: How create a tuple of not self-initialized and attached types?&lt;br /&gt;
The first is used in these features : 'target', 'is_equal', 'set_operands', 'copy', 'apply'&lt;br /&gt;
&lt;br /&gt;
'is_equal', 'set_operands' and 'copy' and 'target' rely on data model.&lt;br /&gt;
'apply' is more sensitive. Indeed the problem is when there is an opened target.&lt;br /&gt;
&lt;br /&gt;
'apply' could be restricted for no opened arguments or could be removed since it is not a lot used.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	require&lt;br /&gt;
		no_operands: open_count = 0&lt;br /&gt;
	do&lt;br /&gt;
		call (Void)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The redesign of agent classes is an opportunity to solve agent problems (see [[Minor-ECMA-problems]], [[Agents in SCOOP]]).&lt;br /&gt;
&lt;br /&gt;
Another solution will be mentioned later.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
The generic 'RESULT_TYPE' of FUNCTION class is used only on request result. Then it is a covariant generic. It is an expected point.&lt;br /&gt;
&lt;br /&gt;
=== Comparison with other solutions ===&lt;br /&gt;
==== [[Detachable types]] (non-generic) ====&lt;br /&gt;
The variant typing is not in conflict with the void-safe typing.&lt;br /&gt;
&lt;br /&gt;
And more the object test is not needed.&lt;br /&gt;
&lt;br /&gt;
==== [[Usage-site variance]] (generic) ====&lt;br /&gt;
The variant typing is a supplier specification while usage-site variance is a client specification.&lt;br /&gt;
&lt;br /&gt;
Another difference is the interface restriction of the usage-site variance. With the variant typing for generics the interface is fully aivailable.&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
The limited variant typing is reasonable and expressive. It limits Eiffel changes and solves all catcall problems.&lt;br /&gt;
&lt;br /&gt;
The proposal reuses an existing keyword.&lt;br /&gt;
&lt;br /&gt;
The addition in TYPE class for reflexivity and dynamic object test is little.&lt;br /&gt;
Indeed two simple booleans &amp;quot;is_contravariant&amp;quot; and &amp;quot;is_covariant&amp;quot; for each generic is required.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
generic_parameter_contravariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter contravariant?&lt;br /&gt;
	&lt;br /&gt;
generic_parameter_covariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter covariant?&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A possible critical could be the generic conformance restriction. Propositions are mentioned below.&lt;br /&gt;
&lt;br /&gt;
== General discussions ==&lt;br /&gt;
=== Greater flexibility for generics ===&lt;br /&gt;
A lot of generics could be novariant, encouraging to propose a solution to have a new flexibility, but safe.&lt;br /&gt;
==== Wildcard generics ====&lt;br /&gt;
The request result type is the constrained inheritance type. And the type of the feature argument is (attached) NONE.&lt;br /&gt;
The new semantic of 'Void' is considered: Void is not a NONE instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: ARRAY [?]; b: ARRAY [STRING]&lt;br /&gt;
	o: ANY&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
	o := a.item (1)&lt;br /&gt;
	a.put (&amp;quot;try&amp;quot;) -- invalid call. The type expected is NONE.&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However the wildcard generics will be used on request result or feature argument. A more power and elegent solution could be the parametrized routines.&lt;br /&gt;
&lt;br /&gt;
==== Parametrized routines ====&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
do_something [G] (a: ARRAY [G]): G&lt;br /&gt;
	require&lt;br /&gt;
		a.count &amp;gt;= 1&lt;br /&gt;
	do&lt;br /&gt;
		Result := a.item (1)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Right abstraction ====&lt;br /&gt;
The wildcard generics and the parametrized routines introduce new constructs for Eiffel. Is there another solution avoiding this?&lt;br /&gt;
&lt;br /&gt;
With a right abstraction it is possible to have flexible classes. It is comparable to the imuutable cocncept.&lt;br /&gt;
&lt;br /&gt;
'''example:''' V_CONTAINER class of Eiffel Base 2&lt;br /&gt;
To obtain the genric covariance behavior it is necessary to have:&lt;br /&gt;
* V_ITERATOR must have a covariant generic.&lt;br /&gt;
* TUPLE should be a read-only interface (V_MUTABLE_TUPLE would be the current TUPLE class). Therefore TUPLE could be conformed to V_SEQUENCE and V_MUTABLE_TUPLE conformed to V_ARRAY. Note that only the readonly interface could be in the Eiffel Standard.&lt;br /&gt;
&lt;br /&gt;
In V_CONTAINER class only two features should use the variant typing:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
new_cursor: V_ITERATOR [G]&lt;br /&gt;
	do ... end&lt;br /&gt;
&lt;br /&gt;
occurrences (v: variant G): INTEGER&lt;br /&gt;
		do&lt;br /&gt;
			-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
			across Current as it loop&lt;br /&gt;
				if it.item = v then&lt;br /&gt;
					Result := Result + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
has (v: variant G)&lt;br /&gt;
	local&lt;br /&gt;
		it: like new_cursor&lt;br /&gt;
	do&lt;br /&gt;
		-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
		it := new_cursor -- 'it' type = V_ITERATOR [ANY]&lt;br /&gt;
		it.search_forth (v)&lt;br /&gt;
		Result := not it.after&lt;br /&gt;
	ensure&lt;br /&gt;
		occurrences (v) = 1	&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In V_ITERATOR only two features should use the variant typing without object test!&lt;br /&gt;
&lt;br /&gt;
With these changes the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: V_CONTAINER [ANY]; b: V_CONTAINER [STRING]&lt;br /&gt;
do&lt;br /&gt;
	a := b&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sub-conclusion ====&lt;br /&gt;
With a right abstraction and a smart use of variant typing for generics, it is possible to obtain a greater flexibility keeping a fully aivailable interface.&lt;br /&gt;
&lt;br /&gt;
=== Limit changes ===&lt;br /&gt;
To limit code change and to increase typing consistency, we can change the semantic of 'variant'.&lt;br /&gt;
&lt;br /&gt;
Contravariant redefinition of request result is not very useful.&lt;br /&gt;
The variant typing could be limited for covariant redefinition. There could have no effect on request result.&lt;br /&gt;
&lt;br /&gt;
For generic conformance, a formal generic prefixed with the variant mark is covariant. The variant mark is not required on feature argument limiting code change.&lt;br /&gt;
&lt;br /&gt;
However we have a problem: How mark a contravariant generic? There is three options:&lt;br /&gt;
* Another mark.&lt;br /&gt;
* 'frozen' mark for novariant generic and then no mark for contravariant generic: too restrictive since novariance concerns a lot of generic classes&lt;br /&gt;
* No prefixed mark means novariant or contravariant generic&lt;br /&gt;
&lt;br /&gt;
=== Export status restrictions ===&lt;br /&gt;
Since the ECMA Eiffel Standard forbids the export restriction with conforming inheritance, it is not a problem.&lt;br /&gt;
However, the semantic can be changed to enable this restriction on conforming inheritance.&lt;br /&gt;
&lt;br /&gt;
Restrict exportation should not cause a catcall. The mechanism could be used just to change the class interface.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	ANIMAL&lt;br /&gt;
feature&lt;br /&gt;
	is_vegetarian: BOOLEAN&lt;br /&gt;
		deferred end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		export {NONE}&lt;br /&gt;
			is_vegetarian&lt;br /&gt;
		end&lt;br /&gt;
feature {NONE}&lt;br /&gt;
	is_vegetarian: BOOLEAN = True&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	an_animal: ANIMAL; a_cow: COW&lt;br /&gt;
	b: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
	create a_cow&lt;br /&gt;
	b := a_cow.is_vegetarian -- invalid call&lt;br /&gt;
	&lt;br /&gt;
	an_animal := a_cow&lt;br /&gt;
	b := an_animal .is_vegetarian -- valid call&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class interface is more simple and readable.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
The proposition uses no new keyword and solves the catcall problem.&lt;br /&gt;
It passes all [[Catcall checkpoints]].&lt;br /&gt;
&lt;br /&gt;
The new generic conformance gives a natural, safe, and flexible static typing.&lt;br /&gt;
The variant typing allows to create adaptive interfaces keeping a safe static typing.&lt;br /&gt;
&lt;br /&gt;
With a fine abstraction and the use of variant typing for generics, the genric conformance flexibility is little restricted.&lt;br /&gt;
&lt;br /&gt;
There is no interface restriction ([[Interval types]] or [[Usage-site variance]]). Class interfaces are fully available.&lt;br /&gt;
&lt;br /&gt;
== Your view ==&lt;br /&gt;
name:&lt;br /&gt;
comment:&lt;br /&gt;
&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15182</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=15182"/>
				<updated>2014-05-05T21:25:25Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Replace obsolete keyword with a simple note clause&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10 loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
&lt;br /&gt;
A consequence is that expanded types are no longer generic creation ready.&lt;br /&gt;
Generic creation ready type could be frozen types with `default_create' as creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class PROPOSITION feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class CURRENT_STANDARD feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class  A feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface A feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clauses are inherited if they are not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;Documentation.&amp;quot;&lt;br /&gt;
            option: stable&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit A redefine something end feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;New documentation.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The `what' clause is not inheried since it is redefined. However the `option' clause is inherited.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Replace obsolete keyword with a simple note clause&lt;br /&gt;
| A note clause could replace the obsolete keyword&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            obsolete: &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
instead of:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        obsolete&lt;br /&gt;
            &amp;quot;Use another instead.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
| A keyword removed; simpler feature definition&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=15181</id>
		<title>Default and explicit variance</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=15181"/>
				<updated>2014-05-05T21:19:21Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: agent conformance update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Catcall]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
In first the limited variant typing is exposed. It checks all catcall checkpoints.&lt;br /&gt;
In the second part the mechanism is extended. It is less simple and explicit, but it enables a best transition.&lt;br /&gt;
&lt;br /&gt;
== Limited variant typing ==&lt;br /&gt;
What is the advantages of covariance compared to a novariant typing?&lt;br /&gt;
* explicit and adaptative interface&lt;br /&gt;
* One routine&lt;br /&gt;
&lt;br /&gt;
=== Variant typing ===&lt;br /&gt;
* A variant entity has '''the most restrictive type'''. &lt;br /&gt;
* A variant entity requires a simple object test to use the entity with the '''expected type'''.&lt;br /&gt;
&lt;br /&gt;
Examples are available in next sections.&lt;br /&gt;
&lt;br /&gt;
=== Feature redefinition ===&lt;br /&gt;
* Covariant redefinition of request result is allowed (as currently).&lt;br /&gt;
* Covariant redefinition of feature argument requires a variant typing on redefined argument or first definition.&lt;br /&gt;
'''The most restrictive type''' for a variant type argument is the type of the first definition.&lt;br /&gt;
&lt;br /&gt;
The first rule is a stronger postcondition. The current semantic is not changed.&lt;br /&gt;
&lt;br /&gt;
'''example 1:''' covariant redefinition of feature argument with 'variant' typing on redefined argument&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* The object test is not needed.&lt;br /&gt;
* the type is not repeated in the object test.&lt;br /&gt;
* In the class interface the 'variant' is removed. Indeed, it is not possible to call 'eat' on an entity of type COW with a parameter of type 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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: like last)&lt;br /&gt;
		require&lt;br /&gt;
			True&lt;br /&gt;
		do&lt;br /&gt;
			last := f&lt;br /&gt;
		ensure&lt;br /&gt;
			True&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		redefine all end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last) -- or eat (f: variant GRASS)&lt;br /&gt;
		require else&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = expected type. Here: GRASS&lt;br /&gt;
		do&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				-- 'expected' type = expected type. Here: GRASS&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&lt;br /&gt;
		ensure then&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''example 2:''' covariant redefinition of feature argument with 'variant' typing on first feature definition.&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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last)&lt;br /&gt;
		do&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&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;
		redefine last end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
Default: a generic is novariant&lt;br /&gt;
&lt;br /&gt;
If a genric must be variant (covariant or contravariant or both) then the formal generic must be prefixed with the 'variant' mark.&lt;br /&gt;
&lt;br /&gt;
The compiler must ensure that the variant generic checks one next rule:&lt;br /&gt;
* Generic used only on feature argument is contravariant.&lt;br /&gt;
* Generic used only on request result or feature argument with variant typing is covariant.&lt;br /&gt;
* Generic not used is both contravariant and covariant.&lt;br /&gt;
&lt;br /&gt;
'''The most restrictive type''' for a variant generic argument is the constrained inheritance type.&lt;br /&gt;
'''&lt;br /&gt;
example:'''&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	EXAMPLE [variant K, variant G]&lt;br /&gt;
		-- K is contravariant and G is covariant&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	first: G&lt;br /&gt;
	&lt;br /&gt;
	item (i: K): G&lt;br /&gt;
		deferred&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: EXAMPLE [INTEGER, COMPARABLE]; b: EXAMPLE [NUMERIC, STRING]&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
As explained for [[Usage-site variance]] the generic 'OPEN_ARGS' from ROUTINE, PROCEDURE, FUNCTION, PREDICATE must be contravariant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	ROUTINE [BASE_TYPE, variant OPEN_ARGS -&amp;gt; detachable TUPLE create default_create end]&lt;br /&gt;
-- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic 'OPEN_ARGS' is used on feature arguments, but also on request result.&lt;br /&gt;
&lt;br /&gt;
The class should probably be redesigned. Indeed if contravariant is allowed then there may be a new contravariant catcall on request result.&lt;br /&gt;
&lt;br /&gt;
In these classes there are only two requests using the generic as type:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second request is not used internally and may be problematic for creation: How create a tuple of not self-initialized and attached types?&lt;br /&gt;
The first is used in these features : 'target', 'is_equal', 'set_operands', 'copy', 'apply'&lt;br /&gt;
&lt;br /&gt;
'is_equal', 'set_operands' and 'copy' and 'target' rely on data model.&lt;br /&gt;
'apply' is more sensitive. Indeed the problem is when there is an opened target.&lt;br /&gt;
&lt;br /&gt;
'apply' could be restricted for no opened arguments or could be removed since it is not a lot used.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	require&lt;br /&gt;
		no_operands: open_count = 0&lt;br /&gt;
	do&lt;br /&gt;
		call (Void)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The redesign of agent classes is an opportunity to solve agent problems (see [[Minor-ECMA-problems]], [[Agents in SCOOP]]).&lt;br /&gt;
&lt;br /&gt;
Another solution will be mentioned later.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
The generic 'RESULT_TYPE' of FUNCTION class is used only on request result. Then it is a covariant generic. It is an expected point.&lt;br /&gt;
&lt;br /&gt;
=== Comparison with other solutions ===&lt;br /&gt;
==== [[Detachable types]] (non-generic) ====&lt;br /&gt;
The variant typing is not in conflict with the void-safe typing.&lt;br /&gt;
&lt;br /&gt;
And more the object test is not needed.&lt;br /&gt;
&lt;br /&gt;
==== [[Usage-site variance]] (generic) ====&lt;br /&gt;
The variant typing is a supplier specification while usage-site variance is a client specification.&lt;br /&gt;
&lt;br /&gt;
Another difference is the interface restriction of the usage-site variance. With the variant typing for generics the interface is fully aivailable.&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
The limited variant typing is reasonable and expressive. It limits Eiffel changes and solves all catcall problems.&lt;br /&gt;
&lt;br /&gt;
The proposal reuses an existing keyword.&lt;br /&gt;
&lt;br /&gt;
The addition in TYPE class for reflexivity and dynamic object test is little.&lt;br /&gt;
Indeed two simple booleans &amp;quot;is_contravariant&amp;quot; and &amp;quot;is_covariant&amp;quot; for each generic is required.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
generic_parameter_contravariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter contravariant?&lt;br /&gt;
	&lt;br /&gt;
generic_parameter_covariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter covariant?&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A possible critical could be the generic conformance restriction. Propositions are mentioned below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extended variant typing ==&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
The variant mark is optional. The compiler infers the generic variance. It is a good point for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
* Generic used only on feature argument or request result with variant typing is contravariant.&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
It is possible to declare 'operands' and 'empty_operands' as variant.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: variant detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: variant OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'apply' and 'target' should be wrote again. For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	do&lt;br /&gt;
		-- 'operands' type = constrained inheritance. Here: detachable TUPLE&lt;br /&gt;
		if attached operands as args then&lt;br /&gt;
			-- 'operands' type = request result type. Here: OPEN_ARGS&lt;br /&gt;
			call (args)&lt;br /&gt;
		else&lt;br /&gt;
			call (Void)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
This part extend the proposition to enable a best backward compatibility and then a best transition.&lt;br /&gt;
&lt;br /&gt;
== General discussions ==&lt;br /&gt;
=== Greater flexibility for generics ===&lt;br /&gt;
A lot of generics could be novariant, encouraging to propose a solution to have a new flexibility, but safe.&lt;br /&gt;
==== Wildcard generics ====&lt;br /&gt;
The request result type is the constrained inheritance type. And the type of the feature argument is (attached) NONE.&lt;br /&gt;
The new semantic of 'Void' is considered: Void is not a NONE instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: ARRAY [?]; b: ARRAY [STRING]&lt;br /&gt;
	o: ANY&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
	o := a.item (1)&lt;br /&gt;
	a.put (&amp;quot;try&amp;quot;) -- invalid call. The type expected is NONE.&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However the wildcard generics will be used on request result or feature argument. A more power and elegent solution could be the parametrized routines.&lt;br /&gt;
&lt;br /&gt;
==== Parametrized routines ====&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
do_something [G] (a: ARRAY [G]): G&lt;br /&gt;
	require&lt;br /&gt;
		a.count &amp;gt;= 1&lt;br /&gt;
	do&lt;br /&gt;
		Result := a.item (1)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Right abstraction ====&lt;br /&gt;
The wildcard generics and the parametrized routines introduce new constructs for Eiffel. Is there another solution avoiding this?&lt;br /&gt;
&lt;br /&gt;
With a right abstraction it is possible to have flexible classes. It is comparable to the imuutable cocncept.&lt;br /&gt;
&lt;br /&gt;
'''example:''' V_CONTAINER class of Eiffel Base 2&lt;br /&gt;
To obtain the genric covariance behavior it is necessary to have:&lt;br /&gt;
* V_ITERATOR must have a covariant generic.&lt;br /&gt;
* TUPLE should be a read-only interface (V_MUTABLE_TUPLE would be the current TUPLE class). Therefore TUPLE could be conformed to V_SEQUENCE and V_MUTABLE_TUPLE conformed to V_ARRAY. Note that only the readonly interface could be in the Eiffel Standard.&lt;br /&gt;
&lt;br /&gt;
In V_CONTAINER class only two features should use the variant typing:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
new_cursor: V_ITERATOR [G]&lt;br /&gt;
	do ... end&lt;br /&gt;
&lt;br /&gt;
occurrences (v: variant G): INTEGER&lt;br /&gt;
		do&lt;br /&gt;
			-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
			across Current as it loop&lt;br /&gt;
				if it.item = v then&lt;br /&gt;
					Result := Result + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
has (v: variant G)&lt;br /&gt;
	local&lt;br /&gt;
		it: like new_cursor&lt;br /&gt;
	do&lt;br /&gt;
		-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
		it := new_cursor -- 'it' type = V_ITERATOR [ANY]&lt;br /&gt;
		it.search_forth (v)&lt;br /&gt;
		Result := not it.after&lt;br /&gt;
	ensure&lt;br /&gt;
		occurrences (v) = 1	&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In V_ITERATOR only two features should use the variant typing without object test!&lt;br /&gt;
&lt;br /&gt;
With these changes the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: V_CONTAINER [ANY]; b: V_CONTAINER [STRING]&lt;br /&gt;
do&lt;br /&gt;
	a := b&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sub-conclusion ====&lt;br /&gt;
With a right abstraction and a smart use of variant typing for generics, it is possible to obtain a greater flexibility keeping a fully aivailable interface.&lt;br /&gt;
&lt;br /&gt;
=== Limit changes ===&lt;br /&gt;
To limit code change and to increase typing consistency, we can change the semantic of 'variant'.&lt;br /&gt;
&lt;br /&gt;
Contravariant redefinition of request result is not very useful.&lt;br /&gt;
The variant typing could be limited for covariant redefinition. There could have no effect on request result.&lt;br /&gt;
&lt;br /&gt;
For generic conformance, a formal generic prefixed with the variant mark is covariant. The variant mark is not required on feature argument limiting code change.&lt;br /&gt;
&lt;br /&gt;
However we have a problem: How mark a contravariant generic? There is three options:&lt;br /&gt;
* Another mark.&lt;br /&gt;
* 'frozen' mark for novariant generic and then no mark for contravariant generic: too restrictive since novariance concerns a lot of generic classes&lt;br /&gt;
* No prefixed mark means novariant or contravariant generic&lt;br /&gt;
&lt;br /&gt;
=== Export status restrictions ===&lt;br /&gt;
Since the ECMA Eiffel Standard forbids the export restriction with conforming inheritance, it is not a problem.&lt;br /&gt;
However, the semantic can be changed to enable this restriction on conforming inheritance.&lt;br /&gt;
&lt;br /&gt;
Restrict exportation should not cause a catcall. The mechanism could be used just to change the class interface.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	ANIMAL&lt;br /&gt;
feature&lt;br /&gt;
	is_vegetarian: BOOLEAN&lt;br /&gt;
		deferred end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		export {NONE}&lt;br /&gt;
			is_vegetarian&lt;br /&gt;
		end&lt;br /&gt;
feature {NONE}&lt;br /&gt;
	is_vegetarian: BOOLEAN = True&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	an_animal: ANIMAL; a_cow: COW&lt;br /&gt;
	b: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
	create a_cow&lt;br /&gt;
	b := a_cow.is_vegetarian -- invalid call&lt;br /&gt;
	&lt;br /&gt;
	an_animal := a_cow&lt;br /&gt;
	b := an_animal .is_vegetarian -- valid call&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class interface is more simple and readable.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
The proposition uses no new keyword and solves the catcall problem.&lt;br /&gt;
It passes all [[Catcall checkpoints]].&lt;br /&gt;
&lt;br /&gt;
The new generic conformance gives a natural safe and flexible static typing.&lt;br /&gt;
The variant typing enables to create adaptive interfaces keeping a safe static typing.&lt;br /&gt;
&lt;br /&gt;
With a fine abstraction and the use of variant typing for generics, the genric conformance flexibility is little restricted. The contravariant for request result can then be discarded for simplicity.&lt;br /&gt;
&lt;br /&gt;
There is no interface restriction ([[Interval types]] or [[Usage-site variance]]). Class interfaces are fully available.&lt;br /&gt;
&lt;br /&gt;
== Your view ==&lt;br /&gt;
name:&lt;br /&gt;
comment:&lt;br /&gt;
&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15180</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=15180"/>
				<updated>2014-05-03T22:31:04Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Adding a consequence of customized creation procedure for expanded type&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
&lt;br /&gt;
A consequence is that expanded types are no longer generic creation ready.&lt;br /&gt;
Generic creation ready type could be frozen types with `default_create' as creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clauses are inherited if they are not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;Documentation.&amp;quot;&lt;br /&gt;
            option: stable&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit A redefine something end feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;New documentation.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The `what' clause is not inheried since it is redefined. However the `option' clause is inherited.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15179</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=15179"/>
				<updated>2014-05-03T22:25:50Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Adding precision for note inheritance&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clauses are inherited if they are not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;Documentation.&amp;quot;&lt;br /&gt;
            option: stable&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit A redefine something end feature&lt;br /&gt;
    something: ANY&lt;br /&gt;
        note&lt;br /&gt;
            what: &amp;quot;New documentation.&amp;quot;&lt;br /&gt;
        do end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The `what' clause is not inheried since it is redefined. However the `option' clause is inherited.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15178</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=15178"/>
				<updated>2014-05-03T22:19:43Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Put redefine correction proposal in the correct category&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
|-&lt;br /&gt;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&lt;br /&gt;
&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;
&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clause is inherited if it is not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15153</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=15153"/>
				<updated>2014-04-28T21:27:13Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Adding precision&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color for dot (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clause is inherited if it is not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15152</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=15152"/>
				<updated>2014-04-28T21:25:52Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Fix genral layout&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clause is inherited if it is not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15151</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=15151"/>
				<updated>2014-04-28T21:25:08Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Fix layout issue&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
| || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clause is inherited if it is not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15150</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=15150"/>
				<updated>2014-04-28T21:23:21Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: /* 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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
&lt;br /&gt;
||||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Improve code readability&lt;br /&gt;
|Use red color (as assigment color) to make more readable a feature call in the editor view.&lt;br /&gt;
&lt;br /&gt;
sometimes it is diffult to distinguish this two codes:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target.feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
some_target_feature_of_some_type.feature_of_some_type_2&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
||||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clause is inherited if it is not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15145</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=15145"/>
				<updated>2014-04-21T14:09:58Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Note clause and inheritance&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! `note' clause and inheritance&lt;br /&gt;
| `note' clause is inherited if it is not redefined.&lt;br /&gt;
Since a feature documentation is a part of the note clause (`what' tag), &lt;br /&gt;
it is also inherited (simple &amp;lt;e&amp;gt;-- &amp;lt;Precursor&amp;gt;&amp;lt;/e&amp;gt; is not longer required).&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15144</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=15144"/>
				<updated>2014-04-21T13:40:57Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Conditional expression without `else' branch&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Conditional expression without `else' branch&lt;br /&gt;
| Allow a conditional expression without `else' branch. i.e.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if boolean_expression then expression else Void end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15143</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=15143"/>
				<updated>2014-04-21T13:31:56Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: More strict semantic for `require else' and `ensure then'&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! More strict semantic for `require else' and `ensure then'&lt;br /&gt;
| `require else' and `ensure then' cannot be used for the first declaration. &lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A feature&lt;br /&gt;
&lt;br /&gt;
    do_something&lt;br /&gt;
        require else&lt;br /&gt;
            True&lt;br /&gt;
        do&lt;br /&gt;
        ensure then&lt;br /&gt;
            True&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15142</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=15142"/>
				<updated>2014-04-21T13:25:25Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Make `redefine' ECMA conform&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Make `redefine' ECMA conform&lt;br /&gt;
| According ECMA 367 8.10.7 (Effect, effecting),&lt;br /&gt;
The `redefine' clause cannot be used to effect a inherited deferred feature.&lt;br /&gt;
This code should be rejected:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class A feature&lt;br /&gt;
	&lt;br /&gt;
    do_something&lt;br /&gt;
        deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B inherit&lt;br /&gt;
    A&lt;br /&gt;
        redefine&lt;br /&gt;
            do_something&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
        do_something&lt;br /&gt;
            deferred end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|| || ||&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15141</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=15141"/>
				<updated>2014-04-21T12:47:41Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: documentation checker and Inspector Eiffel&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
This check could be a part of Inspector Eiffel.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15140</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=15140"/>
				<updated>2014-04-21T12:45:00Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: CHange proposal for creation procedure for expanded type&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Allow to use another creation procedure. `default_create' is not longer required.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=15065</id>
		<title>Default and explicit variance</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=15065"/>
				<updated>2014-03-03T17:10:59Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: ARgument and feature ambiguity solved&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Catcall]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
In first the limited variant typing is exposed. It checks all catcall checkpoints.&lt;br /&gt;
In the second part the mechanism is extended. It is less simple and explicit, but it enables a best transition.&lt;br /&gt;
&lt;br /&gt;
== Limited variant typing ==&lt;br /&gt;
What is the advantages of covariance compared to a novariant typing?&lt;br /&gt;
* explicit and adaptative interface&lt;br /&gt;
* One routine&lt;br /&gt;
&lt;br /&gt;
=== Variant typing ===&lt;br /&gt;
* A variant entity has '''the most restrictive type'''. &lt;br /&gt;
* A variant entity requires a simple object test to use the entity with the '''expected type'''.&lt;br /&gt;
&lt;br /&gt;
Examples are available in next sections.&lt;br /&gt;
&lt;br /&gt;
=== Feature redefinition ===&lt;br /&gt;
* Covariant redefinition of request result is allowed (as currently).&lt;br /&gt;
* Covariant redefinition of feature argument requires a variant typing on redefined argument or first definition.&lt;br /&gt;
'''The most restrictive type''' for a variant type argument is the type of the first definition.&lt;br /&gt;
&lt;br /&gt;
The first rule is a stronger postcondition. The current semantic is not changed.&lt;br /&gt;
&lt;br /&gt;
'''example 1:''' covariant redefinition of feature argument with 'variant' typing on redefined argument&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* The object test is not needed.&lt;br /&gt;
* the type is not repeated in the object test.&lt;br /&gt;
* In the class interface the 'variant' is removed. Indeed, it is not possible to call 'eat' on an entity of type COW with a parameter of type 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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: like last)&lt;br /&gt;
		require&lt;br /&gt;
			True&lt;br /&gt;
		do&lt;br /&gt;
			last := f&lt;br /&gt;
		ensure&lt;br /&gt;
			True&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		redefine all end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last) -- or eat (f: variant GRASS)&lt;br /&gt;
		require else&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = expected type. Here: GRASS&lt;br /&gt;
		do&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				-- 'expected' type = expected type. Here: GRASS&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&lt;br /&gt;
		ensure then&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''example 2:''' covariant redefinition of feature argument with 'variant' typing on first feature definition.&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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last)&lt;br /&gt;
		do&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&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;
		redefine last end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
Default: a generic is novariant&lt;br /&gt;
&lt;br /&gt;
If a genric must be variant (covariant or contravariant or both) then the formal generic must be prefixed with the 'variant' mark.&lt;br /&gt;
&lt;br /&gt;
The compiler must ensure that the variant generic checks one next rule:&lt;br /&gt;
* Generic used only on feature argument is contravariant.&lt;br /&gt;
* Generic used only on request result or feature argument with variant typing is covariant.&lt;br /&gt;
* Generic not used is both contravariant and covariant.&lt;br /&gt;
&lt;br /&gt;
'''The most restrictive type''' for a variant generic argument is the constrained inheritance type.&lt;br /&gt;
'''&lt;br /&gt;
example:'''&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	EXAMPLE [variant K, variant G]&lt;br /&gt;
		-- K is contravariant and G is covariant&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	first: G&lt;br /&gt;
	&lt;br /&gt;
	item (i: K): G&lt;br /&gt;
		deferred&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: EXAMPLE [INTEGER, COMPARABLE]; b: EXAMPLE [NUMERIC, STRING]&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
As explained for [[Usage-site variance]] the generic 'OPEN_ARGS' from ROUTINE, PROCEDURE, FUNCTION, PREDICATE must be contravariant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	ROUTINE [BASE_TYPE, variant OPEN_ARGS -&amp;gt; detachable TUPLE create default_create end]&lt;br /&gt;
-- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic 'OPEN_ARGS' is used on feature arguments, but also on request result.&lt;br /&gt;
&lt;br /&gt;
The class should probably be redesigned. Indeed if contravariant is allowed then there may be a new contravariant catcall on request result.&lt;br /&gt;
&lt;br /&gt;
In these classes there are only two requests using the generic as type:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second request is not used internally and may be problematic for creation: How create a tuple of not self-initialized and attached types?&lt;br /&gt;
The first is used in these features : 'target', 'is_equal', 'set_operands', 'copy', 'apply'&lt;br /&gt;
&lt;br /&gt;
'is_equal', 'set_operands' and 'copy' rely on data model.&lt;br /&gt;
'apply' and 'target' are more sensitive. Indeed the problem is when there is an opened target.&lt;br /&gt;
&lt;br /&gt;
'apply' could be restricted for no opened arguments.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	require&lt;br /&gt;
		no_operands: open_count = 0&lt;br /&gt;
	do&lt;br /&gt;
		call (Void)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
'target' could be modfied:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target: ANY&lt;br /&gt;
	require&lt;br /&gt;
		is_target_closed&lt;br /&gt;
	do&lt;br /&gt;
		-- ...&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or maybe it is better to separate opened target and closed target in two abstractions.&lt;br /&gt;
&lt;br /&gt;
The redesign of agent classes is an opportunity to solve agent problems (see [[Minor-ECMA-problems]], [[Agents in SCOOP]]).&lt;br /&gt;
&lt;br /&gt;
Another solution will be mentioned later.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
The generic 'RESULT_TYPE' of FUNCTION class is used only on request result. Then it is a covariant generic. It is an expected point.&lt;br /&gt;
&lt;br /&gt;
=== Comparison with other solutions ===&lt;br /&gt;
==== [[Detachable types]] (non-generic) ====&lt;br /&gt;
The variant typing is not in conflict with the void-safe typing.&lt;br /&gt;
&lt;br /&gt;
And more the object test is not needed.&lt;br /&gt;
&lt;br /&gt;
==== [[Usage-site variance]] (generic) ====&lt;br /&gt;
The variant typing is a supplier specification while usage-site variance is a client specification.&lt;br /&gt;
&lt;br /&gt;
Another difference is the interface restriction of the usage-site variance. With the variant typing for generics the interface is fully aivailable.&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
The limited variant typing is reasonable and expressive. It limits Eiffel changes and solves all catcall problems.&lt;br /&gt;
&lt;br /&gt;
The proposal reuses an existing keyword.&lt;br /&gt;
&lt;br /&gt;
The addition in TYPE class for reflexivity and dynamic object test is little.&lt;br /&gt;
Indeed two simple booleans &amp;quot;is_contravariant&amp;quot; and &amp;quot;is_covariant&amp;quot; for each generic is required.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
generic_parameter_contravariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter contravariant?&lt;br /&gt;
	&lt;br /&gt;
generic_parameter_covariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter covariant?&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A possible critical could be the generic conformance restriction. Propositions are mentioned below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extended variant typing ==&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
The variant mark is optional. The compiler infers the generic variance. It is a good point for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
* Generic used only on feature argument or request result with variant typing is contravariant.&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
It is possible to declare 'operands' and 'empty_operands' as variant.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: variant detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: variant OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'apply' and 'target' should be wrote again. For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	do&lt;br /&gt;
		-- 'operands' type = constrained inheritance. Here: detachable TUPLE&lt;br /&gt;
		if attached operands as args then&lt;br /&gt;
			-- 'operands' type = request result type. Here: OPEN_ARGS&lt;br /&gt;
			call (args)&lt;br /&gt;
		else&lt;br /&gt;
			call (Void)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
This part extend the proposition to enable a best backward compatibility and then a best transition.&lt;br /&gt;
&lt;br /&gt;
== General discussions ==&lt;br /&gt;
=== Greater flexibility for generics ===&lt;br /&gt;
A lot of generics could be novariant, encouraging to propose a solution to have a new flexibility, but safe.&lt;br /&gt;
==== Wildcard generics ====&lt;br /&gt;
The request result type is the constrained inheritance type. And the type of the feature argument is (attached) NONE.&lt;br /&gt;
The new semantic of 'Void' is considered: Void is not a NONE instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: ARRAY [?]; b: ARRAY [STRING]&lt;br /&gt;
	o: ANY&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
	o := a.item (1)&lt;br /&gt;
	a.put (&amp;quot;try&amp;quot;) -- invalid call. The type expected is NONE.&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However the wildcard generics will be used on request result or feature argument. A more power and elegent solution could be the parametrized routines.&lt;br /&gt;
&lt;br /&gt;
==== Parametrized routines ====&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
do_something [G] (a: ARRAY [G]): G&lt;br /&gt;
	require&lt;br /&gt;
		a.count &amp;gt;= 1&lt;br /&gt;
	do&lt;br /&gt;
		Result := a.item (1)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Right abstraction ====&lt;br /&gt;
The wildcard generics and the parametrized routines introduce new constructs for Eiffel. Is there another solution avoiding this?&lt;br /&gt;
&lt;br /&gt;
With a right abstraction it is possible to have flexible classes. It is comparable to the imuutable cocncept.&lt;br /&gt;
&lt;br /&gt;
'''example:''' V_CONTAINER class of Eiffel Base 2&lt;br /&gt;
To obtain the genric covariance behavior it is necessary to have:&lt;br /&gt;
* V_ITERATOR must have a covariant generic.&lt;br /&gt;
* TUPLE should be a read-only interface (V_MUTABLE_TUPLE would be the current TUPLE class). Therefore TUPLE could be conformed to V_SEQUENCE and V_MUTABLE_TUPLE conformed to V_ARRAY. Note that only the readonly interface could be in the Eiffel Standard.&lt;br /&gt;
&lt;br /&gt;
In V_CONTAINER class only two features should use the variant typing:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
new_cursor: V_ITERATOR [G]&lt;br /&gt;
	do ... end&lt;br /&gt;
&lt;br /&gt;
occurrences (v: variant G): INTEGER&lt;br /&gt;
		do&lt;br /&gt;
			-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
			across Current as it loop&lt;br /&gt;
				if it.item = v then&lt;br /&gt;
					Result := Result + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
has (v: variant G)&lt;br /&gt;
	local&lt;br /&gt;
		it: like new_cursor&lt;br /&gt;
	do&lt;br /&gt;
		-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
		it := new_cursor -- 'it' type = V_ITERATOR [ANY]&lt;br /&gt;
		it.search_forth (v)&lt;br /&gt;
		Result := not it.after&lt;br /&gt;
	ensure&lt;br /&gt;
		occurrences (v) = 1	&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In V_ITERATOR only two features should use the variant typing without object test!&lt;br /&gt;
&lt;br /&gt;
With these changes the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: V_CONTAINER [ANY]; b: V_CONTAINER [STRING]&lt;br /&gt;
do&lt;br /&gt;
	a := b&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sub-conclusion ====&lt;br /&gt;
With a right abstraction and a smart use of variant typing for generics, it is possible to obtain a greater flexibility keeping a fully aivailable interface.&lt;br /&gt;
&lt;br /&gt;
=== Limit changes ===&lt;br /&gt;
To limit code change and to increase typing consistency, we can change the semantic of 'variant'.&lt;br /&gt;
&lt;br /&gt;
Contravariant redefinition of request result is not very useful.&lt;br /&gt;
The variant typing could be limited for covariant redefinition. There could have no effect on request result.&lt;br /&gt;
&lt;br /&gt;
For generic conformance, a formal generic prefixed with the variant mark is covariant. The variant mark is not required on feature argument limiting code change.&lt;br /&gt;
&lt;br /&gt;
However we have a problem: How mark a contravariant generic? There is three options:&lt;br /&gt;
* Another mark.&lt;br /&gt;
* 'frozen' mark for novariant generic and then no mark for contravariant generic: too restrictive since novariance concerns a lot of generic classes&lt;br /&gt;
* No prefixed mark means novariant or contravariant generic&lt;br /&gt;
&lt;br /&gt;
=== Export status restrictions ===&lt;br /&gt;
Since the ECMA Eiffel Standard forbids the export restriction with conforming inheritance, it is not a problem.&lt;br /&gt;
However, the semantic can be changed to enable this restriction on conforming inheritance.&lt;br /&gt;
&lt;br /&gt;
Restrict exportation should not cause a catcall. The mechanism could be used just to change the class interface.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	ANIMAL&lt;br /&gt;
feature&lt;br /&gt;
	is_vegetarian: BOOLEAN&lt;br /&gt;
		deferred end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		export {NONE}&lt;br /&gt;
			is_vegetarian&lt;br /&gt;
		end&lt;br /&gt;
feature {NONE}&lt;br /&gt;
	is_vegetarian: BOOLEAN = True&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	an_animal: ANIMAL; a_cow: COW&lt;br /&gt;
	b: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
	create a_cow&lt;br /&gt;
	b := a_cow.is_vegetarian -- invalid call&lt;br /&gt;
	&lt;br /&gt;
	an_animal := a_cow&lt;br /&gt;
	b := an_animal .is_vegetarian -- valid call&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class interface is more simple and readable.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
The proposition uses no new keyword and solves the catcall problem.&lt;br /&gt;
It passes all [[Catcall checkpoints]].&lt;br /&gt;
&lt;br /&gt;
The new generic conformance gives a natural safe and flexible static typing.&lt;br /&gt;
The variant typing enables to create adaptive interfaces keeping a safe static typing.&lt;br /&gt;
&lt;br /&gt;
With a fine abstraction and the use of variant typing for generics, the genric conformance flexibility is little restricted. The contravariant for request result can then be discarded for simplicity.&lt;br /&gt;
&lt;br /&gt;
There is no interface restriction ([[Interval types]] or [[Usage-site variance]]). Class interfaces are fully available.&lt;br /&gt;
&lt;br /&gt;
== Your view ==&lt;br /&gt;
name:&lt;br /&gt;
comment:&lt;br /&gt;
&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=15002</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=15002"/>
				<updated>2014-02-01T22:55:26Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Updated documentation checker&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Updated documentation checker&lt;br /&gt;
|Throw a warning if the documentation refers to a nonexistent feature.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
		-- Call procedure with `args' as last set.&lt;br /&gt;
	do&lt;br /&gt;
		call (operands)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
Throws a warning for nonexistent `args' feature.&lt;br /&gt;
|Help to maintain an updated documentation&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Agent_Calls&amp;diff=15001</id>
		<title>Agent Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Agent_Calls&amp;diff=15001"/>
				<updated>2014-02-01T18:46:34Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Object test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Code Generation]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
====Introduction====&lt;br /&gt;
The Eiffel programming language supports closures with agents. As a reminder, an agent is a normal Eiffel object of one of the types:&lt;br /&gt;
*FUNCTION&lt;br /&gt;
*PROCEDURE&lt;br /&gt;
Some terminology is needed: The place where an agent is created (with the agent keyword or the tilde operator) is called the '''agent creation'''. The feature to which the agent points is the '''agent callee''' and the place (or places) where the agent is called is denoted '''agent call'''. &lt;br /&gt;
&lt;br /&gt;
An example that clarifies these terms:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel,N]class &lt;br /&gt;
    TERMINOLOGY&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
&lt;br /&gt;
    f1&lt;br /&gt;
        local&lt;br /&gt;
            p: PROCEDURE [ANY, TUPLE]&lt;br /&gt;
        do&lt;br /&gt;
            p := agent target   -- agent creation&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    f2 (p: PROCEDURE [ANY, TUPLE])&lt;br /&gt;
        do&lt;br /&gt;
            p.call ([])         -- agent call&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
    target                      -- callee&lt;br /&gt;
        do&lt;br /&gt;
        end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====The problem====&lt;br /&gt;
It is again helpful to focus on the differences between the Eiffel and C language. Eiffel supports closures, C only supports function pointers. A way is needed thus to construct closures based on function pointers. Dynamic binding also contributes its part to the problem. It is not known at compile time which exact feature an agent (when looking at its '''agent creation''') refers to. But it gets even worse, sometimes the feature is not known until the agent is called (at runtime). This is the case for agents with open targets.&lt;br /&gt;
====The data structure====&lt;br /&gt;
Class C will be used for the following examples:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel,N]class&lt;br /&gt;
    C&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    f (p1, p2: INTEGER; p3: STRING): STRING&lt;br /&gt;
        do&lt;br /&gt;
            ...&lt;br /&gt;
        end   &lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
There are three data structures needed for an agent:&lt;br /&gt;
* The open_map (member of class ROUTINE)&lt;br /&gt;
* The closed_operands (member of class ROUTINE)&lt;br /&gt;
* The open_operands&lt;br /&gt;
The open_map is known at compile time when an '''agent_creation''' is detected. The closed_operands are known at '''agent creation''' time. The open_operands are not known until the agent is called. &lt;br /&gt;
&lt;br /&gt;
The content of these structures will be given for agent one and two:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
! Agent one !! Agent two&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
agent c.f (?, 1, ?)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
agent {C}.f (1, ?, &amp;quot;hello&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The open_map is an array that has an entry for every open parameter. Its content for agents one and two are:&lt;br /&gt;
#{2,4}&lt;br /&gt;
#{1,3}&lt;br /&gt;
The closed_operands is a TUPLE that has an entry for every closed operand. Its content for agents one and two again:&lt;br /&gt;
#{c, 1}&lt;br /&gt;
#{1, &amp;quot;hello&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
====The wrapper====&lt;br /&gt;
It comes by no surprise that the compiler creates special wrapper functions for agents. It is interesting though that these wrappers are created per '''agent creation'''. This has the advantage that it is known whether a given formal argument is open or closed. &lt;br /&gt;
&lt;br /&gt;
In workbench mode, for every '''agent creation''' a C-function is generated. This wrapper function does the following:&lt;br /&gt;
*Arrange the closed and open arguments in the right order.&lt;br /&gt;
*Calculate the proper '''agent callee''' based on the dynamic type of the target.&lt;br /&gt;
*Call the '''agent callee'''.&lt;br /&gt;
&lt;br /&gt;
For the '''agent creation''':&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
            agent c.f (?, 1, ?)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
the following wrapper function is generated:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;[c, N]EIF_REFERENCE _fAaatpmf_2_4 (&lt;br /&gt;
   EIF_REFERENCE (*f_ptr)(EIF_REFERENCE, //can be ignored &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_REFERENCE), &lt;br /&gt;
   EIF_TYPED_ELEMENT* closed,            //Closed arguments&lt;br /&gt;
   EIF_TYPED_ELEMENT* open)              //Open arguments&lt;br /&gt;
{&lt;br /&gt;
    return &lt;br /&gt;
      (FUNCTION_CAST(EIF_REFERENCE, (EIF_REFERENCE, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_REFERENCE)) &lt;br /&gt;
      //Dynamic binding using the target:  &lt;br /&gt;
      RTVF(350, 30, &amp;quot;f&amp;quot;, closed [1].element.rarg))(  &lt;br /&gt;
      //Arranging the open and closed arguments:&lt;br /&gt;
            closed [1].element.rarg,                    &lt;br /&gt;
            open [1].element.i32arg, &lt;br /&gt;
            closed [2].element.i32arg, &lt;br /&gt;
            open [2].element.rarg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
This example shows how the wrapper does its three tasks. The suffix &amp;quot;_2_4&amp;quot; of the wrapper comes from the fact that the second and forth parameter (first and third argument) are open.&lt;br /&gt;
&lt;br /&gt;
A second example is given:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
            agent {C}.f (1, ?, &amp;quot;hello&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
For this '''agent creation''' the wrapper function looks like:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;[c, N]&lt;br /&gt;
EIF_REFERENCE _fAaatpmf_1_3 (&lt;br /&gt;
   EIF_REFERENCE (*f_ptr)(EIF_REFERENCE,  //can be ignored &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_REFERENCE), &lt;br /&gt;
   EIF_TYPED_ELEMENT* closed,             //Closed arguments&lt;br /&gt;
   EIF_TYPED_ELEMENT* open)               //Open arguments&lt;br /&gt;
{&lt;br /&gt;
   return &lt;br /&gt;
      (FUNCTION_CAST(EIF_REFERENCE, (EIF_REFERENCE, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_REFERENCE)) &lt;br /&gt;
      //Dynamic binding using the target:  &lt;br /&gt;
      RTVF(350, 30, &amp;quot;f&amp;quot;, open [1].element.rarg))(&lt;br /&gt;
      //Arranging the open and closed arguments:&lt;br /&gt;
         open [1].element.rarg, &lt;br /&gt;
         closed [1].element.i32arg, &lt;br /&gt;
         open [2].element.i32arg, &lt;br /&gt;
         closed [2].element.rarg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This time the suffix is &amp;quot;_1_3&amp;quot; since the first and third parameter (target and second argument) are open.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Agent call====&lt;br /&gt;
An '''agent call''' like the following:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
   f: FUNCTION [ANY, TUPLE [INTEGER], INTEGER]&lt;br /&gt;
   b: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
   b := f.item ([10])&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
Obviously calls feature &amp;lt;eiffel&amp;gt;item&amp;lt;/eiffel&amp;gt; of class &amp;lt;eiffel&amp;gt;FUNCTION&amp;lt;/eiffel&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
item (args: OPEN_ARGS): RESULT_TYPE is&lt;br /&gt;
   -- Result of calling function with `args' as operands.&lt;br /&gt;
   require&lt;br /&gt;
      valid_operands: valid_operands (args)&lt;br /&gt;
   local&lt;br /&gt;
      l_closed_count: INTEGER&lt;br /&gt;
   do&lt;br /&gt;
      l_closed_count :=  closed_operands.count&lt;br /&gt;
      Result := fast_item (encaps_rout_disp, calc_rout_addr, &lt;br /&gt;
            $closed_operands, $args, class_id, feature_id,&lt;br /&gt;
            is_precompiled, is_basic, is_inline_agent, &lt;br /&gt;
            l_closed_count, open_count, $open_map)&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This leads to a call to the external C feature &amp;lt;eiffel&amp;gt;fast_item&amp;lt;/eiffel&amp;gt; of class &amp;lt;eiffel&amp;gt;FUNCTION&amp;lt;/eiffel&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;fast_item (a_rout_disp, a_calc_rout_addr: POINTER&lt;br /&gt;
	   a_closed_operands: POINTER; a_operands: POINTER&lt;br /&gt;
	   a_class_id, a_feature_id: INTEGER&lt;br /&gt;
           a_is_precompiled, a_is_basic, a_is_inline_agent: BOOLEAN&lt;br /&gt;
	   a_closed_count, a_open_count: INTEGER; a_open_map: POINTER): RESULT_TYPE&lt;br /&gt;
	external&lt;br /&gt;
	    &amp;quot;C inline use %&amp;quot;eif_rout_obj.h%&amp;quot;&amp;quot;&lt;br /&gt;
	alias&lt;br /&gt;
	    &amp;quot;[&lt;br /&gt;
                #ifdef WORKBENCH&lt;br /&gt;
		    $$_result_type result;&lt;br /&gt;
		    if ($a_rout_disp != 0) {&lt;br /&gt;
			return (FUNCTION_CAST($$_result_type, &lt;br /&gt;
                            (EIF_POINTER, EIF_REFERENCE, EIF_REFERENCE)) $a_rout_disp)(&lt;br /&gt;
			    $a_calc_rout_addr, $a_closed_operands, $a_operands);&lt;br /&gt;
		    } else {&lt;br /&gt;
			...&lt;br /&gt;
		    }&lt;br /&gt;
		#else&lt;br /&gt;
		    ...&lt;br /&gt;
		#endif&lt;br /&gt;
	    ]&amp;quot;&lt;br /&gt;
	end&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When there is a valid function pointer to the wrapper (&amp;lt;c&amp;gt;a_rout_disp != 0&amp;lt;/c&amp;gt;) it is called with the closed and open operands as parameters. The wrapper will then call the actual '''agent callee'''. The case when there is no valid function pointer will be considered later.&lt;br /&gt;
&lt;br /&gt;
====Improving the dynamic binding====&lt;br /&gt;
When at '''agent creation''' the target is closed, the exact '''agent callee''' can be calculated at '''agent creation'''. This improves performance when the agent is called more than once. This optimization is only done when in final mode.&lt;br /&gt;
&lt;br /&gt;
====Eradicating manifest tuple creation====&lt;br /&gt;
In finalized mode there is a simple optimization that speeds things up significantly. It is not uncommon, that an '''agent calls''' passes a manifest tuple as parameter, see the following call:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
   b := f.item ([10, 20, &amp;quot;hello&amp;quot;])&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The lifetime of this tuple is short. It is only used throughout the call to &amp;lt;eiffel&amp;gt;item&amp;lt;/eiffel&amp;gt;. Tuple creations are not that fast, they take several times longer than the '''agent call''' itself. Thats why the EiffelStudio in finalized mode replaces these calls to &amp;lt;eiffel&amp;gt;item&amp;lt;/eiffel&amp;gt; by a direct call to wrapper function. If the open parameters in Eiffel code are passed in the form of a manifest tuple, they are directly passed to the wrapper function in the translated code, to get rid of the slow tuple creation.&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
tp1 = RTMS_EX_H(&amp;quot;hello&amp;quot;,5,1702403183);&lt;br /&gt;
tp2 = tp1;&lt;br /&gt;
tp1 = (FUNCTION_CAST(EIF_REFERENCE, (EIF_POINTER, &lt;br /&gt;
                                     EIF_REFERENCE, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_REFERENCE)) &lt;br /&gt;
      *(EIF_POINTER *)(loc3+ @PTROFF(5,4,0,3,0,0)))(    //calling the wrapper function&lt;br /&gt;
         *(EIF_POINTER *)(loc3+ @PTROFF(5,4,0,3,0,1)),  //passing the calculated agent callee&lt;br /&gt;
	 *(EIF_REFERENCE *)(loc3 + @REFACS(1)),         //passing the closed parameters&lt;br /&gt;
         ((EIF_INTEGER_32) 10L),                        //passing 10&lt;br /&gt;
         ((EIF_INTEGER_32) 11L),                        //passing 11&lt;br /&gt;
         tp2);                                          //passing &amp;quot;hello&amp;quot;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Wrapper functions in final mode====&lt;br /&gt;
Due to the potential optimization described above, in final mode two C wrapper functions are generated:&lt;br /&gt;
*one which expects the closed arguments as a tuple (encapsulated). The only difference to the frozen wrapper is how the '''agent callee''' is calculated.&lt;br /&gt;
*and one that expects them as separate parameters. &lt;br /&gt;
&lt;br /&gt;
For the '''agent creation''':&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
agent c.f (?, 1, ?)&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
the following wrapper functions are generated:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
EIF_REFERENCE _fAaatpmf_2_4 (&lt;br /&gt;
   EIF_REFERENCE (*f_ptr)(EIF_REFERENCE, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_REFERENCE), &lt;br /&gt;
   EIF_TYPED_ELEMENT* closed, &lt;br /&gt;
   EIF_TYPED_ELEMENT* open)&lt;br /&gt;
{&lt;br /&gt;
    return f_ptr (closed [1].element.rarg, &lt;br /&gt;
                  open [1].element.i32arg, &lt;br /&gt;
                  closed [2].element.i32arg, &lt;br /&gt;
                  open [2].element.rarg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
EIF_REFERENCE __fAaatpmf_2_4 (&lt;br /&gt;
   EIF_REFERENCE (*f_ptr)(EIF_REFERENCE, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_REFERENCE), &lt;br /&gt;
   EIF_TYPED_ELEMENT* closed, &lt;br /&gt;
   EIF_INTEGER_32 op_2, &lt;br /&gt;
   EIF_REFERENCE op_4)&lt;br /&gt;
{&lt;br /&gt;
    return f_ptr (closed [1].element.rarg, &lt;br /&gt;
                  op_2, &lt;br /&gt;
                  closed [2].element.i32arg, &lt;br /&gt;
                  op_4);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
The name of the wrapper for the encapsulated closed arguments always starts with one '_', whereas the other one starts with two underlines.&lt;br /&gt;
&lt;br /&gt;
====Melted agent creator====&lt;br /&gt;
Of course it is possible that the '''agent creation''' is melted and hence there is no wrapper. For this situation the Eiffel runtime provides two generic wrapper functions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[c, N]&lt;br /&gt;
RT_LNK void rout_obj_call_procedure_dynamic (&lt;br /&gt;
    int stype_id, int feature_id, int is_precompiled, int is_basic_type, int is_inline_agent, EIF_TYPED_ELEMENT* closed_args, &lt;br /&gt;
    int closed_count, EIF_TYPED_ELEMENT* open_args, int open_count, EIF_REFERENCE open_map);&lt;br /&gt;
&lt;br /&gt;
RT_LNK void rout_obj_call_function_dynamic (&lt;br /&gt;
    int stype_id, int feature_id, int is_precompiled, int is_basic_type, int is_inline_agent, EIF_TYPED_ELEMENT* closed_args, &lt;br /&gt;
    int closed_count, EIF_TYPED_ELEMENT* open_args, int open_count, EIF_REFERENCE open_map, void* res);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These functions calculate the '''agent callee''' with the static type id and a feature id. Furthermore the reordering of open and closed arguments has to be done at agent call time with help of the open_map.&lt;br /&gt;
&lt;br /&gt;
== Strategy for optimizing dotnet Agent Calls ==&lt;br /&gt;
Work in progress!&lt;br /&gt;
Compared to the Classic version, dotnet Agent Calls are slow. The a short look at feature apply of class FUNCTION shows why:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply &lt;br /&gt;
        -- Call function with `operands' as last set.&lt;br /&gt;
    do&lt;br /&gt;
        if attached {RESULT_TYPE} rout_disp.invoke (target_object, internal_operands) as al_last_result then&lt;br /&gt;
            last_result := al_last_result&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The actual call is done through reflection. Additionally, in dotnet the two major optimizations are missing:&lt;br /&gt;
&lt;br /&gt;
*Directly passing the elements of manifest tuples as parameters. (And hence not creating the tuple)&lt;br /&gt;
*Computing the reordering of closed and open operands at compile time. (By generating the proper wrapper)&lt;br /&gt;
&lt;br /&gt;
All these three issues can be removed.&lt;br /&gt;
&lt;br /&gt;
For every '''agent creation''' we create: &lt;br /&gt;
* A delegate type that requires two Tuples (closed and open arguments) as arguments. &lt;br /&gt;
* A static method that conforms to this delegate type. This method does the ordering of closed and open arguments and calls the '''agent callee'''.&lt;br /&gt;
* A second delegate type, that requires one Tuple (closed arguments) and all the open arguments as arguments.&lt;br /&gt;
* A second static method which conforms to the second delegate type and does the ordering and '''agent callee''' call.&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Agent_Calls&amp;diff=15000</id>
		<title>Agent Calls</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Agent_Calls&amp;diff=15000"/>
				<updated>2014-02-01T18:44:55Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Replace obsolete syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Code Generation]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
====Introduction====&lt;br /&gt;
The Eiffel programming language supports closures with agents. As a reminder, an agent is a normal Eiffel object of one of the types:&lt;br /&gt;
*FUNCTION&lt;br /&gt;
*PROCEDURE&lt;br /&gt;
Some terminology is needed: The place where an agent is created (with the agent keyword or the tilde operator) is called the '''agent creation'''. The feature to which the agent points is the '''agent callee''' and the place (or places) where the agent is called is denoted '''agent call'''. &lt;br /&gt;
&lt;br /&gt;
An example that clarifies these terms:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel,N]class &lt;br /&gt;
    TERMINOLOGY&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
&lt;br /&gt;
    f1&lt;br /&gt;
        local&lt;br /&gt;
            p: PROCEDURE [ANY, TUPLE]&lt;br /&gt;
        do&lt;br /&gt;
            p := agent target   -- agent creation&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    f2 (p: PROCEDURE [ANY, TUPLE])&lt;br /&gt;
        do&lt;br /&gt;
            p.call ([])         -- agent call&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
    target                      -- callee&lt;br /&gt;
        do&lt;br /&gt;
        end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====The problem====&lt;br /&gt;
It is again helpful to focus on the differences between the Eiffel and C language. Eiffel supports closures, C only supports function pointers. A way is needed thus to construct closures based on function pointers. Dynamic binding also contributes its part to the problem. It is not known at compile time which exact feature an agent (when looking at its '''agent creation''') refers to. But it gets even worse, sometimes the feature is not known until the agent is called (at runtime). This is the case for agents with open targets.&lt;br /&gt;
====The data structure====&lt;br /&gt;
Class C will be used for the following examples:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel,N]class&lt;br /&gt;
    C&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    f (p1, p2: INTEGER; p3: STRING): STRING&lt;br /&gt;
        do&lt;br /&gt;
            ...&lt;br /&gt;
        end   &lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
There are three data structures needed for an agent:&lt;br /&gt;
* The open_map (member of class ROUTINE)&lt;br /&gt;
* The closed_operands (member of class ROUTINE)&lt;br /&gt;
* The open_operands&lt;br /&gt;
The open_map is known at compile time when an '''agent_creation''' is detected. The closed_operands are known at '''agent creation''' time. The open_operands are not known until the agent is called. &lt;br /&gt;
&lt;br /&gt;
The content of these structures will be given for agent one and two:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
! Agent one !! Agent two&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
agent c.f (?, 1, ?)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
agent {C}.f (1, ?, &amp;quot;hello&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The open_map is an array that has an entry for every open parameter. Its content for agents one and two are:&lt;br /&gt;
#{2,4}&lt;br /&gt;
#{1,3}&lt;br /&gt;
The closed_operands is a TUPLE that has an entry for every closed operand. Its content for agents one and two again:&lt;br /&gt;
#{c, 1}&lt;br /&gt;
#{1, &amp;quot;hello&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
====The wrapper====&lt;br /&gt;
It comes by no surprise that the compiler creates special wrapper functions for agents. It is interesting though that these wrappers are created per '''agent creation'''. This has the advantage that it is known whether a given formal argument is open or closed. &lt;br /&gt;
&lt;br /&gt;
In workbench mode, for every '''agent creation''' a C-function is generated. This wrapper function does the following:&lt;br /&gt;
*Arrange the closed and open arguments in the right order.&lt;br /&gt;
*Calculate the proper '''agent callee''' based on the dynamic type of the target.&lt;br /&gt;
*Call the '''agent callee'''.&lt;br /&gt;
&lt;br /&gt;
For the '''agent creation''':&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
            agent c.f (?, 1, ?)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
the following wrapper function is generated:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;[c, N]EIF_REFERENCE _fAaatpmf_2_4 (&lt;br /&gt;
   EIF_REFERENCE (*f_ptr)(EIF_REFERENCE, //can be ignored &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_REFERENCE), &lt;br /&gt;
   EIF_TYPED_ELEMENT* closed,            //Closed arguments&lt;br /&gt;
   EIF_TYPED_ELEMENT* open)              //Open arguments&lt;br /&gt;
{&lt;br /&gt;
    return &lt;br /&gt;
      (FUNCTION_CAST(EIF_REFERENCE, (EIF_REFERENCE, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_REFERENCE)) &lt;br /&gt;
      //Dynamic binding using the target:  &lt;br /&gt;
      RTVF(350, 30, &amp;quot;f&amp;quot;, closed [1].element.rarg))(  &lt;br /&gt;
      //Arranging the open and closed arguments:&lt;br /&gt;
            closed [1].element.rarg,                    &lt;br /&gt;
            open [1].element.i32arg, &lt;br /&gt;
            closed [2].element.i32arg, &lt;br /&gt;
            open [2].element.rarg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
This example shows how the wrapper does its three tasks. The suffix &amp;quot;_2_4&amp;quot; of the wrapper comes from the fact that the second and forth parameter (first and third argument) are open.&lt;br /&gt;
&lt;br /&gt;
A second example is given:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
            agent {C}.f (1, ?, &amp;quot;hello&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
For this '''agent creation''' the wrapper function looks like:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;[c, N]&lt;br /&gt;
EIF_REFERENCE _fAaatpmf_1_3 (&lt;br /&gt;
   EIF_REFERENCE (*f_ptr)(EIF_REFERENCE,  //can be ignored &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_REFERENCE), &lt;br /&gt;
   EIF_TYPED_ELEMENT* closed,             //Closed arguments&lt;br /&gt;
   EIF_TYPED_ELEMENT* open)               //Open arguments&lt;br /&gt;
{&lt;br /&gt;
   return &lt;br /&gt;
      (FUNCTION_CAST(EIF_REFERENCE, (EIF_REFERENCE, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_REFERENCE)) &lt;br /&gt;
      //Dynamic binding using the target:  &lt;br /&gt;
      RTVF(350, 30, &amp;quot;f&amp;quot;, open [1].element.rarg))(&lt;br /&gt;
      //Arranging the open and closed arguments:&lt;br /&gt;
         open [1].element.rarg, &lt;br /&gt;
         closed [1].element.i32arg, &lt;br /&gt;
         open [2].element.i32arg, &lt;br /&gt;
         closed [2].element.rarg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This time the suffix is &amp;quot;_1_3&amp;quot; since the first and third parameter (target and second argument) are open.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Agent call====&lt;br /&gt;
An '''agent call''' like the following:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
   f: FUNCTION [ANY, TUPLE [INTEGER], INTEGER]&lt;br /&gt;
   b: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
   b := f.item ([10])&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
Obviously calls feature &amp;lt;eiffel&amp;gt;item&amp;lt;/eiffel&amp;gt; of class &amp;lt;eiffel&amp;gt;FUNCTION&amp;lt;/eiffel&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
item (args: OPEN_ARGS): RESULT_TYPE is&lt;br /&gt;
   -- Result of calling function with `args' as operands.&lt;br /&gt;
   require&lt;br /&gt;
      valid_operands: valid_operands (args)&lt;br /&gt;
   local&lt;br /&gt;
      l_closed_count: INTEGER&lt;br /&gt;
   do&lt;br /&gt;
      l_closed_count :=  closed_operands.count&lt;br /&gt;
      Result := fast_item (encaps_rout_disp, calc_rout_addr, &lt;br /&gt;
            $closed_operands, $args, class_id, feature_id,&lt;br /&gt;
            is_precompiled, is_basic, is_inline_agent, &lt;br /&gt;
            l_closed_count, open_count, $open_map)&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This leads to a call to the external C feature &amp;lt;eiffel&amp;gt;fast_item&amp;lt;/eiffel&amp;gt; of class &amp;lt;eiffel&amp;gt;FUNCTION&amp;lt;/eiffel&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;fast_item (a_rout_disp, a_calc_rout_addr: POINTER&lt;br /&gt;
	   a_closed_operands: POINTER; a_operands: POINTER&lt;br /&gt;
	   a_class_id, a_feature_id: INTEGER&lt;br /&gt;
           a_is_precompiled, a_is_basic, a_is_inline_agent: BOOLEAN&lt;br /&gt;
	   a_closed_count, a_open_count: INTEGER; a_open_map: POINTER): RESULT_TYPE&lt;br /&gt;
	external&lt;br /&gt;
	    &amp;quot;C inline use %&amp;quot;eif_rout_obj.h%&amp;quot;&amp;quot;&lt;br /&gt;
	alias&lt;br /&gt;
	    &amp;quot;[&lt;br /&gt;
                #ifdef WORKBENCH&lt;br /&gt;
		    $$_result_type result;&lt;br /&gt;
		    if ($a_rout_disp != 0) {&lt;br /&gt;
			return (FUNCTION_CAST($$_result_type, &lt;br /&gt;
                            (EIF_POINTER, EIF_REFERENCE, EIF_REFERENCE)) $a_rout_disp)(&lt;br /&gt;
			    $a_calc_rout_addr, $a_closed_operands, $a_operands);&lt;br /&gt;
		    } else {&lt;br /&gt;
			...&lt;br /&gt;
		    }&lt;br /&gt;
		#else&lt;br /&gt;
		    ...&lt;br /&gt;
		#endif&lt;br /&gt;
	    ]&amp;quot;&lt;br /&gt;
	end&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When there is a valid function pointer to the wrapper (&amp;lt;c&amp;gt;a_rout_disp != 0&amp;lt;/c&amp;gt;) it is called with the closed and open operands as parameters. The wrapper will then call the actual '''agent callee'''. The case when there is no valid function pointer will be considered later.&lt;br /&gt;
&lt;br /&gt;
====Improving the dynamic binding====&lt;br /&gt;
When at '''agent creation''' the target is closed, the exact '''agent callee''' can be calculated at '''agent creation'''. This improves performance when the agent is called more than once. This optimization is only done when in final mode.&lt;br /&gt;
&lt;br /&gt;
====Eradicating manifest tuple creation====&lt;br /&gt;
In finalized mode there is a simple optimization that speeds things up significantly. It is not uncommon, that an '''agent calls''' passes a manifest tuple as parameter, see the following call:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
   b := f.item ([10, 20, &amp;quot;hello&amp;quot;])&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The lifetime of this tuple is short. It is only used throughout the call to &amp;lt;eiffel&amp;gt;item&amp;lt;/eiffel&amp;gt;. Tuple creations are not that fast, they take several times longer than the '''agent call''' itself. Thats why the EiffelStudio in finalized mode replaces these calls to &amp;lt;eiffel&amp;gt;item&amp;lt;/eiffel&amp;gt; by a direct call to wrapper function. If the open parameters in Eiffel code are passed in the form of a manifest tuple, they are directly passed to the wrapper function in the translated code, to get rid of the slow tuple creation.&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
tp1 = RTMS_EX_H(&amp;quot;hello&amp;quot;,5,1702403183);&lt;br /&gt;
tp2 = tp1;&lt;br /&gt;
tp1 = (FUNCTION_CAST(EIF_REFERENCE, (EIF_POINTER, &lt;br /&gt;
                                     EIF_REFERENCE, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_INTEGER_32, &lt;br /&gt;
                                     EIF_REFERENCE)) &lt;br /&gt;
      *(EIF_POINTER *)(loc3+ @PTROFF(5,4,0,3,0,0)))(    //calling the wrapper function&lt;br /&gt;
         *(EIF_POINTER *)(loc3+ @PTROFF(5,4,0,3,0,1)),  //passing the calculated agent callee&lt;br /&gt;
	 *(EIF_REFERENCE *)(loc3 + @REFACS(1)),         //passing the closed parameters&lt;br /&gt;
         ((EIF_INTEGER_32) 10L),                        //passing 10&lt;br /&gt;
         ((EIF_INTEGER_32) 11L),                        //passing 11&lt;br /&gt;
         tp2);                                          //passing &amp;quot;hello&amp;quot;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Wrapper functions in final mode====&lt;br /&gt;
Due to the potential optimization described above, in final mode two C wrapper functions are generated:&lt;br /&gt;
*one which expects the closed arguments as a tuple (encapsulated). The only difference to the frozen wrapper is how the '''agent callee''' is calculated.&lt;br /&gt;
*and one that expects them as separate parameters. &lt;br /&gt;
&lt;br /&gt;
For the '''agent creation''':&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
agent c.f (?, 1, ?)&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
the following wrapper functions are generated:&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
EIF_REFERENCE _fAaatpmf_2_4 (&lt;br /&gt;
   EIF_REFERENCE (*f_ptr)(EIF_REFERENCE, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_REFERENCE), &lt;br /&gt;
   EIF_TYPED_ELEMENT* closed, &lt;br /&gt;
   EIF_TYPED_ELEMENT* open)&lt;br /&gt;
{&lt;br /&gt;
    return f_ptr (closed [1].element.rarg, &lt;br /&gt;
                  open [1].element.i32arg, &lt;br /&gt;
                  closed [2].element.i32arg, &lt;br /&gt;
                  open [2].element.rarg);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
EIF_REFERENCE __fAaatpmf_2_4 (&lt;br /&gt;
   EIF_REFERENCE (*f_ptr)(EIF_REFERENCE, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_INTEGER_32, &lt;br /&gt;
                          EIF_REFERENCE), &lt;br /&gt;
   EIF_TYPED_ELEMENT* closed, &lt;br /&gt;
   EIF_INTEGER_32 op_2, &lt;br /&gt;
   EIF_REFERENCE op_4)&lt;br /&gt;
{&lt;br /&gt;
    return f_ptr (closed [1].element.rarg, &lt;br /&gt;
                  op_2, &lt;br /&gt;
                  closed [2].element.i32arg, &lt;br /&gt;
                  op_4);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
The name of the wrapper for the encapsulated closed arguments always starts with one '_', whereas the other one starts with two underlines.&lt;br /&gt;
&lt;br /&gt;
====Melted agent creator====&lt;br /&gt;
Of course it is possible that the '''agent creation''' is melted and hence there is no wrapper. For this situation the Eiffel runtime provides two generic wrapper functions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[c, N]&lt;br /&gt;
RT_LNK void rout_obj_call_procedure_dynamic (&lt;br /&gt;
    int stype_id, int feature_id, int is_precompiled, int is_basic_type, int is_inline_agent, EIF_TYPED_ELEMENT* closed_args, &lt;br /&gt;
    int closed_count, EIF_TYPED_ELEMENT* open_args, int open_count, EIF_REFERENCE open_map);&lt;br /&gt;
&lt;br /&gt;
RT_LNK void rout_obj_call_function_dynamic (&lt;br /&gt;
    int stype_id, int feature_id, int is_precompiled, int is_basic_type, int is_inline_agent, EIF_TYPED_ELEMENT* closed_args, &lt;br /&gt;
    int closed_count, EIF_TYPED_ELEMENT* open_args, int open_count, EIF_REFERENCE open_map, void* res);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These functions calculate the '''agent callee''' with the static type id and a feature id. Furthermore the reordering of open and closed arguments has to be done at agent call time with help of the open_map.&lt;br /&gt;
&lt;br /&gt;
== Strategy for optimizing dotnet Agent Calls ==&lt;br /&gt;
Work in progress!&lt;br /&gt;
Compared to the Classic version, dotnet Agent Calls are slow. The a short look at feature apply of class FUNCTION shows why:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply &lt;br /&gt;
        -- Call function with `operands' as last set.&lt;br /&gt;
    do&lt;br /&gt;
        if attached rout_disp.invoke (target_object, internal_operands) as al_last_result then&lt;br /&gt;
            last_result := al_last_result&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The actual call is done through reflection. Additionally, in dotnet the two major optimizations are missing:&lt;br /&gt;
&lt;br /&gt;
*Directly passing the elements of manifest tuples as parameters. (And hence not creating the tuple)&lt;br /&gt;
*Computing the reordering of closed and open operands at compile time. (By generating the proper wrapper)&lt;br /&gt;
&lt;br /&gt;
All these three issues can be removed.&lt;br /&gt;
&lt;br /&gt;
For every '''agent creation''' we create: &lt;br /&gt;
* A delegate type that requires two Tuples (closed and open arguments) as arguments. &lt;br /&gt;
* A static method that conforms to this delegate type. This method does the ordering of closed and open arguments and calls the '''agent callee'''.&lt;br /&gt;
* A second delegate type, that requires one Tuple (closed arguments) and all the open arguments as arguments.&lt;br /&gt;
* A second static method which conforms to the second delegate type and does the ordering and '''agent callee''' call.&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14999</id>
		<title>Immutable Interface</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14999"/>
				<updated>2014-02-01T18:20:44Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: English corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Immutability]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Eiffel Base 2 relies on partial (see below) immutable interfaces to design better abstractions and to allow a better use of the library.&lt;br /&gt;
This page sketch a solution to allow full immutable interface designs.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
An interface is immutable if it exports only queries. The routines exported to no classes are not included in the class interface.&lt;br /&gt;
Note that an immutable class has an immutable interface and more queries must be pure, i.e. with no side-effect.&lt;br /&gt;
&lt;br /&gt;
== Issue ==&lt;br /&gt;
Immutable interfaces are not conceivable in the current state of the Eiffel Standard.&lt;br /&gt;
Indeed, all classes inherit of ANY. However ANY has not an immutable interface, it exports some commands. Therefore no immutable interface is conceivable.&lt;br /&gt;
&lt;br /&gt;
ANY class interface (queries are omitted):&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface&lt;br /&gt;
	ANY&lt;br /&gt;
	&lt;br /&gt;
feature -- Duplication&lt;br /&gt;
&lt;br /&gt;
	copy (other: like Current)&lt;br /&gt;
			-- Update current object using fields of object attached&lt;br /&gt;
			-- to `other', so as to yield equal objects.&lt;br /&gt;
		require&lt;br /&gt;
			type_identity: same_type (other)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Current ~ other&lt;br /&gt;
&lt;br /&gt;
	frozen deep_copy (other: like Current)&lt;br /&gt;
			-- Effect equivalent to that of:&lt;br /&gt;
			--		copy (`other' . deep_twin)&lt;br /&gt;
		ensure&lt;br /&gt;
			deep_equal: deep_equal (Current, other)&lt;br /&gt;
	&lt;br /&gt;
feature -- Basic Operations&lt;br /&gt;
&lt;br /&gt;
	default_rescue&lt;br /&gt;
			-- Process exception for routines with no Rescue clause.&lt;br /&gt;
			-- (Default: do nothing.)&lt;br /&gt;
&lt;br /&gt;
	frozen do_nothing&lt;br /&gt;
			-- Execute a null action.&lt;br /&gt;
&lt;br /&gt;
feature -- Output&lt;br /&gt;
&lt;br /&gt;
	print (o: detachable ANY)&lt;br /&gt;
			-- Write terse external representation of `o'&lt;br /&gt;
			-- on standard output.&lt;br /&gt;
			&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make ANY as immutable interface ==&lt;br /&gt;
=== Export commands to no classes ===&lt;br /&gt;
* The command 'default_rescue' allows to change an internal behavior. This command can be exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The command 'do_nothing' is a procedure specially interesting for agent uses.&lt;br /&gt;
A qualified call of 'do_nothing' on any objects is not useful. An interesting use can be:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	EXAMPLE&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
	do_something&lt;br /&gt;
		do&lt;br /&gt;
			do_something_with (agent {A}.do_nothing)&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	do_something_with (a: PROCEDURE [ANY, TUPLE [A]])&lt;br /&gt;
		do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However the contravariance (concept not introduced yet) of the second generic parameter of PROCEDURE can remove this use:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	EXAMPLE&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
	do_something&lt;br /&gt;
		do&lt;br /&gt;
			do_something_with (agent do_nothing)&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	do_something_with (a: PROCEDURE [ANY, TUPLE [A]])&lt;br /&gt;
		do end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore the command 'do_nothing' can be exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The command 'print' could be called only with unqualified calls. It can be too exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The commands 'copy' and 'deep_copy' are probably used mainly through the queries 'twin' and respectively 'deep_twin'.&lt;br /&gt;
Export this commands to no classes seems have no important disturbance. It is always possible to export its in descendants.&lt;br /&gt;
&lt;br /&gt;
However, we can easily imagine that 'twin' and 'deep_twin' create a new object and then apply 'copy' and respectively 'deep_copy'.&lt;br /&gt;
This process does not follow the Eiffel creation philosophy.&lt;br /&gt;
Maybe it is an opportunity to correct it and then to write the queries 'twin' and 'deep_twin' with Eiffel code.&lt;br /&gt;
&lt;br /&gt;
A solution would be to make both commands as creation commands.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	ANY&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
	copy,&lt;br /&gt;
	deep_copy,&lt;br /&gt;
	default_create&lt;br /&gt;
&lt;br /&gt;
feature {NONE}-- Initialization&lt;br /&gt;
	&lt;br /&gt;
	copy (other: like Current)&lt;br /&gt;
			-- Update current object using fields of object attached&lt;br /&gt;
			-- to `other', so as to yield equal objects.&lt;br /&gt;
		require&lt;br /&gt;
			type_identity: same_type (other)&lt;br /&gt;
		external&lt;br /&gt;
			&amp;quot;built_in&amp;quot;&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Current ~ other&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	-- ...&lt;br /&gt;
		&lt;br /&gt;
feature -- Duplication&lt;br /&gt;
&lt;br /&gt;
	frozen twin: like Current&lt;br /&gt;
			-- New object equal to `Current'&lt;br /&gt;
			-- `twin' calls `copy'; to change copying/twinning semantics, redefine `copy'.&lt;br /&gt;
		do&lt;br /&gt;
			create Result.copy (Current)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Result ~ Current&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	-- ...&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The both commands can be exported to no classes and two queries can be writed in Eiffel code.&lt;br /&gt;
However the developer must declare the creation commands for each effective class.&lt;br /&gt;
&lt;br /&gt;
To remove this issue we can introduce the inherited creation command mechanism.&lt;br /&gt;
&lt;br /&gt;
=== Inherited Creation Command ===&lt;br /&gt;
A simple addition to Eiffel could be to allow the create clause in deferred classes.&lt;br /&gt;
The creation commands declared in deferred classes would be inherited creation commands, i.e. creation commands implicitly declared in each descendants.&lt;br /&gt;
&lt;br /&gt;
If an effective class declares no new creation commands then all inherited creation commands and the command 'default_create' are creation commands.&lt;br /&gt;
If an effective class declares new creation commands then all inherited creation commands and new ones are creation commands.&lt;br /&gt;
An inherited creation command can be declared again in an effective class. This possibility allows then all inherited commands as creation commands without 'default_create' (except if 'default_create' is an inherited creation command).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
create -- inherited&lt;br /&gt;
	make&lt;br /&gt;
&lt;br /&gt;
feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
	make (a_n: INTEGER)&lt;br /&gt;
		deferred end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	B&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	-- 'make' and 'default_create' are creation procedures&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	C&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
	make&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	-- 'make' is a creation procedure&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This addition does not affect existing code. The compatibility is preserved.&lt;br /&gt;
And more it can be useful in constrained generic context.&lt;br /&gt;
&lt;br /&gt;
=== ANY and inherited creation commands ===&lt;br /&gt;
The mechanism described in the previous section is not usable on ANY. Indeed, ANY is an effective class.&lt;br /&gt;
However is it very useful to allow the creation of ANY instance?&lt;br /&gt;
&lt;br /&gt;
I have not examples of use of ANY instances. Maybe it is more relevant to make ANY as deferred class and then to use the inherited creation command mechanism.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	ANY&lt;br /&gt;
&lt;br /&gt;
create -- inherited creation commands&lt;br /&gt;
	copy,&lt;br /&gt;
	deep_copy&lt;br /&gt;
	&lt;br /&gt;
feature&lt;br /&gt;
	-- ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Export all ANY class's commands allows the design of full immutable interfaces.&lt;br /&gt;
&lt;br /&gt;
In addition, the inherited creation command concept is a minimal mechanism compatible with existing software. It introduces no new keyword and allows to write two queries of ANY in Eiffel code.&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14974</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=14974"/>
				<updated>2014-01-12T11:40:37Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Postcondition for assigner commands&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a query is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Ensure a postcondition for assigner command&lt;br /&gt;
| After an assigment, the equality property is waited:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target := source&lt;br /&gt;
check target = source end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
(Except for some cases such as NaN).&lt;br /&gt;
Therefore the postcondition of assigner commands should verify it.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface &lt;br /&gt;
	A &lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	q (...): T assign c&lt;br /&gt;
	&lt;br /&gt;
	c (a_q: T; ...)&lt;br /&gt;
		ensure&lt;br /&gt;
			q (...) = a_q&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14959</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=14959"/>
				<updated>2013-12-08T22:20:49Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: assigner command precision&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
Proposition:&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14958</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=14958"/>
				<updated>2013-12-08T22:14:21Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: TUPLE is now iterable&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| Replace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Editing Text Files&lt;br /&gt;
|Being able to edit in the IDE other text files besides Eiffel class texts, for instance, gobo lex (.l) and yacc (.y), or C headers (.h). The files might be added manually to a cluster in the 'groups view'.  &lt;br /&gt;
&lt;br /&gt;
|More convenient than having to switch between the Eiffel IDE and another editor, for a task that is essentially the same (text editing).&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;()&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Comparison_of_catcall_solutions&amp;diff=14904</id>
		<title>Comparison of catcall solutions</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Comparison_of_catcall_solutions&amp;diff=14904"/>
				<updated>2013-08-29T14:35:50Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Export status restrictions not adressed for Default and explicit variance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Catcall]]&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
By allowing covariant feature redefinition and hiding of features, the Eiffel language introduces the problem of catcalls (Changed Availability or Type). Currently the ECMA Eiffel standard does not specify how the occurrence of catcalls should be statically rejected.&lt;br /&gt;
&lt;br /&gt;
The purpose of this document is to show a comparison between different proposals on how to handle the issue of preventing catcalls.&lt;br /&gt;
&lt;br /&gt;
== Criteria for a solution ==&lt;br /&gt;
&lt;br /&gt;
To be able to judge a solution we use the following criteria which we consider as important:&lt;br /&gt;
&lt;br /&gt;
; Syntax overhead : How much syntax will be added to the language in order to express safe covariance and generics?&lt;br /&gt;
; Covariance on non-generic types : Are covariant argument redefinitions addressed in the solution? How does the programmer express it?&lt;br /&gt;
; Export status restrictions : Is restriction of export status addressed in the solution? How does the programmer express it?&lt;br /&gt;
; Use of generic types : How is conformance of generics? Are catcalls for generics addressed in the solution? How does the programmer express it? Can generics be used as now or are there restrictions?&lt;br /&gt;
:; Agents : Can agents be modeled with the solution while being type safe and expressive?&lt;br /&gt;
:; Comparator : Can comparator types be modeled with the solution while being type safe and expressive?&lt;br /&gt;
; Complexity of the compiler check : Is it just a matter of doing one check or several?&lt;br /&gt;
; Complexity of the runtime : Does the runtime need more information to do assignment attempts or object tests?&lt;br /&gt;
; Whole-system analysis : Is a whole-system analysis necessary?&lt;br /&gt;
; Dynamic class and type loading : Is it safe to dynamically load new classes at runtime and instantiate new types?&lt;br /&gt;
; Backward compatibility : Is the solution backward compatible to existing source code?&lt;br /&gt;
:; Applicable per cluster : Can the solution be applied on a per cluster basis?&lt;br /&gt;
; Support of compiler/IDE : Can the compiler/IDE help in updating existing source code? How?&lt;br /&gt;
&lt;br /&gt;
== General remarks ==&lt;br /&gt;
&lt;br /&gt;
=== Checking feature calls ===&lt;br /&gt;
&lt;br /&gt;
As the ''Single-level Call rule'' (8.25.3, VUSC) describes, a feature call is only valid if it is valid for every type in the dynamic type set. A simple solution would be that every feature call has to be checked for all possible descendants of the static target type. If this check is performed on a system, it will catch all catcalls - but also report false positives.&lt;br /&gt;
&lt;br /&gt;
Some of the proposed solutions try to address this problem by finding a better approximation to the dynamic type set so that the false positives can be ruled out.&lt;br /&gt;
&lt;br /&gt;
In general this is problematic as it requires a whole-system analysis, thus preventing the dynamic loading of new classes at run-time. The reason for this is that it is not known at compile time which features will be covariantly redefined by dynamically loaded classes.&lt;br /&gt;
&lt;br /&gt;
This is only the case with non-generic types. For generics, it is known at compile time that all features containing a formal in the parameter list can be treated as covariantly redefined and corresponding precautions can be implemented via the type system and conformance rules which allow to load even generic types at run-time.&lt;br /&gt;
&lt;br /&gt;
By the way, Eiffel Software has started to [[Single level call rule implementation|implement the basis of the ''single-level call rule'']] in it's Eiffel compiler. It is work in progress which revealed some implementation problems.&lt;br /&gt;
&lt;br /&gt;
=== Generic vs. non-generic covariance ===&lt;br /&gt;
&lt;br /&gt;
We can distinguish two different kinds of covariant argument redefinition:&lt;br /&gt;
&lt;br /&gt;
* When a generic type is derived, the formal generic parameters will be replaced by the actual generic parameters. Given the current conformance rules for generics, this can be seen as a covariant redefinition for all features which contain a formal generic as an argument. A simple example is the change from &amp;lt;e&amp;gt;LIST [ANY]&amp;lt;/e&amp;gt; to &amp;lt;e&amp;gt;LIST [INTEGER]&amp;lt;/e&amp;gt; where the feature &amp;lt;e&amp;gt;put&amp;lt;/e&amp;gt; changes signature from &amp;lt;e&amp;gt;ANY&amp;lt;/e&amp;gt; to &amp;lt;e&amp;gt;INTEGER&amp;lt;/e&amp;gt;.&lt;br /&gt;
* In the non-generic case, covariance happens for certain anchored type declarations and in the case of explicitly changing an argument type to a descendant. This happens in general only on a small subset of the features.&lt;br /&gt;
&lt;br /&gt;
The main difference is that in the generic case, all features which have a formal generic parameter automatically change the signature in different derivations whereas the non-generic case only specific features are covariantly redefined (if any at all). Also, in the generic case it is known for all possible descendants which features are redefined covariantly.&lt;br /&gt;
&lt;br /&gt;
This observation helps to understand the various proposals and to see their strengths and weaknesses:&lt;br /&gt;
* A proposal which operates on the feature level can be good for non-generic classes as you generally have a small number of features covariantly redefined and you only have to specify these features. In the case of generics this can become cumbersome as all features with formal generic parameters are always considered as covariantly redefined and thus for generics they always have to be considered.&lt;br /&gt;
* A proposal which operates on the type level is better suited for generics as you don't have to specify every single feature which has a formal generic parameter as argument. But they run into problems in the non-generic case if you look at anchored types - for example &amp;lt;e&amp;gt;like Current&amp;lt;/e&amp;gt;. Due to the fact that you have a covariant redeclaration in every descendant with such a feature, operating on the type level means that you have to handle every descendant specifically whereas if you operated on the feature level you could just handle this single feature.&lt;br /&gt;
* You see that there are two families of features: Features with formal arguments and ordinary features which are covariantly redefined. The fundamental difference between these two families is that they can change their signature independently. From &amp;lt;e&amp;gt;LIST [ANY]&amp;lt;/e&amp;gt; to &amp;lt;e&amp;gt;LIST [INTEGER]&amp;lt;/e&amp;gt; only the features based on the formal change their signature while they don't change from &amp;lt;e&amp;gt;LIST [ANY]&amp;lt;/e&amp;gt; to &amp;lt;e&amp;gt;LINKED_LIST [ANY]&amp;lt;/e&amp;gt; where the ordinary ones do. If you don't want to restrict the programmers expressiveness these feature families have to be addressed separately and a ''one fits all'' solution does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Contravariant generics ===&lt;br /&gt;
&lt;br /&gt;
The modeling of certain problems involving generics requires contravariance. The two examples which will be used are comparator objects and agents:&lt;br /&gt;
&lt;br /&gt;
* If you want to compare objects using a comparator, it either needs to be able to compare objects of the exact type, or an ancestor. Thus if you want to compare strings, either a comparator for &amp;lt;e&amp;gt;STRING&amp;lt;/e&amp;gt; or one for &amp;lt;e&amp;gt;ANY&amp;lt;/e&amp;gt; is suitable. &lt;br /&gt;
* If you want to pass an argument of type &amp;lt;e&amp;gt;STRING&amp;lt;/e&amp;gt; to an agent, the agent either has to accept a &amp;lt;e&amp;gt;STRING&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;ANY&amp;lt;/e&amp;gt; argument (or no argument at all).&lt;br /&gt;
&lt;br /&gt;
These problems can only be modeled if there is a way to express contravariant conformance for generics. This means that all proposed solutions which don't offer this possibility can't be used to model agents or comparator correctly and safely.&lt;br /&gt;
&lt;br /&gt;
=== Catcall benchmark ===&lt;br /&gt;
&lt;br /&gt;
[[Catcall checkpoints]]&lt;br /&gt;
&lt;br /&gt;
== Overview of general solutions ==&lt;br /&gt;
&lt;br /&gt;
The following proposals handle the case of covariance on non-generic and generic types.&lt;br /&gt;
&lt;br /&gt;
=== [[Novariance]] ===&lt;br /&gt;
&lt;br /&gt;
In the novariance proposal, covariant redefinition for arguments is prohibited. If covariance is needed for modeling purposes it can be [http://dev.eiffel.com/Covariance_through_renaming simulated by renaming].&lt;br /&gt;
&lt;br /&gt;
The conformance between generics with different formal parameters is removed.&lt;br /&gt;
&lt;br /&gt;
=== [[Forget / keep]] ===&lt;br /&gt;
&lt;br /&gt;
With the forget and keep mechanisms you specify per type on the feature level which features need not to be called - these features can safely be redefined covariantly - or which features have to be available - these features have to be typesafe for all possible values of a caller object.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://dev.eiffel.com/Forget_/_Keep_Mechanism Article on dev.eiffel.com]&lt;br /&gt;
&lt;br /&gt;
=== Dynamic typeset algorithm ===&lt;br /&gt;
&lt;br /&gt;
The dynamic typeset algorithm does not change any semantics of the types or the conformance as it is in Eiffel already, it only does an abstract execution of the system to limit the possibilities per feature call which have to be checked if they are safe.&lt;br /&gt;
&lt;br /&gt;
=== [[Interval types]] ===&lt;br /&gt;
&lt;br /&gt;
Interval types allow to define each type as an interval with a lower and upper type as boundary. This limits the dynamic type set and thus restricts the number of features which need to be checked for system-validity. In addition to this, it defines rules which handle the case of features with formal arguments.&lt;br /&gt;
&lt;br /&gt;
=== [[Read-write types]] ===&lt;br /&gt;
&lt;br /&gt;
Read-write types are a solution which can model interval types and usage-site variance. It splits a type into a ''read'' type and a ''write'' type. The read type defines the applicable features and the write type the signature to check for valid arguments.&lt;br /&gt;
&lt;br /&gt;
=== [[Default and explicit variance]] ===&lt;br /&gt;
Default and explicit variance is inspired of usage-site variance and detachable proposition.&lt;br /&gt;
The proposition add no new keyword.&lt;br /&gt;
&lt;br /&gt;
== Overview of solutions for non-generics ==&lt;br /&gt;
&lt;br /&gt;
These proposal only address the case for non-generics. For generic catcalls another solution (e.g. wildcard generics) can be used.&lt;br /&gt;
&lt;br /&gt;
=== [[Restrict types]] ===&lt;br /&gt;
&lt;br /&gt;
With restrict types you specify per type on the type level which descendant types that are allowed. Only these types can be assigned to such a variable, and all feature calls on these variables have to be valid for all possible types in this list.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://se.inf.ethz.ch/cgi-bin/ecma/index.cgi?IssueFLEX_CATCALL IssueFLEX_CATCALL on ECMA wiki]&amp;lt;br/&amp;gt;&lt;br /&gt;
Reference: Discussion in ECMA mailinglist named ''Catcall removal: another proposal'', [[Restrict types mail|available in parts]]&lt;br /&gt;
&lt;br /&gt;
=== [[DOG proposal]] ===&lt;br /&gt;
&lt;br /&gt;
With the DOG proposal, features which can be covariantly redefined have to be marked as such. These features can only be called on specially marked entities which have a restricted conformance, thus preventing assignments from descendants with potential covariantly redefined arguments.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://se.inf.ethz.ch/cgi-bin/ecma/index.cgi?IssueDOG IssueDOG on ECMA wiki]&lt;br /&gt;
&lt;br /&gt;
== Overview of solutions for generics ==&lt;br /&gt;
&lt;br /&gt;
These proposal only address the case for generics. For non-generic catcalls another solution (e.g. novariance) can be used.&lt;br /&gt;
&lt;br /&gt;
=== [[Usage-site variance]] ===&lt;br /&gt;
&lt;br /&gt;
This solution lets the programmer decide on the instantiation of a generic if the generic parameter should be covariant, contravariant or invariant. Depending on the variance, the applicable features of the type and the conformance rules to other generic types are changed.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://pag.csail.mit.edu/reading-group/variance-ECOOP02.pdf On variance-based subtyping for parametric types]&lt;br /&gt;
&lt;br /&gt;
=== [[Definition-site variance]] ===&lt;br /&gt;
&lt;br /&gt;
This solution lets the programmer decide in the definition of a generic class if the generic parameter should be covariant, contravariant or invariant. Depending on the variance, the formal generic can only appear at the argument, only appear as a result type or appear in both places. Also the conformance is adapted depending on the variance of the generic parameter.&lt;br /&gt;
&lt;br /&gt;
This is the solution which is implemented in the CLR, although not supported by generics in C# which are novariant.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://blogs.msdn.com/rmbyers/archive/2006/06/01/613690.aspx Article about generics in CLR]&lt;br /&gt;
&lt;br /&gt;
Note: There is also a [http://fams.de/text/type-safe-eiffel.html proposal by Bernd Schoeller] about ''variant and invariant'' generics which is a subset of this one and thus not explained in detail.&lt;br /&gt;
&lt;br /&gt;
=== Wildcard generics ===&lt;br /&gt;
&lt;br /&gt;
This mechanism extends the [[usage-site variance]] by adding a wildcard to the generic derivation. This wildcard denotes unspecified types and limits the use of features with generic parameters or result types over conformance to the wildcard types.&lt;br /&gt;
&lt;br /&gt;
Since the mechanism is almost identical to the usage-site variance, it will not be looked at in more detail. Please refer to the reference article for more information.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://www.jot.fm/issues/issue_2004_12/article5 Adding Wildcards to the Java Programming Language]&lt;br /&gt;
&lt;br /&gt;
== Overview of dynamic solutions ==&lt;br /&gt;
&lt;br /&gt;
These proposals do not prevent catcalls at compile-time but introduce means to handle catcalls at runtime.&lt;br /&gt;
&lt;br /&gt;
=== [[Detachable types]] ===&lt;br /&gt;
&lt;br /&gt;
This solution allows covariantly redefined features only to use detachable types. Through this mechanism, an object test is necessary before an argument can be used. This forces the programmer to test arguments for validity.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://se.ethz.ch/~meyer/publications/lncs/attached.pdf Article about ''attached types'' by Bertrand Meyer]&amp;lt;br/&amp;gt;&lt;br /&gt;
Reference: [http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA Eiffel standard 2nd edition of June 2006]&lt;br /&gt;
&lt;br /&gt;
=== Recast ===&lt;br /&gt;
&lt;br /&gt;
In the recast proposal, the programmer has to specify a transformation function when covariantly redefining a feature which can transform the old argument types to the new ones.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://se.inf.ethz.ch/cgi-bin/ecma/index.cgi?IssueCAT IssueCAT on ECMA wiki]&amp;lt;br/&amp;gt;&lt;br /&gt;
Reference: [http://www.inf.ethz.ch/~meyer/ongoing/covariance/recast.pdf Article about recast]&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
&lt;br /&gt;
Another way of handling catcalls at runtime is to raise exceptions. It can be required or not to provide a rescue clause which handles the case of the catcall.&lt;br /&gt;
&lt;br /&gt;
== Combinations ==&lt;br /&gt;
&lt;br /&gt;
It is also possible to combine different proposals:&lt;br /&gt;
&lt;br /&gt;
* Novariance for non-generic features and usage-site variance for generics .&lt;br /&gt;
* Forget / keep for non-generic features and definition-site variance for generics.&lt;br /&gt;
* DOG proposal for non-generic features and wildcard generics.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Results ==&lt;br /&gt;
&lt;br /&gt;
The following table summarizes the support of the various solutions to the criteria described above which can be used to judge a catcall solution.&lt;br /&gt;
&lt;br /&gt;
This results can be differently interpreted, so the colors may not be totally accurate. See the [[Comparison of catcall solutions#Table_explained|explanation at the end of the table]] for more information&lt;br /&gt;
&lt;br /&gt;
=== General solutions ===&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellpadding=2&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;visibility: hidden&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Criteria&lt;br /&gt;
! [[Novariance]]&lt;br /&gt;
! [[Forget / keep]]&lt;br /&gt;
! Dynamic typeset algorithm&lt;br /&gt;
! Default and explicit variance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Syntax overhead&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Red|Big}}: forget/keep clauses per type&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Covariance on non-generic types &lt;br /&gt;
| {{Red|Not allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Export status restrictions&lt;br /&gt;
| {{Red|Not allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Use of generic types&lt;br /&gt;
| {{Red|Very limited}}: Only invariant conformance&lt;br /&gt;
| {{Orange|Limited}}: Conformance restricted (''keep all'' as default)&amp;lt;br/&amp;gt;{{Orange|Limited}}: Use restricted (''forget all'' as default)&lt;br /&gt;
| {{Green|As it is now}}&lt;br /&gt;
| {{Orange|Limited}}: Conformance is limited&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Agents&lt;br /&gt;
| {{Orange|Limited}}&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Orange|Limited}}&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Red|As it is now}}&lt;br /&gt;
| {{Green|Fully supported}}&amp;lt;br/&amp;gt;{{Green|Safe}} - Class change needed for contravariant conformance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Comparator&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Green|Supported}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of compiler check&lt;br /&gt;
| {{Green|Small}}&lt;br /&gt;
| {{Orange|Medium}}: Check of feature call for all descendants; Conformance check on forget/keep clauses&lt;br /&gt;
| {{Red|Big}}: Iterative abstract system execution&lt;br /&gt;
| {{Green|Small}}: Check features for determinate the variance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of runtime&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Orange|Medium}}: Need to know cat features for object tests&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Whole-system analysis&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Red|Yes}}: use of ''forget all'' depends on system&lt;br /&gt;
| {{Red|Yes}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Dynamic class and type loading&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Red|No}}&lt;br /&gt;
| {{Red|No}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Backward compatibility&lt;br /&gt;
| {{Red|Very limited}}&lt;br /&gt;
| {{Orange|Limited}}&lt;br /&gt;
| {{Green|Full}}&lt;br /&gt;
| {{Red|Very limited}}: All covariant redefinition of feature argument must be declared as variant. More restrcited conformance for generics.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Support of IDE (Source changes)&lt;br /&gt;
| {{Green|Not needed}}&lt;br /&gt;
| {{Orange|Possible}}: Can propose forget/keep clauses&lt;br /&gt;
| {{Green|Not needed}}&lt;br /&gt;
| {{Orange|Possible}}: Can propose variant mark for unsafe redefinition and for automatic generic variance detection.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Solutions for non-generics ===&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellpadding=2&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;visibility: hidden&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Criteria&lt;br /&gt;
! [[Restrict types]]&lt;br /&gt;
! [[DOG proposal]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Syntax overhead&lt;br /&gt;
| {{Red|Big}}: Restrict clause per type declaration&lt;br /&gt;
| {{Orange|Medium}}: ''cat'' on features and on type declarations&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Covariance on non-generic types &lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Export status restrictions&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Use of generic types&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Agents&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Comparator&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of compiler check&lt;br /&gt;
| {{Orange|Medium}}: Check of feature call for all descendants; Conformance check on restrict clauses&lt;br /&gt;
| {{Green|Small}}: Check of ''cat'' on conformance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of runtime&lt;br /&gt;
| not yet considered&lt;br /&gt;
| {{Green|Small}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Whole-system analysis&lt;br /&gt;
| {{Orange|Partial}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Dynamic class and type loading&lt;br /&gt;
| {{Orange|Limited}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Backward compatibility&lt;br /&gt;
| {{Red|Very limited}}&lt;br /&gt;
| {{Red|Very limited}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Support of IDE (Source changes)&lt;br /&gt;
| {{Orange|Possible}}: Can propose restrict clauses&lt;br /&gt;
| {{Orange|Possible}}: Can propose ''cat'' marks&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Solutions for generics ===&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellpadding=2&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;visibility: hidden&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Criteria&lt;br /&gt;
! [[Usage-site variance]]&lt;br /&gt;
! [[Definition-site variance]]&lt;br /&gt;
! Wildcard generics&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Syntax overhead&lt;br /&gt;
| {{Orange|Medium}}: Variance marks per generic type&lt;br /&gt;
| {{Green|Small}}: Variance marks per generic class definition&lt;br /&gt;
| {{Orange|Medium}}: Variance marks per generic type&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Covariance on non-generic types &lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Export status restrictions&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Use of generic types&lt;br /&gt;
| {{Orange|Limited}}: Conformance is limited&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Orange|Limited}}: Conformance is limited&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Orange|Limited}}: Conformance is limited&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Agents&lt;br /&gt;
| {{Green|Fully supported}}&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Green|Fully supported}}: If tuples can be specified covariantly&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Green|Fully supported}}&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Comparator&lt;br /&gt;
| {{Green|Supported}}&lt;br /&gt;
| {{Green|Supported}}&lt;br /&gt;
| {{Green|Supported}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of compiler check&lt;br /&gt;
| {{Green|Small}}: Consider variance in conformance check&lt;br /&gt;
| {{Green|Small}}: Consider variance in conformance check&lt;br /&gt;
| {{Green|Small}}: Consider variance in conformance check&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of runtime&lt;br /&gt;
| {{Green|Small}}: Consider variance in object test&lt;br /&gt;
| {{Green|Small}}: Consider variance in object test&lt;br /&gt;
| {{Green|Small}}: Consider variance in object test&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Whole-system analysis&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Dynamic class and type loading&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Backward compatibility&lt;br /&gt;
| {{Orange|Limited}}: Use of generics changed due to conformance&lt;br /&gt;
| {{Red|Very limited}}: Libraries need redesign&lt;br /&gt;
| {{Orange|Limited}}: Use of generics changed due to conformance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Support of IDE (Source changes)&lt;br /&gt;
| {{Orange|Possible}}: Can propose variance marks&lt;br /&gt;
| {{Red|Not possible}}: Libraries need redesign&lt;br /&gt;
| {{Orange|Possible}}: Can propose variance marks/wildcards&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dynamic solutions ===&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellpadding=2&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;visibility: hidden&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Criteria&lt;br /&gt;
! [[Detachable types]]&lt;br /&gt;
! Recast&lt;br /&gt;
! Exceptions&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Syntax overhead&lt;br /&gt;
| {{Green|Small}}: Detachment marks&lt;br /&gt;
| {{Red|Big}}: Recast clauses, recast features&lt;br /&gt;
| {{Orange|Medium}}: If rescue clause mandatory&amp;lt;br/&amp;gt;{{Green|No}}: If rescue clause not needed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Covariance on non-generic types &lt;br /&gt;
| {{Red|Very limited}}: Only detached arguments, no expanded arguments&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Export status restrictions&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Use of generics&lt;br /&gt;
| {{Red|Very limited}}: Only detachable formal arguments&lt;br /&gt;
| {{Red|Very limited}}: Recast clause for all features with formal generics&lt;br /&gt;
| {{Green|As it is now}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Agents&lt;br /&gt;
| {{Red|As it is now}} &lt;br /&gt;
| {{Red|As it is now}} &lt;br /&gt;
| {{Red|As it is now}} &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Comparator&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of compiler check&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of runtime&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Orange|Medium}}: Check for catcalls and do recast&lt;br /&gt;
| {{Orange|Medium}}: Check for catcalls and raise exception&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Whole-system analysis&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Dynamic class and type loading&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Backward compatibility&lt;br /&gt;
| {{Red|Very limited}}: All covariant and generic features become detached&lt;br /&gt;
| {{Red|Very limited}}: All covariant and generic features need recast clause&lt;br /&gt;
| {{Orange|Limited}}: If rescue clause is mandatory&amp;lt;br/&amp;gt;{{Green|Full}}: If rescue clause not needed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Support of IDE (Source changes)&lt;br /&gt;
| {{Orange|Possible}}: Can propose detachment marks&lt;br /&gt;
| {{Red|Not possible}}: Programmer must provide recast clause&lt;br /&gt;
| {{Red|Not possible}}: If rescue clause mandatory&amp;lt;br/&amp;gt;{{Green|Not needed}}: If rescue clause not needed&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Table explained ===&lt;br /&gt;
&lt;br /&gt;
; Syntax overhead : {{Green|Small}} if a keyword/mark is needed per class/feature declaration; {{Orange|Medium}} if a keyword/mark is neede per type declaration; {{Red|Big}} if a clause is needed per type declaration.&lt;br /&gt;
; Use of generics : {{Green|As it is now}} if assignments are possible if generic parameters conform; {{Orange|Limited}} is some restrictions in the use or the conformance between generics exist; {{Red|Very limited}} a lot of restrictions in the use or the conformance between generics exist.&lt;br /&gt;
; Agents : {{Green|Fully supported}} if all safe assignments are allowed; {{Orange|Limited}} if not all safe assignments are allowed; {{Red|As it is now}} if unsafe assignments are still possible.&lt;br /&gt;
; Comparator : {{Green|Supported}} if for a comparator all safe assignments are permitted (i.e. contravariant assignments); {{Red|Not supported}} if only exact type or even (unsafe) subtypes can be assigned.&lt;br /&gt;
; Support of IDE (Source changes) : {{Green|Not needed}} if everything still works the same; {{Orange|Possible}} if the compiler can suggest clauses or marks; {{Red|Not possible}} if the programmer has to specify additional features/instructions.&lt;br /&gt;
&lt;br /&gt;
== Personal opinions ==&lt;br /&gt;
&lt;br /&gt;
[[Personal view about catcall solution]]&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Comparison_of_catcall_solutions&amp;diff=14903</id>
		<title>Comparison of catcall solutions</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Comparison_of_catcall_solutions&amp;diff=14903"/>
				<updated>2013-08-29T14:31:27Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Correction for Default and explicit variance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Catcall]]&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
By allowing covariant feature redefinition and hiding of features, the Eiffel language introduces the problem of catcalls (Changed Availability or Type). Currently the ECMA Eiffel standard does not specify how the occurrence of catcalls should be statically rejected.&lt;br /&gt;
&lt;br /&gt;
The purpose of this document is to show a comparison between different proposals on how to handle the issue of preventing catcalls.&lt;br /&gt;
&lt;br /&gt;
== Criteria for a solution ==&lt;br /&gt;
&lt;br /&gt;
To be able to judge a solution we use the following criteria which we consider as important:&lt;br /&gt;
&lt;br /&gt;
; Syntax overhead : How much syntax will be added to the language in order to express safe covariance and generics?&lt;br /&gt;
; Covariance on non-generic types : Are covariant argument redefinitions addressed in the solution? How does the programmer express it?&lt;br /&gt;
; Export status restrictions : Is restriction of export status addressed in the solution? How does the programmer express it?&lt;br /&gt;
; Use of generic types : How is conformance of generics? Are catcalls for generics addressed in the solution? How does the programmer express it? Can generics be used as now or are there restrictions?&lt;br /&gt;
:; Agents : Can agents be modeled with the solution while being type safe and expressive?&lt;br /&gt;
:; Comparator : Can comparator types be modeled with the solution while being type safe and expressive?&lt;br /&gt;
; Complexity of the compiler check : Is it just a matter of doing one check or several?&lt;br /&gt;
; Complexity of the runtime : Does the runtime need more information to do assignment attempts or object tests?&lt;br /&gt;
; Whole-system analysis : Is a whole-system analysis necessary?&lt;br /&gt;
; Dynamic class and type loading : Is it safe to dynamically load new classes at runtime and instantiate new types?&lt;br /&gt;
; Backward compatibility : Is the solution backward compatible to existing source code?&lt;br /&gt;
:; Applicable per cluster : Can the solution be applied on a per cluster basis?&lt;br /&gt;
; Support of compiler/IDE : Can the compiler/IDE help in updating existing source code? How?&lt;br /&gt;
&lt;br /&gt;
== General remarks ==&lt;br /&gt;
&lt;br /&gt;
=== Checking feature calls ===&lt;br /&gt;
&lt;br /&gt;
As the ''Single-level Call rule'' (8.25.3, VUSC) describes, a feature call is only valid if it is valid for every type in the dynamic type set. A simple solution would be that every feature call has to be checked for all possible descendants of the static target type. If this check is performed on a system, it will catch all catcalls - but also report false positives.&lt;br /&gt;
&lt;br /&gt;
Some of the proposed solutions try to address this problem by finding a better approximation to the dynamic type set so that the false positives can be ruled out.&lt;br /&gt;
&lt;br /&gt;
In general this is problematic as it requires a whole-system analysis, thus preventing the dynamic loading of new classes at run-time. The reason for this is that it is not known at compile time which features will be covariantly redefined by dynamically loaded classes.&lt;br /&gt;
&lt;br /&gt;
This is only the case with non-generic types. For generics, it is known at compile time that all features containing a formal in the parameter list can be treated as covariantly redefined and corresponding precautions can be implemented via the type system and conformance rules which allow to load even generic types at run-time.&lt;br /&gt;
&lt;br /&gt;
By the way, Eiffel Software has started to [[Single level call rule implementation|implement the basis of the ''single-level call rule'']] in it's Eiffel compiler. It is work in progress which revealed some implementation problems.&lt;br /&gt;
&lt;br /&gt;
=== Generic vs. non-generic covariance ===&lt;br /&gt;
&lt;br /&gt;
We can distinguish two different kinds of covariant argument redefinition:&lt;br /&gt;
&lt;br /&gt;
* When a generic type is derived, the formal generic parameters will be replaced by the actual generic parameters. Given the current conformance rules for generics, this can be seen as a covariant redefinition for all features which contain a formal generic as an argument. A simple example is the change from &amp;lt;e&amp;gt;LIST [ANY]&amp;lt;/e&amp;gt; to &amp;lt;e&amp;gt;LIST [INTEGER]&amp;lt;/e&amp;gt; where the feature &amp;lt;e&amp;gt;put&amp;lt;/e&amp;gt; changes signature from &amp;lt;e&amp;gt;ANY&amp;lt;/e&amp;gt; to &amp;lt;e&amp;gt;INTEGER&amp;lt;/e&amp;gt;.&lt;br /&gt;
* In the non-generic case, covariance happens for certain anchored type declarations and in the case of explicitly changing an argument type to a descendant. This happens in general only on a small subset of the features.&lt;br /&gt;
&lt;br /&gt;
The main difference is that in the generic case, all features which have a formal generic parameter automatically change the signature in different derivations whereas the non-generic case only specific features are covariantly redefined (if any at all). Also, in the generic case it is known for all possible descendants which features are redefined covariantly.&lt;br /&gt;
&lt;br /&gt;
This observation helps to understand the various proposals and to see their strengths and weaknesses:&lt;br /&gt;
* A proposal which operates on the feature level can be good for non-generic classes as you generally have a small number of features covariantly redefined and you only have to specify these features. In the case of generics this can become cumbersome as all features with formal generic parameters are always considered as covariantly redefined and thus for generics they always have to be considered.&lt;br /&gt;
* A proposal which operates on the type level is better suited for generics as you don't have to specify every single feature which has a formal generic parameter as argument. But they run into problems in the non-generic case if you look at anchored types - for example &amp;lt;e&amp;gt;like Current&amp;lt;/e&amp;gt;. Due to the fact that you have a covariant redeclaration in every descendant with such a feature, operating on the type level means that you have to handle every descendant specifically whereas if you operated on the feature level you could just handle this single feature.&lt;br /&gt;
* You see that there are two families of features: Features with formal arguments and ordinary features which are covariantly redefined. The fundamental difference between these two families is that they can change their signature independently. From &amp;lt;e&amp;gt;LIST [ANY]&amp;lt;/e&amp;gt; to &amp;lt;e&amp;gt;LIST [INTEGER]&amp;lt;/e&amp;gt; only the features based on the formal change their signature while they don't change from &amp;lt;e&amp;gt;LIST [ANY]&amp;lt;/e&amp;gt; to &amp;lt;e&amp;gt;LINKED_LIST [ANY]&amp;lt;/e&amp;gt; where the ordinary ones do. If you don't want to restrict the programmers expressiveness these feature families have to be addressed separately and a ''one fits all'' solution does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Contravariant generics ===&lt;br /&gt;
&lt;br /&gt;
The modeling of certain problems involving generics requires contravariance. The two examples which will be used are comparator objects and agents:&lt;br /&gt;
&lt;br /&gt;
* If you want to compare objects using a comparator, it either needs to be able to compare objects of the exact type, or an ancestor. Thus if you want to compare strings, either a comparator for &amp;lt;e&amp;gt;STRING&amp;lt;/e&amp;gt; or one for &amp;lt;e&amp;gt;ANY&amp;lt;/e&amp;gt; is suitable. &lt;br /&gt;
* If you want to pass an argument of type &amp;lt;e&amp;gt;STRING&amp;lt;/e&amp;gt; to an agent, the agent either has to accept a &amp;lt;e&amp;gt;STRING&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;ANY&amp;lt;/e&amp;gt; argument (or no argument at all).&lt;br /&gt;
&lt;br /&gt;
These problems can only be modeled if there is a way to express contravariant conformance for generics. This means that all proposed solutions which don't offer this possibility can't be used to model agents or comparator correctly and safely.&lt;br /&gt;
&lt;br /&gt;
=== Catcall benchmark ===&lt;br /&gt;
&lt;br /&gt;
[[Catcall checkpoints]]&lt;br /&gt;
&lt;br /&gt;
== Overview of general solutions ==&lt;br /&gt;
&lt;br /&gt;
The following proposals handle the case of covariance on non-generic and generic types.&lt;br /&gt;
&lt;br /&gt;
=== [[Novariance]] ===&lt;br /&gt;
&lt;br /&gt;
In the novariance proposal, covariant redefinition for arguments is prohibited. If covariance is needed for modeling purposes it can be [http://dev.eiffel.com/Covariance_through_renaming simulated by renaming].&lt;br /&gt;
&lt;br /&gt;
The conformance between generics with different formal parameters is removed.&lt;br /&gt;
&lt;br /&gt;
=== [[Forget / keep]] ===&lt;br /&gt;
&lt;br /&gt;
With the forget and keep mechanisms you specify per type on the feature level which features need not to be called - these features can safely be redefined covariantly - or which features have to be available - these features have to be typesafe for all possible values of a caller object.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://dev.eiffel.com/Forget_/_Keep_Mechanism Article on dev.eiffel.com]&lt;br /&gt;
&lt;br /&gt;
=== Dynamic typeset algorithm ===&lt;br /&gt;
&lt;br /&gt;
The dynamic typeset algorithm does not change any semantics of the types or the conformance as it is in Eiffel already, it only does an abstract execution of the system to limit the possibilities per feature call which have to be checked if they are safe.&lt;br /&gt;
&lt;br /&gt;
=== [[Interval types]] ===&lt;br /&gt;
&lt;br /&gt;
Interval types allow to define each type as an interval with a lower and upper type as boundary. This limits the dynamic type set and thus restricts the number of features which need to be checked for system-validity. In addition to this, it defines rules which handle the case of features with formal arguments.&lt;br /&gt;
&lt;br /&gt;
=== [[Read-write types]] ===&lt;br /&gt;
&lt;br /&gt;
Read-write types are a solution which can model interval types and usage-site variance. It splits a type into a ''read'' type and a ''write'' type. The read type defines the applicable features and the write type the signature to check for valid arguments.&lt;br /&gt;
&lt;br /&gt;
=== [[Default and explicit variance]] ===&lt;br /&gt;
Default and explicit variance is inspired of usage-site variance and detachable proposition.&lt;br /&gt;
The proposition add no new keyword.&lt;br /&gt;
&lt;br /&gt;
== Overview of solutions for non-generics ==&lt;br /&gt;
&lt;br /&gt;
These proposal only address the case for non-generics. For generic catcalls another solution (e.g. wildcard generics) can be used.&lt;br /&gt;
&lt;br /&gt;
=== [[Restrict types]] ===&lt;br /&gt;
&lt;br /&gt;
With restrict types you specify per type on the type level which descendant types that are allowed. Only these types can be assigned to such a variable, and all feature calls on these variables have to be valid for all possible types in this list.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://se.inf.ethz.ch/cgi-bin/ecma/index.cgi?IssueFLEX_CATCALL IssueFLEX_CATCALL on ECMA wiki]&amp;lt;br/&amp;gt;&lt;br /&gt;
Reference: Discussion in ECMA mailinglist named ''Catcall removal: another proposal'', [[Restrict types mail|available in parts]]&lt;br /&gt;
&lt;br /&gt;
=== [[DOG proposal]] ===&lt;br /&gt;
&lt;br /&gt;
With the DOG proposal, features which can be covariantly redefined have to be marked as such. These features can only be called on specially marked entities which have a restricted conformance, thus preventing assignments from descendants with potential covariantly redefined arguments.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://se.inf.ethz.ch/cgi-bin/ecma/index.cgi?IssueDOG IssueDOG on ECMA wiki]&lt;br /&gt;
&lt;br /&gt;
== Overview of solutions for generics ==&lt;br /&gt;
&lt;br /&gt;
These proposal only address the case for generics. For non-generic catcalls another solution (e.g. novariance) can be used.&lt;br /&gt;
&lt;br /&gt;
=== [[Usage-site variance]] ===&lt;br /&gt;
&lt;br /&gt;
This solution lets the programmer decide on the instantiation of a generic if the generic parameter should be covariant, contravariant or invariant. Depending on the variance, the applicable features of the type and the conformance rules to other generic types are changed.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://pag.csail.mit.edu/reading-group/variance-ECOOP02.pdf On variance-based subtyping for parametric types]&lt;br /&gt;
&lt;br /&gt;
=== [[Definition-site variance]] ===&lt;br /&gt;
&lt;br /&gt;
This solution lets the programmer decide in the definition of a generic class if the generic parameter should be covariant, contravariant or invariant. Depending on the variance, the formal generic can only appear at the argument, only appear as a result type or appear in both places. Also the conformance is adapted depending on the variance of the generic parameter.&lt;br /&gt;
&lt;br /&gt;
This is the solution which is implemented in the CLR, although not supported by generics in C# which are novariant.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://blogs.msdn.com/rmbyers/archive/2006/06/01/613690.aspx Article about generics in CLR]&lt;br /&gt;
&lt;br /&gt;
Note: There is also a [http://fams.de/text/type-safe-eiffel.html proposal by Bernd Schoeller] about ''variant and invariant'' generics which is a subset of this one and thus not explained in detail.&lt;br /&gt;
&lt;br /&gt;
=== Wildcard generics ===&lt;br /&gt;
&lt;br /&gt;
This mechanism extends the [[usage-site variance]] by adding a wildcard to the generic derivation. This wildcard denotes unspecified types and limits the use of features with generic parameters or result types over conformance to the wildcard types.&lt;br /&gt;
&lt;br /&gt;
Since the mechanism is almost identical to the usage-site variance, it will not be looked at in more detail. Please refer to the reference article for more information.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://www.jot.fm/issues/issue_2004_12/article5 Adding Wildcards to the Java Programming Language]&lt;br /&gt;
&lt;br /&gt;
== Overview of dynamic solutions ==&lt;br /&gt;
&lt;br /&gt;
These proposals do not prevent catcalls at compile-time but introduce means to handle catcalls at runtime.&lt;br /&gt;
&lt;br /&gt;
=== [[Detachable types]] ===&lt;br /&gt;
&lt;br /&gt;
This solution allows covariantly redefined features only to use detachable types. Through this mechanism, an object test is necessary before an argument can be used. This forces the programmer to test arguments for validity.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://se.ethz.ch/~meyer/publications/lncs/attached.pdf Article about ''attached types'' by Bertrand Meyer]&amp;lt;br/&amp;gt;&lt;br /&gt;
Reference: [http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA Eiffel standard 2nd edition of June 2006]&lt;br /&gt;
&lt;br /&gt;
=== Recast ===&lt;br /&gt;
&lt;br /&gt;
In the recast proposal, the programmer has to specify a transformation function when covariantly redefining a feature which can transform the old argument types to the new ones.&lt;br /&gt;
&lt;br /&gt;
Reference: [http://se.inf.ethz.ch/cgi-bin/ecma/index.cgi?IssueCAT IssueCAT on ECMA wiki]&amp;lt;br/&amp;gt;&lt;br /&gt;
Reference: [http://www.inf.ethz.ch/~meyer/ongoing/covariance/recast.pdf Article about recast]&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
&lt;br /&gt;
Another way of handling catcalls at runtime is to raise exceptions. It can be required or not to provide a rescue clause which handles the case of the catcall.&lt;br /&gt;
&lt;br /&gt;
== Combinations ==&lt;br /&gt;
&lt;br /&gt;
It is also possible to combine different proposals:&lt;br /&gt;
&lt;br /&gt;
* Novariance for non-generic features and usage-site variance for generics .&lt;br /&gt;
* Forget / keep for non-generic features and definition-site variance for generics.&lt;br /&gt;
* DOG proposal for non-generic features and wildcard generics.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Results ==&lt;br /&gt;
&lt;br /&gt;
The following table summarizes the support of the various solutions to the criteria described above which can be used to judge a catcall solution.&lt;br /&gt;
&lt;br /&gt;
This results can be differently interpreted, so the colors may not be totally accurate. See the [[Comparison of catcall solutions#Table_explained|explanation at the end of the table]] for more information&lt;br /&gt;
&lt;br /&gt;
=== General solutions ===&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellpadding=2&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;visibility: hidden&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:20%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Criteria&lt;br /&gt;
! [[Novariance]]&lt;br /&gt;
! [[Forget / keep]]&lt;br /&gt;
! Dynamic typeset algorithm&lt;br /&gt;
! Default and explicit variance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Syntax overhead&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Red|Big}}: forget/keep clauses per type&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Covariance on non-generic types &lt;br /&gt;
| {{Red|Not allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Export status restrictions&lt;br /&gt;
| {{Red|Not allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Red|Not allowed}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Use of generic types&lt;br /&gt;
| {{Red|Very limited}}: Only invariant conformance&lt;br /&gt;
| {{Orange|Limited}}: Conformance restricted (''keep all'' as default)&amp;lt;br/&amp;gt;{{Orange|Limited}}: Use restricted (''forget all'' as default)&lt;br /&gt;
| {{Green|As it is now}}&lt;br /&gt;
| {{Orange|Limited}}: Conformance is limited&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Agents&lt;br /&gt;
| {{Orange|Limited}}&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Orange|Limited}}&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Red|As it is now}}&lt;br /&gt;
| {{Green|Fully supported}}&amp;lt;br/&amp;gt;{{Green|Safe}} - Class change needed for contravariant conformance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Comparator&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Green|Supported}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of compiler check&lt;br /&gt;
| {{Green|Small}}&lt;br /&gt;
| {{Orange|Medium}}: Check of feature call for all descendants; Conformance check on forget/keep clauses&lt;br /&gt;
| {{Red|Big}}: Iterative abstract system execution&lt;br /&gt;
| {{Green|Small}}: Check features for determinate the variance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of runtime&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Orange|Medium}}: Need to know cat features for object tests&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Whole-system analysis&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Red|Yes}}: use of ''forget all'' depends on system&lt;br /&gt;
| {{Red|Yes}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Dynamic class and type loading&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Red|No}}&lt;br /&gt;
| {{Red|No}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Backward compatibility&lt;br /&gt;
| {{Red|Very limited}}&lt;br /&gt;
| {{Orange|Limited}}&lt;br /&gt;
| {{Green|Full}}&lt;br /&gt;
| {{Red|Very limited}}: All covariant redefinition of feature argument must be declared as variant. More restrcited conformance for generics.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Support of IDE (Source changes)&lt;br /&gt;
| {{Green|Not needed}}&lt;br /&gt;
| {{Orange|Possible}}: Can propose forget/keep clauses&lt;br /&gt;
| {{Green|Not needed}}&lt;br /&gt;
| {{Orange|Possible}}: Can propose variant mark for unsafe redefinition and for automatic generic variance detection.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Solutions for non-generics ===&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellpadding=2&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;visibility: hidden&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Criteria&lt;br /&gt;
! [[Restrict types]]&lt;br /&gt;
! [[DOG proposal]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Syntax overhead&lt;br /&gt;
| {{Red|Big}}: Restrict clause per type declaration&lt;br /&gt;
| {{Orange|Medium}}: ''cat'' on features and on type declarations&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Covariance on non-generic types &lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Export status restrictions&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Use of generic types&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Agents&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Comparator&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of compiler check&lt;br /&gt;
| {{Orange|Medium}}: Check of feature call for all descendants; Conformance check on restrict clauses&lt;br /&gt;
| {{Green|Small}}: Check of ''cat'' on conformance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of runtime&lt;br /&gt;
| not yet considered&lt;br /&gt;
| {{Green|Small}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Whole-system analysis&lt;br /&gt;
| {{Orange|Partial}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Dynamic class and type loading&lt;br /&gt;
| {{Orange|Limited}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Backward compatibility&lt;br /&gt;
| {{Red|Very limited}}&lt;br /&gt;
| {{Red|Very limited}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Support of IDE (Source changes)&lt;br /&gt;
| {{Orange|Possible}}: Can propose restrict clauses&lt;br /&gt;
| {{Orange|Possible}}: Can propose ''cat'' marks&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Solutions for generics ===&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellpadding=2&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;visibility: hidden&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Criteria&lt;br /&gt;
! [[Usage-site variance]]&lt;br /&gt;
! [[Definition-site variance]]&lt;br /&gt;
! Wildcard generics&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Syntax overhead&lt;br /&gt;
| {{Orange|Medium}}: Variance marks per generic type&lt;br /&gt;
| {{Green|Small}}: Variance marks per generic class definition&lt;br /&gt;
| {{Orange|Medium}}: Variance marks per generic type&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Covariance on non-generic types &lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Export status restrictions&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Use of generic types&lt;br /&gt;
| {{Orange|Limited}}: Conformance is limited&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Orange|Limited}}: Conformance is limited&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Orange|Limited}}: Conformance is limited&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Agents&lt;br /&gt;
| {{Green|Fully supported}}&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Green|Fully supported}}: If tuples can be specified covariantly&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
| {{Green|Fully supported}}&amp;lt;br/&amp;gt;{{Green|Safe}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Comparator&lt;br /&gt;
| {{Green|Supported}}&lt;br /&gt;
| {{Green|Supported}}&lt;br /&gt;
| {{Green|Supported}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of compiler check&lt;br /&gt;
| {{Green|Small}}: Consider variance in conformance check&lt;br /&gt;
| {{Green|Small}}: Consider variance in conformance check&lt;br /&gt;
| {{Green|Small}}: Consider variance in conformance check&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of runtime&lt;br /&gt;
| {{Green|Small}}: Consider variance in object test&lt;br /&gt;
| {{Green|Small}}: Consider variance in object test&lt;br /&gt;
| {{Green|Small}}: Consider variance in object test&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Whole-system analysis&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Dynamic class and type loading&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Backward compatibility&lt;br /&gt;
| {{Orange|Limited}}: Use of generics changed due to conformance&lt;br /&gt;
| {{Red|Very limited}}: Libraries need redesign&lt;br /&gt;
| {{Orange|Limited}}: Use of generics changed due to conformance&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Support of IDE (Source changes)&lt;br /&gt;
| {{Orange|Possible}}: Can propose variance marks&lt;br /&gt;
| {{Red|Not possible}}: Libraries need redesign&lt;br /&gt;
| {{Orange|Possible}}: Can propose variance marks/wildcards&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dynamic solutions ===&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellpadding=2&lt;br /&gt;
&lt;br /&gt;
|- style=&amp;quot;visibility: hidden&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width:25%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Criteria&lt;br /&gt;
! [[Detachable types]]&lt;br /&gt;
! Recast&lt;br /&gt;
! Exceptions&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Syntax overhead&lt;br /&gt;
| {{Green|Small}}: Detachment marks&lt;br /&gt;
| {{Red|Big}}: Recast clauses, recast features&lt;br /&gt;
| {{Orange|Medium}}: If rescue clause mandatory&amp;lt;br/&amp;gt;{{Green|No}}: If rescue clause not needed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Covariance on non-generic types &lt;br /&gt;
| {{Red|Very limited}}: Only detached arguments, no expanded arguments&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
| {{Green|Allowed}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Export status restrictions&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
| Not addressed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Use of generics&lt;br /&gt;
| {{Red|Very limited}}: Only detachable formal arguments&lt;br /&gt;
| {{Red|Very limited}}: Recast clause for all features with formal generics&lt;br /&gt;
| {{Green|As it is now}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Agents&lt;br /&gt;
| {{Red|As it is now}} &lt;br /&gt;
| {{Red|As it is now}} &lt;br /&gt;
| {{Red|As it is now}} &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Comparator&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
| {{Red|Not supported}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of compiler check&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Complexity of runtime&lt;br /&gt;
| {{Green|Small}}: As it is now&lt;br /&gt;
| {{Orange|Medium}}: Check for catcalls and do recast&lt;br /&gt;
| {{Orange|Medium}}: Check for catcalls and raise exception&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Whole-system analysis&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
| {{Green|No}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Dynamic class and type loading&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
| {{Green|Yes}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Backward compatibility&lt;br /&gt;
| {{Red|Very limited}}: All covariant and generic features become detached&lt;br /&gt;
| {{Red|Very limited}}: All covariant and generic features need recast clause&lt;br /&gt;
| {{Orange|Limited}}: If rescue clause is mandatory&amp;lt;br/&amp;gt;{{Green|Full}}: If rescue clause not needed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! Support of IDE (Source changes)&lt;br /&gt;
| {{Orange|Possible}}: Can propose detachment marks&lt;br /&gt;
| {{Red|Not possible}}: Programmer must provide recast clause&lt;br /&gt;
| {{Red|Not possible}}: If rescue clause mandatory&amp;lt;br/&amp;gt;{{Green|Not needed}}: If rescue clause not needed&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Table explained ===&lt;br /&gt;
&lt;br /&gt;
; Syntax overhead : {{Green|Small}} if a keyword/mark is needed per class/feature declaration; {{Orange|Medium}} if a keyword/mark is neede per type declaration; {{Red|Big}} if a clause is needed per type declaration.&lt;br /&gt;
; Use of generics : {{Green|As it is now}} if assignments are possible if generic parameters conform; {{Orange|Limited}} is some restrictions in the use or the conformance between generics exist; {{Red|Very limited}} a lot of restrictions in the use or the conformance between generics exist.&lt;br /&gt;
; Agents : {{Green|Fully supported}} if all safe assignments are allowed; {{Orange|Limited}} if not all safe assignments are allowed; {{Red|As it is now}} if unsafe assignments are still possible.&lt;br /&gt;
; Comparator : {{Green|Supported}} if for a comparator all safe assignments are permitted (i.e. contravariant assignments); {{Red|Not supported}} if only exact type or even (unsafe) subtypes can be assigned.&lt;br /&gt;
; Support of IDE (Source changes) : {{Green|Not needed}} if everything still works the same; {{Orange|Possible}} if the compiler can suggest clauses or marks; {{Red|Not possible}} if the programmer has to specify additional features/instructions.&lt;br /&gt;
&lt;br /&gt;
== Personal opinions ==&lt;br /&gt;
&lt;br /&gt;
[[Personal view about catcall solution]]&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=14902</id>
		<title>Default and explicit variance</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=14902"/>
				<updated>2013-08-29T14:06:31Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Minor improvements&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Catcall]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
In first the limited variant typing is exposed. It checks all catcall checkpoints.&lt;br /&gt;
In the second part the mechanism is extended. It is less simple and explicit, but it enables a best transition.&lt;br /&gt;
&lt;br /&gt;
== Limited variant typing ==&lt;br /&gt;
What is the advantages of covariance compared to a novariant typing?&lt;br /&gt;
* explicit and adaptative interface&lt;br /&gt;
* One routine&lt;br /&gt;
&lt;br /&gt;
=== Variant typing ===&lt;br /&gt;
* A variant entity has '''the most restrictive type'''. &lt;br /&gt;
* A variant entity requires a simple object test to use the entity with the '''expected type'''.&lt;br /&gt;
&lt;br /&gt;
Examples are available in next sections.&lt;br /&gt;
&lt;br /&gt;
=== Feature redefinition ===&lt;br /&gt;
* Covariant redefinition of request result is allowed (as currently).&lt;br /&gt;
* Covariant redefinition of feature argument requires a variant typing on redefined feature or first feature definition.&lt;br /&gt;
'''The most restrictive type''' for a variant type argument is the type of the first feature definition.&lt;br /&gt;
&lt;br /&gt;
The first rule is a stronger postcondition. The current semantic is not changed.&lt;br /&gt;
&lt;br /&gt;
'''example 1:''' covariant redefinition of feature argument with 'variant' typing on redefined feature&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* The object test is not needed.&lt;br /&gt;
* the type is not repeated in the object test.&lt;br /&gt;
* In the class interface the 'variant' is removed. Indeed, it is not possible to call 'eat' on an entity of type COW with a parameter of type 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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: like last)&lt;br /&gt;
		require&lt;br /&gt;
			True&lt;br /&gt;
		do&lt;br /&gt;
			last := f&lt;br /&gt;
		ensure&lt;br /&gt;
			True&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		redefine all end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last) -- or eat (f: variant GRASS)&lt;br /&gt;
		require else&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = expected type. Here: GRASS&lt;br /&gt;
		do&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				-- 'expected' type = expected type. Here: GRASS&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&lt;br /&gt;
		ensure then&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''example 2:''' covariant redefinition of feature argument with 'variant' typing on first feature definition.&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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last)&lt;br /&gt;
		do&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&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;
		redefine last end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
Default: a generic is novariant&lt;br /&gt;
&lt;br /&gt;
If a genric must be variant (covariant or contravariant or both) then the formal generic must be prefixed with the 'variant' mark.&lt;br /&gt;
&lt;br /&gt;
The compiler must ensure that the variant generic checks one next rule:&lt;br /&gt;
* Generic used only on feature argument is contravariant.&lt;br /&gt;
* Generic used only on request result or feature argument with variant typing is covariant.&lt;br /&gt;
* Generic not used is both contravariant and covariant.&lt;br /&gt;
&lt;br /&gt;
'''The most restrictive type''' for a variant generic argument is the constrained inheritance type.&lt;br /&gt;
'''&lt;br /&gt;
example:'''&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	EXAMPLE [variant K, variant G]&lt;br /&gt;
		-- K is contravariant and G is covariant&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	first: G&lt;br /&gt;
	&lt;br /&gt;
	item (i: K): G&lt;br /&gt;
		deferred&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: EXAMPLE [INTEGER, COMPARABLE]; b: EXAMPLE [NUMERIC, STRING]&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
As explained for [[Usage-site variance]] the generic 'OPEN_ARGS' from ROUTINE, PROCEDURE, FUNCTION, PREDICATE must be contravariant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	ROUTINE [BASE_TYPE, variant OPEN_ARGS -&amp;gt; detachable TUPLE create default_create end]&lt;br /&gt;
-- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic 'OPEN_ARGS' is used on feature arguments, but also on request result.&lt;br /&gt;
&lt;br /&gt;
The class should probably be redesigned. Indeed if contravariant is allowed then there may be a new contravariant catcall on request result.&lt;br /&gt;
&lt;br /&gt;
In these classes there are only two requests using the generic as type:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second request is not used internally and may be problematic for creation: How create a tuple of not self-initialized and attached types?&lt;br /&gt;
The first is used in these features : 'target', 'is_equal', 'set_operands', 'copy', 'apply'&lt;br /&gt;
&lt;br /&gt;
'is_equal', 'set_operands' and 'copy' rely on data model.&lt;br /&gt;
'apply' and 'target' are more sensitive. Indeed the problem is when there is an opened target.&lt;br /&gt;
&lt;br /&gt;
'apply' could be restricted for no opened arguments.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	require&lt;br /&gt;
		no_operands: open_count = 0&lt;br /&gt;
	do&lt;br /&gt;
		call (Void)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
'target' could be modfied:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target: ANY&lt;br /&gt;
	require&lt;br /&gt;
		is_target_closed&lt;br /&gt;
	do&lt;br /&gt;
		-- ...&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or maybe it is better to separate opened target and closed target in two abstractions.&lt;br /&gt;
&lt;br /&gt;
The redesign of agent classes is an opportunity to solve agent problems (see [[Minor-ECMA-problems]], [[Agents in SCOOP]]).&lt;br /&gt;
&lt;br /&gt;
Another solution will be mentioned later.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
The generic 'RESULT_TYPE' of FUNCTION class is used only on request result. Then it is a covariant generic. It is an expected point.&lt;br /&gt;
&lt;br /&gt;
=== Comparison with other solutions ===&lt;br /&gt;
==== [[Detachable types]] (non-generic) ====&lt;br /&gt;
The variant typing is not in conflict with the void-safe typing.&lt;br /&gt;
&lt;br /&gt;
And more the object test is not needed.&lt;br /&gt;
&lt;br /&gt;
==== [[Usage-site variance]] (generic) ====&lt;br /&gt;
The variant typing is a supplier specification while usage-site variance is a client specification.&lt;br /&gt;
&lt;br /&gt;
Another difference is the interface restriction of the usage-site variance. With the variant typing for generics the interface is fully aivailable.&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
The limited variant typing is reasonable and expressive. It limits Eiffel changes and solves all catcall problems.&lt;br /&gt;
&lt;br /&gt;
The proposal reuses an existing keyword.&lt;br /&gt;
&lt;br /&gt;
The addition in TYPE class for reflexivity and dynamic object test is little.&lt;br /&gt;
Indeed two simple booleans &amp;quot;is_contravariant&amp;quot; and &amp;quot;is_covariant&amp;quot; for each generic is required.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
generic_parameter_contravariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter contravariant?&lt;br /&gt;
	&lt;br /&gt;
generic_parameter_covariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter covariant?&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A possible critical could be the generic conformance restriction. Propositions are mentioned below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extended variant typing ==&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
The variant mark is optional. The compiler infers the generic variance. It is a good point for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
* Generic used only on feature argument or request result with variant typing is contravariant.&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
It is possible to declare 'operands' and 'empty_operands' as variant.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: variant detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: variant OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'apply' and 'target' should be wrote again. For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	do&lt;br /&gt;
		-- 'operands' type = constrained inheritance. Here: detachable TUPLE&lt;br /&gt;
		if attached operands as args then&lt;br /&gt;
			-- 'operands' type = request result type. Here: OPEN_ARGS&lt;br /&gt;
			call (args)&lt;br /&gt;
		else&lt;br /&gt;
			call (Void)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
This part extend the proposition to enable a best backward compatibility and then a best transition.&lt;br /&gt;
&lt;br /&gt;
== General discussions ==&lt;br /&gt;
=== Greater flexibility for generics ===&lt;br /&gt;
A lot of generics could be novariant, encouraging to propose a solution to have a new flexibility, but safe.&lt;br /&gt;
==== Wildcard generics ====&lt;br /&gt;
The request result type is the constrained inheritance type. And the type of the feature argument is (attached) NONE.&lt;br /&gt;
The new semantic of 'Void' is considered: Void is not a NONE instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: ARRAY [?]; b: ARRAY [STRING]&lt;br /&gt;
	o: ANY&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
	o := a.item (1)&lt;br /&gt;
	a.put (&amp;quot;try&amp;quot;) -- invalid call. The type expected is NONE.&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However the wildcard generics will be used on request result or feature argument. A more power and elegent solution could be the parametrized routines.&lt;br /&gt;
&lt;br /&gt;
==== Parametrized routines ====&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
do_something [G] (a: ARRAY [G]): G&lt;br /&gt;
	require&lt;br /&gt;
		a.count &amp;gt;= 1&lt;br /&gt;
	do&lt;br /&gt;
		Result := a.item (1)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Right abstraction ====&lt;br /&gt;
The wildcard generics and the parametrized routines introduce new constructs for Eiffel. Is there another solution avoiding this?&lt;br /&gt;
&lt;br /&gt;
With a right abstraction it is possible to have flexible classes. It is comparable to the imuutable cocncept.&lt;br /&gt;
&lt;br /&gt;
'''example:''' V_CONTAINER class of Eiffel Base 2&lt;br /&gt;
To obtain the genric covariance behavior it is necessary to have:&lt;br /&gt;
* V_ITERATOR must have a covariant generic.&lt;br /&gt;
* TUPLE should be a read-only interface (V_MUTABLE_TUPLE would be the current TUPLE class). Therefore TUPLE could be conformed to V_SEQUENCE and V_MUTABLE_TUPLE conformed to V_ARRAY. Note that only the readonly interface could be in the Eiffel Standard.&lt;br /&gt;
&lt;br /&gt;
In V_CONTAINER class only two features should use the variant typing:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
new_cursor: V_ITERATOR [G]&lt;br /&gt;
	do ... end&lt;br /&gt;
&lt;br /&gt;
occurrences (v: variant G): INTEGER&lt;br /&gt;
		do&lt;br /&gt;
			-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
			across Current as it loop&lt;br /&gt;
				if it.item = v then&lt;br /&gt;
					Result := Result + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
has (v: variant G)&lt;br /&gt;
	local&lt;br /&gt;
		it: like new_cursor&lt;br /&gt;
	do&lt;br /&gt;
		-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
		it := new_cursor -- 'it' type = V_ITERATOR [ANY]&lt;br /&gt;
		it.search_forth (v)&lt;br /&gt;
		Result := not it.after&lt;br /&gt;
	ensure&lt;br /&gt;
		occurrences (v) = 1	&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In V_ITERATOR only two features should use the variant typing without object test!&lt;br /&gt;
&lt;br /&gt;
With these changes the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: V_CONTAINER [ANY]; b: V_CONTAINER [STRING]&lt;br /&gt;
do&lt;br /&gt;
	a := b&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sub-conclusion ====&lt;br /&gt;
With a right abstraction and a smart use of variant typing for generics, it is possible to obtain a greater flexibility keeping a fully aivailable interface.&lt;br /&gt;
&lt;br /&gt;
=== Limit changes ===&lt;br /&gt;
To limit code change and to increase typing consistency, we can change the semantic of 'variant'.&lt;br /&gt;
&lt;br /&gt;
Contravariant redefinition of request result is not very useful.&lt;br /&gt;
The variant typing could be limited for covariant redefinition. There could have no effect on request result.&lt;br /&gt;
&lt;br /&gt;
For generic conformance, a formal generic prefixed with the variant mark is covariant. The variant mark is not required on feature argument limiting code change.&lt;br /&gt;
&lt;br /&gt;
However we have a problem: How mark a contravariant generic? There is three options:&lt;br /&gt;
* Another mark.&lt;br /&gt;
* 'frozen' mark for novariant generic and then no mark for contravariant generic: too restrictive since novariance concerns a lot of generic classes&lt;br /&gt;
* No prefixed mark means novariant or contravariant generic&lt;br /&gt;
&lt;br /&gt;
=== Export status restrictions ===&lt;br /&gt;
Since the ECMA Eiffel Standard forbids the export restriction with conforming inheritance, it is not a problem.&lt;br /&gt;
However, the semantic can be changed to enable this restriction on conforming inheritance.&lt;br /&gt;
&lt;br /&gt;
Restrict exportation should not cause a catcall. The mechanism could be used just to change the class interface.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	ANIMAL&lt;br /&gt;
feature&lt;br /&gt;
	is_vegetarian: BOOLEAN&lt;br /&gt;
		deferred end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		export {NONE}&lt;br /&gt;
			is_vegetarian&lt;br /&gt;
		end&lt;br /&gt;
feature {NONE}&lt;br /&gt;
	is_vegetarian: BOOLEAN = True&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	an_animal: ANIMAL; a_cow: COW&lt;br /&gt;
	b: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
	create a_cow&lt;br /&gt;
	b := a_cow.is_vegetarian -- invalid call&lt;br /&gt;
	&lt;br /&gt;
	an_animal := a_cow&lt;br /&gt;
	b := an_animal .is_vegetarian -- valid call&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class interface is more simple and readable.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
The proposition uses no new keyword and solves the catcall problem.&lt;br /&gt;
It passes all [[Catcall checkpoints]].&lt;br /&gt;
&lt;br /&gt;
The new generic conformance gives a natural safe and flexible static typing.&lt;br /&gt;
The variant typing enables to create adaptive interfaces keeping a safe static typing.&lt;br /&gt;
&lt;br /&gt;
With a fine abstraction and the use of variant typing for generics, the genric conformance flexibility is little restricted. The contravariant for request result can then be discarded for simplicity.&lt;br /&gt;
&lt;br /&gt;
There is no interface restriction ([[Interval types]] or [[Usage-site variance]]). Class interfaces are fully available.&lt;br /&gt;
&lt;br /&gt;
== Your view ==&lt;br /&gt;
name:&lt;br /&gt;
comment:&lt;br /&gt;
&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=14901</id>
		<title>Default and explicit variance</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Default_and_explicit_variance&amp;diff=14901"/>
				<updated>2013-08-29T13:47:54Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Minor improvements&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Catcall]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
In first the limited variant typing is exposed. It checks all catcall checkpoints.&lt;br /&gt;
In the second part the mechanism is extended. It is less simple and explicit, but it enables a best transition.&lt;br /&gt;
&lt;br /&gt;
== Limited variant typing ==&lt;br /&gt;
What is the advantages of covariance compared to a novariant typing?&lt;br /&gt;
* explicit and adaptative interface&lt;br /&gt;
* One routine&lt;br /&gt;
&lt;br /&gt;
=== Variant typing ===&lt;br /&gt;
* A variant entity has '''the most restrictive type'''. &lt;br /&gt;
* A variant entity requires a simple object test to use the entity with the '''expected type'''.&lt;br /&gt;
&lt;br /&gt;
Examples are available in next sections.&lt;br /&gt;
&lt;br /&gt;
=== Feature redefinition ===&lt;br /&gt;
* Covariant redefinition of request result is allowed (as currently).&lt;br /&gt;
* Covariant redefinition of feature argument requires a variant typing on redefined feature or first feature definition.&lt;br /&gt;
'''The most restrictive type''' for a variant type argument is the type of the first feature definition.&lt;br /&gt;
&lt;br /&gt;
The first rule is a stronger postcondition. The current semantic is not changed.&lt;br /&gt;
&lt;br /&gt;
'''example 1:''' covariant redefinition of feature argument with 'variant' typing on redefined feature&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* The object test is not needed.&lt;br /&gt;
* the type is not repeated in the object test.&lt;br /&gt;
* In the class interface the 'variant' is removed. Indeed, it is not possible to call 'eat' on an entity of type COW with a parameter of type 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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: like last)&lt;br /&gt;
		require&lt;br /&gt;
			True&lt;br /&gt;
		do&lt;br /&gt;
			last := f&lt;br /&gt;
		ensure&lt;br /&gt;
			True&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		redefine all end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last) -- or eat (f: variant GRASS)&lt;br /&gt;
		require else&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = expected type. Here: GRASS&lt;br /&gt;
		do&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				-- 'expected' type = expected type. Here: GRASS&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&lt;br /&gt;
		ensure then&lt;br /&gt;
			True&lt;br /&gt;
			-- 'f' type = type of the first definition. Here: FOOD&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''example 2:''' covariant redefinition of feature argument with 'variant' typing on first feature definition.&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&lt;br /&gt;
&lt;br /&gt;
feature -- Eating&lt;br /&gt;
	eat (f: variant like last)&lt;br /&gt;
		do&lt;br /&gt;
			if attached f as expected then&lt;br /&gt;
				last := expected&lt;br /&gt;
			end&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;
		redefine last end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	last: GRASS&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
Default: a generic is novariant&lt;br /&gt;
&lt;br /&gt;
If a genric must be variant (covariant or contravariant or both) then the formal generic must be prefixed with the 'variant' mark.&lt;br /&gt;
&lt;br /&gt;
The compiler must ensure that the variant generic checks one next rule:&lt;br /&gt;
* Generic used only on feature argument is contravariant.&lt;br /&gt;
* Generic used only on request result or feature argument with variant typing is covariant.&lt;br /&gt;
* Generic not used is both contravariant and covariant.&lt;br /&gt;
&lt;br /&gt;
'''The most restrictive type''' for a variant generic argument is the constrained inheritance type.&lt;br /&gt;
'''&lt;br /&gt;
example:'''&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	EXAMPLE [variant K, variant G]&lt;br /&gt;
		-- K is contravariant and G is covariant&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
	first: G&lt;br /&gt;
	&lt;br /&gt;
	item (i: K): G&lt;br /&gt;
		deferred&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: EXAMPLE [INTEGER, COMPARABLE]; b: EXAMPLE [NUMERIC, STRING]&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
As explained for [[Usage-site variance]] the generic 'OPEN_ARGS' from ROUTINE, PROCEDURE, FUNCTION, PREDICATE must be contravariant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	ROUTINE [BASE_TYPE, variant OPEN_ARGS -&amp;gt; detachable TUPLE create default_create end]&lt;br /&gt;
-- ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic 'OPEN_ARGS' is used on feature arguments, but also on request result.&lt;br /&gt;
&lt;br /&gt;
The class should probably be redesigned. Indeed if contravariant is allowed then there may be a new contravariant catcall on request result.&lt;br /&gt;
&lt;br /&gt;
In these classes there are only two requests using the generic as type:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second request is not used internally and may be problematic for creation: How create a tuple of not self-initialized and attached types?&lt;br /&gt;
The first is used in these features : 'target', 'is_equal', 'set_operands', 'copy', 'apply'&lt;br /&gt;
&lt;br /&gt;
'is_equal', 'set_operands' and 'copy' rely on data model.&lt;br /&gt;
'apply' and 'target' are more sensitive. Indeed the problem is when there is an opened target.&lt;br /&gt;
&lt;br /&gt;
'apply' could be restricted for no opened arguments.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	require&lt;br /&gt;
		no_operands: open_count = 0&lt;br /&gt;
	do&lt;br /&gt;
		call (Void)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
'target' could be modfied:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
target: ANY&lt;br /&gt;
	require&lt;br /&gt;
		is_target_closed&lt;br /&gt;
	do&lt;br /&gt;
		-- ...&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or maybe it is better to separate opened target and closed target in two abstractions.&lt;br /&gt;
&lt;br /&gt;
The redesign of agent classes is an opportunity to solve agent problems (see [[Minor-ECMA-problems]], [[Agents in SCOOP]]).&lt;br /&gt;
&lt;br /&gt;
Another solution will be mentioned later.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
The generic 'RESULT_TYPE' of FUNCTION class is used only on request result. Then it is a covariant generic. It is an expected point.&lt;br /&gt;
&lt;br /&gt;
=== Comparison with other solutions ===&lt;br /&gt;
==== [[Detachable types]] (non-generic) ====&lt;br /&gt;
The variant typing is not in conflict with the void-safe typing.&lt;br /&gt;
&lt;br /&gt;
And more the object test is not needed.&lt;br /&gt;
&lt;br /&gt;
==== [[Usage-site variance]] (generic) ====&lt;br /&gt;
The variant typing is a supplier specification while usage-site variance is a client specification.&lt;br /&gt;
&lt;br /&gt;
Another difference is the interface restriction of the usage-site variance. With the variant typing for generics the interface is fully aivailable.&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
The limited variant typing is reasonable and expressive. It limits Eiffel changes and solves all catcall problems.&lt;br /&gt;
&lt;br /&gt;
The proposal reuses an existing keyword.&lt;br /&gt;
&lt;br /&gt;
The addition in TYPE class for reflexivity and dynamic object test is little.&lt;br /&gt;
Indeed two simple booleans &amp;quot;is_contravariant&amp;quot; and &amp;quot;is_covariant&amp;quot; for each generic is required.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
generic_parameter_contravariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter contravariant?&lt;br /&gt;
	&lt;br /&gt;
generic_parameter_covariant (i: INTEGER): BOOLEAN&lt;br /&gt;
	-- Is `i'-th generic parameter covariant?&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A possible critical could be the generic conformance restriction. Propositions are mentioned below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extended variant typing ==&lt;br /&gt;
=== Generic conformance ===&lt;br /&gt;
The variant mark is optional. The compiler infers the generic variance. It is a good point for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
* Generic used only on feature argument or request result with variant typing is contravariant.&lt;br /&gt;
&lt;br /&gt;
==== Agent conformance ====&lt;br /&gt;
It is possible to declare 'operands' and 'empty_operands' as variant.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
operands: variant detachable OPEN_ARGS&lt;br /&gt;
&lt;br /&gt;
empty_operands: variant OPEN_ARGS&lt;br /&gt;
	do create Result ensure ... end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'apply' and 'target' should be wrote again. For example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
apply&lt;br /&gt;
	do&lt;br /&gt;
		-- 'operands' type = constrained inheritance. Here: detachable TUPLE&lt;br /&gt;
		if attached operands as args then&lt;br /&gt;
			-- 'operands' type = request result type. Here: OPEN_ARGS&lt;br /&gt;
			call (args)&lt;br /&gt;
		else&lt;br /&gt;
			call (Void)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sub-conclusion ===&lt;br /&gt;
This part extend the proposition to enable a best backward compatibility and then a best transition.&lt;br /&gt;
&lt;br /&gt;
== General discussions ==&lt;br /&gt;
=== Greater flexibility for generics ===&lt;br /&gt;
A lot of generics could be novariant, encouraging to propose a solution to have a new flexibility, but safe.&lt;br /&gt;
==== Wildcard generics ====&lt;br /&gt;
The request result type is the constrained inheritance type. And the type of the feature argument is (attached) NONE.&lt;br /&gt;
The new semantic of 'Void' is considered: Void is not a NONE instance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: ARRAY [?]; b: ARRAY [STRING]&lt;br /&gt;
	o: ANY&lt;br /&gt;
do&lt;br /&gt;
	-- ...&lt;br /&gt;
	a := b&lt;br /&gt;
	o := a.item (1)&lt;br /&gt;
	a.put (&amp;quot;try&amp;quot;) -- invalid call. The type expected is NONE.&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However the wildcard generics will be used on request result or feature argument. A more power and elegent solution could be the parametrized routines.&lt;br /&gt;
&lt;br /&gt;
==== Parametrized routines ====&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
do_something [G] (a: ARRAY [G]): G&lt;br /&gt;
	require&lt;br /&gt;
		a.count &amp;gt;= 1&lt;br /&gt;
	do&lt;br /&gt;
		Result := a.item (1)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Right abstraction ====&lt;br /&gt;
The wildcard generics and the parametrized routines introduce new constructs for Eiffel. Is there another solution avoiding this?&lt;br /&gt;
&lt;br /&gt;
With a right abstraction it is possible to have flexible classes. It is comparable to the imuutable cocncept.&lt;br /&gt;
&lt;br /&gt;
'''example:''' V_CONTAINER class of Eiffel Base 2&lt;br /&gt;
To obtain the genric covariance behavior it is necessary to have:&lt;br /&gt;
* V_ITERATOR must have a covariant generic.&lt;br /&gt;
* TUPLE should be a read-only interface (V_MUTABLE_TUPLE would be the current TUPLE class). Therefore TUPLE could be conformed to V_SEQUENCE and V_MUTABLE_TUPLE conformed to V_ARRAY. Note that only the readonly interface could be in the Eiffel Standard.&lt;br /&gt;
&lt;br /&gt;
In V_CONTAINER class only two features should use the variant typing:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
new_cursor: V_ITERATOR [G]&lt;br /&gt;
	do ... end&lt;br /&gt;
&lt;br /&gt;
occurrences (v: variant G): INTEGER&lt;br /&gt;
		do&lt;br /&gt;
			-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
			across Current as it loop&lt;br /&gt;
				if it.item = v then&lt;br /&gt;
					Result := Result + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
has (v: variant G)&lt;br /&gt;
	local&lt;br /&gt;
		it: like new_cursor&lt;br /&gt;
	do&lt;br /&gt;
		-- G -&amp;gt; ANY then 'v' type = ANY&lt;br /&gt;
		it := new_cursor -- 'it' type = V_ITERATOR [ANY]&lt;br /&gt;
		it.search_forth (v)&lt;br /&gt;
		Result := not it.after&lt;br /&gt;
	ensure&lt;br /&gt;
		occurrences (v) = 1	&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In V_ITERATOR only two features should use the variant typing without object test!&lt;br /&gt;
&lt;br /&gt;
With these changes the next code is valid:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	a: V_CONTAINER [ANY]; b: V_CONTAINER [STRING]&lt;br /&gt;
do&lt;br /&gt;
	a := b&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sub-conclusion ====&lt;br /&gt;
With a right abstraction and a smart use of variant typing for generics, it is possible to obtain a greater flexibility keeping a fully aivailable interface.&lt;br /&gt;
&lt;br /&gt;
=== Limit changes ===&lt;br /&gt;
To limit code change and to increase typing consistency, we can change the semantic of 'variant'.&lt;br /&gt;
&lt;br /&gt;
Covariant redefinition of request result is not very useful.&lt;br /&gt;
The variant typing could be limited for covariant redefinition. There could have no effect on request result.&lt;br /&gt;
&lt;br /&gt;
For generic conformance, a formal generic prefixed with the variant mark is covariant. The variant mark is not required on feature argument limiting code change.&lt;br /&gt;
&lt;br /&gt;
However we have a problem: How mark a contravariant generic? There is two options:&lt;br /&gt;
* Another mark.&lt;br /&gt;
* No prefixed mark means novariant or contravariant generic&lt;br /&gt;
&lt;br /&gt;
=== Export status restrictions ===&lt;br /&gt;
Since the ECMA Eiffel Standard forbids the export restriction with conforming inheritance, it is not a problem.&lt;br /&gt;
However, the semantic can be changed to enable this restriction on conforming inheritance.&lt;br /&gt;
&lt;br /&gt;
Restrict exportation should not cause a catcall. The mechanism could be used just to change the class interface.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	ANIMAL&lt;br /&gt;
feature&lt;br /&gt;
	is_vegetarian: BOOLEAN&lt;br /&gt;
		deferred end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	COW&lt;br /&gt;
inherit&lt;br /&gt;
	ANIMAL&lt;br /&gt;
		export {NONE}&lt;br /&gt;
			is_vegetarian&lt;br /&gt;
		end&lt;br /&gt;
feature {NONE}&lt;br /&gt;
	is_vegetarian: BOOLEAN = True&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
	an_animal: ANIMAL; a_cow: COW&lt;br /&gt;
	b: BOOLEAN&lt;br /&gt;
do&lt;br /&gt;
	create a_cow&lt;br /&gt;
	b := a_cow.is_vegetarian -- invalid call&lt;br /&gt;
	&lt;br /&gt;
	an_animal := a_cow&lt;br /&gt;
	b := an_animal .is_vegetarian -- valid call&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class interface is more simple and readable.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
The proposition uses no new keyword and solves the catcall problem.&lt;br /&gt;
It passes all [[Catcall checkpoints]].&lt;br /&gt;
&lt;br /&gt;
The new generic conformance gives a natural safe and flexible static typing.&lt;br /&gt;
The variant typing enables to create adaptive interfaces keeping a safe static typing.&lt;br /&gt;
&lt;br /&gt;
With a fine abstraction and the use of variant typing for generics, the genric conformance flexibility is little restricted. The contravariant for request result can then be discarded for simplicity.&lt;br /&gt;
&lt;br /&gt;
There is no interface restriction ([[Interval types]] or [[Usage-site variance]]). Class interfaces are fully available.&lt;br /&gt;
&lt;br /&gt;
== Your view ==&lt;br /&gt;
name:&lt;br /&gt;
comment:&lt;br /&gt;
&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14900</id>
		<title>Immutable Interface</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Immutable_Interface&amp;diff=14900"/>
				<updated>2013-08-29T12:43:20Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Minor corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
[[Category:Immutability]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Eiffel Base 2 relies on partial (see below) immutable interfaces to design better abstractions and to allow a better use of the library.&lt;br /&gt;
This page sketch a solution to allow full immutable interface designs.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
An interface is immutable if it exports only queries. The routines exported to no classes are not included in the class interface.&lt;br /&gt;
Note that an immutable class has an immutable interface and more queries must be pure, i.e. with no side-effect.&lt;br /&gt;
&lt;br /&gt;
== Issue ==&lt;br /&gt;
Immutable interfaces are not conceivable in the current state of the Eiffel Standard.&lt;br /&gt;
Indeed, all classes inherit of ANY. However ANY has not an immutable interface, it exports some commands. Therefore no immutable interface is conceivable.&lt;br /&gt;
&lt;br /&gt;
ANY class interface (queries are omitted):&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class interface&lt;br /&gt;
	ANY&lt;br /&gt;
	&lt;br /&gt;
feature -- Duplication&lt;br /&gt;
&lt;br /&gt;
	copy (other: like Current)&lt;br /&gt;
			-- Update current object using fields of object attached&lt;br /&gt;
			-- to `other', so as to yield equal objects.&lt;br /&gt;
		require&lt;br /&gt;
			type_identity: same_type (other)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Current ~ other&lt;br /&gt;
&lt;br /&gt;
	frozen deep_copy (other: like Current)&lt;br /&gt;
			-- Effect equivalent to that of:&lt;br /&gt;
			--		copy (`other' . deep_twin)&lt;br /&gt;
		ensure&lt;br /&gt;
			deep_equal: deep_equal (Current, other)&lt;br /&gt;
	&lt;br /&gt;
feature -- Basic Operations&lt;br /&gt;
&lt;br /&gt;
	default_rescue&lt;br /&gt;
			-- Process exception for routines with no Rescue clause.&lt;br /&gt;
			-- (Default: do nothing.)&lt;br /&gt;
&lt;br /&gt;
	frozen do_nothing&lt;br /&gt;
			-- Execute a null action.&lt;br /&gt;
&lt;br /&gt;
feature -- Output&lt;br /&gt;
&lt;br /&gt;
	print (o: detachable ANY)&lt;br /&gt;
			-- Write terse external representation of `o'&lt;br /&gt;
			-- on standard output.&lt;br /&gt;
			&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make ANY as immutable interface ==&lt;br /&gt;
=== Export commands to no classes ===&lt;br /&gt;
* The command 'default_rescue' allows to change an internal behavior. This command can be exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The command 'do_nothing' is a procedure specially interesting for agent uses.&lt;br /&gt;
A qualified call of 'do_nothing' on any objects is not useful. An interesting use can be:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	EXAMPLE&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
	do_something&lt;br /&gt;
		do&lt;br /&gt;
			do_something_with (agent {A}.do_nothing)&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	do_something_with (a: PROCEDURE [ANY, TUPLE [A]])&lt;br /&gt;
		do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However the contravariance (concept not introduced yet) of the second generic parameter of PROCEDURE can remove this use:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	EXAMPLE&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	&lt;br /&gt;
	do_something&lt;br /&gt;
		do&lt;br /&gt;
			do_something_with (agent do_nothing)&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	do_something_with (a: PROCEDURE [ANY, TUPLE [A]])&lt;br /&gt;
		do end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefore the command 'do_nothing' can be exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The command 'print' can be called only with unqualified calls. It can be too exported to no classes.&lt;br /&gt;
&lt;br /&gt;
* The commands 'copy' and 'deep_copy' are probably used mainly through the queries 'twin' and respectively 'deep_twin'.&lt;br /&gt;
Export this commands to no classes seems have no important disturbance. It is always possible to export its in descendants.&lt;br /&gt;
&lt;br /&gt;
However, we can easily imagine that 'twin' and 'deep_twin' create a new object and then apply 'copy' and respectively 'deep_copy'.&lt;br /&gt;
This process does not follow the Eiffel creation philosophy.&lt;br /&gt;
Maybe it is an opportunity to correct it and then to write the queries 'twin' and 'deep_twin' with Eiffel code.&lt;br /&gt;
&lt;br /&gt;
A solution would be to make both commands as creation commands.&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	ANY&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
	copy,&lt;br /&gt;
	deep_copy,&lt;br /&gt;
	default_create&lt;br /&gt;
&lt;br /&gt;
feature {NONE}-- Initialization&lt;br /&gt;
	&lt;br /&gt;
	copy (other: like Current)&lt;br /&gt;
			-- Update current object using fields of object attached&lt;br /&gt;
			-- to `other', so as to yield equal objects.&lt;br /&gt;
		require&lt;br /&gt;
			type_identity: same_type (other)&lt;br /&gt;
		external&lt;br /&gt;
			&amp;quot;built_in&amp;quot;&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Current ~ other&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	-- ...&lt;br /&gt;
		&lt;br /&gt;
feature -- Duplication&lt;br /&gt;
&lt;br /&gt;
	frozen twin: like Current&lt;br /&gt;
			-- New object equal to `Current'&lt;br /&gt;
			-- `twin' calls `copy'; to change copying/twinning semantics, redefine `copy'.&lt;br /&gt;
		do&lt;br /&gt;
			create Result.copy (Current)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_equal: Result ~ Current&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	-- ...&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The both commands can be exported to no classes and two queries can be writed in Eiffel code.&lt;br /&gt;
However the developer must declare the creation commands for each effective class.&lt;br /&gt;
&lt;br /&gt;
To remove this issue we can introduce the inherited creation command mechanism.&lt;br /&gt;
&lt;br /&gt;
=== Inherited Creation Command ===&lt;br /&gt;
A simple addition to Eiffel could be to allow the create clause in the deferred classes.&lt;br /&gt;
The creation commands declared in deferred classes would be inherited creation commands, i.e. creation commands implicitly declared in each descendants.&lt;br /&gt;
&lt;br /&gt;
If an effective class declares no new creation commands then all inherited creation commands and the command 'default_create' are creation commands.&lt;br /&gt;
If an effective class declares new creation commands then all inherited creation commands and new ones are creation commands.&lt;br /&gt;
An inherited command can be declared again in an effective class. This possibility allows then all inherited commands as creation commands without 'default_create' (except if 'default_create' is an inherited creation command).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
create -- inherited&lt;br /&gt;
	make&lt;br /&gt;
&lt;br /&gt;
feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
	make (a_n: INTEGER)&lt;br /&gt;
		deferred end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	B&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	-- 'make' and 'default_create' are creation procedures&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	C&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
	make&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
	-- 'make' is a creation procedure&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This addition does not affect existing code. The compatibility is preserved.&lt;br /&gt;
And more it can be useful in constrained generic context.&lt;br /&gt;
&lt;br /&gt;
=== ANY and inherited creation commands ===&lt;br /&gt;
The mechanism described in the previous section is not usable on ANY. Indeed, ANY is an effective class.&lt;br /&gt;
However it is very useful to allow the creation of ANY instance?&lt;br /&gt;
&lt;br /&gt;
I have no example of use of ANY instances. Maybe it is more relevant to make ANY as deferred class and then to use the inherited creation command mechanism.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	ANY&lt;br /&gt;
&lt;br /&gt;
create -- inherited creation commands&lt;br /&gt;
	copy,&lt;br /&gt;
	deep_copy&lt;br /&gt;
	&lt;br /&gt;
feature&lt;br /&gt;
	-- ...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Export all ANY class's commands allows the design of full immutable interfaces.&lt;br /&gt;
&lt;br /&gt;
In addition, the inherited creation command concept is a minimal mechanism compatible with existing software. It introduces no new keyword and allows to write two queries of ANY in Eiffel code.&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14899</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=14899"/>
				<updated>2013-08-23T22:18:32Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Anchror replacement proposal&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
 || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit Types in interface view&lt;br /&gt;
| REplace the anchors with explicits types in interface view. It is easier to read.&lt;br /&gt;
| The developper does not limit his use of anchors because of readeability issues.&lt;br /&gt;
 || ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Iterable 'TUPLE'&lt;br /&gt;
| Allow to use an iterator on TUPLE.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;()&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14898</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=14898"/>
				<updated>2013-08-22T15:07:35Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: new features for NATURAL&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
|| ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Iterable 'TUPLE'&lt;br /&gt;
| Allow to use an iterator on TUPLE.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;()&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 'factorial', 'even' and 'odd' request&lt;br /&gt;
| Add features to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	even: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  	&lt;br /&gt;
  	odd: BOOLEAN&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Category:Immutability&amp;diff=14896</id>
		<title>Category:Immutability</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Category:Immutability&amp;diff=14896"/>
				<updated>2013-08-20T12:10:51Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Category description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pages about immutability concepts for Eiffel.&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=DynamicTypeSet&amp;diff=14895</id>
		<title>DynamicTypeSet</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=DynamicTypeSet&amp;diff=14895"/>
				<updated>2013-08-19T16:35:24Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Remove 'is' keyword&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ECMA]]&lt;br /&gt;
Author: Matthias Konrad&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction}}&lt;br /&gt;
&lt;br /&gt;
====CAT-Call freeness detection algorithms====&lt;br /&gt;
Finding out, whether any given Eiffel system contains a CAT call is undecidable. A CAT call finding algorithm will thus make one or both of the following error kinds:&lt;br /&gt;
* Kind A: Report a system that has no CAT-call as NOT CAT-call free.&lt;br /&gt;
* Kind B: Report a system containing CAT-calls as CAT-call free.&lt;br /&gt;
Algorithms making errors of kind B are of no use. An algorithm that only makes errors of kind A leads to type safety, but may be useless if it makes too many (the trivial algorithm, that reports every Eiffel system as NOT CAT-call free makes no errors of kind B but is completely useless).&lt;br /&gt;
The goal is thus to find the maximal (or most reasonable) subclass of the class of CAT-call free Eiffel systems that is decidable and fast enough to be used in practice.&lt;br /&gt;
&lt;br /&gt;
====Dynamic type set algorithm====&lt;br /&gt;
The Dynamic type set algorithm (DTSA) as defined in ETL2 (combined with a system validity check) seems to make no errors of kind B (it remains to be proven) but certainly of kind A. By showing some of these errors we try to show what impact the DTSA has to the Eiffel language. &lt;br /&gt;
&lt;br /&gt;
DTSA does not work well with generic algorithms. See feature ''merge'', that merges the list ''f'' into the list ''t'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
merge (f, t: LIST [ANY])&lt;br /&gt;
   require&lt;br /&gt;
      f /= Void&lt;br /&gt;
      t /= Void&lt;br /&gt;
      --f.G &amp;lt;= t.G&lt;br /&gt;
   do&lt;br /&gt;
      from f.start until f.after loop&lt;br /&gt;
         t.extend (f.item) &lt;br /&gt;
         f.forth&lt;br /&gt;
      end&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This feature might be used frequently in a bigger system. As a consequence, the dynamic type sets of both arguments become large. It is not the performance problem that interests us here, but the fact that the feature will become invalid very fast. A system containing the following two calls to ''merge'' (even if the calls are not in the same feature or even class) will be reported as invalid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel, N]&lt;br /&gt;
merge (create {LINKED_LIST [STRING]}.make, create {LINKED_LIST [STRING]}.make)&lt;br /&gt;
merge (create {LINKED_LIST [ANY]}.make, create {LINKED_LIST [ANY]}.make)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I consider this a strong error of kind A, since it obviously takes power (genericity) from the language.&lt;br /&gt;
&lt;br /&gt;
====Why does the DTSA fail for the merge methode====&lt;br /&gt;
==Proof obligation based algorithm==&lt;br /&gt;
&lt;br /&gt;
Feature ''merge'' works with lots of dynamic types. It depends on one thing tough, the actual generic parameter of argument ''f'' needs to be equally or more specific compared to the actual generic parameter of argument ''t''. This constraint should be detected by an algorithm and made an obligation for every caller of ''merge''. In Eiffel an obligation made to a caller is a precondition. &lt;br /&gt;
&lt;br /&gt;
====Rule 1====&lt;br /&gt;
For calls of the form: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t.f (a)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
where feature the first formal argument of feature ''f'' is of generic type G the following obligation follows:&lt;br /&gt;
a &amp;lt;= t.G, a needs to be more specific than the &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A better algorithm should detect what feature ''merge'' depends on to work properly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One weakness of the DTSA is, that the dynamic type sets of arguments of often used types become huge. This indirectly leads to many errors of kind A as the following example shows:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
foo&lt;br /&gt;
   local&lt;br /&gt;
      l1: LIST_ANY&lt;br /&gt;
      l2: LIST_STRING&lt;br /&gt;
   do&lt;br /&gt;
      create l1&lt;br /&gt;
      l1.put (&amp;quot;&amp;quot;)&lt;br /&gt;
      double_list (l1)&lt;br /&gt;
&lt;br /&gt;
      create l2&lt;br /&gt;
      l2.put (&amp;quot;&amp;quot;)&lt;br /&gt;
      double_list (l2)&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;
double_list (l: LIST_ANY)   -- backward obligation: l.put.item &amp;gt;= l.item&lt;br /&gt;
   do&lt;br /&gt;
      l.put (l.item)          &lt;br /&gt;
   end&lt;br /&gt;
&lt;br /&gt;
merge_list (from_list, to_list: LIST_ANY)   --backward obligation: to_list.put.item &amp;gt;= from_list.start&lt;br /&gt;
   do&lt;br /&gt;
      to_list.put (from_list.start)&lt;br /&gt;
   end&lt;br /&gt;
&lt;br /&gt;
add_to_list (list: LIST_ANY; elem: ANY)   --backward obligation: list.put.item &amp;gt;= elem&lt;br /&gt;
   do&lt;br /&gt;
      list.put (elem)&lt;br /&gt;
   end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|}	&lt;br /&gt;
&lt;br /&gt;
The dynamic type set of argument ''i'' of feature ''put'' of type ''LIST_ANY'' becomes {INTEGER, STRING}. Same thing for attribute ''item'' of type ''LIST_ANY''. DTSA will thus fail to report this system as CAT-call free.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
The following system will be used for examples:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; -halign=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel,N]&lt;br /&gt;
class&lt;br /&gt;
   LIST_ANY&lt;br /&gt;
feature&lt;br /&gt;
   put (i: ANY) is&lt;br /&gt;
      do&lt;br /&gt;
         item := i&lt;br /&gt;
      end&lt;br /&gt;
   item: ANY&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;[eiffel,N]&lt;br /&gt;
class&lt;br /&gt;
   LIST_STRING&lt;br /&gt;
inherit&lt;br /&gt;
   LIST_ANY&lt;br /&gt;
      redefine put, item end&lt;br /&gt;
feature&lt;br /&gt;
   put (i: STRING) is&lt;br /&gt;
      do&lt;br /&gt;
         item := i&lt;br /&gt;
      end	&lt;br /&gt;
   item: STRING&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

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

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

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14854</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=14854"/>
				<updated>2013-07-27T10:03:25Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Remove the example&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
|| ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Iterable 'TUPLE'&lt;br /&gt;
| Allow to use an iterator on TUPLE.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;()&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Factorial request&lt;br /&gt;
| Add factorial feature to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial alias &amp;quot;!&amp;quot;: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14853</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=14853"/>
				<updated>2013-07-27T10:01:01Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Syntax correction&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
|| ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Iterable 'TUPLE'&lt;br /&gt;
| Allow to use an iterator on TUPLE.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;()&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A possible application :&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	PROCEDURE [BASE_TYPE, OPEN_ARGS -&amp;gt; detachable TUPLE create default_create end]&lt;br /&gt;
&lt;br /&gt;
feature -- Calls&lt;br /&gt;
	call alias &amp;quot;()&amp;quot; (args: detachable OPEN_ARGS)&lt;br /&gt;
		...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
do_something (p: PROCEDURE [ANY,TUPLE [NATURAL]]&lt;br /&gt;
	do&lt;br /&gt;
		p ([8]) -- equivalent to p.call ([8])&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Factorial request&lt;br /&gt;
| Add factorial feature to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial alias &amp;quot;!&amp;quot;: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14852</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=14852"/>
				<updated>2013-07-27T10:00:07Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Add syntax coloration&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
|| ||&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;e&amp;gt;&lt;br /&gt;
 foo: STRING assign set_key_value (&amp;quot;foo&amp;quot;, ?)&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, v: STRING)&lt;br /&gt;
     do&lt;br /&gt;
         values.force (v, k)&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&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;e&amp;gt;&lt;br /&gt;
foo( a : B): C&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;/e&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&lt;br /&gt;
     end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Iterable 'TUPLE'&lt;br /&gt;
| Allow to use an iterator on TUPLE.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;()&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A possible application :&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	PROCEDURE [BASE_TYPE, OPEN_ARGS -&amp;gt; detachable TUPLE create default_create end]&lt;br /&gt;
&lt;br /&gt;
feture -- Calls&lt;br /&gt;
	call alias &amp;quot;()&amp;quot; (args: detachable OPEN_ARGS)&lt;br /&gt;
		...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
do_something (p: PROCEDURE [ANY,TUPLE [NATURAL]]&lt;br /&gt;
	do&lt;br /&gt;
		p ([8]) -- equivalent to p.call ([8])&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Factorial request&lt;br /&gt;
| Add factorial feature to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial alias &amp;quot;!&amp;quot;: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14851</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=14851"/>
				<updated>2013-07-27T09:57:50Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: Enclosed alias proposal&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
|| ||&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;, ?)&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, v: STRING)&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&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&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;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Iterable 'TUPLE'&lt;br /&gt;
| Allow to use an iterator on TUPLE.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove 'only' postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Enclosed alias&lt;br /&gt;
| Enclosed alias has similar behavior to bracket alias.&lt;br /&gt;
&amp;quot;[]&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;()&amp;quot;, &amp;quot;{}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A possible application :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	PROCEDURE [BASE_TYPE, OPEN_ARGS -&amp;gt; detachable TUPLE create default_create end]&lt;br /&gt;
&lt;br /&gt;
feture -- Calls&lt;br /&gt;
	call alias &amp;quot;()&amp;quot; (args: detachable OPEN_ARGS)&lt;br /&gt;
		...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
do_something (p: PROCEDURE [ANY,TUPLE [NATURAL]]&lt;br /&gt;
	do&lt;br /&gt;
		p ([8]) -- equivalent to p.call ([8])&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;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Factorial request&lt;br /&gt;
| Add factorial feature to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial alias &amp;quot;!&amp;quot;: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Wish_List&amp;diff=14835</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=14835"/>
				<updated>2013-05-26T10:30:49Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: factorial and abs requests&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;
* Would be a smart idea implementing this in a similar way as IP (Intentional Programming) does (storing source files as Abstract Syntax Tree, representable in different representations, and using a smart versioning system). More info: see [http://intentsoft.com/]&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;
! Customizing the font of different lexical components&lt;br /&gt;
| It would be useful to be able to set different fonts for different lexical components.  It is already possible for keywords some other may be useful too like class names, locals, queries, commands, comments ... || || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Auto Indent&lt;br /&gt;
|Auto indent does not work, yes it does what 90% of editors that clame to do auto indent do. But if you have seen auto indent you would know this is not it.&lt;br /&gt;
You should be able to just press &amp;lt;CR&amp;gt; at end of line and type. E.G. if you are in a do block and type ensure it should unindent. |Badly indented should be an earlt indication of some syntax errors. &lt;br /&gt;
| Less key presses, less stress. || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Select and Paste&lt;br /&gt;
|Like On X, middle button pastes previus selection.&lt;br /&gt;
|less mouse presses || ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!Dialog Boxes, Yes or No&lt;br /&gt;
|In a dialog box that askes whould you like to save, have buttons labelled &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
|Much quicker for intermediate and advanced users, as dont need to read all the text. Less error prone (as these users wont read the text)&lt;br /&gt;
&lt;br /&gt;
Better for begginers: Resurch has shown that begginers see these questions as asking for permition, and do not feal qualified to give it. Most begginers press No the first time. Then later wonder where there work went.&lt;br /&gt;
&lt;br /&gt;
Or even better just save it.&lt;br /&gt;
&lt;br /&gt;
|See: &amp;quot;Open Office&amp;quot; for an example.&lt;br /&gt;
See: The Inmates Are Running the Asylum: Why High-Tech Products Drive Us Crazy and How to Restore the Sanity (http://www.cooper.com/insights/books/)&lt;br /&gt;
&lt;br /&gt;
 ||&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Pebble for Override Clusters&lt;br /&gt;
| Further integrate  'Override Clusters' into the IDE, i.e., rather than having to manually copy a class from an existing library to the override cluster's folder, use a pebble and drop the class in the override cluster directly.&lt;br /&gt;
|| ||&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;, ?)&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, v: STRING)&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&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;
! 'across' with optional 'as'&lt;br /&gt;
| Allow to use '''across''' without '''as''' &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 a_routine&lt;br /&gt;
     do&lt;br /&gt;
         across 1 |..| 10&lt;br /&gt;
         loop&lt;br /&gt;
              -- do something&lt;br /&gt;
         end&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;
! Simple conversion declaration&lt;br /&gt;
| Allow to write a simple conversion statment:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CONVERSION_PROPOSAL&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from,&lt;br /&gt;
    something&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_CONVERSION&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make_from&lt;br /&gt;
&lt;br /&gt;
convert&lt;br /&gt;
    make_from ({A_TYPE}),&lt;br /&gt;
    something: {ANOTHER_TYPE}&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
    make_from (v: A_TYPE)&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
    something: ANOTHER_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| Esaier and more readable declaration&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Iterable 'TUPLE'&lt;br /&gt;
| Allow to use an iterator on TUPLE.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Customized creation procedure for expanded type&lt;br /&gt;
| Require 'default_create' as now but allow to use another creation procedure.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Empty braces for unexported features&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    PROPOSITION&lt;br /&gt;
&lt;br /&gt;
feature {}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
equivalent to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    CURRENT_STANDARD&lt;br /&gt;
&lt;br /&gt;
feature {NONE}&lt;br /&gt;
    internal_something: A_TYPE&lt;br /&gt;
        do end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* Liberty Eiffel uses this syntax.&lt;br /&gt;
* NONE keyword could be deprecated in the future (save a keyword and remove the concept of a class NONE inheriting of all classes)&lt;br /&gt;
|&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is less explicit, so it is arguably harder to read than the current standard &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The proposal &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; is likely to cause confusion between unexported features and features exported to &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. Empty braces look very similar to braces omitted entirely.&lt;br /&gt;
* The proposal would force upgrading of existing code, which would be disruptive to existing users (although probably easily automated).&lt;br /&gt;
* What about &amp;lt;code&amp;gt;inherit {NONE}&amp;lt;/code&amp;gt;?&lt;br /&gt;
* What would the type of &amp;lt;code&amp;gt;Void&amp;lt;/code&amp;gt; be?&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Remove only postcondition&lt;br /&gt;
| Replace only postcondition with the old convention.&lt;br /&gt;
Bertrand MEYER described that in this article : [here][http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Explicit assigner command specification&lt;br /&gt;
| In the ECMA strandart (367), there is no information about renaming and exportation rules for assigner commands.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed.&lt;br /&gt;
* Assigner Commands are not droped when the procedure is renamed or redefined.&lt;br /&gt;
* When a request is renamed the assigner may be changed. If there is no assigner command specified then it is removed. (similar to 'alias' behavior).&lt;br /&gt;
* Assigner command exportation is equivalent to the procedure.&lt;br /&gt;
&lt;br /&gt;
However, if the exportation of the request is restricted then there is no sense to use the assigner command in the non-exported classes.&lt;br /&gt;
The previous rule could be replaced with :&lt;br /&gt;
* The assigner command is exported to the set of classes resulting of the intersection betwen the exported set of the request and of the command.&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	A&lt;br /&gt;
&lt;br /&gt;
feature {B, C} -- Access&lt;br /&gt;
	q: A assign c&lt;br /&gt;
	&lt;br /&gt;
feature {C, D} -- Chnage&lt;br /&gt;
	c (v: A)&lt;br /&gt;
		do&lt;br /&gt;
			q := v&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- o: A&lt;br /&gt;
o.q := v&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
is allowed in classes conforms to 'C'.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Library ==&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;
! until_do_and_remove&lt;br /&gt;
| Add DISPENCER_ITERATOR[G-&amp;gt;DISPENCER] inherit ITERATOR ....&lt;br /&gt;
  Add procedures until_do_and_remove and its brothers.&lt;br /&gt;
| if I want to iterate a QUEUE, I dont want the items to exist afterwards.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! SQL like where&lt;br /&gt;
| simmala to do_if, but a function:&lt;br /&gt;
  where (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  		--returns container like current, for items satisfying test&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! slice functions&lt;br /&gt;
|   &lt;br /&gt;
  slice_until, slice_after, slice_after_and_including, etc (test: FUNCTION [ANY, TUPLE [G], BOOLEAN]): like Current&lt;br /&gt;
  	deferred&lt;br /&gt;
  	end&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Absolute request result as NATURAL&lt;br /&gt;
| Change the 'abs' request type.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	abs: NATURAL_32&lt;br /&gt;
  			-- (from INTEGER_32_REF)&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! Factorial request&lt;br /&gt;
| Add factorial feature to NATURAL types.&lt;br /&gt;
  &amp;lt;e&amp;gt;&lt;br /&gt;
  	factorial alias &amp;quot;!&amp;quot;: like Current&lt;br /&gt;
  		...&lt;br /&gt;
  &amp;lt;/e&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&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;
! Easier Method for using eternal dll&lt;br /&gt;
| When I wanted to include the Advantage Database Server and Virtual Print Engine client libraries written in C with an Eiffel project I was told you had to write wrappers for the header files and create an Eiffel method for each of the function calls in the library.  This was and is too time consuming.  Eiffel should be able to use external dlls without all this work or it should generate the required classes/methods itself.  As a result the project was completed in another language.&lt;br /&gt;
 || ||&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Persistence_predicates&amp;diff=14831</id>
		<title>Persistence predicates</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Persistence_predicates&amp;diff=14831"/>
				<updated>2013-05-20T15:13:32Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: remove 'is' keyword&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Persistence]]&lt;br /&gt;
{{Research}}&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;e&amp;gt;STORABLE&amp;lt;/e&amp;gt;s in an application has at least two significant disadvantages. &lt;br /&gt;
&lt;br /&gt;
One is that using them for long-term persistence is vulnerable to changes in the class. &lt;br /&gt;
&lt;br /&gt;
Another is that too much data may be stored, resulting in large files (or database occupancy, or whatever) and slow reload times. Some data, such as internal caches, are probably best not serialized at all. For other data, it may be better just to store a shorthand identifier to enable the data to be rebuilt (maybe on demand) at retrieval time.&lt;br /&gt;
&lt;br /&gt;
This article explores ways to address the second problem. The first problem is best tackled by only using &amp;lt;e&amp;gt;STORABLE&amp;lt;/e&amp;gt;s as a medium-term caching mechanism.&lt;br /&gt;
&lt;br /&gt;
==Transient data==&lt;br /&gt;
&lt;br /&gt;
Java tackles this problem with the keyword &amp;lt;java&amp;gt;transient&amp;lt;/java&amp;gt;. An attribute so marked is not stored at serialization time. When the object is retrieved the attribute will be void.&lt;br /&gt;
&lt;br /&gt;
This seems rather limited to me. It can't be used if the class invariant constrains the attribute to be non-void. And I don't think there is a way for a descendant class to override this behaviour (it's a long time since I've written any Java, so I could be very wrong here).&lt;br /&gt;
&lt;br /&gt;
My thinking is that there should be a way to specify whether or not a particular attribute should be stored on any given occaision, and a way to specify what to do at retrieval time.&lt;br /&gt;
&lt;br /&gt;
===Persistence predicates===&lt;br /&gt;
&lt;br /&gt;
A persistence predicate is a routine of type &amp;lt;e&amp;gt;PREDICATE [ANY, TUPLE [!&amp;lt;attribute_type&amp;gt;]]&amp;lt;/e&amp;gt; associated with an attribute of type &amp;lt;attribute_type&amp;gt;.&lt;br /&gt;
At storage time, the predicate will be called with the instance of the attribute as its argument (if the attribute is non-Void). If it returns &amp;lt;e&amp;gt;True&amp;lt;/e&amp;gt; then the attribute is stored. If it returns &amp;lt;e&amp;gt;False&amp;lt;/e&amp;gt; then the attribute is not stored, but it may be re-created at retrieval time.&lt;br /&gt;
&lt;br /&gt;
===Restoration routines===&lt;br /&gt;
&lt;br /&gt;
If a persistence predicate returns &amp;lt;e&amp;gt;False&amp;lt;/e&amp;gt;, it may be that the programmer does not need this data at all (such as the case of an internal cache). But in some cases the programmer will want the data to be recreated at restoration time (this may be necessary to restore the class invariant), rather than retrieved from the persistence mechanism. &lt;br /&gt;
&lt;br /&gt;
Take an example of a class which has an attribute named &amp;lt;e&amp;gt;`gadget'&amp;lt;/e&amp;gt; of type &amp;lt;e&amp;gt;GADGET_FROM_DATABASE&amp;lt;/e&amp;gt; having an attribute named &amp;lt;e&amp;gt;`id'&amp;lt;/e&amp;gt; of type &amp;lt;e&amp;gt;INTEGER&amp;lt;/e&amp;gt;. The class invariant requires that&amp;lt;e&amp;gt;`gadget'&amp;lt;/e&amp;gt; is not &amp;lt;e&amp;gt;Void&amp;lt;/e&amp;gt;, but the size required to store &amp;lt;e&amp;gt;`gadget'&amp;lt;/e&amp;gt; is very large. The class also has a secret routine &amp;lt;e&amp;gt;`create_gadget_from_identifier (a_id: INTEGER)&amp;lt;/e&amp;gt; which can be used to create a &amp;lt;e&amp;gt;GADGET_FROM_DATABASE&amp;lt;/e&amp;gt; given its &amp;lt;e&amp;gt;`id'&amp;lt;/e&amp;gt; value. In such a case, rather than store &amp;lt;e&amp;gt;`gadget'&amp;lt;/e&amp;gt; it is probably better to just store the &amp;lt;e&amp;gt;`id'&amp;lt;/e&amp;gt; value, and then call &amp;lt;e&amp;gt;`create_gadget_from_identifier'&amp;lt;/e&amp;gt; at retrieval time.&lt;br /&gt;
&lt;br /&gt;
A restoration routine is similar to a creation procedure, in as much as it cannot reply on the class invariant holding. It can rely on attributes for which the persistence predicate evaluates to &amp;lt;e&amp;gt;True &amp;lt;/e&amp;gt; as having been restored, though.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&lt;br /&gt;
One new keyword &amp;lt;e&amp;gt;restore&amp;lt;/e&amp;gt; will be required. This can occur in several places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;After the &amp;lt;e&amp;gt;create&amp;lt;/e&amp;gt; clause in the class prolog. What follows is a list of restoration routines, just like the list of creation procedures. Typically this will occur in the form:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
restore {STORABLE}&lt;br /&gt;
 recreate_attributes&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;After the &amp;lt;e&amp;gt;attribute&amp;lt;/e&amp;gt; keyword and optional body. What follows is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;1. The tag &amp;lt;e&amp;gt;persistence_predicate:&amp;lt;/e&amp;gt; followed by one of:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;p&amp;gt;a) &amp;lt;e&amp;gt;True&amp;lt;/e&amp;gt; meaning always persist.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &amp;lt;p&amp;gt;b) &amp;lt;e&amp;gt;False&amp;lt;/e&amp;gt; meaning never persist.&amp;lt;/p&amp;gt;&lt;br /&gt;
 &amp;lt;p&amp;gt;c) The keyword &amp;lt;e&amp;gt;agent&amp;lt;/e&amp;gt; followed by a declaration of a &amp;lt;e&amp;gt;PREDICATE&amp;lt;/e&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;2. An optional body (introduced by the tag &amp;lt;e&amp;gt;body:&amp;lt;/e&amp;gt;) like the attribute body, and this is code that is executed only if the attribute was not persisted. These routines run after all persisted attributes have been restored, but before the restoration procedure is run. It is only used for initialization of attributes that do not depend &lt;br /&gt;
upon other restoration attribute bodies having been run.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Within a restoration routine as an instruction. Here it is used analagously to a &amp;lt;e&amp;gt;create&amp;lt;/e&amp;gt; instruction, to run one of the named restoration routines specified in the class of one of the attributes that was not persisted.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
 make, make_from_db&lt;br /&gt;
&lt;br /&gt;
restore {STORABLE}&lt;br /&gt;
 initialize_attributes, recreate_attributes&lt;br /&gt;
&lt;br /&gt;
feature {NONE} -- Initialization&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
   -- Initialize `Current' with a new gadget.&lt;br /&gt;
  do&lt;br /&gt;
   initialize_attributes&lt;br /&gt;
   gadget.save_to_database&lt;br /&gt;
   -- other stuff ...&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 make_from_db (a_gadget_id: INTEGER; ...)&lt;br /&gt;
   -- Initialize `Current' using `a_gadget_id' to create `gadget' from database.&lt;br /&gt;
  do&lt;br /&gt;
    recreate_attributes (a_gadget_id, ...)&lt;br /&gt;
    -- other stuff&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 initialize_attributes&lt;br /&gt;
   -- Initialize `gadget' and ...&lt;br /&gt;
  do&lt;br /&gt;
   create gadget.make_new&lt;br /&gt;
   -- other stuff ...&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 recreate_attributes (a_gadget_id: INTEGER; ...)&lt;br /&gt;
   -- Recreate certain attributes.&lt;br /&gt;
  do&lt;br /&gt;
   create_gadget_from_identifier (a_gadget_id)&lt;br /&gt;
   -- other stuff&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
 gadget: GADGET&lt;br /&gt;
   -- Gadget retrieved from DB via its `id' attribute&lt;br /&gt;
  attribute&lt;br /&gt;
  restore&lt;br /&gt;
   persistance_predicate: agent is_gadget_persisted (attribute.id) -- `True' and `False' would also be acceptable values, &lt;br /&gt;
                                                                   --  with `True' being the default&lt;br /&gt;
   body: agent create_gadget_from_identifier (attribute.id)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class B&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
&lt;br /&gt;
 A&lt;br /&gt;
  redefine&lt;br /&gt;
   make&lt;br /&gt;
  rename&lt;br /&gt;
   gadget as gadget_from_a&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
restore {STORABLE}&lt;br /&gt;
&lt;br /&gt;
 restore_gadgets&lt;br /&gt;
&lt;br /&gt;
feature {NONE} -- Initialization&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
   -- Initialize `Current' with a new gadget.&lt;br /&gt;
  do&lt;br /&gt;
   Precursor&lt;br /&gt;
   create gadget.make_new&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 restore_gadgets (a_id, a_other_id: INTEGER; ...)&lt;br /&gt;
   -- Restore `gadget' and `gadget_from_a' from database.&lt;br /&gt;
  do&lt;br /&gt;
   restore recreate_attributes (a_other_id, ...)&lt;br /&gt;
   create gadget.make_from_databse (a_id)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
 gadget: MY_GADGET&lt;br /&gt;
   -- Gadget createable from database.&lt;br /&gt;
  attribute&lt;br /&gt;
  restore&lt;br /&gt;
   persistance_predicate: False&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here the ECMA &amp;lt;e&amp;gt;attribute&amp;lt;/e&amp;gt; keyword is reused to denote the instance of `gadget'. This is only available within the attribute restore clause, not in a restoration routine.&lt;br /&gt;
&lt;br /&gt;
Now here are some scenarios in which objects of classes A and B are stored:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
local&lt;br /&gt;
 a: A&lt;br /&gt;
 b: B&lt;br /&gt;
do&lt;br /&gt;
 create a.make&lt;br /&gt;
 create b.make&lt;br /&gt;
&lt;br /&gt;
 -- Save a to a storable, using defaults for retrieval&lt;br /&gt;
 a.independent_store (a_medium)&lt;br /&gt;
 &lt;br /&gt;
 -- Assuming `a.is_gadget_persisted (a.gadget.id)' returns `False', `a.gadget' will not be saved, but `a.gadget.id' will be saved&lt;br /&gt;
 --  for use in the local (attribute-specified) restoration routine `create_gadget_from_identifier.&lt;br /&gt;
&lt;br /&gt;
 -- Save b to a storable specifying a restoration routine&lt;br /&gt;
 b.independent_store (a_medium, agent b.restore_gadgets (b.gadget.id, b.gadget_from_a.id, ...))&lt;br /&gt;
&lt;br /&gt;
 -- Assuming `b.is_gadget_persisted (b.gadget_from_a.id)' returns `False', then neither gadget will be stored, but their identifiers&lt;br /&gt;
 --  will be recorded so they can be passed to `restore_gadgets' at retrieval time.&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Redefinition==&lt;br /&gt;
&lt;br /&gt;
The open/closed principle is honoured (I think). The author of the class can determine that an attribute must always be stored (this is the default, and is the current situation), or that it is never stored (for a pure cache attribute), or provide flexibility by specifying an agent.&lt;br /&gt;
&lt;br /&gt;
The agent's routine could be deferred, frozen (yuk!) or just a normal routine, in which case descendant classes can redefine it.&lt;br /&gt;
&lt;br /&gt;
The actual instance data that is passed to the persistance_predicate and the restoration_routine could be specified via an agent, which allows for further flexibility. For restoration, it might even involve an &amp;lt;e&amp;gt;EV_DIALOG&amp;lt;/e&amp;gt; (heaven forfend)!&lt;br /&gt;
&lt;br /&gt;
==Class correctness conditions==&lt;br /&gt;
&lt;br /&gt;
The possibility of the persistance_predicate evaluating to (or statically specified as) &amp;lt;e&amp;gt;False&amp;lt;/e&amp;gt; on an attribute that is required to be non-Void (or non-default for an expanded attribute) implies that either inline restoration code must be supplied, or the restoration routine has an appropriate postcondition clause.&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Persistence_code_samples&amp;diff=14830</id>
		<title>Persistence code samples</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Persistence_code_samples&amp;diff=14830"/>
				<updated>2013-05-20T15:11:40Z</updated>
		
		<summary type="html">&lt;p&gt;Conaclos: apply void-safety and style guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Persistence]]&lt;br /&gt;
Below are sketches of essential classes of the PERSIST framework. &lt;br /&gt;
&lt;br /&gt;
For an open discussion on the design choices please have a look at the [[persistence framework design discussion]].  &lt;br /&gt;
&lt;br /&gt;
You can download the source code here (TODO: provide a link to the sources)&lt;br /&gt;
&lt;br /&gt;
An example of an actually implemented library built according to the PERSIST framework is [http://dadle.origo.ethz.ch/wiki/documentation_of_the_library dadle].&lt;br /&gt;
&lt;br /&gt;
You can also go back to the [[persistence unified]] page.&lt;br /&gt;
==Simplified BON diagram==&lt;br /&gt;
&lt;br /&gt;
[[Image:Abel_class_diagram.png]]&lt;br /&gt;
&lt;br /&gt;
==PERSISTENCE_MANAGER==&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	PERSISTENCE_MANAGER&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	medium: PERSISTENCE_MEDIUM&lt;br /&gt;
			-- Chosen medium&lt;br /&gt;
&lt;br /&gt;
	format: PERSISTENCE_FORMAT&lt;br /&gt;
			-- Chosen format&lt;br /&gt;
&lt;br /&gt;
feature -- Basic operations&lt;br /&gt;
&lt;br /&gt;
	store (an_object: ANY)&lt;br /&gt;
			-- Persists an_object using the format and medium stored by current object.&lt;br /&gt;
		do&lt;br /&gt;
			format.store (an_object, medium)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	retrieve: ANY&lt;br /&gt;
			-- Retrieves an_object using the medium and format stored by current object.&lt;br /&gt;
		do&lt;br /&gt;
			Result := format.retrieve (medium)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BINARY_PERSISTENCE_MANAGER==&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	BINARY_PERSISTENCE_MANAGER&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	PERSISTENCE_MANAGER&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
	make&lt;br /&gt;
&lt;br /&gt;
feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
	make (file_name: STRING)&lt;br /&gt;
			-- Initialization procedure&lt;br /&gt;
		do&lt;br /&gt;
			create {FILE_MEDIUM} medium.make (file_name)&lt;br /&gt;
			create {INDEPENDENT_BINARY_FORMAT} format&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PERSISTENCE_FORMAT==&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	PERSISTENCE_FORMAT&lt;br /&gt;
&lt;br /&gt;
feature -- Basic operations&lt;br /&gt;
&lt;br /&gt;
       serialized_form: SERIALIZED_FORM&lt;br /&gt;
			-- Desired serialized form. If exists, this is what will be serialized.&lt;br /&gt;
       &lt;br /&gt;
       set_serialized_form (custom_serialized: SERIALIZED_FORM)&lt;br /&gt;
			-- Set desired custom serialized form. This is what will be serialized.&lt;br /&gt;
		do&lt;br /&gt;
			 serialized_form := custom_serialized&lt;br /&gt;
		ensure&lt;br /&gt;
			object_effect: custom_ser = serialized_form&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	store (object: ANY; medium: PERSISTENCE_MEDIUM)&lt;br /&gt;
			-- Store 'object' using medium&lt;br /&gt;
		deferred&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	retrieve (medium: PERSISTENCE_MEDIUM):ANY&lt;br /&gt;
		deferred&lt;br /&gt;
		end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BINARY_FORMAT==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
deferred class&lt;br /&gt;
	BINARY_FORMAT&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	PERSISTENCE_FORMAT&lt;br /&gt;
		redefine&lt;br /&gt;
			store,&lt;br /&gt;
			retrieve&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	store_handler: SED_STORABLE_FACILITIES&lt;br /&gt;
&lt;br /&gt;
	serializer: SED_MEDIUM_READER_WRITER&lt;br /&gt;
&lt;br /&gt;
feature -- Basic operations&lt;br /&gt;
&lt;br /&gt;
	store (object: ANY; data_file: FILE_MEDIUM)&lt;br /&gt;
			-- stores 'object' using a FILE_MEDIUM&lt;br /&gt;
		do&lt;br /&gt;
			create store_handler&lt;br /&gt;
			create serializer.make (data_file.raw_file)&lt;br /&gt;
			if data_file.exists then&lt;br /&gt;
				data_file.reopen_write (data_file.file_name)&lt;br /&gt;
			else&lt;br /&gt;
				data_file.open_write&lt;br /&gt;
			end&lt;br /&gt;
			serializer.set_for_writing&lt;br /&gt;
			store_now (object)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	store_now (object_to_store: ANY)&lt;br /&gt;
			-- Proper store operation depends on specific descendant.&lt;br /&gt;
		deferred&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	retrieve (data_file: FILE_MEDIUM): ANY&lt;br /&gt;
			-- Retrieve object using a FILE_MEDIUM&lt;br /&gt;
		do&lt;br /&gt;
			create store_handler&lt;br /&gt;
			create serializer.make (data_file.raw_file)&lt;br /&gt;
			if data_file.exists then&lt;br /&gt;
				data_file.open_read&lt;br /&gt;
				serializer.set_for_reading&lt;br /&gt;
				Result:= store_handler.retrieved (serializer,true)&lt;br /&gt;
			else&lt;br /&gt;
				print (&amp;quot;%NData file does not exist! &amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==INDEPENDENT_BINARY_FORMAT==&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	INDEPENDENT_BINARY_FORMAT&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	BINARY_FORMAT&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	optimized_for_retrieval: BOOLEAN&lt;br /&gt;
&lt;br /&gt;
feature -- Status setting&lt;br /&gt;
&lt;br /&gt;
	set_optimized_for_retrieval (is_optimized_for_retrieval:BOOLEAN)&lt;br /&gt;
		do&lt;br /&gt;
			optimized_for_retrieval:= is_optimized_for_retrieval&lt;br /&gt;
		ensure&lt;br /&gt;
			optimized_for_retrieval_effect: optimized_for_retrieval = is_optimized_for_retrieval&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
feature -- Basic operations&lt;br /&gt;
&lt;br /&gt;
	store_now (object_to_store:ANY)&lt;br /&gt;
		do&lt;br /&gt;
			store_handler.independent_store(object_to_store,serializer,optimized_for_retrieval)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FILE_MEDIUM==&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
	FILE_MEDIUM&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
	PERSISTENCE_MEDIUM&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
	make&lt;br /&gt;
&lt;br /&gt;
feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
	make (a_file_name:STRING)&lt;br /&gt;
		do&lt;br /&gt;
			create raw_file.make (a_file_name)&lt;br /&gt;
			file_name:=a_file_name&lt;br /&gt;
		ensure&lt;br /&gt;
			file_name_effect: file_name = a_file_name&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	raw_file: RAW_FILE&lt;br /&gt;
	&lt;br /&gt;
	file_name: STRING&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	exists: BOOLEAN&lt;br /&gt;
		do&lt;br /&gt;
			Result := raw_file.exists&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
feature -- Basic operations&lt;br /&gt;
&lt;br /&gt;
	reopen_write (a_file_name: STRING)&lt;br /&gt;
			-- Reopens the file named 'a_file_name' for writing.&lt;br /&gt;
		do&lt;br /&gt;
			raw_file.reopen_write (a_file_name)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	open_write&lt;br /&gt;
			-- Open the current file for writing.&lt;br /&gt;
		do&lt;br /&gt;
			raw_file.open_write&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	open_read&lt;br /&gt;
			-- Open the current file for reading.&lt;br /&gt;
		do&lt;br /&gt;
			raw_file.open_read&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conaclos</name></author>	</entry>

	</feed>