CINXE.COM
ET: Other Mechanisms
<!doctype html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>ET: Other Mechanisms</title> <link media="all" rel="stylesheet" href="/theme/responsive-eiffel-org/css/all.css" /> <link rel="shortcut icon" href="https://www.eiffel.org/favicon.ico"/> <link href="https://fonts.googleapis.com/css?family=Inconsolata|Open+Sans:400,700|Titillium+Web" rel="stylesheet" type="text/css" /> <!--[if IE]><script src="/theme/responsive-eiffel-org/js/ie.js"></script><![endif]--> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <link rel="stylesheet" href="/module/auth/files/css/auth.css" type="text/css"/> <link rel="stylesheet" href="/module/node/files/css/node.css" type="text/css"/> <link rel="stylesheet" href="/module/blog/files/css/blog.css" type="text/css"/> <link rel="stylesheet" href="/module/comments/files/css/comments.css" type="text/css"/> <link rel="stylesheet" href="/module/wikitext/files/css/wikitext.css" type="text/css"/> <link rel="stylesheet" href="/module/taxonomy/files/css/taxonomy.css" type="text/css"/> <style> table.recent-changes th { padding: 3px; } table.recent-changes td { padding: 3px; border: dotted 1px #ddd; } table.recent-changes td.date { padding-left: 15px; } table.recent-changes td.title { font-weight: bold; } </style> <link rel="stylesheet" href="/module/feed_aggregator/files/css/feed_aggregator.css" type="text/css"/> <link rel="profile" href="http://gmpg.org/xfn/11" /> <meta property="url" content="https://www.eiffel.org/doc/eiffel/ET-_Other_Mechanisms" /> <meta property="og:type" content="article" /> <meta property="article:published_time" content="2019-09-10" /> <meta property="article:modified_time" content="2020-07-02" /> <meta property="og:image" content="https://www.eiffel.org/favicon.ico" /> <link rel='canonical' href='https://www.eiffel.org/doc/eiffel/ET-_Other_Mechanisms' /> <link rel='shortlink' href='https://www.eiffel.org/doc/eiffel/ET-_Other_Mechanisms' /> <script type="text/javascript" src="/module/wdocs/files/js/wdocs.js"></script> <link rel="stylesheet" href="/module/wdocs/files/css/wdocs.css" type="text/css"/> </head> <body class="page"> <div id="page"> <!-- Header --> <header id="header" class="grid-3"> <div class="logo"><a href="https://www.eiffel.org/"><img src="/theme/responsive-eiffel-org/images/logo.png" width="226" height="60" alt="Eiffel"></a></div> <nav id="nav"> <ul> <li><a href="https://www.eiffel.org/welcome">welcome</a></li> <li><a href="https://www.eiffel.org/documentation">documentation</a></li> <li><a href="https://www.eiffel.org/resources">resources</a></li> <li><a href="https://www.eiffel.org/contribute">contribute</a></li> <li><a href="https://www.eiffel.org/blogs">blogs</a></li> <li><a href="https://www.eiffel.org/downloads">download</a></li> </ul> </nav> <nav class="add-links"> <ul> <li> <a href="/account/roc-login?destination=doc%2Feiffel%2FET-_Other_Mechanisms">Sign in</a> </li> <li class="search"> <div class="block" id="block-gcse_search_form"><div class="inside"><form class="search-form" method="GET" action="https://www.eiffel.org/gcse20"> <input type="image" alt="Search" class="btn" src="/theme/responsive-eiffel-org/images/ico-search.png"/> <input type="text" name="q" size="25" maxlength="255" value="" /> </form> </div></div> </li> </ul> </nav> </header> <!-- Main part --> <main id="main"> <a id="main-content"><!-- Internal anchor to top content --></a> <section id="content" class=" doc" itemtype="http://schema.org/Article" itemscope=""> <div class="container grid has-gutter"> <aside id="sidebar"> <div class="holder"><div class="block" id="block-wdocs-tree"><div class="inside"><div id="wdocs-tree" class="menu"><ul class="vertical" > <li class="expandable expanded "><a href="/doc/eiffel/Eiffel">Eiffel</a><ul> <li class="expandable "><a href="/doc/eiffel/Eiffel_Overview">Overview</a><ul> <li><a href="/doc/eiffel/Two-Minute_fact_sheet">Two-Minute fact sheet</a></li><li><a href="/doc/eiffel/Your_next_project_in_Eiffel">Your next project in Eiffel</a></li><li><a href="/doc/eiffel/Learning_Eiffel">Learning Eiffel</a></li><li><a href="/doc/eiffel/Common_myths_and_misconceptions_about_Eiffel">Common myths and misconceptions about Eiffel</a></li></ul></li><li class="expandable expanded "><a href="/doc/eiffel/Eiffel_Tutorials">Tutorials</a><ul> <li class="expandable "><a href="/doc/eiffel/Invitation_to_Eiffel_%28I2E%29">Invitation to Eiffel</a><ul> <li><a href="/doc/eiffel/I2E-_What_Must_I_Know_First%3F">I2E: What Must I Know First?</a></li><li><a href="/doc/eiffel/I2E-_Design_Principles">I2E: Design Principles</a></li><li><a href="/doc/eiffel/I2E-_Object-Oriented_Design">I2E: Object-Oriented Design</a></li><li><a href="/doc/eiffel/I2E-_Classes">I2E: Classes</a></li><li><a href="/doc/eiffel/I2E-_Types">I2E: Types</a></li><li><a href="/doc/eiffel/I2E-_Design_by_Contract_and_Assertions">I2E: Design by Contract and Assertions</a></li><li><a href="/doc/eiffel/I2E-_Exceptions">I2E: Exceptions</a></li><li><a href="/doc/eiffel/I2E-_Event-Driven_Programming_and_Agents">I2E: Event-Driven Programming and Agents</a></li><li><a href="/doc/eiffel/I2E-_Genericity">I2E: Genericity</a></li><li><a href="/doc/eiffel/I2E-_Inheritance">I2E: Inheritance</a></li><li><a href="/doc/eiffel/I2E-_Polymorphism_and_Dynamic_Binding">I2E: Polymorphism and Dynamic Binding</a></li><li><a href="/doc/eiffel/I2E-_Combining_Genericity_and_Inheritance">I2E: Combining Genericity and Inheritance</a></li><li><a href="/doc/eiffel/I2E-_Deferred_Classes_and_Seamless_Development">I2E: Deferred Classes and Seamless Development</a></li><li><a href="/doc/eiffel/I2E-_Putting_a_System_Together">I2E: Putting a System Together</a></li><li><a href="/doc/eiffel/I2E-_Invitation_to_Eiffel_Copyright">I2E: Invitation to Eiffel Copyright</a></li></ul></li><li class="expandable "><a href="/doc/eiffel/Mini_How-tos">Mini How-tos</a><ul> <li><a href="/doc/eiffel/Getting_a_STRING_from_a_NUMERIC_object">NUMERIC to STRING</a></li><li><a href="/doc/eiffel/Iterating_on_a_LIST">Iterating on a LIST</a></li><li><a href="/doc/eiffel/Removing_object_while_iterating_on_a_LIST">Removing object while iterating on a LIST</a></li><li><a href="/doc/eiffel/Managing_CTRL%2BC_in_console_application">Managing CTRL+C in console application</a></li></ul></li><li class="expandable expanded "><a href="/doc/eiffel/An_Eiffel_Tutorial_%28ET%29">Tutorial</a><ul> <li><a href="/doc/eiffel/ET-_Overview">ET: Overview</a></li><li><a href="/doc/eiffel/ET-_General_Properties">ET: General Properties</a></li><li><a href="/doc/eiffel/ET-_The_Software_Process_in_Eiffel">ET: The Software Process in Eiffel</a></li><li><a href="/doc/eiffel/ET-_Hello_World">ET: Hello World</a></li><li><a href="/doc/eiffel/ET-_The_Static_Picture-_System_Organization">ET: The Static Picture: System Organization</a></li><li><a href="/doc/eiffel/ET-_The_Dynamic_Structure-_Execution_Model">ET: The Dynamic Structure: Execution Model</a></li><li><a href="/doc/eiffel/ET-_Genericity_and_Arrays">ET: Genericity and Arrays</a></li><li><a href="/doc/eiffel/ET-_Design_by_Contract_%28tm%29%2C_Assertions_and_Exceptions">ET: Design by Contract (tm), Assertions and Exceptions</a></li><li><a href="/doc/eiffel/ET-_Inheritance">ET: Inheritance</a></li><li><a href="/doc/eiffel/ET-_Instructions">ET: Instructions</a></li><li><a href="/doc/eiffel/ET-_Once_routines_and_shared_objects">ET: Once routines and shared objects</a></li><li class="active "><a href="/doc/eiffel/ET-_Other_Mechanisms">ET: Other Mechanisms</a></li><li><a href="/doc/eiffel/ET-_Agents">ET: Agents</a></li><li><a href="/doc/eiffel/ET-_Lexical_Conventions_and_Style_Rules">ET: Lexical Conventions and Style Rules</a></li><li><a href="/doc/eiffel/ET-_To_Learn_More">ET: To Learn More</a></li><li><a href="/doc/eiffel/ET-_Eiffel_Tutorial_Copyright">ET: Eiffel Tutorial Copyright</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffel/Language_reference">Language</a><ul> <li class="expandable "><a href="/doc/eiffel/Quick_reference_to_the_Eiffel_programming_language">Quick Reference</a><ul> <li><a href="/doc/eiffel/Eiffel_programming_language_syntax">Syntax</a></li><li class="expandable "><a href="/doc/eiffel/Expressions">Expressions</a><ul> <li><a href="/doc/eiffel/Conditional_expression">Conditional</a></li><li><a href="/doc/eiffel/Manifest_array">Manifest array</a></li></ul></li><li><a href="/doc/eiffel/Types">Types</a></li><li><a href="/doc/eiffel/Eiffel_programming_language_reserved_words">Reserved words</a></li></ul></li><li class="expandable "><a href="/doc/eiffel/Void-safe_programming_in_Eiffel">Void-safe programming</a><ul> <li><a href="/doc/eiffel/Void-safety-_Background%2C_definition%2C_and_tools">Background and tools</a></li><li><a href="/doc/eiffel/Creating_a_new_void-safe_project">New void-safe project</a></li><li class="expandable "><a href="/doc/eiffel/Converting_existing_software_to_void-safety">Converting existing software to void-safety</a><ul> <li><a href="/doc/eiffel/Void-safe_changes_to_Eiffel_libraries">Void-safe changes to Eiffel libraries</a></li><li><a href="/doc/eiffel/Mixing_void-safe_and_void-unsafe_software">Mixing void-safe and void-unsafe software</a></li></ul></li><li><a href="/doc/eiffel/What_makes_a_Certified_Attachment_Pattern">What makes a Certified Attachment Pattern</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffel/Technical_papers_about_Eiffel">Papers</a><ul> <li><a href="/doc/eiffel/Eiffel_as_an_expression_language">Eiffel as an expression language</a></li><li><a href="/doc/eiffel/Void-safety-_how_Eiffel_removes_null-pointer_dereferencing">Void-safety: how Eiffel removes null-pointer dereferencing</a></li><li class="expandable "><a href="/doc/eiffel/Books_about_the_Eiffel_Method_and_Language">Books</a><ul> <li><a href="/doc/eiffel/Touch_of_Class-_Learning_to_Program_Well_with_Objects_and_Contracts">Touch of Class</a></li><li><a href="/doc/eiffel/Object-Oriented_Software_Construction%2C_2nd_Edition">OOSC2</a></li><li><a href="/doc/eiffel/ECMA_Standard_367">ECMA Standard 367</a></li><li><a href="/doc/eiffel/Eiffel-_The_Language">Eiffel: The Language</a></li><li><a href="/doc/eiffel/Reusable_Software-_The_Base_Object-Oriented_Component_Libraries">OO Component Libraries</a></li><li><a href="/doc/eiffel/EiffelStudio-_A_Guided_Tour_-_Eiffel_Software_Technical_Report">EiffelStudio Guided Tour</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffel/Coding_Standards">Coding Standards</a><ul> <li><a href="/doc/eiffel/Eiffel_Code_Comments">Eiffel Code Comments</a></li><li><a href="/doc/eiffel/Eiffel_Coding_Standard">Eiffel Coding Standard</a></li><li><a href="/doc/eiffel/Local_Declaration_Guidelines">Local Declaration Guidelines</a></li><li><a href="/doc/eiffel/Style_Guidelines">Style Guidelines</a></li></ul></li><li class="expandable "><a href="/doc/eiffel/Examples">Examples</a><ul> <li><a href="/doc/eiffel/Introduction_to_the_Examples_Book">Introduction to the Examples Book</a></li><li><a href="/doc/eiffel/Example-_Command_line_arguments">Example: Command line arguments</a></li><li><a href="/doc/eiffel/Example-_Environment_variables">Example: Environment variables</a></li><li><a href="/doc/eiffel/Example-_File_IO">Example: File IO</a></li><li><a href="/doc/eiffel/Example-_Polymorphism">Example: Polymorphism</a></li><li><a href="/doc/eiffel/Example-_Reverse_a_string">Example: Reverse a string</a></li><li><a href="/doc/eiffel/Example-_Self-initializing_attributes_and_assigner_commands">Example: Self-initializing attributes and assigner commands</a></li><li><a href="/doc/eiffel/Example-_Sieve_of_Eratosthenes">Example: Sieve of Eratosthenes</a></li><li><a href="/doc/eiffel/Example-_Sleep">Example: Sleep</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio">EiffelStudio</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Getting_started">Getting started</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Setup_and_installation">Setup and installation</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Software_Installation_for_EiffelStudio">Software Installation for EiffelStudio</a><ul> <li><a href="/doc/eiffelstudio/FreeBSD">FreeBSD</a></li><li><a href="/doc/eiffelstudio/HP_OpenVMS">HP OpenVMS</a></li><li><a href="/doc/eiffelstudio/HP_Tru64_UNIX">HP Tru64 UNIX</a></li><li><a href="/doc/eiffelstudio/HP-UX">HP-UX</a></li><li><a href="/doc/eiffelstudio/Linux">Linux</a></li><li><a href="/doc/eiffelstudio/Mac_OS_X">Mac OS X</a></li><li><a href="/doc/eiffelstudio/OpenBSD">OpenBSD</a></li><li><a href="/doc/eiffelstudio/SGI_Irix">SGI Irix</a></li><li><a href="/doc/eiffelstudio/Solaris">Solaris</a></li><li class="expandable "><a href="/doc/eiffelstudio/Windows">Windows</a><ul> <li><a href="/doc/eiffelstudio/Installing_Microsoft_C_compiler">MS C compiler</a></li></ul></li></ul></li><li><a href="/doc/eiffelstudio/Third_Party_Tools_Installation_Help">Third Party Tools Installation Help</a></li></ul></li><li><a href="/doc/eiffelstudio/Introducing_EiffelStudio">Introducing EiffelStudio</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_tutorials">Tutorials</a><ul> <li><a href="/doc/eiffelstudio/Copying_the_Example_Files">Copying the Example Files</a></li><li><a href="/doc/eiffelstudio/Starting_EiffelStudio_and_Opening_a_Project">Starting EiffelStudio and Opening a Project</a></li><li><a href="/doc/eiffelstudio/Compiling_and_Executing_a_System">Compiling and Executing a System</a></li><li><a href="/doc/eiffelstudio/A_Look_at_the_Project_Directory">A Look at the Project Directory</a></li><li><a href="/doc/eiffelstudio/Starting_To_Browse">Starting To Browse</a></li><li><a href="/doc/eiffelstudio/Viewing_Classes">Viewing Classes</a></li><li><a href="/doc/eiffelstudio/Customizing_the_tools_layout_and_toolbars">Customizing the tools layout and toolbars</a></li><li><a href="/doc/eiffelstudio/Producing_and_Exporting_Documentation">Producing and Exporting Documentation</a></li><li><a href="/doc/eiffelstudio/Browsing_Features">Browsing Features</a></li><li><a href="/doc/eiffelstudio/Retargeting_Through_Pick-and-Drop">Retargeting Through Pick-and-Drop</a></li><li><a href="/doc/eiffelstudio/Recompiling_and_Editing">Recompiling and Editing</a></li><li><a href="/doc/eiffelstudio/Handling_Syntax_and_Validity_Errors">Handling Syntax and Validity Errors</a></li><li><a href="/doc/eiffelstudio/Debugging_and_Run-time_Monitoring">Debugging and Run-time Monitoring</a></li><li class="expandable "><a href="/doc/eiffelstudio/Using_AutoTest">Using AutoTest</a><ul> <li><a href="/doc/eiffelstudio/Testing-_Background_and_basics">Testing: Background and basics</a></li><li><a href="/doc/eiffelstudio/Create_a_manual_test">Create a manual test</a></li><li><a href="/doc/eiffelstudio/Execute_tests">Execute tests</a></li><li><a href="/doc/eiffelstudio/Using_extracted_tests">Using extracted tests</a></li><li><a href="/doc/eiffelstudio/Using_generated_tests">Using generated tests</a></li><li><a href="/doc/eiffelstudio/Managing_tests">Managing tests</a></li></ul></li><li><a href="/doc/eiffelstudio/Computing_Project_Metrics">Computing Project Metrics</a></li><li><a href="/doc/eiffelstudio/Graphics-based_Design">Graphics-based Design</a></li><li><a href="/doc/eiffelstudio/Using_automatic_class_licensing">Using automatic class licensing</a></li><li><a href="/doc/eiffelstudio/How_EiffelStudio_Compiles">How EiffelStudio Compiles</a></li><li><a href="/doc/eiffelstudio/Technical_papers_about_EiffelStudio">Papers</a></li><li><a href="/doc/eiffelstudio/The_Command-Line_Compiler">The Command-Line Compiler</a></li><li><a href="/doc/eiffelstudio/Executing_a_System_Within_and_Without_EiffelStudio">Executing a System Within and Without EiffelStudio</a></li><li><a href="/doc/eiffelstudio/Writing_Documentation_Filters_with_EFF%2C_the_Eiffel_Filter_Format">Writing Filters with EFF</a></li><li><a href="/doc/eiffelstudio/Manual_identification_and_copyright">Manual identification and copyright</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_Reference">Reference</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_release_notes">Release Notes</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_24.05">24.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_23.09">23.09</a></li><li class="expandable "><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_22.12">22.12</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_22.12_-_macosx">22.12 - macosx</a></li></ul></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_22.05">22.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_21.11">21.11</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_20.11">20.11</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_20.05">20.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_19.12">19.12</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_19.05">19.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_18.11">18.11</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_18.07">18.07</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_18.01">18.01</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_17.05">17.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_17.01">17.01</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_16.05">16.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_15.12">15.12</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_15.08">15.08</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_15.01">15.01</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_14.05">14.05</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_13.11">13.11</a></li><li class="expandable "><a href="/doc/eiffelstudio/7.x">7.x</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_7.3">7.3</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_7.2">7.2</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_7.1">7.1</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_7.0">7.0</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_6_release_notes">6.x</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.8">6.8</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.7">6.7</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.6">6.6</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.5">6.5</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.4">6.4</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.3">6.3</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.2">6.2</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.1">6.1</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_6.0">6.0</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_5_release_notes">5.x</a><ul> <li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.7">5.7</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.6">5.6</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.5">5.5</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.4">5.4</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.3">5.3</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.2">5.2</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.1">5.1</a></li><li><a href="/doc/eiffelstudio/Release_notes_for_EiffelStudio_5.0">5.0</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio-_General_interface_description">General Description</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_interface_mechanisms">EiffelStudio interface mechanisms</a><ul> <li><a href="/doc/eiffelstudio/Pick-and-drop_mechanism">Pick-and-drop mechanism</a></li><li><a href="/doc/eiffelstudio/Pick-and-drop_shortcut">Pick-and-drop shortcut</a></li><li><a href="/doc/eiffelstudio/Toolbar_customization">Toolbar customization</a></li></ul></li><li><a href="/doc/eiffelstudio/EiffelStudio-_All_shortcuts">EiffelStudio: All shortcuts</a></li><li><a href="/doc/eiffelstudio/EiffelStudio_window_overview">EiffelStudio window overview</a></li><li><a href="/doc/eiffelstudio/Main_toolbars">Main toolbars</a></li><li><a href="/doc/eiffelstudio/EiffelStudio-_Key_shortcuts">EiffelStudio: Key shortcuts</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Browsing_tools">Browsing tools</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Address_bars">Address bars</a><ul> <li><a href="/doc/eiffelstudio/Main_address_bar">Main address bar</a></li><li><a href="/doc/eiffelstudio/Context_tool_address_bar">Context tool address bar</a></li><li><a href="/doc/eiffelstudio/Change_data_share_mode">Change data share mode</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Groups_tool">Groups tool</a><ul> <li><a href="/doc/eiffelstudio/System_tree_representation">System tree representation</a></li><li><a href="/doc/eiffelstudio/New_cluster_command">New cluster command</a></li><li><a href="/doc/eiffelstudio/New_class_command">New class command</a></li><li><a href="/doc/eiffelstudio/Locate_command">Locate command</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Features_tool">Features tool</a><ul> <li><a href="/doc/eiffelstudio/Feature_tree">Feature tree</a></li><li><a href="/doc/eiffelstudio/New_feature_command">New feature command</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Favorites_tool">Favorites tool</a><ul> <li><a href="/doc/eiffelstudio/Favorites_tree">Favorites tree</a></li><li><a href="/doc/eiffelstudio/Favorites_menu">Favorites menu</a></li><li class="expandable "><a href="/doc/eiffelstudio/Organize_Favorites_dialog">Organize Favorites dialog</a><ul> <li><a href="/doc/eiffelstudio/New_favorite_class_command">New favorite class command</a></li><li><a href="/doc/eiffelstudio/Create_favorite_folder_command">Create favorite folder command</a></li><li><a href="/doc/eiffelstudio/Move_to_Folder_command">Move to Folder command</a></li><li><a href="/doc/eiffelstudio/Remove_favorite_command">Remove favorite command</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Windows_tool">Windows tool</a><ul> <li><a href="/doc/eiffelstudio/Window_list">Window list</a></li><li><a href="/doc/eiffelstudio/Window_menu">Window menu</a></li><li><a href="/doc/eiffelstudio/Window_related_commands">Window related commands</a></li></ul></li><li><a href="/doc/eiffelstudio/Search_tool">Search tool</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_Editor">Editor</a><ul> <li><a href="/doc/eiffelstudio/Cursor_moves">Cursor moves</a></li><li><a href="/doc/eiffelstudio/Selection">Selection</a></li><li><a href="/doc/eiffelstudio/Clipboard_functionality">Clipboard functionality</a></li><li><a href="/doc/eiffelstudio/History_functionality">History functionality</a></li><li><a href="/doc/eiffelstudio/Search_functionality">Search functionality</a></li><li class="expandable "><a href="/doc/eiffelstudio/Automatic_completion">Automatic completion</a><ul> <li><a href="/doc/eiffelstudio/Syntax_auto_complete">Syntax auto complete</a></li><li><a href="/doc/eiffelstudio/Feature_call_auto_complete">Feature call auto complete</a></li><li><a href="/doc/eiffelstudio/Class_name_auto_complete">Class name auto complete</a></li></ul></li><li><a href="/doc/eiffelstudio/Code_Templates">Code Templates</a></li><li class="expandable "><a href="/doc/eiffelstudio/Operations_on_text_blocks">Operations on text blocks</a><ul> <li><a href="/doc/eiffelstudio/Comment_and_uncomment_lines">Comment and uncomment lines</a></li><li><a href="/doc/eiffelstudio/Indent_and_unindent_selection">Indent and unindent selection</a></li><li><a href="/doc/eiffelstudio/Embed_lines_in_%27if_then...end%27_or_in_%27debug...end%27">Embed lines in 'if then...end' or in 'debug...end'</a></li></ul></li><li><a href="/doc/eiffelstudio/Edit_menu_commands">Edit menu commands</a></li><li><a href="/doc/eiffelstudio/Editor_customization">Editor customization</a></li></ul></li><li><a href="/doc/eiffelstudio/Contract_Editor_tool">Contract Editor tool</a></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio-_Project_settings_window">Project Settings</a><ul> <li><a href="/doc/eiffelstudio/System_Options">System Options</a></li><li class="expandable "><a href="/doc/eiffelstudio/General_Target_Options">General Target Options</a><ul> <li><a href="/doc/eiffelstudio/Language_and_Capabilities">Language and Capabilities</a></li><li><a href="/doc/eiffelstudio/Assertion_Options">Assertion Options</a></li><li><a href="/doc/eiffelstudio/Group_Options">Group Options</a></li><li class="expandable "><a href="/doc/eiffelstudio/Advanced_Options">Advanced Options</a><ul> <li><a href="/doc/eiffelstudio/Warning_Options">Warning Options</a></li><li><a href="/doc/eiffelstudio/Debug_Options">Debug Options</a></li><li><a href="/doc/eiffelstudio/Externals_Options">Externals Options</a></li><li><a href="/doc/eiffelstudio/Tasks_Options">Tasks Options</a></li><li><a href="/doc/eiffelstudio/Variables">Variables</a></li><li><a href="/doc/eiffelstudio/Type_mapping">Type mapping</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Compiler">Compiler</a><ul> <li><a href="/doc/eiffelstudio/Melting_Ice_Technology">Melting Ice Technology</a></li><li><a href="/doc/eiffelstudio/Supported_C_compilers">Supported C compilers</a></li><li class="expandable "><a href="/doc/eiffelstudio/Command_line">Command line</a><ul> <li><a href="/doc/eiffelstudio/Eiffel_compatibility_options">Eiffel compatibility options</a></li><li><a href="/doc/eiffelstudio/EiffelStudio-_Using_command_line_options">Using command line options</a></li><li><a href="/doc/eiffelstudio/Batch_compilation">Batch compilation</a></li><li class="expandable "><a href="/doc/eiffelstudio/Command_line_interactive_mode">Command line interactive mode</a><ul> <li><a href="/doc/eiffelstudio/Compile_%28and_run%29_menu">Compile (and run) menu</a></li><li><a href="/doc/eiffelstudio/Class_menu">Class menu</a></li><li><a href="/doc/eiffelstudio/Feature_menu">Feature menu</a></li><li><a href="/doc/eiffelstudio/System_menu">System menu</a></li><li><a href="/doc/eiffelstudio/Testing_menu">Testing menu</a></li><li><a href="/doc/eiffelstudio/Profile_menu">Profile menu</a></li><li><a href="/doc/eiffelstudio/Documentation_menu">Documentation menu</a></li></ul></li><li><a href="/doc/eiffelstudio/finish_freezing_utility">finish_freezing utility</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Dynamic_library_generation">Dynamic library generation</a><ul> <li><a href="/doc/eiffelstudio/Dynamic_library_builder">Dynamic library builder</a></li><li><a href="/doc/eiffelstudio/Definition_file">Definition file</a></li><li><a href="/doc/eiffelstudio/Dynamic_library-_Generated_files">Dynamic library: Generated files</a></li></ul></li><li><a href="/doc/eiffelstudio/Syntax_level_variant_settings_by_version">Syntax level variant settings by version</a></li><li><a href="/doc/eiffelstudio/Differences_between_standard_ECMA-367_and_Eiffel_Software_implementation">ECMA-367 vs implementation</a></li><li><a href="/doc/eiffelstudio/Differences_between_ETL_2nd_printing_and__Eiffel_Software__implementation">ETL 2nd printing vs implementation</a></li><li class="expandable "><a href="/doc/eiffelstudio/Compiler_History">Compiler History</a><ul> <li><a href="/doc/eiffelstudio/Major_changes_with_ISE_Eiffel_18.01_and_18.07">18.07</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_15.12_and_ISE_Eiffel_16.05">16.05</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_15.08_and_ISE_Eiffel_15.12">15.12</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_15.01_and_ISE_Eiffel_15.08">15.08</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_13.11_and_ISE_Eiffel_14.05">14.05</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_7.3_and_ISE_Eiffel_13.11">13.11</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_7.2_and_ISE_Eiffel_7.3">7.3</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_7.1_and_ISE_Eiffel_7.2">7.2</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_7.0_and_ISE_Eiffel_7.1">7.1</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.8_and_ISE_Eiffel_7.0">7.0</a></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_6_compiler_history">6.x</a><ul> <li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.7_and_ISE_Eiffel_6.8">6.8</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.6_and_ISE_Eiffel_6.7">6.7</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.5_and_ISE_Eiffel_6.6">6.6</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.4_and_ISE_Eiffel_6.5">6.5</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.3_and_ISE_Eiffel_6.4">6.4</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.2_and_ISE_Eiffel_6.3">6.3</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.1_and_ISE_Eiffel_6.2">6.2</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_6.0_and_ISE_Eiffel_6.1">6.1</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.7_and_ISE_Eiffel_6.0">6.0</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_5_compiler_history">5.x</a><ul> <li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.6_and_ISE_Eiffel_5.7">5.7</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.5_and_ISE_Eiffel_5.6">5.6</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.4_and_ISE_Eiffel_5.5">5.5</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.3_and_ISE_Eiffel_5.4">5..4</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.2_and_ISE_Eiffel_5.3">5.3</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.1_and_ISE_Eiffel_5.2">5.2</a></li><li><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_5.0_and_ISE_Eiffel_5.1">5.1</a></li><li class="expandable "><a href="/doc/eiffelstudio/Major_changes_between_ISE_Eiffel_4.5_and_ISE_Eiffel_5.0">5.0</a><ul> <li><a href="/doc/eiffelstudio/Assertions_checking_configuration_changes">Assertions checking configuration changes</a></li><li><a href="/doc/eiffelstudio/EiffelThread_differences_from_4.5_to_5.0">EiffelThread differences from 4.5 to 5.0</a></li><li><a href="/doc/eiffelstudio/Compiler_differences_from_4.5_to_5.0">Compiler differences from 4.5 to 5.0</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Errors_and_warnings">Errors, warnings</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Legacy_code">Legacy code</a><ul> <li><a href="/doc/eiffelstudio/VD81">VD81</a></li><li><a href="/doc/eiffelstudio/VWMA%281%29">VWMA(1)</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Code_Analyzer">Code Analyzer</a><ul> <li><a href="/doc/eiffelstudio/Getting_Started">Getting Started</a></li><li><a href="/doc/eiffelstudio/Running_the_Code_Analyzer">Running the Analyzer</a></li><li><a href="/doc/eiffelstudio/Code_Analyzer-_Interpreting_Results">Interpreting Results</a></li><li><a href="/doc/eiffelstudio/Code_Analyzer-_Customization">Customization</a></li><li class="expandable "><a href="/doc/eiffelstudio/Code_Analyzer-_Rules">Rules</a><ul> <li><a href="/doc/eiffelstudio/CA001_-_Self_Assignment">CA001</a></li><li><a href="/doc/eiffelstudio/CA002_-_Unused_argument">CA002</a></li><li><a href="/doc/eiffelstudio/CA003_-_Feature_never_called">CA003</a></li><li><a href="/doc/eiffelstudio/CA004_-_Command-Query_Separation">CA004</a></li><li><a href="/doc/eiffelstudio/CA005_-_Useless_object_test_local">CA005</a></li><li><a href="/doc/eiffelstudio/CA006_-_Object_test_typing_not_needed">CA006</a></li><li><a href="/doc/eiffelstudio/CA010_-_High_complexity_of_nested_branches_and_loops">CA010</a></li><li><a href="/doc/eiffelstudio/CA011_-_Too_many_arguments">CA011</a></li><li><a href="/doc/eiffelstudio/CA013_-_Exported_creation_procedure">CA013</a></li><li><a href="/doc/eiffelstudio/CA017_-_Empty_conditional">CA017</a></li><li><a href="/doc/eiffelstudio/CA020_-_Variable_not_read_after_assignment">CA020</a></li><li><a href="/doc/eiffelstudio/CA023_-_Unneeded_parentheses">CA023</a></li><li><a href="/doc/eiffelstudio/CA024_-_Use_across_loop">CA024</a></li><li><a href="/doc/eiffelstudio/CA025_-_Use_semicolons">CA025</a></li><li><a href="/doc/eiffelstudio/CA028_-_Combine_two_if_instructions">CA028</a></li><li><a href="/doc/eiffelstudio/CA032_-_Long_routine_implementation">CA032</a></li><li><a href="/doc/eiffelstudio/CA033_-_Large_class">CA033</a></li><li><a href="/doc/eiffelstudio/CA034_-_High_NPATH_complexity">CA034</a></li><li><a href="/doc/eiffelstudio/CA071_-_Self-comparison">CA071</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Debugger">Debugger</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Execution_commands">Execution commands</a><ul> <li><a href="/doc/eiffelstudio/Run_and_stop_at_breakpoints">Run and stop at breakpoints</a></li><li><a href="/doc/eiffelstudio/Run_with_arguments">Run with arguments</a></li><li><a href="/doc/eiffelstudio/Execution_profiles">Execution profiles</a></li><li><a href="/doc/eiffelstudio/Run_without_breakpoints">Run without breakpoints</a></li><li><a href="/doc/eiffelstudio/Run_a_finalized_executable">Run a finalized executable</a></li><li><a href="/doc/eiffelstudio/Step_into_a_feature">Step into a feature</a></li><li><a href="/doc/eiffelstudio/Execute_one_line_at_a_time">Execute one line at a time</a></li><li><a href="/doc/eiffelstudio/Step_out_of_a_feature">Step out of a feature</a></li><li><a href="/doc/eiffelstudio/Pause_an_application">Pause an application</a></li><li><a href="/doc/eiffelstudio/Stop_a_debugged_application">Stop a debugged application</a></li><li><a href="/doc/eiffelstudio/Attach_application">Attach application</a></li><li><a href="/doc/eiffelstudio/Detach_application">Detach application</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Breakpoints">Breakpoints</a><ul> <li><a href="/doc/eiffelstudio/Breakpoint_editing">Breakpoint editing</a></li><li><a href="/doc/eiffelstudio/Breakpoint_commands">Breakpoint commands</a></li><li><a href="/doc/eiffelstudio/Breakpoint_information_command">Breakpoint information command</a></li><li><a href="/doc/eiffelstudio/Breakpoint_menu">Breakpoint menu</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Call_stack_tool">Call stack tool</a><ul> <li><a href="/doc/eiffelstudio/Call_stack_tool-_Interface">Call stack tool: Interface</a></li><li><a href="/doc/eiffelstudio/Information_relative_to_a_stack_element">Information relative to a stack element</a></li><li><a href="/doc/eiffelstudio/Supported_exceptions">Supported exceptions</a></li><li><a href="/doc/eiffelstudio/Save_call_stack">Save call stack</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Execution_record_and_replay">Execution record and replay</a><ul> <li><a href="/doc/eiffelstudio/Record_execution">Record execution</a></li><li><a href="/doc/eiffelstudio/Replay_%28recorded%29_execution">Replay (recorded) execution</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Object_tool">Object tool</a><ul> <li><a href="/doc/eiffelstudio/Attribute_symbols">Attribute symbols</a></li><li><a href="/doc/eiffelstudio/Debug_output">Debug output</a></li><li><a href="/doc/eiffelstudio/Set_slice_size_command">Set slice size command</a></li><li><a href="/doc/eiffelstudio/Object_Viewer_%28also_known_as_Expanded_display%29">Object Viewer (also known as Expanded display)</a></li><li><a href="/doc/eiffelstudio/Remove_object_command">Remove object command</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Expression_evaluation">Expression evaluation</a><ul> <li><a href="/doc/eiffelstudio/Evaluation_tool_or_Watch_tool">Evaluation tool or Watch tool</a></li><li><a href="/doc/eiffelstudio/New_expression_dialog">New expression dialog</a></li></ul></li><li><a href="/doc/eiffelstudio/Debuggee%27s_Object_Storage">Debuggee's Object Storage</a></li><li><a href="/doc/eiffelstudio/Threads_tool">Threads tool</a></li><li><a href="/doc/eiffelstudio/Exceptions_handling_tool">Exceptions handling tool</a></li><li><a href="/doc/eiffelstudio/Stack_overflow_prevention">Stack overflow prevention</a></li><li><a href="/doc/eiffelstudio/Debugging_tips_with_the_objects_grid_view">Debugging tips with the objects grid view</a></li><li><a href="/doc/eiffelstudio/Debugging_preferences">Debugging preferences</a></li><li><a href="/doc/eiffelstudio/Command_line_debugger">Command line debugger</a></li><li><a href="/doc/eiffelstudio/Debugging_limitations">Debugging limitations</a></li></ul></li><li><a href="/doc/eiffelstudio/Error_List_Tool">Error List Tool</a></li><li class="expandable "><a href="/doc/eiffelstudio/Diagram_tool">Diagram tool</a><ul> <li><a href="/doc/eiffelstudio/Notation">Notation</a></li><li><a href="/doc/eiffelstudio/Diagram_toolbar">Diagram toolbar</a></li><li><a href="/doc/eiffelstudio/Views">Views</a></li><li><a href="/doc/eiffelstudio/Contexts">Contexts</a></li><li><a href="/doc/eiffelstudio/Diagram_tool-_Code_generation">Diagram tool: Code generation</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Metrics_tool">Metrics tool</a><ul> <li><a href="/doc/eiffelstudio/Requirements">Requirements</a></li><li class="expandable "><a href="/doc/eiffelstudio/Definitions">Definitions</a><ul> <li><a href="/doc/eiffelstudio/Attributes%2C_metrics_and_measures">Attributes, metrics and measures</a></li><li><a href="/doc/eiffelstudio/Units">Units</a></li><li><a href="/doc/eiffelstudio/Metric_framework_and_theory">Metric framework and theory</a></li><li><a href="/doc/eiffelstudio/Elementary_and_composite_metrics">Elementary and composite metrics</a></li><li><a href="/doc/eiffelstudio/Raw_metrics_and_selection_criteria">Raw metrics and selection criteria</a></li><li><a href="/doc/eiffelstudio/Selection_Criteria">Selection Criteria</a></li><li><a href="/doc/eiffelstudio/Predefined_raw_metrics">Predefined raw metrics</a></li><li><a href="/doc/eiffelstudio/Scopes">Scopes</a></li><li><a href="/doc/eiffelstudio/Domains">Domains</a></li><li><a href="/doc/eiffelstudio/Measurement_archive">Measurement archive</a></li><li><a href="/doc/eiffelstudio/Under_the_Hood_-_How_metrics_work">Under the Hood - How metrics work</a></li><li><a href="/doc/eiffelstudio/Criterion_References">Criterion References</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/User_interface_basics">User interface basics</a><ul> <li><a href="/doc/eiffelstudio/Metric_Evaluation_Panel">Metric Evaluation Panel</a></li><li><a href="/doc/eiffelstudio/Detailed_Result_Panel">Detailed Result Panel</a></li><li><a href="/doc/eiffelstudio/Metric_Definition_Panel">Metric Definition Panel</a></li><li><a href="/doc/eiffelstudio/Metric_History_Panel">Metric History Panel</a></li><li><a href="/doc/eiffelstudio/Metric_Archive_Panel">Metric Archive Panel</a></li></ul></li></ul></li><li><a href="/doc/eiffelstudio/Console_tool">Console tool</a></li><li class="expandable "><a href="/doc/eiffelstudio/Outputs_tool">Outputs tool</a><ul> <li><a href="/doc/eiffelstudio/General_output_pane">General output pane</a></li><li><a href="/doc/eiffelstudio/External_compilation_pane">External compilation pane</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Eiffel_Information_System">Eiffel Information System</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/EIS-_Outgoing">EIS: Outgoing</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Information_Tool">Information Tool</a><ul> <li><a href="/doc/eiffelstudio/Browsing_Information">Browsing Information</a></li><li><a href="/doc/eiffelstudio/Change_Analysis">Change Analysis</a></li><li><a href="/doc/eiffelstudio/Annotation_Management">Annotation Management</a></li><li><a href="/doc/eiffelstudio/Protocols">Protocols</a></li><li><a href="/doc/eiffelstudio/Variable_Definition">Variable Definition</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EIS-_Incoming">EIS: Incoming</a><ul> <li><a href="/doc/eiffelstudio/Eiffel_Scheme_Syntax">Eiffel Scheme Syntax</a></li><li><a href="/doc/eiffelstudio/EIS_incoming_Examples">EIS incoming Examples</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/AutoTest">AutoTest</a><ul> <li><a href="/doc/eiffelstudio/The_AutoTest_Interface">The AutoTest Interface</a></li><li><a href="/doc/eiffelstudio/The_Eiffel_Test_Wizard">The Eiffel Test Wizard</a></li></ul></li><li><a href="/doc/eiffelstudio/Source_Control_Management">Source Control</a></li><li class="expandable "><a href="/doc/eiffelstudio/Wizards_and_dialogs">Wizards and dialogs</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Profiler_Wizard">Profiler Wizard</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Profiler_wizard_guided_tour">Profiler wizard guided tour</a><ul> <li><a href="/doc/eiffelstudio/Select_the_Compilation_mode">Select the Compilation mode</a></li><li><a href="/doc/eiffelstudio/Reuse_or_Generate_an_Execution_Profile">Reuse or Generate an Execution Profile</a></li><li><a href="/doc/eiffelstudio/Select_a_Run-time_information_record_to_generate_the_Execution_Profile">Select a Run-time information record to generate the Execution Profile</a></li><li><a href="/doc/eiffelstudio/Select_the_information_you_need_and_formulate_your_query">Select the information you need and formulate your query</a></li><li><a href="/doc/eiffelstudio/Profile_query_window">Profile query window</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Profiler_How_To%27s">Profiler How To's</a><ul> <li><a href="/doc/eiffelstudio/How_to_set_up_a_Profiler_Configuration_File">How to set up a Profiler Configuration File</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Dialogs">Dialogs</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/New_feature_dialog">New feature dialog</a><ul> <li><a href="/doc/eiffelstudio/New_feature_dialog_overview">New feature dialog overview</a></li><li><a href="/doc/eiffelstudio/New_procedure_layout">New procedure layout</a></li><li><a href="/doc/eiffelstudio/New_function_layout">New function layout</a></li><li><a href="/doc/eiffelstudio/New_attribute_layout">New attribute layout</a></li><li class="expandable "><a href="/doc/eiffelstudio/New_feature_dialog-_feature_properties_modification">New feature dialog: feature properties modification</a><ul> <li><a href="/doc/eiffelstudio/Feature_clauses">Feature clauses</a></li><li><a href="/doc/eiffelstudio/Name_field">Name field</a></li><li><a href="/doc/eiffelstudio/Argument_list">Argument list</a></li><li><a href="/doc/eiffelstudio/Header_comment">Header comment</a></li><li><a href="/doc/eiffelstudio/Precondition">Precondition</a></li><li><a href="/doc/eiffelstudio/Local_variable">Local variable</a></li><li><a href="/doc/eiffelstudio/Feature_body">Feature body</a></li><li><a href="/doc/eiffelstudio/Postcondition">Postcondition</a></li><li><a href="/doc/eiffelstudio/Type_selection">Type selection</a></li><li><a href="/doc/eiffelstudio/Invariant_field">Invariant field</a></li><li><a href="/doc/eiffelstudio/Set-procedure">Set-procedure</a></li></ul></li></ul></li><li><a href="/doc/eiffelstudio/Error_wizard">Error wizard</a></li><li><a href="/doc/eiffelstudio/External_commands_editor_dialog">External commands editor dialog</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_Preferences">EiffelStudio Preferences</a><ul> <li><a href="/doc/eiffelstudio/Preference_window_overview">Preference window overview</a></li><li class="expandable "><a href="/doc/eiffelstudio/Preferences_Reference">Preferences Reference</a><ul> <li><a href="/doc/eiffelstudio/General_Preferences">General Preferences</a></li><li class="expandable "><a href="/doc/eiffelstudio/Interface">Interface</a><ul> <li><a href="/doc/eiffelstudio/Development_Window_Preferences">Development Window Preferences</a></li><li><a href="/doc/eiffelstudio/Discardable_dialogs">Discardable dialogs</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_Tools_Preferences">EiffelStudio Tools Preferences</a><ul> <li><a href="/doc/eiffelstudio/Context_Tools">Context Tools</a></li><li><a href="/doc/eiffelstudio/EiffelStudio_Diagram_Tool_Preferences">EiffelStudio Diagram Tool Preferences</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Editor_Preferences">Editor Preferences</a><ul> <li><a href="/doc/eiffelstudio/General_Editor_Preferences">General Editor Preferences</a></li><li class="expandable "><a href="/doc/eiffelstudio/Eiffel_Editor_Preferences">Eiffel Editor Preferences</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Syntax_automatic_completion_preferences">Syntax automatic completion preferences</a><ul> <li><a href="/doc/eiffelstudio/Keywords_automatic_completion_preferences">Keywords automatic completion preferences</a></li><li><a href="/doc/eiffelstudio/Keyword_completion_customization">Keyword completion customization</a></li><li><a href="/doc/eiffelstudio/Default_values_for_keyword_completion_preferences">Default values for keyword completion preferences</a></li></ul></li></ul></li><li><a href="/doc/eiffelstudio/Keyboard_shortcuts_preferences">Keyboard shortcuts preferences</a></li></ul></li><li><a href="/doc/eiffelstudio/Debugger_Preferences">Debugger Preferences</a></li><li><a href="/doc/eiffelstudio/Recent_Project_Preferences">Recent Project Preferences</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Formatted_information_about_compiled_classes_and_features">Formatted information about compiled classes and features</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Class_views">Class views</a><ul> <li><a href="/doc/eiffelstudio/Class_formatters-_Basic_text_view">Class formatters: Basic text view</a></li><li><a href="/doc/eiffelstudio/Clickable_view">Clickable view</a></li><li><a href="/doc/eiffelstudio/Class_formatters-_Flat_view">Class formatters: Flat view</a></li><li><a href="/doc/eiffelstudio/Contract_view">Contract view</a></li><li><a href="/doc/eiffelstudio/Flat_Contract_view">Flat Contract view</a></li><li><a href="/doc/eiffelstudio/Ancestors">Ancestors</a></li><li><a href="/doc/eiffelstudio/Descendants">Descendants</a></li><li><a href="/doc/eiffelstudio/Clients">Clients</a></li><li><a href="/doc/eiffelstudio/Suppliers">Suppliers</a></li><li><a href="/doc/eiffelstudio/Attributes">Attributes</a></li><li><a href="/doc/eiffelstudio/Routines">Routines</a></li><li><a href="/doc/eiffelstudio/Invariants">Invariants</a></li><li><a href="/doc/eiffelstudio/Creators">Creators</a></li><li><a href="/doc/eiffelstudio/Deferred_features">Deferred features</a></li><li><a href="/doc/eiffelstudio/Once_routines_and_constants">Once routines and constants</a></li><li><a href="/doc/eiffelstudio/Class_formatters-_External_features">Class formatters: External features</a></li><li><a href="/doc/eiffelstudio/Exported_features">Exported features</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Feature_views">Feature views</a><ul> <li><a href="/doc/eiffelstudio/Feature_formatters-_Basic_text_view">Feature formatters: Basic text view</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Flat_view">Feature formatters: Flat view</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Callers">Feature formatters: Callers</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Assigners">Feature formatters: Assigners</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Creators">Feature formatters: Creators</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Callees">Feature formatters: Callees</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Assignees">Feature formatters: Assignees</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Creations">Feature formatters: Creations</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Implementers">Feature formatters: Implementers</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Ancestor_versions">Feature formatters: Ancestor versions</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Descendant_versions">Feature formatters: Descendant versions</a></li><li><a href="/doc/eiffelstudio/Feature_formatters-_Homonyms">Feature formatters: Homonyms</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio_How_To%27s">EiffelStudio How To's</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/EiffelStudio-_Starting_a_project">EiffelStudio: Starting a project</a><ul> <li><a href="/doc/eiffelstudio/EiffelStudio-_Creating_a_new_project">EiffelStudio: Creating a new project</a></li><li><a href="/doc/eiffelstudio/Retrieving_a_project_from_a_configuration_file">Retrieving a project from a configuration file</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Browsing">Browsing</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Searching">Searching</a><ul> <li><a href="/doc/eiffelstudio/Looking_for_a_cluster">Looking for a cluster</a></li><li><a href="/doc/eiffelstudio/Looking_for_a_class">Looking for a class</a></li><li><a href="/doc/eiffelstudio/Looking_for_a_feature">Looking for a feature</a></li><li><a href="/doc/eiffelstudio/Looking_for_an_expression_in_text">Looking for an expression in text</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Viewing_information_about_a_component">Viewing information about a component</a><ul> <li><a href="/doc/eiffelstudio/Centering_tools_on_a_component">Centering tools on a component</a></li><li><a href="/doc/eiffelstudio/Viewing_information_about_a_cluster">Viewing information about a cluster</a></li><li><a href="/doc/eiffelstudio/Viewing_information_about_a_class">Viewing information about a class</a></li><li><a href="/doc/eiffelstudio/Viewing_information_about_a_feature">Viewing information about a feature</a></li></ul></li><li><a href="/doc/eiffelstudio/Opening_new_windows">Opening new windows</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Editing_a_project">Editing a project</a><ul> <li><a href="/doc/eiffelstudio/Adding_a_cluster">Adding a cluster</a></li><li><a href="/doc/eiffelstudio/Adding_a_library">Adding a library</a></li><li><a href="/doc/eiffelstudio/Adding_a_class">Adding a class</a></li><li class="expandable "><a href="/doc/eiffelstudio/Adding_a_feature">Adding a feature</a><ul> <li><a href="/doc/eiffelstudio/Opening_the_new_feature_dialog">Opening the new feature dialog</a></li><li><a href="/doc/eiffelstudio/Adding_a_procedure">Adding a procedure</a></li><li><a href="/doc/eiffelstudio/Adding_a_function">Adding a function</a></li><li><a href="/doc/eiffelstudio/Adding_an_attribute">Adding an attribute</a></li></ul></li><li><a href="/doc/eiffelstudio/Removing_a_cluster">Removing a cluster</a></li><li><a href="/doc/eiffelstudio/Removing_a_class">Removing a class</a></li><li><a href="/doc/eiffelstudio/Removing_a_feature">Removing a feature</a></li><li><a href="/doc/eiffelstudio/Moving_a_class">Moving a class</a></li><li><a href="/doc/eiffelstudio/Changing_project_parameters">Changing project parameters</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Compiling">Compiling</a><ul> <li><a href="/doc/eiffelstudio/Generating_executables">Generating executables</a></li><li><a href="/doc/eiffelstudio/Generating_libraries">Generating libraries</a></li><li><a href="/doc/eiffelstudio/Setting_the_assertion_level">Setting the assertion level</a></li><li><a href="/doc/eiffelstudio/Setting_the_syntax_variant">Setting the syntax variant</a></li><li><a href="/doc/eiffelstudio/Enabling_the_profiler">Enabling the profiler</a></li><li><a href="/doc/eiffelstudio/Using_libraries">Using libraries</a></li><li><a href="/doc/eiffelstudio/Tuning_a_program">Tuning a program</a></li><li><a href="/doc/eiffelstudio/Using_threads">Using threads</a></li><li><a href="/doc/eiffelstudio/Clean_compile">Clean compile</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Running_and_debugging">Running and debugging</a><ul> <li><a href="/doc/eiffelstudio/Running_an_application">Running an application</a></li><li><a href="/doc/eiffelstudio/Interrupting_an_application">Interrupting an application</a></li><li><a href="/doc/eiffelstudio/Exploring_an_application_dynamic_state">Exploring an application dynamic state</a></li><li><a href="/doc/eiffelstudio/Using_breakpoints">Using breakpoints</a></li><li><a href="/doc/eiffelstudio/Handling_exceptions">Handling exceptions</a></li><li><a href="/doc/eiffelstudio/Using_debug_clauses">Using debug clauses</a></li><li><a href="/doc/eiffelstudio/Setting_the_command_line_arguments">Setting the command line arguments</a></li><li><a href="/doc/eiffelstudio/Profiling">Profiling</a></li><li><a href="/doc/eiffelstudio/Tracing">Tracing</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Designing_a_project">Designing a project</a><ul> <li><a href="/doc/eiffelstudio/Switching_to_the_diagram_tool">Switching to the diagram tool</a></li><li><a href="/doc/eiffelstudio/Undoing_and_redoing">Undoing and redoing</a></li><li class="expandable "><a href="/doc/eiffelstudio/Altering_the_system">Altering the system</a><ul> <li><a href="/doc/eiffelstudio/Creating_a_new_class">Creating a new class</a></li><li><a href="/doc/eiffelstudio/Creating_a_new_feature">Creating a new feature</a></li><li class="expandable "><a href="/doc/eiffelstudio/Refactoring">Refactoring</a><ul> <li><a href="/doc/eiffelstudio/Rename_Class">Rename Class</a></li><li><a href="/doc/eiffelstudio/Rename_Feature">Rename Feature</a></li><li><a href="/doc/eiffelstudio/Pull_up_Feature">Pull up Feature</a></li></ul></li><li><a href="/doc/eiffelstudio/Deleting_items">Deleting items</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Managing_links">Managing links</a><ul> <li><a href="/doc/eiffelstudio/Creating_inheritance_links">Creating inheritance links</a></li><li><a href="/doc/eiffelstudio/Creating_client-supplier_links">Creating client-supplier links</a></li><li><a href="/doc/eiffelstudio/Creating_aggregate_client-supplier_links">Creating aggregate client-supplier links</a></li><li><a href="/doc/eiffelstudio/Using_the_link_tool">Using the link tool</a></li><li><a href="/doc/eiffelstudio/Creating_handles">Creating handles</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Modifying_the_display">Modifying the display</a><ul> <li><a href="/doc/eiffelstudio/Showing_or_hiding_links_and_labels">Showing or hiding links and labels</a></li><li><a href="/doc/eiffelstudio/Changing_system_exploration_depth">Changing system exploration depth</a></li><li><a href="/doc/eiffelstudio/Removing_items_from_a_view">Removing items from a view</a></li><li><a href="/doc/eiffelstudio/Changing_colors_of_classes">Changing colors of classes</a></li><li><a href="/doc/eiffelstudio/Zooming_a_diagram">Zooming a diagram</a></li><li><a href="/doc/eiffelstudio/Retrieving_all_classes_into_a_cluster">Retrieving all classes into a cluster</a></li><li><a href="/doc/eiffelstudio/Iconifying_and_restoring_a_cluster">Iconifying and restoring a cluster</a></li><li><a href="/doc/eiffelstudio/Change_the_Display_Quality">Change the Display Quality</a></li><li><a href="/doc/eiffelstudio/Turn_on_Physics_Mode">Turn on Physics Mode</a></li><li><a href="/doc/eiffelstudio/Switching_between_BON_and_UML_View">Switching between BON and UML View</a></li><li><a href="/doc/eiffelstudio/Anchoring">Anchoring</a></li><li><a href="/doc/eiffelstudio/Adjusting_Physics_Settings">Adjusting Physics Settings</a></li><li><a href="/doc/eiffelstudio/Using_the_Cluster_Legend">Using the Cluster Legend</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Managing_views">Managing views</a><ul> <li><a href="/doc/eiffelstudio/Adding_a_view">Adding a view</a></li><li><a href="/doc/eiffelstudio/Deleting_a_view">Deleting a view</a></li></ul></li><li><a href="/doc/eiffelstudio/Exporting_a_diagram_to_PNG_image_file">Exporting a diagram to PNG image file</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/How_to_analyze_a_project">How to analyze a project</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Computing_a_measure">Computing a measure</a><ul> <li><a href="/doc/eiffelstudio/Evaluating_a_measure">Evaluating a measure</a></li><li><a href="/doc/eiffelstudio/Saving_a_measure">Saving a measure</a></li><li><a href="/doc/eiffelstudio/Viewing_measure_details">Viewing measure details</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Handling_new_metrics">Handling new metrics</a><ul> <li class="expandable "><a href="/doc/eiffelstudio/Defining_new_metrics">Defining new metrics</a><ul> <li><a href="/doc/eiffelstudio/Defining_derived_metrics">Defining derived metrics</a></li><li><a href="/doc/eiffelstudio/Defining_linear_metrics">Defining linear metrics</a></li><li><a href="/doc/eiffelstudio/Defining_ratio_metrics">Defining ratio metrics</a></li></ul></li><li><a href="/doc/eiffelstudio/Managing_new_metrics">Managing new metrics</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Handling_archives">Handling archives</a><ul> <li><a href="/doc/eiffelstudio/Creating_an_archive">Creating an archive</a></li><li><a href="/doc/eiffelstudio/Comparing_to_an_archive">Comparing to an archive</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Generating_documentation">Generating documentation</a><ul> <li><a href="/doc/eiffelstudio/Generating_multi-format_documentation">Generating multi-format documentation</a></li><li><a href="/doc/eiffelstudio/Generating_XMI_documentation">Generating XMI documentation</a></li></ul></li><li class="expandable "><a href="/doc/eiffelstudio/Customizing_EiffelStudio">Customizing EiffelStudio</a><ul> <li><a href="/doc/eiffelstudio/Setting_the_editor_behavior">Setting the editor behavior</a></li><li><a href="/doc/eiffelstudio/Changing_texts_display">Changing texts display</a></li><li><a href="/doc/eiffelstudio/Customizing_toolbars">Customizing toolbars</a></li><li><a href="/doc/eiffelstudio/Making_the_context_tool_independent_from_the_editor">Making the context tool independent from the editor</a></li><li><a href="/doc/eiffelstudio/Changing_the_default_history_size">Changing the default history size</a></li><li><a href="/doc/eiffelstudio/Choosing_classes_to_be_ignored_in_BON_diagrams">Choosing classes to be ignored in BON diagrams</a></li><li><a href="/doc/eiffelstudio/Customizing_class_text_views">Customizing class text views</a></li><li><a href="/doc/eiffelstudio/Configuring_an_external_editor">Configuring an external editor</a></li><li><a href="/doc/eiffelstudio/Customizing_EiffelStudio_for_Subversion_commands">Customizing EiffelStudio for Subversion commands</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Solutions_and_Libraries">Solutions and Libraries</a><ul> <li><a href="/doc/solutions/IRON-_Eiffel_package_repository">IRON Eiffel repository</a></li><li class="expandable "><a href="/doc/solutions/.NET">.NET</a><ul> <li><a href="/doc/solutions/.NET_Installation_instructions">.NET Installation instructions</a></li><li><a href="/doc/solutions/Building_a_.NET_application">Building a .NET application</a></li><li class="expandable "><a href="/doc/solutions/The_Eiffel_for_.NET_language">The Eiffel for .NET language</a><ul> <li class="expandable "><a href="/doc/solutions/Conventions">Conventions</a><ul> <li><a href="/doc/solutions/Eiffel_for_.NET_Terminology">Eiffel for .NET Terminology</a></li><li><a href="/doc/solutions/Eiffel_Class_and_Feature_Names">Eiffel Class and Feature Names</a></li><li><a href="/doc/solutions/Type_Organization">Type Organization</a></li><li><a href="/doc/solutions/Constructors_and_Creation_Procedures">Constructors and Creation Procedures</a></li><li><a href="/doc/solutions/Similar_Types_Occurring_in_Both_Libraries">Similar Types Occurring in Both Libraries</a></li><li><a href="/doc/solutions/Eiffel_reserved_words">Eiffel reserved words</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_for_.NET">Eiffel for .NET</a><ul> <li><a href="/doc/solutions/Eiffel_Classes">Eiffel Classes</a></li><li><a href="/doc/solutions/Adding_Class_Features">Adding Class Features</a></li><li><a href="/doc/solutions/Inheritance">Inheritance</a></li><li><a href="/doc/solutions/Genericity">Genericity</a></li><li><a href="/doc/solutions/Design_by_Contract_and_Assertions">Design by Contract and Assertions</a></li><li><a href="/doc/solutions/Exception_Mechanism">Exception Mechanism</a></li><li><a href="/doc/solutions/Event_Programming_with_Agents">Event Programming with Agents</a></li><li><a href="/doc/solutions/Using_Referenced_Assemblies">Using Referenced Assemblies</a></li><li><a href="/doc/solutions/Eiffel_for_.NET_Compliance">Eiffel for .NET Compliance</a></li><li><a href="/doc/solutions/Referenced_Assembly_Type_and_Feature_Name_Conversion">Referenced Assembly Type and Feature Name Conversion</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_for_.NET_Integration">Eiffel for .NET Integration</a><ul> <li><a href="/doc/solutions/Workaround_Eiffel_.NET_limitations">Workarounds</a></li><li><a href="/doc/solutions/Eiffel_.NETCore_execution">NETCore execution</a></li></ul></li><li><a href="/doc/solutions/Known_issues">Known issues</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_.NET_samples">Eiffel .NET samples</a><ul> <li class="expandable "><a href="/doc/solutions/ADO_.NET_Samples">ADO .NET Samples</a><ul> <li><a href="/doc/solutions/ADO.NET_Sample">ADO.NET Sample</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Console_Samples">Console Samples</a><ul> <li><a href="/doc/solutions/Calculator-_console">Calculator: console</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Threads_Samples">Threads Samples</a><ul> <li><a href="/doc/solutions/Pools">Pools</a></li><li><a href="/doc/solutions/Timers">Timers</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Winform_Samples">Winform Samples</a><ul> <li><a href="/doc/solutions/Simple_Hello_world_form_sample">Simple Hello world form sample</a></li><li><a href="/doc/solutions/Message_Box">Message Box</a></li><li class="expandable "><a href="/doc/solutions/Menus">Menus</a><ul> <li><a href="/doc/solutions/Menu_Details">Menu Details</a></li></ul></li><li class="expandable "><a href="/doc/solutions/MDI">MDI</a><ul> <li><a href="/doc/solutions/MDI_Details">MDI Details</a></li></ul></li><li><a href="/doc/solutions/Calculator-_winform">Calculator: winform</a></li><li><a href="/doc/solutions/GDI_plus_-_text">GDI plus - text</a></li><li><a href="/doc/solutions/Date_Time_Picker">Date Time Picker</a></li><li><a href="/doc/solutions/Progress_bar_sample">Progress bar sample</a></li><li><a href="/doc/solutions/Simple_data_binding">Simple data binding</a></li><li><a href="/doc/solutions/Tree_view">Tree view</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_for_ASP.NET_Documentation">Eiffel for ASP.NET Documentation</a><ul> <li class="expandable "><a href="/doc/solutions/Writing_ASP.NET_pages_in_Eiffel">Writing ASP.NET pages in Eiffel</a><ul> <li><a href="/doc/solutions/Eiffel_for_ASP.NET_Installation">Eiffel for ASP.NET Installation</a></li><li><a href="/doc/solutions/CodeDom-_Getting_Started">CodeDom: Getting Started</a></li><li><a href="/doc/solutions/Using_Eiffel_%28to_write_ASP.NET_pages%29">Using Eiffel (to write ASP.NET pages)</a></li><li><a href="/doc/solutions/Names_Mappings">Names Mappings</a></li></ul></li><li class="expandable "><a href="/doc/solutions/The_Eiffel_CodeDom_Provider">The Eiffel CodeDom Provider</a><ul> <li><a href="/doc/solutions/About_the_Code_Document_Object_Model_%28CodeDom%29">About the Code Document Object Model (CodeDom)</a></li><li><a href="/doc/solutions/Installation">Installation</a></li><li><a href="/doc/solutions/Supported_Constructs">Supported Constructs</a></li><li><a href="/doc/solutions/Configuration">Configuration</a></li><li><a href="/doc/solutions/Logging">Logging</a></li><li><a href="/doc/solutions/Required_Permissions">Required Permissions</a></li><li><a href="/doc/solutions/Common_Scenarios">Common Scenarios</a></li><li><a href="/doc/solutions/Eiffel_Implementation">Eiffel Implementation</a></li><li><a href="/doc/solutions/Limitations">Limitations</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel_for_ASP.NET_Tools_and_Administration">Eiffel for ASP.NET Tools and Administration</a><ul> <li><a href="/doc/solutions/Eiffel_CodeDom_Provider_Manager">Eiffel CodeDom Provider Manager</a></li><li><a href="/doc/solutions/eSplitter">eSplitter</a></li><li><a href="/doc/solutions/Name_Mapper">Name Mapper</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Basic_computing">Basic computing</a><ul> <li><a href="/doc/solutions/Process_and_BaseProcess">External processes</a></li><li class="expandable "><a href="/doc/solutions/EiffelBase">EiffelBase</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBase_Tutorial">EiffelBase Tutorial</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBase%2C_The_Kernel">EiffelBase, The Kernel</a><ul> <li><a href="/doc/solutions/Universal_class_and_its_features">Universal class and its features</a></li><li><a href="/doc/solutions/Language-related_facilities">Language-related facilities</a></li><li><a href="/doc/solutions/Files%2C_input%2C_output">Files, input, output</a></li><li><a href="/doc/solutions/Persistence%2C_storage%2C_and_retrieval">Persistence, storage, and retrieval</a></li><li><a href="/doc/solutions/Access_to_internal_properties">Access to internal properties</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelBase_Data_Structures_Overview">EiffelBase Data Structures Overview</a><ul> <li><a href="/doc/solutions/EiffelBase%2C_Abstract_Container_Structures-_The_Taxonomy">EiffelBase, Abstract Container Structures: The Taxonomy</a></li><li><a href="/doc/solutions/EiffelBase_Data_Structures%2C_Lists">EiffelBase Data Structures, Lists</a></li><li><a href="/doc/solutions/EiffelBase%2C_Dispensers">EiffelBase, Dispensers</a></li><li><a href="/doc/solutions/EiffelBase%2C_Trees">EiffelBase, Trees</a></li><li><a href="/doc/solutions/EiffelBase%2C_Sets">EiffelBase, Sets</a></li><li><a href="/doc/solutions/EiffelBase%2C_Tables">EiffelBase, Tables</a></li><li><a href="/doc/solutions/EiffelBase%2C_Iteration">EiffelBase, Iteration</a></li></ul></li><li><a href="/doc/solutions/EiffelBase_Support_Cluster">EiffelBase Support Cluster</a></li></ul></li><li><a href="/doc/solutions/EiffelBase_Class_Reference">EiffelBase Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelBase_Samples">EiffelBase Samples</a><ul> <li><a href="/doc/solutions/EiffelBase_Sample-_Calculator">EiffelBase Sample: Calculator</a></li></ul></li><li><a href="/doc/solutions/Eiffel_Software_Free_Eiffel_Library_License_%28IFELL%29">Free Eiffel Library License</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Graphics">Graphics</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBuild">EiffelBuild</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBuild_How_To%27s">EiffelBuild How To's</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelBuild-_Starting_a_project">EiffelBuild: Starting a project</a><ul> <li><a href="/doc/solutions/EiffelBuild-_Creating_a_new_project">EiffelBuild: Creating a new project</a></li><li><a href="/doc/solutions/Retrieving_a_project_from_a_Build_project_file">Retrieving a project from a Build project file</a></li></ul></li><li><a href="/doc/solutions/Create_an_object">Create an object</a></li><li><a href="/doc/solutions/Delete_an_object">Delete an object</a></li><li><a href="/doc/solutions/Save_a_project">Save a project</a></li><li><a href="/doc/solutions/Reparent_an_Object">Reparent an Object</a></li><li><a href="/doc/solutions/Import_a_project">Import a project</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelBuild_Reference">EiffelBuild Reference</a><ul> <li><a href="/doc/solutions/EiffelBuild_Notation">EiffelBuild Notation</a></li><li class="expandable "><a href="/doc/solutions/EiffelBuild-_General_interface_description">EiffelBuild: General interface description</a><ul> <li><a href="/doc/solutions/EiffelBuild_window_overview">EiffelBuild window overview</a></li><li><a href="/doc/solutions/Main_toolbar">Main toolbar</a></li><li><a href="/doc/solutions/EiffelBuild-_Key_shortcuts">EiffelBuild: Key shortcuts</a></li><li><a href="/doc/solutions/Docking">Docking</a></li></ul></li><li><a href="/doc/solutions/Layout_constructor">Layout constructor</a></li><li><a href="/doc/solutions/Type_selector">Type selector</a></li><li class="expandable "><a href="/doc/solutions/Object_editor">Object editor</a><ul> <li><a href="/doc/solutions/Merging_radio_button_groups">Merging radio button groups</a></li><li><a href="/doc/solutions/Positioning_table_children">Positioning table children</a></li><li><a href="/doc/solutions/Positioning_fixed_children">Positioning fixed children</a></li></ul></li><li><a href="/doc/solutions/Display_window">Display window</a></li><li><a href="/doc/solutions/Builder_window">Builder window</a></li><li><a href="/doc/solutions/Component_selector">Component selector</a></li><li><a href="/doc/solutions/Widget_selector">Widget selector</a></li><li><a href="/doc/solutions/Component_viewer">Component viewer</a></li><li><a href="/doc/solutions/History">History</a></li><li><a href="/doc/solutions/Constants">Constants</a></li><li class="expandable "><a href="/doc/solutions/EiffelBuild-_Project_settings_window">EiffelBuild: Project settings window</a><ul> <li><a href="/doc/solutions/Build_Tab">Build Tab</a></li><li><a href="/doc/solutions/Generation_Tab">Generation Tab</a></li></ul></li><li><a href="/doc/solutions/EiffelBuild_Preferences">EiffelBuild Preferences</a></li><li><a href="/doc/solutions/EiffelBuild-_Code_Generation">EiffelBuild: Code Generation</a></li></ul></li><li><a href="/doc/solutions/EiffelBuild_Version_History">EiffelBuild Version History</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelVision_2">EiffelVision 2</a><ul> <li><a href="/doc/solutions/EiffelVision_Introduction">EiffelVision Introduction</a></li><li class="expandable "><a href="/doc/solutions/Vison2_-_How-to">How to ...</a><ul> <li><a href="/doc/solutions/How_to_build_a_concurrent_graphical_application-_EiffelVision_with_SCOOP">How to build a concurrent graphical application: EiffelVision with SCOOP</a></li><li><a href="/doc/solutions/Triggering_Pick-and-Drop">Triggering PnD</a></li><li><a href="/doc/solutions/Converting_EiffelVision_2_Systems_to_Void-Safety">Converting EiffelVision 2 Systems to Void-Safety</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelVision_Library_Reference_Manual">EiffelVision Library Reference Manual</a><ul> <li><a href="/doc/solutions/Kernel">Kernel</a></li><li class="expandable "><a href="/doc/solutions/Widgets">Widgets</a><ul> <li><a href="/doc/solutions/Primitives">Primitives</a></li><li><a href="/doc/solutions/Containers">Containers</a></li><li><a href="/doc/solutions/EiffelVision_Dialogs">EiffelVision Dialogs</a></li></ul></li><li><a href="/doc/solutions/Items">Items</a></li><li><a href="/doc/solutions/Events">Events</a></li><li class="expandable "><a href="/doc/solutions/Properties">Properties</a><ul> <li><a href="/doc/solutions/EiffelVision_Pick_and_Drop">EiffelVision Pick and Drop</a></li></ul></li><li><a href="/doc/solutions/Support">Support</a></li><li><a href="/doc/solutions/Figures">Figures</a></li></ul></li><li><a href="/doc/solutions/EiffelVision_2_Class_Reference">EiffelVision 2 Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelVision_2_Samples">EiffelVision 2 Samples</a><ul> <li><a href="/doc/solutions/Widgets_Sample">Widgets Sample</a></li><li><a href="/doc/solutions/Accelerator_Sample">Accelerator Sample</a></li><li><a href="/doc/solutions/Cursor_Sample">Cursor Sample</a></li><li><a href="/doc/solutions/Gauges_Sample">Gauges Sample</a></li><li><a href="/doc/solutions/Standard_dialogs_Sample">Standard_dialogs Sample</a></li><li><a href="/doc/solutions/Viewport_Sample">Viewport Sample</a></li></ul></li><li><a href="/doc/solutions/Revisions_and_Bug_Fixes">Revisions and Bug Fixes</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Dates_and_times">Dates and times</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelTime">EiffelTime</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelTime_Tutorial">EiffelTime Tutorial</a><ul> <li><a href="/doc/solutions/Absolute_time">Absolute time</a></li><li><a href="/doc/solutions/Duration">Duration</a></li><li><a href="/doc/solutions/Interval">Interval</a></li><li><a href="/doc/solutions/DATE_TIME_to_STRING_Conversion">DATE TIME to STRING Conversion</a></li><li><a href="/doc/solutions/More_precision">More precision</a></li></ul></li><li><a href="/doc/solutions/EiffelTime_Class_Reference">EiffelTime Class Reference</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Including_other_languages">With other languages</a><ul> <li class="expandable "><a href="/doc/solutions/Eiffel_%22external%22_mechanism">Eiffel "external" mechanism</a><ul> <li><a href="/doc/solutions/Interfacing_with_C_and_C%2B%2B">Interfacing with C and C++</a></li><li><a href="/doc/solutions/Interfacing_with_DLLs">Interfacing with DLLs</a></li><li class="expandable "><a href="/doc/solutions/Obsolete_%22external%22_interfaces">Obsolete "external" interfaces</a><ul> <li><a href="/doc/solutions/C_externals">C externals</a></li><li><a href="/doc/solutions/C%2B%2B_Externals">C++ Externals</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/CECIL">CECIL</a><ul> <li><a href="/doc/solutions/Compiling_an_Eiffel_system_for_CECIL">Compiling an Eiffel system for CECIL</a></li><li><a href="/doc/solutions/Using_a_CECIL_archive">Using a CECIL archive</a></li><li><a href="/doc/solutions/CECIL_interface_overview">CECIL interface overview</a></li><li class="expandable "><a href="/doc/solutions/CECIL_Reference">CECIL Reference</a><ul> <li><a href="/doc/solutions/attribute_exists">attribute_exists</a></li><li><a href="/doc/solutions/eif_access">eif_access</a></li><li><a href="/doc/solutions/eif_adopt">eif_adopt</a></li><li><a href="/doc/solutions/eif_attribute">eif_attribute</a></li><li><a href="/doc/solutions/eif_attribute_type">eif_attribute_type</a></li><li><a href="/doc/solutions/eif_create">eif_create</a></li><li><a href="/doc/solutions/eif_disable_visible_exception">eif_disable_visible_exception</a></li><li><a href="/doc/solutions/eif_enable_visible_exception">eif_enable_visible_exception</a></li><li><a href="/doc/solutions/eif_name">eif_name</a></li><li><a href="/doc/solutions/eif_name_by_tid">eif_name_by_tid</a></li><li><a href="/doc/solutions/eif_procedure">eif_procedure</a></li><li><a href="/doc/solutions/eif_protect">eif_protect</a></li><li><a href="/doc/solutions/eif_string">eif_string</a></li><li><a href="/doc/solutions/eif_type">eif_type</a></li><li><a href="/doc/solutions/eif_type_by_name">eif_type_by_name</a></li><li><a href="/doc/solutions/eif_type_by_reference">eif_type_by_reference</a></li><li><a href="/doc/solutions/eif_type_id">eif_type_id</a></li><li><a href="/doc/solutions/eif_wean">eif_wean</a></li><li><a href="/doc/solutions/eif_%2A_function">eif_*_function</a></li></ul></li><li class="expandable "><a href="/doc/solutions/CECIL_samples">CECIL samples</a><ul> <li><a href="/doc/solutions/CECIL_-_C_to_Eiffel">CECIL - C to Eiffel</a></li><li><a href="/doc/solutions/CECIL_-_Eiffel_to_C">CECIL - Eiffel to C</a></li><li><a href="/doc/solutions/CECIL_-_Basic_sample">CECIL - Basic sample</a></li><li><a href="/doc/solutions/CECIL_-_Threads">CECIL - Threads</a></li><li><a href="/doc/solutions/CECIL_-_How_to_compile_the_samples%3F">CECIL - How to compile the samples?</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Eiffel2Java">Eiffel2Java</a><ul> <li><a href="/doc/solutions/Eiffel2Java_Tutorial">Eiffel2Java Tutorial</a></li><li><a href="/doc/solutions/Eiffel2Java_class_reference">Eiffel2Java class reference</a></li><li><a href="/doc/solutions/Eiffel2Java_Sample">Eiffel2Java Sample</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Porting_instructions">Porting instructions</a><ul> <li><a href="/doc/solutions/Porting_an_Eiffel_application_from_UNIX_to_Windows_or_vice-versa">Porting an Eiffel application from UNIX to Windows or vice-versa</a></li></ul></li><li class="expandable "><a href="/doc/solutions/Concurrency">Concurrency</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelThreads">EiffelThreads</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelThread_Tutorial">EiffelThread Tutorial</a><ul> <li><a href="/doc/solutions/Thread_library_overview">Thread library overview</a></li><li><a href="/doc/solutions/Compilation_of_multithreaded_systems">Compilation of multithreaded systems</a></li><li><a href="/doc/solutions/Once_features_in_multithreaded_mode">Once features in multithreaded mode</a></li><li><a href="/doc/solutions/Multithread_FAQ">Multithread FAQ</a></li></ul></li><li><a href="/doc/solutions/EiffelThread_Class_Reference">EiffelThread Class Reference</a></li></ul></li><li><a href="/doc/solutions/SCOOP_tutorial">SCOOP Tutorial (hands-on): a small concurrent email system</a></li><li class="expandable "><a href="/doc/solutions/Concurrent_programming_with_SCOOP">SCOOP</a><ul> <li><a href="/doc/solutions/Getting_Started_with_SCOOP">Getting Started</a></li><li><a href="/doc/solutions/Regions_and_Processors">Regions and Processors</a></li><li><a href="/doc/solutions/Separate_Calls">Separate Calls</a></li><li><a href="/doc/solutions/Exclusive_Access">Exclusive Access</a></li><li><a href="/doc/solutions/Design_by_Contract_in_SCOOP">Design by Contract</a></li><li><a href="/doc/solutions/Asynchronous_Calls">Asynchronous Calls</a></li><li><a href="/doc/solutions/Exceptions_in_SCOOP">Exceptions</a></li><li class="expandable "><a href="/doc/solutions/SCOOP_examples">SCOOP examples</a><ul> <li><a href="/doc/solutions/Single-element_producer-consumer">Single-element producer-consumer</a></li><li><a href="/doc/solutions/Counter">Counter</a></li><li><a href="/doc/solutions/Producer-consumer">Producer-consumer</a></li><li><a href="/doc/solutions/Dining_philosophers">Dining philosophers</a></li><li><a href="/doc/solutions/Barbershop">Barbershop</a></li><li><a href="/doc/solutions/Baboon_crossing">Baboon crossing</a></li><li><a href="/doc/solutions/Search-insert-delete">Search-insert-delete</a></li><li><a href="/doc/solutions/Senate_bus">Senate bus</a></li><li><a href="/doc/solutions/Quicksort">Quicksort</a></li><li><a href="/doc/solutions/Dining_savages">Dining savages</a></li><li><a href="/doc/solutions/Faneuil_Hall">Faneuil Hall</a></li><li><a href="/doc/solutions/Observer_pattern">Observer pattern</a></li></ul></li><li><a href="/doc/solutions/SCOOP_implementation">SCOOP implementation</a></li><li><a href="/doc/solutions/SCOOP_papers">papers</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Networking">Networking</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelNet">EiffelNet</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelNet_Tutorial">EiffelNet Tutorial</a><ul> <li><a href="/doc/solutions/What_is_EiffelNet">What is EiffelNet</a></li><li><a href="/doc/solutions/Clients_and_servers">Clients and servers</a></li><li><a href="/doc/solutions/An_overview_of_EiffelNet_Mechanisms">An overview of EiffelNet Mechanisms</a></li><li><a href="/doc/solutions/Introduction_to_the_examples">Introduction to the examples</a></li><li><a href="/doc/solutions/Obtaining_a_finer_degree_of_control">Obtaining a finer degree of control</a></li><li><a href="/doc/solutions/Using_datagram_sockets">Using datagram sockets</a></li><li><a href="/doc/solutions/Event-driven_command_execution">Event-driven command execution</a></li><li><a href="/doc/solutions/A_more_complex_example">A more complex example</a></li><li><a href="/doc/solutions/Bibliography">Bibliography</a></li></ul></li><li><a href="/doc/solutions/EiffelNet_Class_Reference">EiffelNet Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelNet_Samples">EiffelNet Samples</a><ul> <li><a href="/doc/solutions/Advanced">Advanced</a></li><li><a href="/doc/solutions/Polling">Polling</a></li><li><a href="/doc/solutions/Predef">Predef</a></li><li><a href="/doc/solutions/Same_Machine">Same Machine</a></li><li><a href="/doc/solutions/Two_Machines">Two Machines</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Database_access">Database access</a><ul> <li class="expandable "><a href="/doc/solutions/ABEL">ABEL</a><ul> <li class="expandable "><a href="/doc/solutions/Tutorial">Tutorial</a><ul> <li><a href="/doc/solutions/Getting_started">Getting started</a></li><li><a href="/doc/solutions/Basic_operations">Basic operations</a></li><li><a href="/doc/solutions/Advanced_Queries">Advanced Queries</a></li><li><a href="/doc/solutions/Dealing_with_references">Dealing with references</a></li><li><a href="/doc/solutions/Tuple_queries">Tuple queries</a></li><li><a href="/doc/solutions/Error_handling">Error handling</a></li><li><a href="/doc/solutions/Accessing_an_existing_database">Accessing an existing database</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelStore">EiffelStore</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelStore_Tutorial">EiffelStore Tutorial</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelStore_Interface_Layer">EiffelStore Interface Layer</a><ul> <li><a href="/doc/solutions/Database_Connection">Database Connection</a></li><li><a href="/doc/solutions/Data_Modification">Data Modification</a></li><li><a href="/doc/solutions/Database_Selection">Database Selection</a></li><li><a href="/doc/solutions/Selection_Access">Selection Access</a></li><li><a href="/doc/solutions/Data_Object_Coupling">Data Object Coupling</a></li><li><a href="/doc/solutions/Query_variables">Query variables</a></li><li><a href="/doc/solutions/Stored_Procedures">Stored Procedures</a></li><li><a href="/doc/solutions/Database_control">Database control</a></li></ul></li><li><a href="/doc/solutions/EiffelStore_Implementation_Layer">EiffelStore Implementation Layer</a></li><li class="expandable "><a href="/doc/solutions/EiffelStore_Generation_Cluster">EiffelStore Generation Cluster</a><ul> <li><a href="/doc/solutions/Data_structures_use">Data structures use</a></li><li><a href="/doc/solutions/Data_structures_creation">Data structures creation</a></li></ul></li><li><a href="/doc/solutions/EiffelStore_DataView_Cluster">EiffelStore DataView Cluster</a></li></ul></li><li><a href="/doc/solutions/EiffelStore_Class_Reference">EiffelStore Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelStore_Samples">EiffelStore Samples</a><ul> <li><a href="/doc/solutions/Esql_Sample">Esql Sample</a></li><li><a href="/doc/solutions/Selector_Sample">Selector Sample</a></li><li><a href="/doc/solutions/Inserter_Sample">Inserter Sample</a></li></ul></li><li><a href="/doc/solutions/Defending_against_SQL_injections_with_EiffelStore">SQL injection</a></li><li><a href="/doc/solutions/EiffelStore_ODBC_with_PostgreSQL">EiffelStore ODBC</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Web_technology">Web technology</a><ul> <li><a href="/doc/solutions/EiffelWeb_framework">EiffelWeb</a></li><li class="expandable "><a href="/doc/solutions/Obsolete_EiffelWeb">Obsolete EiffelWeb</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelWeb_Tutorial">EiffelWeb Tutorial</a><ul> <li><a href="/doc/solutions/EiffelWeb_Content_Introduction">EiffelWeb Content Introduction</a></li><li><a href="/doc/solutions/Processing_Requests">Processing Requests</a></li></ul></li><li><a href="/doc/solutions/EiffelWeb_Class_Reference">EiffelWeb Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelWeb_Sample">EiffelWeb Sample</a><ul> <li><a href="/doc/solutions/EiffelWeb_Basic_Sample">EiffelWeb Basic Sample</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Text_processing">Text processing</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelLex">EiffelLex</a><ul> <li><a href="/doc/solutions/EiffelLex_Tutorial">EiffelLex Tutorial</a></li><li><a href="/doc/solutions/EiffelLex_Class_Reference">EiffelLex Class Reference</a></li><li class="expandable "><a href="/doc/solutions/EiffelLex_Sample">EiffelLex Sample</a><ul> <li class="expandable "><a href="/doc/solutions/Eiffel_scanner">Eiffel scanner</a><ul> <li><a href="/doc/solutions/EiffelLex_Samples">EiffelLex Samples</a></li><li><a href="/doc/solutions/EIFFEL_SCAN_Text">EIFFEL_SCAN Text</a></li><li><a href="/doc/solutions/eiffel_scan_console_input">eiffel_scan console input</a></li><li><a href="/doc/solutions/eiffel_scan_console_output">eiffel_scan console output</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelParse">EiffelParse</a><ul> <li><a href="/doc/solutions/EiffelParse_Tutorial">EiffelParse Tutorial</a></li><li><a href="/doc/solutions/EiffelParse_Class_Reference">EiffelParse Class Reference</a></li><li class="expandable "><a href="/doc/solutions/Parse_Sample">Parse Sample</a><ul> <li><a href="/doc/solutions/Eiffel_polynomial_parser">Eiffel polynomial parser</a></li></ul></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Preferences">Preferences</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelPreferences">EiffelPreferences</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelPreferences_Tutorial">EiffelPreferences Tutorial</a><ul> <li><a href="/doc/solutions/Overview">Overview</a></li><li><a href="/doc/solutions/Initialization">Initialization</a></li><li><a href="/doc/solutions/Interface_for_preferences">Interface for preferences</a></li></ul></li><li><a href="/doc/solutions/EiffelPreferences_Class_Reference">EiffelPreferences Class Reference</a></li><li><a href="/doc/solutions/EiffelPreferences_Sample">EiffelPreferences Sample</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/Platform_specifics">Platform specifics</a><ul> <li class="expandable "><a href="/doc/solutions/Microsoft_Windows">Microsoft Windows</a><ul> <li class="expandable "><a href="/doc/solutions/WEL">WEL</a><ul> <li class="expandable "><a href="/doc/solutions/WEL_Common_Concepts">WEL Common Concepts</a><ul> <li><a href="/doc/solutions/Inheriting_WEL_APPLICATION">Inheriting WEL_APPLICATION</a></li><li><a href="/doc/solutions/Redefining_main_window">Redefining main_window</a></li><li><a href="/doc/solutions/Redefining_%60init_application%27">Redefining `init_application'</a></li><li><a href="/doc/solutions/Common_message_hooks">Common message hooks</a></li></ul></li><li class="expandable "><a href="/doc/solutions/WEL_Interface_Content">WEL Interface Content</a><ul> <li><a href="/doc/solutions/windows_cluster">windows cluster</a></li><li class="expandable "><a href="/doc/solutions/controls_cluster">controls cluster</a><ul> <li><a href="/doc/solutions/WEL_CHECKBOX">WEL_CHECKBOX</a></li><li><a href="/doc/solutions/WEL_CHECK_BOX_3_STATE">WEL_CHECK_BOX_3_STATE</a></li><li><a href="/doc/solutions/WEL_GROUP_BOX">WEL_GROUP_BOX</a></li><li><a href="/doc/solutions/WEL_LIST_VIEW">WEL_LIST_VIEW</a></li><li><a href="/doc/solutions/WEL_MULTIPLE_LINE_EDIT">WEL_MULTIPLE_LINE_EDIT</a></li><li><a href="/doc/solutions/WEL_MULTIPLE_SELECTION_LIST_BOX">WEL_MULTIPLE_SELECTION_LIST_BOX</a></li><li><a href="/doc/solutions/WEL_OWNER_DRAW_BUTTON">WEL_OWNER_DRAW_BUTTON</a></li><li><a href="/doc/solutions/WEL_PROGRESS_BAR">WEL_PROGRESS_BAR</a></li><li><a href="/doc/solutions/WEL_PUSH_BUTTON">WEL_PUSH_BUTTON</a></li><li><a href="/doc/solutions/WEL_RADIO_BUTTON">WEL_RADIO_BUTTON</a></li><li><a href="/doc/solutions/WEL_SCROLL_BAR">WEL_SCROLL_BAR</a></li><li><a href="/doc/solutions/WEL_SINGLE_LINE_EDIT">WEL_SINGLE_LINE_EDIT</a></li><li><a href="/doc/solutions/WEL_SINGLE_SELECTION_LIST_BOX">WEL_SINGLE_SELECTION_LIST_BOX</a></li><li><a href="/doc/solutions/WEL_TOOLTIP">WEL_TOOLTIP</a></li><li><a href="/doc/solutions/WEL_TRACK_BAR">WEL_TRACK_BAR</a></li><li><a href="/doc/solutions/WEL_UP_DOWN_CONTROL">WEL_UP_DOWN_CONTROL</a></li></ul></li><li class="expandable "><a href="/doc/solutions/stddlgs_cluster">stddlgs cluster</a><ul> <li><a href="/doc/solutions/WEL_CHOOSE_COLOR_DIALOG">WEL_CHOOSE_COLOR_DIALOG</a></li><li><a href="/doc/solutions/WEL_CHOOSE_FOLDER_DIALOG">WEL_CHOOSE_FOLDER_DIALOG</a></li><li><a href="/doc/solutions/WEL_CHOOSE_FONT_DIALOG">WEL_CHOOSE_FONT_DIALOG</a></li><li><a href="/doc/solutions/WEL_OPEN_FILE_DIALOG">WEL_OPEN_FILE_DIALOG</a></li><li><a href="/doc/solutions/WEL_PRINT_DIALOG">WEL_PRINT_DIALOG</a></li><li><a href="/doc/solutions/WEL_SAVE_FILE_DIALOG">WEL_SAVE_FILE_DIALOG</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/WEL_Tutorial">WEL Tutorial</a><ul> <li><a href="/doc/solutions/Tutorial_Step_1">Tutorial Step 1</a></li><li><a href="/doc/solutions/Tutorial_Step_2">Tutorial Step 2</a></li><li><a href="/doc/solutions/Tutorial_Step_3">Tutorial Step 3</a></li><li><a href="/doc/solutions/Tutorial_Step_4">Tutorial Step 4</a></li><li><a href="/doc/solutions/Tutorial_Step_5">Tutorial Step 5</a></li><li><a href="/doc/solutions/Tutorial_Step_6">Tutorial Step 6</a></li><li><a href="/doc/solutions/Tutorial_Step_7">Tutorial Step 7</a></li><li><a href="/doc/solutions/Tutorial_Step_8">Tutorial Step 8</a></li></ul></li><li><a href="/doc/solutions/WEL_Class_Reference">WEL Class Reference</a></li><li class="expandable "><a href="/doc/solutions/WEL_Samples">WEL Samples</a><ul> <li><a href="/doc/solutions/Bmpview">Bmpview</a></li><li><a href="/doc/solutions/Brushes">Brushes</a></li><li><a href="/doc/solutions/Common_Controls">Common Controls</a></li><li><a href="/doc/solutions/Commands">Commands</a></li><li><a href="/doc/solutions/Controls_Sample">Controls Sample</a></li><li><a href="/doc/solutions/Ctlcolor">Ctlcolor</a></li><li><a href="/doc/solutions/Cursors">Cursors</a></li><li><a href="/doc/solutions/Disk_Space">Disk Space</a></li><li><a href="/doc/solutions/Fontenum">Fontenum</a></li><li><a href="/doc/solutions/Fun">Fun</a></li><li><a href="/doc/solutions/Header_Control">Header Control</a></li><li><a href="/doc/solutions/Hello_World%21">Hello World!</a></li><li><a href="/doc/solutions/List_View">List View</a></li><li><a href="/doc/solutions/Magnify">Magnify</a></li><li><a href="/doc/solutions/MDI_%28Multiple_Document_Interface%29">MDI (Multiple Document Interface)</a></li><li><a href="/doc/solutions/Wel_Sample-_Menus">Wel Sample: Menus</a></li><li><a href="/doc/solutions/Minimal">Minimal</a></li><li><a href="/doc/solutions/Pizza">Pizza</a></li><li><a href="/doc/solutions/Printer">Printer</a></li><li><a href="/doc/solutions/Rich_Edit">Rich Edit</a></li><li><a href="/doc/solutions/Split_Area">Split Area</a></li><li><a href="/doc/solutions/Standard_Dialogs_Sample">Standard Dialogs Sample</a></li><li><a href="/doc/solutions/Timer">Timer</a></li><li><a href="/doc/solutions/Tree_View_Sample">Tree View Sample</a></li><li><a href="/doc/solutions/Unicode_Sample">Unicode Sample</a></li><li><a href="/doc/solutions/Windows_Sample">Windows Sample</a></li><li><a href="/doc/solutions/Xcell">Xcell</a></li><li><a href="/doc/solutions/XY_Co-ordinates">XY Co-ordinates</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/COM">COM</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelCOM_Wizard">EiffelCOM Wizard</a><ul> <li class="expandable "><a href="/doc/solutions/COM_and_Eiffel">COM and Eiffel</a><ul> <li><a href="/doc/solutions/EiffelCOM-_Introduction">EiffelCOM: Introduction</a></li><li><a href="/doc/solutions/COM_Concepts">COM Concepts</a></li><li><a href="/doc/solutions/COM_Interfaces">COM Interfaces</a></li><li><a href="/doc/solutions/Coclass">Coclass</a></li><li><a href="/doc/solutions/The_Component_Location">The Component Location</a></li><li><a href="/doc/solutions/Access_Type">Access Type</a></li><li><a href="/doc/solutions/Deeper_into_COM">Deeper into COM</a></li></ul></li><li><a href="/doc/solutions/EiffelCOM_Wizard_Introduction">EiffelCOM Wizard Introduction</a></li><li class="expandable "><a href="/doc/solutions/EiffelCOM_Wizard_Guided_Tour">EiffelCOM Wizard Guided Tour</a><ul> <li><a href="/doc/solutions/Creating_a_New_COM_Component">Creating a New COM Component</a></li><li><a href="/doc/solutions/Creating_a_new_component_from_an_Eiffel_project">Creating a new component from an Eiffel project</a></li><li><a href="/doc/solutions/Accessing_a_COM_Component">Accessing a COM Component</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelCOM_Wizard_Reference">EiffelCOM Wizard Reference</a><ul> <li><a href="/doc/solutions/How_the_EiffelCOM_Wizard_works">How the EiffelCOM Wizard works</a></li><li><a href="/doc/solutions/Generated_Files">Generated Files</a></li><li><a href="/doc/solutions/Class_Hierarchy">Class Hierarchy</a></li><li><a href="/doc/solutions/Eiffel_Project_Processing">Eiffel Project Processing</a></li><li><a href="/doc/solutions/Reusing_a_COM_Component">Reusing a COM Component</a></li><li><a href="/doc/solutions/Building_a_COM_Component">Building a COM Component</a></li><li><a href="/doc/solutions/Wizards-_Command_Line_Options">Wizards: Command Line Options</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelCOM_Library">EiffelCOM Library</a><ul> <li class="expandable "><a href="/doc/solutions/EiffelCOM_Interface_Content">EiffelCOM Interface Content</a><ul> <li><a href="/doc/solutions/Interfaces">Interfaces</a></li><li><a href="/doc/solutions/Structures">Structures</a></li></ul></li><li><a href="/doc/solutions/EiffelCOM_Class_Reference">EiffelCOM Class Reference</a></li></ul></li></ul></li><li class="expandable "><a href="/doc/solutions/ResourceBench">ResourceBench</a><ul> <li><a href="/doc/solutions/Features">Features</a></li><li><a href="/doc/solutions/Tour">Tour</a></li><li><a href="/doc/solutions/Troubleshooting">Troubleshooting</a></li></ul></li><li class="expandable "><a href="/doc/solutions/EiffelRibbon">EiffelRibbon</a><ul> <li><a href="/doc/solutions/EiffelRibbon_Design_Tool">EiffelRibbon Design Tool</a></li></ul></li></ul></li></ul></li></ul></li><li><a href="/doc/glossary/Glossary">Glossary</a></li><li><a href="/doc/faq/FAQ">FAQ</a></li><li class="expandable "><a href="/doc/contribute/How_to_contribute">Contribute</a><ul> <li><a href="/doc/contribute/How_to_contribute_to_documentation">To documentation</a></li><li><a href="/doc/contribute/Help_to_edit_documentation">Editing help</a></li></ul></li></ul> </div></div></div></div> </aside> <div class="content"> <header class="head"> <div id="breadcrumb"> <span class="ico"><img src="/theme/responsive-eiffel-org/images/ico-document.png" width="21" height="21" alt="Documentation"></span> <a href="https://www.eiffel.org/doc/eiffel">eiffel</a> :: ET: Other Mechanisms </div> </header> <div><div class="wdocs-versions">Version<ul><li class="active"><a href="/doc/eiffel/ET-_Other_Mechanisms">25.02 (released) ...</a><ul class="popup-menu"><li><a href="/doc/version/trunk/eiffel/ET-_Other_Mechanisms">trunk (trunk)</a></li><li class="active"><a href="/doc/eiffel/ET-_Other_Mechanisms">25.02 (released)</a></li><li><a href="/doc/version/24.05/eiffel/ET-_Other_Mechanisms">24.05</a></li><li><a href="/doc/version/23.09/eiffel/ET-_Other_Mechanisms">23.09</a></li><li><a href="/doc/version/22.12/eiffel/ET-_Other_Mechanisms">22.12</a></li></ul></li></ul></div> <div class="wikipage"><h1 class="wikititle">ET: Other Mechanisms</h1> <div class="wiki-toc wiki-toc-auto"> <ol><a id="toc"></a><span class="title">Contents</span> <li><a href="#Manifest_constants">Manifest constants</a><ol> <li><a href="#Verbatim_strings">Verbatim strings</a></li> </ol> </li> <li><a href="#Constant_attributes">Constant attributes</a></li> <li><a href="#Obsolete_features_and_classes">Obsolete features and classes</a></li> <li><a href="#Creation_variants">Creation variants</a></li> <li><a href="#Non-object_calls">Non-object calls</a><ol> <li><a href="#Class_feature">Class feature</a></li> </ol> </li> <li><a href="#Convertibility">Convertibility</a></li> <li><a href="#Tuple_types">Tuple types</a></li> </ol> </div> <p>We now examine a few important mechanisms that complement the preceding picture. </p> <a id="Manifest_constants"></a><h2>Manifest constants</h2> <p>Sometimes we want to provide in software text a self-denoting value of a particular type. In Eiffel this is what we call a <strong>manifest constant</strong>. For example, if we are searching an indexed structure, we might have an integer variable that we would want to initialize to reference the first item in the structure: </p> <p><code> my_index := 1</code> </p> <p>In this case we used a manifest constant, <code class="inline">1</code>, to provide an initial value for <code class="inline">my_index</code>. In particular, this is a manifest integer. </p> <p>Eiffel also supports <a href="/doc/eiffel/Eiffel_programming_language_syntax#Manifest_constants" class="wiki_link">manifest constants</a> for real (and double) numbers (ex: <code class="inline">3.1415</code>), boolean values (ex: <code class="inline">True</code>, <code class="inline">False</code>), and characters (ex: <code class="inline">'A'</code>, with <a href="/doc/eiffel/Eiffel_programming_language_syntax#Special_characters" class="wiki_link">special characters</a> expressed using a percent sign as in <code class="inline">'%N'</code> for new line, <code class="inline">'%B'</code> for backspace, <code class="inline">'%"'</code> for double quote, and <code class="inline">'%U'</code> for null). </p> <p>Manifest constants are also available for strings, using double quotes as in: <code class="inline">"Hello world!"</code>. As with character constants, special characters are denoted using the <code class="inline">%</code> codes. </p> <a id="Verbatim_strings"></a><h3>Verbatim strings</h3> <p>You may occasionally have a need for a manifest string that represents a multi-line formatted string. In Eiffel we call this type of manifest string a <strong>verbatim string</strong>, and there is a special syntax for specifying verbatim strings in Eiffel code. Verbatim strings are either <strong>aligned</strong> or <strong>non-aligned</strong>. Aligned verbatim strings will automatically be adjusted so that their leftmost line (the line with text characters closest to the left margin) contains no "white space" to the left of the first text character. For non-aligned verbatim strings, the white space is left untouched. You use a slightly different way of specifying each type of string. For example, this aligned verbatim string: </p> <p><code> my_aligned_string: STRING = "[ Thrice hail the still unconquered King of Song! For all adore and love the Master Art That reareth his throne in temple of the heart; And smiteth chords of passion full and strong Till music sweet allures the sorrowing throng! ]"</code> </p> <p>will print like this: </p> <p><code lang="text"> Thrice hail the still unconquered King of Song! For all adore and love the Master Art That reareth his throne in temple of the heart; And smiteth chords of passion full and strong Till music sweet allures the sorrowing throng!</code> </p> <p>The same string, declared as a non-aligned verbatim string: </p> <p><code> my_non_aligned_string: STRING = "{ Thrice hail the still unconquered King of Song! For all adore and love the Master Art That reareth his throne in temple of the heart; And smiteth chords of passion full and strong Till music sweet allures the sorrowing throng! }"</code> </p> <p>will print like this: </p> <p><code lang="text"> Thrice hail the still unconquered King of Song! For all adore and love the Master Art That reareth his throne in temple of the heart; And smiteth chords of passion full and strong Till music sweet allures the sorrowing throng!</code> </p> <p>The difference in declaration is that the aligned verbatim string uses as its "opener" the double-quote plus bracket combination, " <code class="inline">"[</code> ", and the bracket plus double quote, " <code class="inline">]"</code> ", as its "closer". The non-aligned verbatim string uses braces, " <code class="inline">{</code> " and " <code class="inline">}</code> " instead of the bracket. </p> <p>The syntax for specifying verbatim strings allows an option for the situation in which the specified string might conflict with the "closer". You can include a simple string between the double quote and the bracket on each end of the verbatim string to guarantee uniqueness. Here's our aligned verbatim string with the simple string " <code class="inline">*?</code> " inserted in the opener and closer: </p> <p><code> my_aligned_string: STRING = "*?[ Thrice hail the still unconquered King of Song! For all adore and love the Master Art That reareth his throne in temple of the heart; And smiteth chords of passion full and strong Till music sweet allures the sorrowing throng! ]*?"</code> </p> <a id="Constant_attributes"></a><h2>Constant attributes</h2> <p>The attributes studied earlier were variable: each represents a field present in each instance of the class and changeable by its routines. </p> <p>It is also possible to declare <strong>constant attributes</strong>, as in <code> Solar_system_planet_count: INTEGER = 8</code> </p> <p>These will have the same value for every instance and hence do not need to occupy any space in objects at execution time. (In other approaches similar needs would be addressed by symbolic constants, as in Pascal or Ada, or macros, as in C.) </p> <p>What comes after the <code class="inline">=</code> is a manifest constant. So you can declare a constant attribute for any type for which there is a manifest constant. </p> <a id="Obsolete_features_and_classes"></a><h2>Obsolete features and classes</h2> <p>One of the conditions for producing truly great reusable software is to recognize that although you should try to get everything right the first time around you won't always succeed. But if "good enough" may be good enough for application software, it's not good enough, in the long term, for reusable software. The aim is to get ever closer to the asymptote of perfection. If you find a better way, you must implement it. The activity of generalization, discussed as part of the lifecycle, doesn't stop at the first release of a reusable library. </p> <p>This raises the issue of backward compatibility: how to move forward with a better design, without compromising existing applications that used the previous version? </p> <p>The notion of obsolete class and feature helps address this issue. By declaring a feature as <code class="inline">obsolete</code>, using the syntax <code> enter (i: INTEGER; x: G) obsolete "Use ` put (x, i)' instead " require ... do put (x, i) end</code> </p> <p>you state that you are now advising against using it, and suggest a replacement through the message that follows the keyword <code class="inline">obsolete</code>, a mere string. The obsolete feature is still there, however; using it will cause no other harm than a warning message when someone compiles a system that includes a call to it. Indeed, you don't want to hold a gun to your client authors' forehead (<em>"Upgrade now or die !"</em>); but you do want to let them know that there is a new version and that they should upgrade at their leisure. </p> <p>Besides routines, you may also mark classes as obsolete. </p> <p>The example above is a historical one, involving an early change of interface for the EiffelBase library class <code class="inline">ARRAY</code>; the change affected both the feature's name, with a new name ensuring better consistency with other classes, and the order of arguments, again for consistency. It shows the recommended style for using <code class="inline">obsolete</code>: <br/> </p> <ul><li> In the message following the keyword, explain the recommended replacement. This message will be part of the warning produced by the compiler for a system that includes the obsolete element.</li> <li> In the body of the routine, it is usually appropriate, as here, to replace the original implementation by a call to the new version. This may imply a small performance overhead, but simplifies maintenance and avoids errors.</li> </ul> <p>It is good discipline not to let obsolete elements linger around for too long. The next major new release, after a suitable grace period, should remove them. </p> <p>The design flexibility afforded by the <code class="inline">obsolete</code> keyword is critical to ensure the harmonious long-term development of ambitious reusable software. </p> <a id="Creation_variants"></a><h2>Creation variants</h2> <p>The basic forms of creation instruction, and the one most commonly used, are the two illustrated earlier ( <a href="/doc/eiffel/ET-_The_Dynamic_Structure-_Execution_Model#Creating_and_initializing_objects" class="wiki_link">"Creating and initializing objects"</a> ): <code> create x.make (2000) create x</code></p> <p>the first one if the corresponding class has a <code class="inline">create</code> clause, the second one if not. In either form you may include a type name in braces, as in <code> create {SAVINGS_ACCOUNT} x.make (2000)</code></p> <p>which is valid only if the type listed, here <code class="inline">SAVINGS_ACCOUNT</code>, conforms to the type of <code class="inline">x</code>, assumed here to be <code class="inline">ACCOUNT</code>. This avoids introducing a local entity, as in <code> local xs: SAVINGS_ACCOUNT do create xs.make (2000) x := xs ...</code></p> <p>and has exactly the same effect. Another variant is the <strong>creation expression</strong>, which always lists the type, but returns a value instead of being an instruction. It is useful in the following context: <code> some_routine (create {ACCOUNT}.make (2000))</code></p> <p>which you may again view as an abbreviation for a more verbose form that would need a local entity, using a creation instruction:<code> local x: ACCOUNT do create x.make (2000) some_routine (x) ...</code></p> <p>Unlike creation instructions, creation expressions must always list the type explicitly, <code class="inline">{ACCOUNT}</code> in the example. They are useful in the case shown: creating an object that only serves as an argument to be passed to a routine. If you need to retain access to the object through an entity, the instruction <code class="inline">create x</code> ... is the appropriate construct. </p> <p>The creation mechanism gets an extra degree of flexibility through the notion of <code class="inline">default_create</code>. The simplest form of creation instruction, <code class="inline">create x</code> without an explicit creation procedure, is actually an abbreviation for <code class="inline">create x.default_create</code>, where <code class="inline">default_create</code> is a procedure defined in class <code class="inline">ANY</code> to do nothing. By redefining <code class="inline">default_create</code> in one of your classes, you can ensure that <code class="inline">create x</code> will take care of non-default initialization (and ensure the invariant if needed). When a class has no <code class="inline">create</code> clause, it's considered to have one that lists only <code class="inline">default_create</code>. If you want to allow <code class="inline">create x</code> as well as the use of some explicit creation procedures, simply list <code class="inline">default_create</code> along with these procedures in the <code class="inline">create</code> clause. To disallow creation altogether, include an empty <code class="inline">create</code> clause, although this technique is seldom needed since most non-creatable classes are deferred, and one can't instantiate a deferred class. </p> <p>One final twist is the mechanism for creating instances of formal generic parameters. For <code class="inline">x</code> of type <code class="inline">G</code> in a class <code class="inline">C [G]</code>, it wouldn't be safe to allow <code class="inline">create x</code>, since <code class="inline">G</code> stands for many possible types, all of which may have their own creation procedures. To allow such creation instructions, we rely on constrained genericity. You may declare a class as <code> [G -> T create cp end]</code></p> <p>to make <code class="inline">G</code> constrained by <code class="inline">T</code>, as we learned before, and specify that any actual generic parameter must have <code class="inline">cp</code> among its creation procedures. Then it's permitted to use <code class="inline">create x.cp</code>, with arguments if required by <code class="inline">cp</code>, since it is guaranteed to be safe. The mechanism is very general since you may use <code class="inline">ANY</code> for <code class="inline">T</code> and <code class="inline">default_create</code> for <code class="inline">cp</code>. The only requirement on <code class="inline">cp</code> is that it must be a procedure of <code class="inline">T</code>, not necessarily a creation procedure; this permits using the mechanism even if <code class="inline">T</code> is deferred, a common occurrence. It's only descendants of <code class="inline">T</code> that must make <code class="inline">cp</code> a creation procedure, by listing it in the <code class="inline">create</code> clause, if they want to serve as actual generic parameters for <code class="inline">C</code>. </p> <a id="Non-object_calls"></a><h2>Non-object calls</h2> <p>The Eiffel model for object-oriented computation involves the application of some feature <code class="inline">f</code> to some object <code class="inline">x</code>, and possibly passing arguments <code class="inline">a</code>:</p> <p><code> x.f (a)</code></p> <p>This type of feature call is known as an <strong>object call</strong> because it applies the feature to a target object, in this case <code class="inline">x</code>. However, under certain circumstances we may apply a feature of a class in a fashion that does not involve a target object. This type of call is a <strong>non-object call</strong>. In place of the target object, the syntax of the non-object call uses the type on which the feature can be found.</p> <p><code> circumference := radius * 2.0 * {MATH_CONST}.pi</code></p> <p>In the sample above, the call to feature <code class="inline">{MATH_CONST}.Pi</code> is a non-object call. This case illustrates one of the primary uses of non-object calls: constants. The library class <code class="inline">MATH_CONST</code> contains commonly used mathematical constants. Non-object calls make it possible to use the constants in <code class="inline">MATH_CONST</code> without having to create an instance of <code class="inline">MATH_CONST</code> or inherit from it.</p> <p>The other primary use is for external features. One example is when we use Microsoft .NET classes from Eiffel code and have to access mechanisms for which there is no direct analog in Eiffel. Microsoft .NET supports so-called "static" methods and enumeration types. To access these, we use non-object calls. In the example below, a non-object call is used to access the enumeration <code lang="text" class="inline">CreateNew</code> from the .NET enumeration type <code lang="text" class="inline">System.IO.FileMode</code>.</p> <p><code> create my_file_stream.make ("my_file.txt", {FILE_MODE}.create_new)</code></p> <p>The validity of a non-object call is restricted in ways that mirror these primary uses. That is, any feature called in a non-object call must be either a constant attribute, an external feature, or a class feature. (See the <a href="/doc/eiffel/ECMA_Standard_367" class="wiki_link">ISO/ECMA Eiffel standard document</a> for additional details.)</p> <a id="Class_feature"></a><h3>Class feature</h3> <p>A feature with a class postcondition is known as a class feature and can be used in non-object calls. A class postcondition consists of a single keyword <code lang="eiffel" class="inline">class</code> (with an optional leading tag):</p> <p><code> disc_area (radius: REAL_32): REAL_32 -- Area of a disk of radius `radius`. do Result := radius * radius * {MATH_CONST}.pi ensure instance_free: class end</code></p> <p>A class feature can be used not only in object calls, but also in non-object calls. For example, assuming the feature above is defined in class <code lang="eiffel" class="inline">GEOMETRY</code>, it can be called without creating an object:</p> <p><code> area := {GEOMETRY}.disc_area (r)</code></p> <p>A class feature is valid only when it does not</p> <ul><li> access <code lang="eiffel" class="inline">Current</code>;</li> <li> access a variable attribute;</li> <li> declare an unqualified agent;</li> <li> make an unqualified call to a non-class feature.</li> </ul> <p>Although an external feature without assertions can be used in non-object calls, it is a good practice to add a class postcondition if such usage is expected. This guarantees that no added or inherited assertion violates the validity rule for a class feature.</p> <a id="Convertibility"></a><h2>Convertibility</h2> <p>It is useful at times to designate that instances of one type can be created through the controlled conversion of instances of some other type. This can be done through a safe Eiffel type conversion mechanism called <strong>convertibility</strong>. </p> <p>Convertibility is useful when refactoring, moving from one design to another, or, as you will see in the example, accommodating external technologies over which we have no control.</p> <p><p class="tpl definition-message"><a href="/doc-image/LogoDefinition"><img src="/doc-image/25.02/_images/Definition_icon_2.png" border="0" width="24" alt=""/></a> <strong>Definition -- Convertibility: converts to, converts from</strong>: <br/> <br/> A type U based on a class CU <strong>converts to</strong> a type T based on a class CT (and T <strong>converts from</strong> U) if either<br/> <br/> CT has a <em>conversion procedure</em> using U as a conversion type, or <br/> <br/> CU has a <em>conversion query</em> listing T as a conversion type,<br/> <br/> but not both.</p> </p> <p>Before we get into an example of convertibility, let's list some of its underlying principles:</p> <ol><li> Conversion Principle: No type may both <em>conform</em> and <em>convert</em> to another.</li> <li> Conversion Asymmetry Principle: No type may convert to another through both a <em>conversion procedure</em> and a <em>conversion query</em>.</li> <li> Conversion Non-transitivity Principle: That V converts to U and U converts to T does not imply that V converts to T.</li> </ol> <p>Let's look at an example with which you may already be familiar. </p> <p><code> my_string: STRING_8 -- Native Eiffel string my_system_string: SYSTEM_STRING -- Native Microsoft .Net string … my_string := my_system_string</code></p> <p>In the snippet above, we have attributes declared of type <code class="inline">STRING_8</code> and <code class="inline">SYSTEM_STRING</code>.</p> <p>We know that if we have a attribute of type <code class="inline">STRING_8</code> that we can make a direct assignment of a .Net type of string (that is, the .Net type <code class="inline">System.String</code> which we see as class <code class="inline">SYSTEM_STRING</code>) to our <code class="inline">STRING_8</code> attribute.</p> <p>We know also that <code class="inline">SYSTEM_STRING</code> does not conform to <code class="inline">STRING_8</code>, so according to the definition of <a href="/doc/eiffel/ET-_Instructions#Assignment_and_attachment" class="wiki_link">compatibility</a>, this must happen through conversion.</p> <p>Therefore <code class="inline">SYSTEM_STRING</code> converts to <code class="inline">STRING_8</code>. And according to the definition above this means that either: </p> <ol><li> Class <code class="inline">SYSTEM_STRING</code> has a conversion query listing <code class="inline">STRING_8</code> as a conversion type, or</li> <li> Class <code class="inline">STRING_8</code> has a conversion procedure listing <code class="inline">SYSTEM_STRING</code> as a conversion type</li> </ol> <p>In this case <code class="inline">STRING_8</code> has a conversion procedure for objects of type <code class="inline">SYSTEM_STRING</code>. Conversion procedures are always <a href="/doc/eiffel/ET-_The_Dynamic_Structure-_Execution_Model#Creating_and_initializing_objects" class="wiki_link">creation procedures</a>. So they appear in both the <code class="inline">create</code> and the <code class="inline">convert</code> parts of the class. </p> <p><code> class STRING_8 … create make_from_cil … convert make_from_cil ({SYSTEM_STRING}) …</code></p> <p>We won't show the implementation of the conversion procedure, but as you can imagine, it initializes its target with the content of its argument.</p> <p>Because of convertibility, this code:</p> <p><code> my_string := my_system_string</code></p> <p>is equivalent to:</p> <p><code> create my_string.make_from_cil (my_system_string)</code></p> <p>So, we've seen how <code class="inline">SYSTEM_STRING</code> converts to <code class="inline">STRING_8</code>. But, in the context of our example, we could also do this:</p> <p><code> my_system_string := my_string</code></p> <p>Which means that <code class="inline">STRING_8</code> converts to <code class="inline">SYSTEM_STRING</code>. The <code class="inline">convert</code> part of class <code class="inline">STRING_8</code> also has a conversion query listing <code class="inline">SYSTEM_STRING</code> as a conversion type: </p> <p><code> class STRING_8 … create make_from_cil … convert make_from_cil ({SYSTEM_STRING}) to_cil: {SYSTEM_STRING} …</code></p> <p>Because of convertibility, this code:</p> <p><code> my_system_string := my_string</code></p> <p>is equivalent to:</p> <p><code> my_system_string := my_string.to_cil</code></p> <p>You should bear in mind that assignments are not the only situation in which conversions take place. Convertibility works for other types of attachments as well. For example, if a routine calls for an argument of type <code class="inline">SYSTEM_STRING</code>, and you supply an actual argument of type <code class="inline">STRING_8</code>, this constitutes an attachment, and the conversion from <code class="inline">STRING</code> to <code class="inline">SYSTEM_STRING</code> will occur. </p> <a id="Tuple_types"></a><h2>Tuple types</h2> <p>The study of genericity described arrays. Another common kind of container objects bears some resemblance to arrays: sequences, or "tuples", of elements of specified types. The difference is that all elements of an array were of the same type, or a conforming one, whereas for tuples you will specify the types we want for each relevant element. A typical tuple type is of the form<code> TUPLE [X, Y, Z]</code></p> <p>denoting a tuple of at least three elements, such that the type of the first conforms to <code class="inline">X</code>, the second to <code class="inline">Y</code>, and the third to <code class="inline">Z</code>. </p> <p>You may list any number of types in brackets, including none at all: <code class="inline">TUPLE</code>, with no types in brackets, denotes tuples of arbitrary length. </p> <p><p class="tpl info-message"><a href="/doc-image/LogoInformation"><img src="/doc-image/25.02/_images/tpl_Information.png" border="0" width="24" alt=""/></a> <strong>Info: </strong>The syntax, with brackets, is intentionally reminiscent of generic classes, but <code class="inline">TUPLE</code> is a reserved word, not the name of a class; making it a class would not work since a generic class has a fixed number of generic parameters. You may indeed use <code class="inline">TUPLE</code> to obtain the effect of a generic class with a variable number of parameters. </p> </p> <p>To write the tuples themselves -- the sequences of elements, instances of a tuple type -- you will also use square brackets; for example<code> [x1, y1, z1]</code></p> <p>with <code class="inline">x1</code> of type <code class="inline">X</code> and so on is a tuple of type <code class="inline">TUPLE [X, Y, Z]</code>. </p> <p>The definition of tuple types states that <code class="inline">TUPLE [X1 ... Xn]</code> denotes sequences of at least <code class="inline">n</code> elements, of which the first <code class="inline">n</code> have types respectively conforming to <code class="inline">X1, ..., Xn</code>. Such a sequence may have more than <code class="inline">n</code> elements. </p> <p>Features available on tuple types include <code class="inline">count: INTEGER</code>, yielding the number of elements in a tuple, <code class="inline">item (i: INTEGER): ANY</code> which returns the <code class="inline">i</code>-th element, and <code class="inline">put</code> which replaces an element. </p> <p>Tuples are appropriate when these are the only operations you need, that is to say, you are using sequences with no further structure or properties. Tuples give you "anonymous classes" with predefined features <code class="inline">count</code>, <code class="inline">item</code> and <code class="inline">put</code>. A typical example is a general-purpose output procedure that takes an arbitrary sequence of values, of arbitrary types, and prints them. It may simply take an argument of type <code class="inline">TUPLE</code>, so that clients can call it under the form <code> write ([your_integer, your_real, your_account]) </code></p> <p>As soon as you need a type with more specific features, you should define a class. </p> </div> <div class="wdocs-nav"><div class="wdocs-nav-section">Back to <a href="/doc/eiffel/An_Eiffel_Tutorial_%28ET%29" class="wdocs-folder">Tutorial</a></div><div class="wdocs-uuid"><a href="/doc/uuid/c0a01664-194c-4e84-0517-8e7c1ca61dec">Permanent link</a></div> </div> <div class="wdocs-cache-info">cached: 02/26/2025 3:28:15.000 PM</div></div> <div class="roc-comments-ext"> <div id="remark42"></div> <script> var remark_config = { site_id: 'eiffel-org-comments', url: 'https://www.eiffel.org/doc/uuid/c0a01664-194c-4e84-0517-8e7c1ca61dec', // Replace PAGE_URL with your page's canonical URL variable max_shown_comments: 25, // optional param; if it isn't defined default value (15) will be used theme: 'dark', // optional param; if it isn't defined default value ('light') will be used }; (function() { var d = document, s = d.createElement('script'); s.src = 'https://remark.eiffel.org/web/embed.js'; // prepends this address with domain where remark42 is placed (d.head || d.body).appendChild(s); })(); </script> </div> </div> </div> </section> </main> <!-- Footer --> <footer id="footer"> <div class="container"> <nav class="footer-nav"> <ul class="grid-5 has-gutter"> <li class="one-sixth"><a href="https://www.eiffel.org/welcome">Welcome</a> <ul> <li><a href="https://www.eiffel.org/purpose">Purpose</a></li> <li><a href="https://www.eiffel.org/news">News</a></li> <li><a href="https://www.eiffel.org/updates">Updates</a></li> <li><a href="https://www.eiffel.org/forum">Forum</a></li> <li><a href="https://www.eiffel.org/community">Community</a></li> <li><a href="https://www.eiffel.org/contact">Contact</a></li> <li> <a href="/account/roc-login?destination=doc%2Feiffel%2FET-_Other_Mechanisms">Sign in</a> </li> </ul> </li> <li class="one-sixth"><a href="https://www.eiffel.org/documentation">Documentation</a> <ul> <li><a href="https://www.eiffel.org/doc/eiffel">Eiffel</a></li> <li><a href="https://www.eiffel.org/doc/eiffelstudio">EiffelStudio</a></li> <li><a href="https://www.eiffel.org/doc/solutions">Solutions</a></li> <li><a href="https://www.eiffel.org/doc/glossary">Glossary</a></li> <li><a href="https://www.eiffel.org/doc/faqs">FAQs</a></li> <li><a href="https://www.eiffel.org/contribute">Contribute</a></li> </ul> </li> <li class="one-sixth"><a href="https://www.eiffel.org/resources">Resources</a> <ul> <li><a href="https://www.eiffel.org/resources/libraries">Libraries</a></li> <li><a href="https://www.eiffel.org/resources/tools">Tools</a></li> <li><a href="https://www.eiffel.org/resources/wish_list">Wish list</a></li> <li><a href="https://www.eiffel.org/resources/videos">Videos</a></li> <li><a href="https://www.eiffel.org/resources/follow_us">Follow us</a></li> </ul> </li> <li class=""> <div class="btn-holder"> <a class="btn btn-download" href="https://www.eiffel.org/downloads">Download Now</a> <a class="btn btn-tryonline" href="https://www.eiffel.org/try_eiffel">Try Eiffel Online</a> <a class="btn btn-contribute" href="https://www.eiffel.org/contribute">Contribute</a> <a class="btn btn-account" href="/account/roc-login?destination=doc%2Feiffel%2FET-_Other_Mechanisms">Sign in</a> </div> </li> <li class="one-sixth"> <ul class="social-networks"> <li><a class="facebook" target="_blank" href="https://www.facebook.com/pages/Eiffel-Programming-Language/235981463124887">Facebook</a></li> <li><a class="youtube" target="_blank" href="http://www.youtube.com/user/EiffelLanguage">You Tube</a></li> <li><a class="twitter" target="_blank" href="https://twitter.com/Eiffel_Language">Twitter</a></li> </ul> </li> </ul> </nav> <!-- Block "built_with_eiffel" cached: 02/27/2025 2:06:10.000 AM --> <div style="float: right">Built with the Eiffel ROC CMS and the <a href="http://www.eiffelweb.org">EiffelWeb framework</a>.</div> </div> </footer> <script src="/theme/responsive-eiffel-org/js/wdownloads.js"></script> <script src="/theme/responsive-eiffel-org/js/home.js"></script> <link href="/theme/responsive-eiffel-org/js/google-code-prettify-eiffel/styles/lang-eiffel.css" type="text/css" rel="stylesheet" /> <script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script> <script src="/theme/responsive-eiffel-org/js/google-code-prettify-eiffel/src/lang-eiffel.js"></script> <script src="https://www.google.com/recaptcha/api.js" async defer></script> </div> </body> </html>