<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.liberty-eiffel.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hzwakenberg</id>
	<title>Liberty Eiffel Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.liberty-eiffel.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hzwakenberg"/>
	<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php/Special:Contributions/Hzwakenberg"/>
	<updated>2026-05-26T06:21:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.0</generator>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2765</id>
		<title>Bibliography</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2765"/>
		<updated>2024-10-30T11:13:58Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Literature]]&lt;br /&gt;
__NOTOC__ &amp;lt;!-- Use alphabetical order of keys. --&amp;gt;&lt;br /&gt;
==ETL 1992==&lt;br /&gt;
Bertrand Meyer. &lt;br /&gt;
''Eiffel: The Language''. &lt;br /&gt;
Prentice Hall, 1993, ISBN 0-13-247925-7.&lt;br /&gt;
&lt;br /&gt;
==GC book==&lt;br /&gt;
Richar Jones and Rafael Lins. &lt;br /&gt;
''Garbage Collection. Algorithms for  Automatic Dynamic Memory Management''.&lt;br /&gt;
John Wiley &amp;amp; Sons, ISBN 0-471-941484-4.&lt;br /&gt;
&lt;br /&gt;
==GoF 1995==&lt;br /&gt;
Erich Gamma, Richard Helm and Ralph Johnson and John Vlissides.&lt;br /&gt;
''Design Patterns: Elements of Reusable Object-Oriented Software''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1995, ISBN 0201633612.&lt;br /&gt;
&lt;br /&gt;
==Goldberg 1984==&lt;br /&gt;
Adele Goldberg.&lt;br /&gt;
''Smalltalk-80, The Interactive Programming Environment''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1984, ISBN 0-201-11372-4.&lt;br /&gt;
&lt;br /&gt;
==GR 1983==&lt;br /&gt;
Adele Goldberg and David Robson.&lt;br /&gt;
''Smalltalk-80: The Language and its Implementation''.&lt;br /&gt;
Addison-Wesley, 1983, ISBN 0-201-11371-6.&lt;br /&gt;
&lt;br /&gt;
==JMJ 1996==&lt;br /&gt;
Jean-Marc Jézéquel.&lt;br /&gt;
''Object-Oriented Software Engineering with Eiffel''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-63381-7.  This book is a gentle introduction to Eiffel programming, without the academic verbosity of many of the other titles in this list.&lt;br /&gt;
&lt;br /&gt;
==JTM 1999==&lt;br /&gt;
Jean-Marc Jézéquel, Michel Train and Christine Mingins.&lt;br /&gt;
''Design Patterns and Contracts''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-30959-9.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1989==&lt;br /&gt;
Gérald Masini, Amédéo Napoli, Dominique Colnet, Daniel Léonard et Karl Tombre.&lt;br /&gt;
''Les langages à objets''.&lt;br /&gt;
InterEditions&amp;quot;, Paris&amp;quot;, 1989, ISBN 2-7296-0275-5.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1991==&lt;br /&gt;
Gérald Masini and Amédéo Napoli and Dominique Colnet and Daniel Léonard and Karl Tombre.&lt;br /&gt;
''Object-Oriented Languages''.&lt;br /&gt;
Academic Press, New York, 1991, ISBN 0-12-477390-7.&lt;br /&gt;
&lt;br /&gt;
==OOSC 1997==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
[https://github.com/gg-daddy/ebooks/blob/master/Object%20Oriented%20Software%20Construction-Meyer.pdf Object-oriented Software Construction, 2nd Ed.].&lt;br /&gt;
Prentice Hall 1997, 1254 pages, ISBN 0-13-629155-4.&lt;br /&gt;
&lt;br /&gt;
==RMJM 2002==&lt;br /&gt;
Richard Mitchel and Jim McKim.&lt;br /&gt;
''Design by Contract, by Example''.&lt;br /&gt;
Adison-Wesley 2002, 238 pages, ISBN 0-201-63460-0.  This title introduces a well structured and very thorough method of using DbC.&lt;br /&gt;
&lt;br /&gt;
==TOCBM 2009==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''TOUCH OF CLASS - Learning to program well with Objects and Contracts''.&lt;br /&gt;
Springer Verlag 2009, 876 pages, ISBN 978-81-322-0374-2.  Unfortunately, this title assumes that you download supporting code and libraries, but the URL in the book is no longer valid.&lt;br /&gt;
&lt;br /&gt;
==RS 1994==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Reusable Software: The Base Object-Oriented Component Libraries''.&lt;br /&gt;
Prentice Hall, 1994, 514 pages, ISBN-10: 013-245-499-8 ISBN-13: 978-013-245-499-5&lt;br /&gt;
&lt;br /&gt;
==ECMA 367 / 2006==&lt;br /&gt;
ECMA International 2006.&lt;br /&gt;
''Eiffel: Analysis, Design and Programming Language''.&lt;br /&gt;
https://www.ecma-international.org/wp-content/uploads/ECMA-367_2nd_edition_june_2006.pdf&lt;br /&gt;
&lt;br /&gt;
==SOOSA 2015==&lt;br /&gt;
Kim Waldén and Jean-Marc Nelson.&lt;br /&gt;
[https://www.bon-method.com/book_print_a4.pdf Seamless Object-Oriented Software Architecture].&lt;br /&gt;
Prentice Hall, 2015, 438 pages, ISBN 0-13-031303-3.  This title is about BON (Business Object Notation), less so about the Eiffel language. BON as a method was developed by the authors of this book. BON is perceived to be simpler than the UML method.&lt;br /&gt;
&lt;br /&gt;
==FUNCPTRN 1999==&lt;br /&gt;
Thomas Kühne.&lt;br /&gt;
[https://www.dbooks.org/d/3860647709-1730286407-41d4001e70927a44/ A Functional Pattern System for Object-Oriented Design].&lt;br /&gt;
Verlag Dr. Kovac, 1999, 346 pages, ISBN 9783860647707.  The thesis of this book is that design patterns inspired by functional programming concepts can advance object-oriented design.  The code examples given are implemented with Eiffel.  Some of the design patterns presented here are not current any more after the Eiffel language adopted 'agents', but the discussions about it are an excellent read nonetheless.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2764</id>
		<title>Bibliography</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2764"/>
		<updated>2024-10-30T11:11:20Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Literature]]&lt;br /&gt;
__NOTOC__ &amp;lt;!-- Use alphabetical order of keys. --&amp;gt;&lt;br /&gt;
==ETL 1992==&lt;br /&gt;
Bertrand Meyer. &lt;br /&gt;
''Eiffel: The Language''. &lt;br /&gt;
Prentice Hall, 1993, ISBN 0-13-247925-7.&lt;br /&gt;
&lt;br /&gt;
==GC book==&lt;br /&gt;
Richar Jones and Rafael Lins. &lt;br /&gt;
''Garbage Collection. Algorithms for  Automatic Dynamic Memory Management''.&lt;br /&gt;
John Wiley &amp;amp; Sons, ISBN 0-471-941484-4.&lt;br /&gt;
&lt;br /&gt;
==GoF 1995==&lt;br /&gt;
Erich Gamma, Richard Helm and Ralph Johnson and John Vlissides.&lt;br /&gt;
''Design Patterns: Elements of Reusable Object-Oriented Software''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1995, ISBN 0201633612.&lt;br /&gt;
&lt;br /&gt;
==Goldberg 1984==&lt;br /&gt;
Adele Goldberg.&lt;br /&gt;
''Smalltalk-80, The Interactive Programming Environment''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1984, ISBN 0-201-11372-4.&lt;br /&gt;
&lt;br /&gt;
==GR 1983==&lt;br /&gt;
Adele Goldberg and David Robson.&lt;br /&gt;
''Smalltalk-80: The Language and its Implementation''.&lt;br /&gt;
Addison-Wesley, 1983, ISBN 0-201-11371-6.&lt;br /&gt;
&lt;br /&gt;
==JMJ 1996==&lt;br /&gt;
Jean-Marc Jézéquel.&lt;br /&gt;
''Object-Oriented Software Engineering with Eiffel''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-63381-7.  This book is a gentle introduction to Eiffel programming, without the academic verbosity of many of the other titles in this list.&lt;br /&gt;
&lt;br /&gt;
==JTM 1999==&lt;br /&gt;
Jean-Marc Jézéquel, Michel Train and Christine Mingins.&lt;br /&gt;
''Design Patterns and Contracts''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-30959-9.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1989==&lt;br /&gt;
Gérald Masini, Amédéo Napoli, Dominique Colnet, Daniel Léonard et Karl Tombre.&lt;br /&gt;
''Les langages à objets''.&lt;br /&gt;
InterEditions&amp;quot;, Paris&amp;quot;, 1989, ISBN 2-7296-0275-5.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1991==&lt;br /&gt;
Gérald Masini and Amédéo Napoli and Dominique Colnet and Daniel Léonard and Karl Tombre.&lt;br /&gt;
''Object-Oriented Languages''.&lt;br /&gt;
Academic Press, New York, 1991, ISBN 0-12-477390-7.&lt;br /&gt;
&lt;br /&gt;
==OOSC 1997==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Object-oriented Software Construction, 2nd Ed.''.&lt;br /&gt;
Prentice Hall 1997, 1254 pages, ISBN 0-13-629155-4.&lt;br /&gt;
&lt;br /&gt;
==RMJM 2002==&lt;br /&gt;
Richard Mitchel and Jim McKim.&lt;br /&gt;
''Design by Contract, by Example''.&lt;br /&gt;
Adison-Wesley 2002, 238 pages, ISBN 0-201-63460-0.  This title introduces a well structured and very thorough method of using DbC.&lt;br /&gt;
&lt;br /&gt;
==TOCBM 2009==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''TOUCH OF CLASS - Learning to program well with Objects and Contracts''.&lt;br /&gt;
Springer Verlag 2009, 876 pages, ISBN 978-81-322-0374-2.  Unfortunately, this title assumes that you download supporting code and libraries, but the URL in the book is no longer valid.&lt;br /&gt;
&lt;br /&gt;
==RS 1994==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Reusable Software: The Base Object-Oriented Component Libraries''.&lt;br /&gt;
Prentice Hall, 1994, 514 pages, ISBN-10: 013-245-499-8 ISBN-13: 978-013-245-499-5&lt;br /&gt;
&lt;br /&gt;
==ECMA 367 / 2006==&lt;br /&gt;
ECMA International 2006.&lt;br /&gt;
''Eiffel: Analysis, Design and Programming Language''.&lt;br /&gt;
https://www.ecma-international.org/wp-content/uploads/ECMA-367_2nd_edition_june_2006.pdf&lt;br /&gt;
&lt;br /&gt;
==SOOSA 2015==&lt;br /&gt;
Kim Waldén and Jean-Marc Nelson.&lt;br /&gt;
[https://www.bon-method.com/book_print_a4.pdf Seamless Object-Oriented Software Architecture].&lt;br /&gt;
Prentice Hall, 2015, 438 pages, ISBN 0-13-031303-3.  This title is about BON (Business Object Notation), less so about the Eiffel language. BON as a method was developed by the authors of this book. BON is perceived to be simpler than the UML method.&lt;br /&gt;
&lt;br /&gt;
==FUNCPTRN 1999==&lt;br /&gt;
Thomas Kühne.&lt;br /&gt;
[https://www.dbooks.org/d/3860647709-1730286407-41d4001e70927a44/ A Functional Pattern System for Object-Oriented Design].&lt;br /&gt;
Verlag Dr. Kovac, 1999, 346 pages, ISBN 9783860647707.  The thesis of this book is that design patterns inspired by functional programming concepts can advance object-oriented design.  The code examples given are implemented with Eiffel.  Some of the design patterns presented here are not current any more after the Eiffel language adopted 'agents', but the discussions about it are an excellent read nonetheless.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2763</id>
		<title>Bibliography</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2763"/>
		<updated>2024-10-30T11:09:25Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Literature]]&lt;br /&gt;
__NOTOC__ &amp;lt;!-- Use alphabetical order of keys. --&amp;gt;&lt;br /&gt;
==ETL 1992==&lt;br /&gt;
Bertrand Meyer. &lt;br /&gt;
''Eiffel: The Language''. &lt;br /&gt;
Prentice Hall, 1993, ISBN 0-13-247925-7.&lt;br /&gt;
&lt;br /&gt;
==GC book==&lt;br /&gt;
Richar Jones and Rafael Lins. &lt;br /&gt;
''Garbage Collection. Algorithms for  Automatic Dynamic Memory Management''.&lt;br /&gt;
John Wiley &amp;amp; Sons, ISBN 0-471-941484-4.&lt;br /&gt;
&lt;br /&gt;
==GoF 1995==&lt;br /&gt;
Erich Gamma, Richard Helm and Ralph Johnson and John Vlissides.&lt;br /&gt;
''Design Patterns: Elements of Reusable Object-Oriented Software''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1995, ISBN 0201633612.&lt;br /&gt;
&lt;br /&gt;
==Goldberg 1984==&lt;br /&gt;
Adele Goldberg.&lt;br /&gt;
''Smalltalk-80, The Interactive Programming Environment''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1984, ISBN 0-201-11372-4.&lt;br /&gt;
&lt;br /&gt;
==GR 1983==&lt;br /&gt;
Adele Goldberg and David Robson.&lt;br /&gt;
''Smalltalk-80: The Language and its Implementation''.&lt;br /&gt;
Addison-Wesley, 1983, ISBN 0-201-11371-6.&lt;br /&gt;
&lt;br /&gt;
==JMJ 1996==&lt;br /&gt;
Jean-Marc Jézéquel.&lt;br /&gt;
''Object-Oriented Software Engineering with Eiffel''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-63381-7.  This book is a gentle introduction to Eiffel programming, without the academic verbosity of many of the other titles in this list.&lt;br /&gt;
&lt;br /&gt;
==JTM 1999==&lt;br /&gt;
Jean-Marc Jézéquel, Michel Train and Christine Mingins.&lt;br /&gt;
''Design Patterns and Contracts''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-30959-9.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1989==&lt;br /&gt;
Gérald Masini, Amédéo Napoli, Dominique Colnet, Daniel Léonard et Karl Tombre.&lt;br /&gt;
''Les langages à objets''.&lt;br /&gt;
InterEditions&amp;quot;, Paris&amp;quot;, 1989, ISBN 2-7296-0275-5.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1991==&lt;br /&gt;
Gérald Masini and Amédéo Napoli and Dominique Colnet and Daniel Léonard and Karl Tombre.&lt;br /&gt;
''Object-Oriented Languages''.&lt;br /&gt;
Academic Press, New York, 1991, ISBN 0-12-477390-7.&lt;br /&gt;
&lt;br /&gt;
==OOSC 1997==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Object-oriented Software Construction, 2nd Ed.''.&lt;br /&gt;
Prentice Hall 1997, 1254 pages, ISBN 0-13-629155-4.&lt;br /&gt;
&lt;br /&gt;
==RMJM 2002==&lt;br /&gt;
Richard Mitchel and Jim McKim.&lt;br /&gt;
''Design by Contract, by Example''.&lt;br /&gt;
Adison-Wesley 2002, 238 pages, ISBN 0-201-63460-0.  This title introduces a well structured and very thorough method of using DbC.&lt;br /&gt;
&lt;br /&gt;
==TOCBM 2009==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''TOUCH OF CLASS - Learning to program well with Objects and Contracts''.&lt;br /&gt;
Springer Verlag 2009, 876 pages, ISBN 978-81-322-0374-2.  Unfortunately, this title assumes that you download supporting code and libraries, but the URL in the book is no longer valid.&lt;br /&gt;
&lt;br /&gt;
==RS 1994==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Reusable Software: The Base Object-Oriented Component Libraries''.&lt;br /&gt;
Prentice Hall, 1994, 514 pages, ISBN-10: 013-245-499-8 ISBN-13: 978-013-245-499-5&lt;br /&gt;
&lt;br /&gt;
==ECMA 367 / 2006==&lt;br /&gt;
ECMA International 2006.&lt;br /&gt;
''Eiffel: Analysis, Design and Programming Language''.&lt;br /&gt;
https://www.ecma-international.org/wp-content/uploads/ECMA-367_2nd_edition_june_2006.pdf&lt;br /&gt;
&lt;br /&gt;
==SOOSA 2015==&lt;br /&gt;
Kim Waldén and Jean-Marc Nelson.&lt;br /&gt;
''Seamless Object-Oriented Software Architecture''.&lt;br /&gt;
Prentice Hall, 2015, 438 pages, ISBN 0-13-031303-3.  This title is about BON (Business Object Notation), less so about the Eiffel language. BON as a method was developed by the authors of this book. BON is perceived to be simpler than the UML method.&lt;br /&gt;
&lt;br /&gt;
==FUNCPTRN 1999==&lt;br /&gt;
Thomas Kühne.&lt;br /&gt;
[https://www.dbooks.org/d/3860647709-1730286407-41d4001e70927a44/ A Functional Pattern System for Object-Oriented Design].&lt;br /&gt;
Verlag Dr. Kovac, 1999, 346 pages, ISBN 9783860647707.  The thesis of this book is that design patterns inspired by functional programming concepts can advance object-oriented design.  The code examples given are implemented with Eiffel.  Some of the design patterns presented here are not current any more after the Eiffel language adopted 'agents', but the discussions about it are an excellent read nonetheless.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Template:MainPageCommunity&amp;diff=2762</id>
		<title>Template:MainPageCommunity</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Template:MainPageCommunity&amp;diff=2762"/>
		<updated>2024-10-28T21:29:54Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* The [[Sandbox]] for all your experimentations&lt;br /&gt;
* [[Getting Started]] by bootstrapping Liberty from its source&lt;br /&gt;
* [[Get in touch]] with the Liberty development team and with other users&lt;br /&gt;
* [[Get involved]] with Liberty Eiffel&lt;br /&gt;
* The day-to-day [[Grand blackboard]]&lt;br /&gt;
* Register to the [[Liberty Eiffel users list]]&lt;br /&gt;
* The [https://savannah.gnu.org/projects/liberty-eiffel/ GNU Savannah Project site] ...&lt;br /&gt;
&lt;br /&gt;
'''Bleeding edge'''&lt;br /&gt;
* [[Installing on Windows using the Tiny-C compiler]]&lt;br /&gt;
* [[GSoC|Google Summer of Code Portal]]&lt;br /&gt;
* Share your Liberty Eiffel [[Coding patterns|tricks and tips]]!&lt;br /&gt;
* Automatic testing of current GIT HEAD by [http://et.liberty-eiffel.org ET]&lt;br /&gt;
* How to create a [[Release_Checklist|LibertyEiffel release]]&lt;br /&gt;
* [[ToDo|What we should improve in this wiki]]&lt;br /&gt;
&lt;br /&gt;
'''Related projects'''&lt;br /&gt;
* [https://sourceforge.net/projects/ese/ Enterprise SmartEiffel]&lt;br /&gt;
* [http://notabug.org/GermanGT/eiffel-iup eiffel-iup]&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Release_Notes_(Versions_history)&amp;diff=2761</id>
		<title>Release Notes (Versions history)</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Release_Notes_(Versions_history)&amp;diff=2761"/>
		<updated>2024-10-28T10:40:06Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Releases]]&lt;br /&gt;
== Liberty Eiffel (latest release first) ==&lt;br /&gt;
For other upcoming releases see the [[upcoming releases|list of names]].&lt;br /&gt;
=== Curtiss (2024.dev, to be named after [https://en.wikipedia.org/wiki/Glenn_Curtiss Glenn Curtiss]) ===&lt;br /&gt;
* not yet released (see next section for current release notes)&lt;br /&gt;
* User-visible changes:&lt;br /&gt;
** added installation script:  [[Installing on Windows using the Tiny-C compiler]]&lt;br /&gt;
** added support for assign (note: it applies to the setter, while ISE version applies to the getter)&lt;br /&gt;
** redesign of eiffeldoc generated HTML to reduce its size dramatically&lt;br /&gt;
** addition of a zsh completer for se&lt;br /&gt;
** updated dependency of BDW GC to version 8.x&lt;br /&gt;
** installation script (install.sh) now supports the latest libgc-dev library (external garbage collector)&lt;br /&gt;
** finally removed the obsolete classes GEN_RAND, MIN_STAND and STD_RAND&lt;br /&gt;
** removed support for some unused legacy platforms (OpenVMS, Amiga, Elate, BeOS, OS/2, Macintosh, HP RISC, IBM370, NS32000, MIPS, Pyramid 9810, SPARC, VAX, Motorola 68000) - in case you have a real use case for those we are happy to readd it&lt;br /&gt;
** removed support for some unused backend C-compilers (i.e. Watcom-C)&lt;br /&gt;
** removed obsolete feature &amp;quot;is_basic_expanded_type&amp;quot; from class ANY&lt;br /&gt;
** obsolete keyword 'creation' now generates an error&lt;br /&gt;
** obsolete class READY_DESCRIPTION removed from sequencer cluster&lt;br /&gt;
** 'is_prime' feature added to class INTEGER_GENERAL&lt;br /&gt;
** 'is_fibonacci' feature added to class INTEGER_GENERAL&lt;br /&gt;
** constants 'Tau', 'Sqr_tau' and 'Inv_tau' added to math_constants.e&lt;br /&gt;
** C-runtime now C99 compliant&lt;br /&gt;
** C-runtime now thread-safe &lt;br /&gt;
** C-code generator does not yet generate C99 compliant C-code, currently being worked on (likely for the Dennis-release).&lt;br /&gt;
** RUN_FEATUREs now have clear names (hopefully)&lt;br /&gt;
** to better support the user access rights model of the current Windows versions, the config file is no longer written to a root directory but rather to %ALLUSERSPROFILE% or %USERPROFILE% &lt;br /&gt;
* Known bugs:&lt;br /&gt;
** see [https://savannah.gnu.org/bugs/?group=liberty-eiffel] for the full list&lt;br /&gt;
&lt;br /&gt;
=== Bell (2016.05, named after [https://en.wikipedia.org/wiki/Alexander_Graham_Bell Alexander Graham Bell]) ===&lt;br /&gt;
* released in May 2016&lt;br /&gt;
* first release since Liberty Eiffel has become the official GNU Eiffel compiler&lt;br /&gt;
* User-visible changes:&lt;br /&gt;
** changed Environment Variable name from SmartEiffel to LibertyEiffel (anyhow, normally it should not be necessary to set this one)&lt;br /&gt;
** new tool [[Mock]]&lt;br /&gt;
** removed linebreaks in compiler output&lt;br /&gt;
** many bugfixes&lt;br /&gt;
** GC call at exit is optional&lt;br /&gt;
** generic creation&lt;br /&gt;
** agents are now [https://en.wikipedia.org/wiki/Closure_(computer_programming) closures ]&lt;br /&gt;
** finder now finds all classes in the universe with the given name, not only the first one&lt;br /&gt;
** keyword '''is''' at the beginning of a feature is now deprecated&lt;br /&gt;
** Added support for alias &amp;quot;[]&amp;quot; and alias &amp;quot;()&amp;quot;&lt;br /&gt;
** constants are now visible in the eiffeldoc generated documentation&lt;br /&gt;
* Known bugs:&lt;br /&gt;
** there is still an issue in both GC implementations (classical SEGC and BDW), if it shows up, it often yields a &amp;quot;Bad target type&amp;quot; runtime error.&lt;br /&gt;
** for the full list see [https://savannah.gnu.org/bugs/?group=liberty-eiffel]&lt;br /&gt;
&lt;br /&gt;
=== Adler (2013.11, named after [http://en.wikipedia.org/wiki/Charles_Adler,_Jr. Charles Adler, Jr.]) ===&lt;br /&gt;
* First release as Liberty Eiffel&lt;br /&gt;
* User-visible changes:&lt;br /&gt;
** Added [[library_class:NATURAL_8|&amp;lt;tt&amp;gt;NATURAL_8&amp;lt;/tt&amp;gt;]], [[library_class:NATURAL_16|&amp;lt;tt&amp;gt;NATURAL_16&amp;lt;/tt&amp;gt;]], [[library_class:NATURAL_32|&amp;lt;tt&amp;gt;NATURAL_32&amp;lt;/tt&amp;gt;]], and [[library_class:NATURAL_64|&amp;lt;tt&amp;gt;NATURAL_64&amp;lt;/tt&amp;gt;]] classes. See &amp;lt;tt&amp;gt;tutorial/natural.e&amp;lt;/tt&amp;gt; for examples.&lt;br /&gt;
** Even low-level features (i.e. &amp;lt;tt&amp;gt;external &amp;quot;built_in&amp;quot;&amp;lt;/tt&amp;gt;) are now checking their assertions. As an example, division by zero is now checked by assertions.&lt;br /&gt;
** Inlined dynamic dispatch for better performance&lt;br /&gt;
** A missing export clause is deprecated. Use &amp;lt;tt&amp;gt;{ANY}&amp;lt;/tt&amp;gt; instead.&lt;br /&gt;
** New core libraries: cli, json, log, parse (beware, these libraries are not yet tuned to be used without GC)&lt;br /&gt;
** Improved libraries: string (with notably a new [[library_class:FIXED_STRING|&amp;lt;tt&amp;gt;FIXED_STRING&amp;lt;/tt&amp;gt;]] class)&lt;br /&gt;
** Wrapper libraries: gtk, gdk, readline, ffi...&lt;br /&gt;
** A new tool that can generate mocks to help unit testing&lt;br /&gt;
** [http://hboehm.info/gc/ BDW] GC support&lt;br /&gt;
** Collections implementation of is_equal changed to compare the contained objects using their is_equal functions instead of = (which was formerly the functionality of is_equal_map). The old functionality of is_equal is available by fast_is_equal.&lt;br /&gt;
* Developer changes:&lt;br /&gt;
** The web site now belongs to the repository&lt;br /&gt;
** Automatic testing tools (ET on the web, and &amp;lt;tt&amp;gt;watch_eiffeltest.sh&amp;lt;/tt&amp;gt; in the shell)&lt;br /&gt;
** Automatic Debian packages generation&lt;br /&gt;
* Known bugs:&lt;br /&gt;
** BDW GC is not well tested; currently weak references seem not to work properly; and the GC is not run at program exit (it should run all finalizers)&lt;br /&gt;
** Sometimes SmartEiffel's native GC behaves wrongly, analysis is welcome&lt;br /&gt;
** Some of the newer core libraries do not work very well when there is no GC&lt;br /&gt;
** See the [https://savannah.gnu.org/bugs/?group=liberty-eiffel bugs page]&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Installing_on_Windows_using_the_Tiny-C_compiler&amp;diff=2760</id>
		<title>Installing on Windows using the Tiny-C compiler</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Installing_on_Windows_using_the_Tiny-C_compiler&amp;diff=2760"/>
		<updated>2024-10-28T10:35:46Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installing Liberty Eiffel on Windows using the Tiny-C compiler =&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
=== Liberty Eiffel repository ===&lt;br /&gt;
The complete Liberty Eiffel source code repository can be downloaded from gnu’s git server.  Install git on your machine if you haven’t done so already and simply use:&lt;br /&gt;
&lt;br /&gt;
“git clone git://git.sv.gnu.org/liberty-eiffel.git”&lt;br /&gt;
&lt;br /&gt;
This will create a directory called ‘liberty-eiffel’ and replicate the entire repository into it.  Personally, I prefer directory names to be a bit shorter, so for my case I renamed it to just ‘liberty’, see the screenshot that follows further below.&lt;br /&gt;
For those of you who don’t want to install ‘git’:  it is possible to visit the mirrored Liberty Eiffel repository at GitHub and download the entire repository as a ZIP-file as well.&lt;br /&gt;
&lt;br /&gt;
=== Tiny-C compiler ===&lt;br /&gt;
The installation script assumes that a working Tiny-C compiler (tcc) is installed and that your ‘path’ environment variable points to the tcc installation directory as well.  If you think this is the case, simply open a command prompt and check whether tcc.exe can indeed be found, like I did for the following screenshot. Note that my current directory was C:\Liberty, which is where I copied the Liberty Eiffel repository to:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:tcc-check-0.png|center|Is Tiny-C installed properly?]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
As you can see, tcc could be found and it reported back that it is version 0.9.27 (x86_64 Windows).  This also means that the ‘path’ environment variable points to the correct Tiny-C installation directory, otherwise the compiler would not have been found.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Open a new command window and navigate to Liberty Eiffel's root installation directory.&lt;br /&gt;
This directory contains a cmd-file named '''win-install-tcc.cmd'''.  Type this command into a CMD-window, like in the following screenshot:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:tcc-check.png|center|Starting the installation cmd file]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
And then press the enter-key.  The following screenshot documents what will happen on your machine:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Liberty-install-Windows.png|center|Installation process using Tiny-C]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Note the time stamps on the output…   Now is the time to grab a cup of coffee, or even a few, and then come back to read the remaining part of this document 😊&lt;br /&gt;
I’ll get back to the time stamps later on….&lt;br /&gt;
&lt;br /&gt;
=== What does this installation script do? ===&lt;br /&gt;
'''The big picture?'''  This script creates your Liberty Eiffel executables by compiling them from the original source code!&lt;br /&gt;
&lt;br /&gt;
* First it verifies the installation prerequisites and creates a number of temporary files.  Then it searches for your Tiny-C installation, which is why it was important to have your installation and your ‘path’ settings checked beforehand, as described above.&lt;br /&gt;
&lt;br /&gt;
* Next, a configuration file is created.  This ‘liberty.cfg’ file is used by the Eiffel compiler and other commands in the tool set.  It is created in %USERPROFILE%.  If you want ‘liberty.cfg’ to be readable for all users, you have to copy it manually to %ALLUSERSPROFILE% as well.  You’ll need admin credentials to do this.&lt;br /&gt;
&lt;br /&gt;
* Up next is the first real compilation: bootstrapping ‘compile_to_c’, the command used by most of the other Liberty Eiffel commands.  As the name implies, this command takes an Eiffel source file or files and creates C-files from them.  The C-sources for ‘compile_to_c’ itself are compiled into an initial version of ‘compile_to_c.exe’.  I had Tiny-C emit some statistics about the size of the sources and the time it took to create an executable from it.&lt;br /&gt;
 &lt;br /&gt;
* This initial executable is then used to compile itself again from the original Eiffel sources.  ‘compile_to_c.exe’ creates C-files, and these are again compiled by Tiny-C, resulting in yet another version of ‘compile_to_c.exe’.  This bootstrapping cycle is repeated three times.  The installation script provides a short message about each of these cycles, named T1, T2 and T3.&lt;br /&gt;
&lt;br /&gt;
* The script continues with comparing the ‘compile_to_c.exe’ files from the T2 and T3 cycles.  If they are binary equivalents, the T3-version is moved to the ..\bin directory.  This is how the core compiler is bootstrapped and later used to compile the rest of the Liberty Eiffel commands.  But before that, the script removes all temporary files and directories that were created for the bootstrapping process.&lt;br /&gt;
&lt;br /&gt;
* Using the now stable version of ‘compile_to_c.exe’, the remaining commands are compiled.  The corresponding executables are moved to ..\bin as well.  Any temporary file created by the compilation process is removed (Liberty Eiffel provides the ‘clean’ command for that, which is used after that executable got created).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Now back to the time stamps I alluded to before:'''&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel (and its predecessor too) were predominantly developed on Linux and a number of other Unix-derived operating systems.  On these operating systems, the compilation tasks share multiple processor cores, making the installation rather swift.  On Windows, we still need to work on the Eiffel code for ‘exec’ and a few other features to spawn separate processes.  Until that is finished, it is not yet possible to have parallel compilation to create a single application.&lt;br /&gt;
&lt;br /&gt;
'''The bottom line''': this installation script for Windows is a single-core sequential processing job, which is why it takes three to four times as long as on a comparable Linux machine.  On my quad-core Xeon @ 4 GHz, it takes about an hour, but then again, only a single core is used for this job and my machine had other compute intensive tasks running in the background as well…&lt;br /&gt;
&lt;br /&gt;
If your installation process shows the ‘Finish:’ time stamp, you should have a working Liberty Eiffel environment on your Windows pc.&lt;br /&gt;
&lt;br /&gt;
=== Looking for a small footprint code editor as well? ===   &lt;br /&gt;
If you’re looking for a minimal footprint editor for your Eiffel endeavours on Windows as well, I recommend using Notepad++.&lt;br /&gt;
&lt;br /&gt;
In your Liberty Eiffel ..\work directory, you’ll find a subdirectory called ‘notepad++_syntax-highlighting’.  Within that directory, you’ll find a Liberty-Eiffel.xml file that can be imported into notepad++.  It loosely implements the Eiffel formatting rules proposed by Bertrand Meyer in OOSC-2.  In this directory, I also uploaded a pdf-file to show what that looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck and happy Eiffeling….!  😉&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Installing_on_Windows_using_the_Tiny-C_compiler&amp;diff=2759</id>
		<title>Installing on Windows using the Tiny-C compiler</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Installing_on_Windows_using_the_Tiny-C_compiler&amp;diff=2759"/>
		<updated>2024-10-28T10:32:00Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installing Liberty Eiffel on Windows using the Tiny-C compiler =&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
=== Liberty Eiffel repository ===&lt;br /&gt;
The complete Liberty Eiffel source code repository can be downloaded from gnu’s git server.  Install git on your machine if you haven’t done so already and simply use:&lt;br /&gt;
&lt;br /&gt;
“git clone git://git.sv.gnu.org/liberty-eiffel.git”&lt;br /&gt;
&lt;br /&gt;
This will create a directory called ‘liberty-eiffel’ and replicate the entire repository into it.  Personally, I prefer directory names to be a bit shorter, so for my case I renamed it to just ‘liberty’, see the screenshot that follows further below.&lt;br /&gt;
For those of you who don’t want to install ‘git’:  it is possible to visit the mirrored Liberty Eiffel repository at GitHub and download the entire repository as a ZIP-file as well.&lt;br /&gt;
&lt;br /&gt;
=== Tiny-C compiler ===&lt;br /&gt;
The installation script assumes that a working Tiny-C compiler (tcc) is installed and that your ‘path’ environment variable points to the tcc installation directory as well.  If you think this is the case, simply open a command prompt and check whether tcc.exe can indeed be found, like I did for the following screenshot. Note that my current directory was C:\Liberty, which is where I copied the Liberty Eiffel repository to:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:tcc-check-0.png|center|Is Tiny-C installed properly?]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
As you can see, tcc could be found and it reported back that it is version 0.9.27 (x86_64 Windows).  This also means that the ‘path’ environment variable points to the correct Tiny-C installation directory, otherwise the compiler would not have been found.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Open a new command window and navigate to Liberty Eiffel's root installation directory.&lt;br /&gt;
This directory contains a cmd-file named '''win-install-tcc.cmd'''.  Type this command into a CMD-window, like in the following screenshot:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:tcc-check.png|center|Starting the installation cmd file]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
And then press the enter-key.  The following screenshot documents what will happen on your machine:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Liberty-install-Windows.png|center|Installation process using Tiny-C]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Note the time stamps on the output…   Now is the time to grab a cup of coffee, or even a few, and then come back to read the remaining part of this document 😊&lt;br /&gt;
I’ll get back to the time stamps later on….&lt;br /&gt;
&lt;br /&gt;
=== What does this installation script do? ===&lt;br /&gt;
'''The big picture?'''  This script creates your Liberty Eiffel executables by compiling them from the original source code!&lt;br /&gt;
&lt;br /&gt;
* First it verifies the installation prerequisites and creates a number of temporary files.  Then it searches for your Tiny-C installation, which is why it was important to have your installation and your ‘path’ settings checked beforehand, as described above.&lt;br /&gt;
&lt;br /&gt;
* Next, a configuration file is created.  This ‘liberty.cfg’ file is used by the Eiffel compiler and other commands in the tool set.  It is created in %USERPROFILE%.  If you want ‘liberty.cfg’ to be readable for all users, you have to copy it manually to %ALLUSERSPROFILE% as well.  You’ll need admin credentials to do this.&lt;br /&gt;
&lt;br /&gt;
* Up next is the first real compilation: bootstrapping ‘compile_to_c’, the command used by most of the other Liberty Eiffel commands.  As the name implies, this command takes an Eiffel source file or files and creates C-files from them.  The C-sources for ‘compile_to_c’ itself are compiled into an initial version of ‘compile_to_c.exe’.  I had Tiny-C emit some statistics about the size of the sources and the time it took to create an executable from it.&lt;br /&gt;
 &lt;br /&gt;
* This initial executable is then used to compile itself again from the original Eiffel sources.  ‘compile_to_c.exe’ creates C-files, and these are again compiled by Tiny-C, resulting in yet another version of ‘compile_to_c.exe’.  This bootstrapping cycle is repeated three times.  The installation script provides a short message about each of these cycles, named T1, T2 and T3.&lt;br /&gt;
&lt;br /&gt;
* The script continues with comparing the ‘compile_to_c.exe’ files from the T2 and T3 cycles.  If they are binary equivalents, the T3-version is moved to the ..\bin directory.  This is how the core compiler is bootstrapped and later used to compile the rest of the Liberty Eiffel commands.  But before that, the script removes all temporary files and directories that were created for the bootstrapping process.&lt;br /&gt;
&lt;br /&gt;
* Using the now stable version of ‘compile_to_c.exe’, the remaining commands are compiled.  The corresponding executables are moved to ..\bin as well.  Any temporary file created by the compilation process is removed (Liberty Eiffel provides the ‘clean’ command for that, which is used after that executable got created).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Now back to the time stamps I alluded to before:'''&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel (and its predecessor too) were predominantly developed on Linux and a number of other Unix-derived operating systems.  On these operating systems, the compilation tasks share multiple processor cores, making the installation rather swift.  On Windows, we still need to work on the Eiffel code for ‘exec’ and a few other features to spawn separate processes.  Until that is finished, it is not yet possible to have parallel compilation to create a single application.&lt;br /&gt;
&lt;br /&gt;
'''The bottom line''': this installation script for Windows is a single-core sequential processing job, which is why it takes three to four times as long as on a comparable Linux machine.  On my quad-core Xeon @ 4 GHz, it takes about an hour, but then again, only a single core is used for this job and my machine had other compute intensive tasks in the background as well…&lt;br /&gt;
&lt;br /&gt;
If your installation process shows the ‘Finish:’ time stamp, you should have a working Liberty Eiffel environment on your Windows pc.&lt;br /&gt;
&lt;br /&gt;
=== Looking for a small footprint code editor as well? ===   &lt;br /&gt;
If you’re looking for a minimal footprint editor for your Eiffel endeavours on Windows as well, I recommend using Notepad++.&lt;br /&gt;
&lt;br /&gt;
In your Liberty Eiffel ..\work directory, you’ll find a subdirectory called ‘notepad++_syntax-highlighting’.  Within that directory, you’ll find a Liberty-Eiffel.xml file that can be imported into notepad++.  It loosely implements the Eiffel formatting rules proposed by Bertrand Meyer in OOSC-2.  In this directory, I also uploaded a pdf-file to show what that looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck and happy Eiffeling….!  😉&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Installing_on_Windows_using_the_Tiny-C_compiler&amp;diff=2758</id>
		<title>Installing on Windows using the Tiny-C compiler</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Installing_on_Windows_using_the_Tiny-C_compiler&amp;diff=2758"/>
		<updated>2024-10-28T10:23:45Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installing Liberty Eiffel on Windows using the Tiny-C compiler =&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
=== Liberty Eiffel repository ===&lt;br /&gt;
The complete Liberty Eiffel source code repository can be downloaded from gnu’s git server.  Install git on your machine if you haven’t done so already and simply use:&lt;br /&gt;
&lt;br /&gt;
“git clone git://git.sv.gnu.org/liberty-eiffel.git”&lt;br /&gt;
&lt;br /&gt;
This will create a directory called ‘liberty-eiffel’ and replicate the entire repository into it.  Personally, I prefer directory names to be a bit shorter, so for my case I renamed it to just ‘liberty’, see the screenshot that follows further below.&lt;br /&gt;
For those of you who don’t want to install ‘git’:  it is possible to visit the mirrored Liberty Eiffel repository at GitHub and download the entire repository as a ZIP-file as well.&lt;br /&gt;
&lt;br /&gt;
=== Tiny-C compiler ===&lt;br /&gt;
The installation script assumes that a working Tiny-C compiler (tcc) is installed and that your ‘path’ environment variable points to the tcc installation directory as well.  If you think this is the case, simply open a command prompt and check whether tcc.exe can indeed be found, like I did for the following screenshot. Note that my current directory was C:\Liberty, which is where I copied the Liberty Eiffel repository to:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:tcc-check-0.png|center|Is Tiny-C installed properly?]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
As you can see, tcc could be found and it reported back that it is version 0.9.27 (x86_64 Windows).  This also means that the ‘path’ environment variable points to the correct Tiny-C installation directory, otherwise the compiler would not have been found.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Open a new command window and navigate to Liberty Eiffel's root installation directory.&lt;br /&gt;
This directory contains a cmd-file named '''win-install-tcc.cmd'''.  Type this command into a CMD-window, like in the following screenshot:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:tcc-check.png|center|Starting the installation cmd file]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
And then press the enter-key.  The following screenshot documents what will happen on your machine:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Liberty-install-Windows.png|center|Installation process using Tiny-C]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Note the time stamps on the output…   Now is the time to grab a cup of coffee, or even a few, and then come back to read the remaining part of this document 😊&lt;br /&gt;
I’ll get back to the time stamps later on….&lt;br /&gt;
&lt;br /&gt;
=== What does this installation script do? ===&lt;br /&gt;
'''The big picture?'''  This script creates your Liberty Eiffel executables by compiling them from the original source code!&lt;br /&gt;
&lt;br /&gt;
* First it verifies the installation prerequisites by creating a number of temporary files.  Then it searches for your Tiny-C installation, which is why it was important to have your installation and your ‘path’ settings checked beforehand, as described above.&lt;br /&gt;
&lt;br /&gt;
* Next, a configuration file is created.  This ‘liberty.cfg’ file is used by the Eiffel compiler and other commands in the tool set. It is created in %USERPROFILE%.  If you want ‘liberty.cfg’ to be readable for all users, you have to copy it manually to %ALLUSERSPROFILE% as well.  You’ll need admin credentials to do this.&lt;br /&gt;
&lt;br /&gt;
* Up next is the first real compilation: bootstrapping ‘compile_to_c’, the command used by most of the other Liberty Eiffel commands.  As the name implies, this command takes an Eiffel source file or files and creates C-files from them.  The C-sources for ‘compile_to_c’ itself are compiled into an initial version of ‘compile_to_c.exe’.  I had Tiny-C emit some statistics about the size of the sources and the time it took to create an executable from it.&lt;br /&gt;
 &lt;br /&gt;
* This initial executable is then used to compile itself again from the original Eiffel sources.  ‘compile_to_c.exe’ creates C-files, and these are again compiled by Tiny-C, resulting in yet another version of ‘compile_to_c.exe’.  This bootstrapping cycle is repeated three times.  The installation script provides a short message about each of these cycles, named T1, T2 and T3.&lt;br /&gt;
&lt;br /&gt;
* The script continues with comparing the ‘compile_to_c.exe’ files from the T2 and T3 cycles.  If they are binary equivalents, the T3-version is moved to the ..\bin directory.  This is how the core compiler is bootstrapped and later used to compile the rest of the Liberty Eiffel commands.  But before that, the script removes all temporary files and directories that were created for the bootstrapping process.&lt;br /&gt;
&lt;br /&gt;
* Using the now stable version of ‘compile_to_c.exe’, the remaining commands are compiled.  The corresponding executables are moved to ..\bin as well.  Any temporary file created by the compilation process is removed (Liberty Eiffel provides the ‘clean’ command for that, which is used after that executable got created).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Now back to the time stamps I alluded to before:'''&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel (and its predecessor too) were predominantly developed on Linux and a number of other Unix-derived operating systems.  On these operating systems, the compilation tasks share multiple processor cores, making the installation rather swift.  On Windows, we still need to work on the Eiffel code for ‘exec’ and a few other features to spawn separate processes.  Until that is finished, it is not yet possible to have parallel compilation to create a single application.&lt;br /&gt;
&lt;br /&gt;
'''The bottom line''': this installation script for Windows is a single-core sequential processing job, which is why it takes three to four times as long as on a comparable Linux machine.  On my quad-core Xeon @ 4 GHz, it takes appr. an hour, but then again, only a single core is used for this job and my machine had other compute intensive tasks in the background as well…&lt;br /&gt;
&lt;br /&gt;
If your installation process shows the ‘Finish:’ time stamp, you should have a working Liberty Eiffel environment on your Windows pc.&lt;br /&gt;
&lt;br /&gt;
=== Looking for a small footprint code editor as well? ===   &lt;br /&gt;
If you’re looking for a minimal footprint editor for your Eiffel endeavours on Windows as well, I recommend using Notepad++.&lt;br /&gt;
&lt;br /&gt;
In your Liberty Eiffel ..\work directory, you’ll find a subdirectory called ‘notepad++_syntax-highlighting’.  Within that directory, you’ll find a Liberty-Eiffel.xml file that can be imported in notepad++.   It loosely implements the Eiffel formatting rules proposed by Bertrand Meyer.  In this directory I also put a pdf-file to show what that looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck and happy Eiffeling….!  😉&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Getting_Started&amp;diff=2757</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Getting_Started&amp;diff=2757"/>
		<updated>2024-10-28T10:21:51Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: /* Windows Installer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prepared Debian/Ubuntu packages ==&lt;br /&gt;
On http://apt.liberty-eiffel.org/ we have prepared some Debian/Ubuntu packages. For the quick start using the last stable release do:&lt;br /&gt;
&lt;br /&gt;
* add the following repository (note: it is currently unsigned)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;deb http://apt.liberty-eiffel.org/ release main&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* then install (as root or with sudo)&lt;br /&gt;
 apt-get install liberty-eiffel-all&lt;br /&gt;
&lt;br /&gt;
That's it, you now can run &amp;quot;se c&amp;quot; to [[Tutorial_tour|compile your first program.]]&lt;br /&gt;
&lt;br /&gt;
== Windows Installer ==&lt;br /&gt;
In a 2016 [[GSoC_-_Windows_Support|GSoC project]] Petru Gurita worked on a Windows installer using NSIS.  His [https://github.com/petr00/Liberty-Eiffel-Windows repository] is hosted on GitHub.&lt;br /&gt;
&lt;br /&gt;
Since October 2024, an installation script exists that loosely mimics the 'install.sh' script that is used on Linux based machines.  The installation process is documented on a separate page:  [[Installing on Windows using the Tiny-C compiler]]&lt;br /&gt;
This Windows cmd-script only assumes that you have a Tiny-C compiler installed - no need to download and run external installation packages.&lt;br /&gt;
&lt;br /&gt;
== Bootstrap from tarball ==&lt;br /&gt;
Download the &amp;lt;release&amp;gt;.tar.gz from http://download.savannah.gnu.org/releases/liberty-eiffel&lt;br /&gt;
unpack it with&lt;br /&gt;
 tar -zxvf &amp;lt;release&amp;gt;.tar.gz&lt;br /&gt;
&lt;br /&gt;
bootstrap Liberty with&lt;br /&gt;
 cd &amp;lt;release&amp;gt;&lt;br /&gt;
 ./install.sh -bootstrap&lt;br /&gt;
&lt;br /&gt;
This will create a default liberty configuration in ~/.config/liberty-eiffel/, bootstrap the compiler and compile all the tools. Afterwards you just need to add &amp;lt;LibertyHome&amp;gt;/target/bin to your path, e. g. in .bashrc:&lt;br /&gt;
 PATH=$PATH:~/&amp;lt;release&amp;gt;/target/bin&lt;br /&gt;
 export PATH&lt;br /&gt;
&lt;br /&gt;
== Bootstrap from git source ==&lt;br /&gt;
On Linux (and most other Unix-like systems) installation of Liberty from source is simple:&lt;br /&gt;
&lt;br /&gt;
Check that the following Pre-requisites are available on your system:&lt;br /&gt;
* git&lt;br /&gt;
* GCC compiler&lt;br /&gt;
* castxml (or GCC-XML)&lt;br /&gt;
* Boehm-Demers-Weiser garbage collector dev-packages&lt;br /&gt;
&lt;br /&gt;
On debian-like systems you may install them with:&lt;br /&gt;
 sudo apt-get install git build-essential castxml libgc-dev&lt;br /&gt;
&lt;br /&gt;
On Fedora you'll need gc-devel, rather than libgc-dev, castxml and of course the basic packages for compiling like gcc, git etc.&lt;br /&gt;
&lt;br /&gt;
Now clone the repository:&lt;br /&gt;
 git clone git://git.sv.gnu.org/liberty-eiffel.git&lt;br /&gt;
&lt;br /&gt;
Change into the directory you created by this:&lt;br /&gt;
 cd liberty-eiffel&lt;br /&gt;
&lt;br /&gt;
and execute&lt;br /&gt;
 ./install.sh -bootstrap&lt;br /&gt;
&lt;br /&gt;
This will create a default liberty configuration in ~/.config/liberty-eiffel/, bootstrap the compiler and compile all the tools. Afterwards you just need to add &amp;lt;LibertyHome&amp;gt;/target/bin to your path, e. g. in .bashrc:&lt;br /&gt;
 PATH=$PATH:~/liberty-eiffel/target/bin&lt;br /&gt;
 export PATH&lt;br /&gt;
&lt;br /&gt;
'''Please note that no legacy SmartEiffel system should be installed on your system. Particularily, any /etc/serc file will prevent you from installing Liberty Eiffel correctly.&lt;br /&gt;
'''&lt;br /&gt;
Now you can call [[Se|se]] as interface for all tools. For examples go to&lt;br /&gt;
 cd &amp;lt;LibertyHome&amp;gt;/tutorial&lt;br /&gt;
and compile with&lt;br /&gt;
 se compile hello_world.e -o hello_world&lt;br /&gt;
your first Liberty Eiffel program.&lt;br /&gt;
&lt;br /&gt;
After this great success, play with the [[Table of contents#Eiffel|language]], [[Tools|tools]] and [[Table of contents#Library|libraries]]. Develop cool applications and for any question, suggestion or complaint [[Get in touch|get in touch]] with us. We are also happy to receive pull requests and provide accounts to this wiki if you want to contribute code or documentation. Be welcome to [[Get involved| get involved]].&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Release_Notes_(Versions_history)&amp;diff=2756</id>
		<title>Release Notes (Versions history)</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Release_Notes_(Versions_history)&amp;diff=2756"/>
		<updated>2024-10-28T09:33:27Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: /* Curtiss (2022.dev, to be named after Glenn Curtiss) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Releases]]&lt;br /&gt;
== Liberty Eiffel (latest release first) ==&lt;br /&gt;
For other upcoming releases see the [[upcoming releases|list of names]].&lt;br /&gt;
=== Curtiss (2022.dev, to be named after [https://en.wikipedia.org/wiki/Glenn_Curtiss Glenn Curtiss]) ===&lt;br /&gt;
* not yet released (see next section for current release notes)&lt;br /&gt;
* User-visible changes:#&lt;br /&gt;
** added installation script:  [[Installing on Windows using the Tiny-C compiler]]&lt;br /&gt;
** added support for assign (note: it applies to the setter, while ISE version applies to the getter)&lt;br /&gt;
** redesign of eiffeldoc generated HTML to reduce its size dramatically&lt;br /&gt;
** addition of a zsh completer for se&lt;br /&gt;
** updated dependency of BDW GC to version 8.x&lt;br /&gt;
** installation script (install.sh) now supports the latest libgc-dev library (external garbage collector)&lt;br /&gt;
** finally removed the obsolete classes GEN_RAND, MIN_STAND and STD_RAND&lt;br /&gt;
** removed support for some unused legacy platforms (OpenVMS, Amiga, Elate, BeOS, OS/2, Macintosh, HP RISC, IBM370, NS32000, MIPS, Pyramid 9810, SPARC, VAX, Motorola 68000) - in case you have a real use case for those we are happy to readd it&lt;br /&gt;
** removed support for some unused backend C-compilers (i.e. Watcom-C)&lt;br /&gt;
** removed obsolete feature &amp;quot;is_basic_expanded_type&amp;quot; from class ANY&lt;br /&gt;
** obsolete keyword 'creation' now generates an error&lt;br /&gt;
** obsolete class READY_DESCRIPTION removed from sequencer cluster&lt;br /&gt;
** 'is_prime' feature added to class INTEGER_GENERAL&lt;br /&gt;
** 'is_fibonacci' feature added to class INTEGER_GENERAL&lt;br /&gt;
** constants 'Tau', 'Sqr_tau' and 'Inv_tau' added to math_constants.e&lt;br /&gt;
** C-runtime now C99 compliant&lt;br /&gt;
** C-runtime now thread-safe &lt;br /&gt;
** C-code generator does not yet generate C99 compliant C-code, currently being worked on (likely for the Dennis-release).&lt;br /&gt;
** RUN_FEATUREs now have clear names (hopefully)&lt;br /&gt;
** to better support the user access rights model of the current Windows versions, the config file is no longer written to a root directory but rather to %ALLUSERSPROFILE% or %USERPROFILE% &lt;br /&gt;
* Known bugs:&lt;br /&gt;
** see [https://savannah.gnu.org/bugs/?group=liberty-eiffel] for the full list&lt;br /&gt;
&lt;br /&gt;
=== Bell (2016.05, named after [https://en.wikipedia.org/wiki/Alexander_Graham_Bell Alexander Graham Bell]) ===&lt;br /&gt;
* released in May 2016&lt;br /&gt;
* first release since Liberty Eiffel has become the official GNU Eiffel compiler&lt;br /&gt;
* User-visible changes:&lt;br /&gt;
** changed Environment Variable name from SmartEiffel to LibertyEiffel (anyhow, normally it should not be necessary to set this one)&lt;br /&gt;
** new tool [[Mock]]&lt;br /&gt;
** removed linebreaks in compiler output&lt;br /&gt;
** many bugfixes&lt;br /&gt;
** GC call at exit is optional&lt;br /&gt;
** generic creation&lt;br /&gt;
** agents are now [https://en.wikipedia.org/wiki/Closure_(computer_programming) closures ]&lt;br /&gt;
** finder now finds all classes in the universe with the given name, not only the first one&lt;br /&gt;
** keyword '''is''' at the beginning of a feature is now deprecated&lt;br /&gt;
** Added support for alias &amp;quot;[]&amp;quot; and alias &amp;quot;()&amp;quot;&lt;br /&gt;
** constants are now visible in the eiffeldoc generated documentation&lt;br /&gt;
* Known bugs:&lt;br /&gt;
** there is still an issue in both GC implementations (classical SEGC and BDW), if it shows up, it often yields a &amp;quot;Bad target type&amp;quot; runtime error.&lt;br /&gt;
** for the full list see [https://savannah.gnu.org/bugs/?group=liberty-eiffel]&lt;br /&gt;
&lt;br /&gt;
=== Adler (2013.11, named after [http://en.wikipedia.org/wiki/Charles_Adler,_Jr. Charles Adler, Jr.]) ===&lt;br /&gt;
* First release as Liberty Eiffel&lt;br /&gt;
* User-visible changes:&lt;br /&gt;
** Added [[library_class:NATURAL_8|&amp;lt;tt&amp;gt;NATURAL_8&amp;lt;/tt&amp;gt;]], [[library_class:NATURAL_16|&amp;lt;tt&amp;gt;NATURAL_16&amp;lt;/tt&amp;gt;]], [[library_class:NATURAL_32|&amp;lt;tt&amp;gt;NATURAL_32&amp;lt;/tt&amp;gt;]], and [[library_class:NATURAL_64|&amp;lt;tt&amp;gt;NATURAL_64&amp;lt;/tt&amp;gt;]] classes. See &amp;lt;tt&amp;gt;tutorial/natural.e&amp;lt;/tt&amp;gt; for examples.&lt;br /&gt;
** Even low-level features (i.e. &amp;lt;tt&amp;gt;external &amp;quot;built_in&amp;quot;&amp;lt;/tt&amp;gt;) are now checking their assertions. As an example, division by zero is now checked by assertions.&lt;br /&gt;
** Inlined dynamic dispatch for better performance&lt;br /&gt;
** A missing export clause is deprecated. Use &amp;lt;tt&amp;gt;{ANY}&amp;lt;/tt&amp;gt; instead.&lt;br /&gt;
** New core libraries: cli, json, log, parse (beware, these libraries are not yet tuned to be used without GC)&lt;br /&gt;
** Improved libraries: string (with notably a new [[library_class:FIXED_STRING|&amp;lt;tt&amp;gt;FIXED_STRING&amp;lt;/tt&amp;gt;]] class)&lt;br /&gt;
** Wrapper libraries: gtk, gdk, readline, ffi...&lt;br /&gt;
** A new tool that can generate mocks to help unit testing&lt;br /&gt;
** [http://hboehm.info/gc/ BDW] GC support&lt;br /&gt;
** Collections implementation of is_equal changed to compare the contained objects using their is_equal functions instead of = (which was formerly the functionality of is_equal_map). The old functionality of is_equal is available by fast_is_equal.&lt;br /&gt;
* Developer changes:&lt;br /&gt;
** The web site now belongs to the repository&lt;br /&gt;
** Automatic testing tools (ET on the web, and &amp;lt;tt&amp;gt;watch_eiffeltest.sh&amp;lt;/tt&amp;gt; in the shell)&lt;br /&gt;
** Automatic Debian packages generation&lt;br /&gt;
* Known bugs:&lt;br /&gt;
** BDW GC is not well tested; currently weak references seem not to work properly; and the GC is not run at program exit (it should run all finalizers)&lt;br /&gt;
** Sometimes SmartEiffel's native GC behaves wrongly, analysis is welcome&lt;br /&gt;
** Some of the newer core libraries do not work very well when there is no GC&lt;br /&gt;
** See the [https://savannah.gnu.org/bugs/?group=liberty-eiffel bugs page]&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=GSoC_-_Windows_Support&amp;diff=2755</id>
		<title>GSoC - Windows Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=GSoC_-_Windows_Support&amp;diff=2755"/>
		<updated>2024-10-28T09:27:32Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Liberty Eiffel meets Windows ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New small footprint installation method using Tiny-C ===&lt;br /&gt;
Since October 2024, an installation script exists that loosely mimics the 'install.sh' script that is used on Linux based machines.  The installation process is documented on a separate page:  [[Installing on Windows using the Tiny-C compiler]]&lt;br /&gt;
This Windows cmd-script only assumes that you have a Tiny-C compiler installed - no need to download and run external installation packages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2016 GSOC effort:  ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/petr00/Liberty-Eiffel-Windows Link to repository]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Final Goal '''&lt;br /&gt;
&lt;br /&gt;
    Bootstrap the Liberty-Eiffel programming language (compiler,classes, functions etc.)&lt;br /&gt;
    from the UNIX/LINUX environment to the WINDOWS environment and wrap it into a nice installer.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== '''Progress''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I've created a working installer application that replicates all the facilities, but one, that Liberty Eiffel offers in POSIX systems,&lt;br /&gt;
in Windows Environment. The only facility that I didn't reproduce, '''net cluster''', caused the eiffeltest_server tool to be inoperable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other tools (se, clean, ace_check, eiffeltest, mock, eiffeltest_ng, pretty, short, class_check, finder, eiffeldoc, extract_internals) work just fine together will all the other plugins and all functionalities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    	&lt;br /&gt;
== What I coded: ==&lt;br /&gt;
&lt;br /&gt;
    	 &lt;br /&gt;
* [https://github.com/petr00/Liberty-Eiffel-Windows/blob/master/nsis-installer/liberty/install.bat install.bat], which creates the &amp;quot;T stages&amp;quot; and compiles *almost* all the tools, creates the configuration file and the binaries from the tools.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/petr00/Liberty-Eiffel-Windows/blob/master/nsis-installer/liberty/install.bat\set_path.cmd set_path.cmd], simple utility used to create the Liberty Eiffel configuration file, called by installer.nsi .&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/petr00/Liberty-Eiffel-Windows/tree/master/nsis-installer/installer.nsi installer.nsi], a nicely wrapped NSIS installer + uninstaller, that follows the best practices : required executionlevel, write/delete registers, function to create/delete environment variable for the binaries created from the compiled Liberty Eiffel tools, has a function that reads the product version of the Liberty Eiffel install application and downloads from it's official website documentation regarding that patch( at the moment the site's structure does not allow that, but the function will be used in the near future, the installers now is only downloading from a plain link), an option for downloading mingw-w64, custom images etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* A part of liberty/[https://github.com/petr00/Liberty-Eiffel-Windows/blob/master/nsis-installer/liberty/se_make.bat se_make.bat](inspired from  [https://github.com/LibertyEiffel/Liberty/blob/master/work/se_make.sh /work/se_make.sh]), no longer needed for this patch, therefore I did not completed all of it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''General''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The original main goal was to create two versions of an installer application: one that assumes that the end-user already has mingw-w64 installed,&lt;br /&gt;
and one that installs mingw-w64 for the user.&lt;br /&gt;
&lt;br /&gt;
The reason was flexibility: the installer with mingw attached would be bigger with around 300mb.&lt;br /&gt;
After searching, I found out that there are not offline installers for mingw available, but online versions of only around 200kb.&lt;br /&gt;
Therefore I only created one version of Liberty Eiffel installer that offers the user the ability to download mingw via calling mingw's online installer. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;T stages&amp;quot; refers to compiling Liberty Eiffel's base code (currently 136 C-files created by the Liberty Eiffel compiler) and create a binary from these, and with that binary the same&lt;br /&gt;
136 C-files (that represent the core of smarteiffel) get compiled again, and so on for three times. After three such processes, if the resulting applications are binary indentical to the previous compile, the installer proceeds further to the [[http://wiki.liberty-eiffel.org/index.php/GSoC_-_Windows_Support#Progress tools compilation]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	The NSIS installer does just as  mentioned [[http://wiki.liberty-eiffel.org/index.php/GSoC_-_Windows_Support#Progress above]] and has incorporated an uninstaller that uninstalls exactly what the installer created.&lt;br /&gt;
&lt;br /&gt;
== '''Repository structure''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please note that I did not want to create a very long post about all the details of installer.nsi, but you can check some of those [https://github.com/petr00/Liberty-Eiffel-Windows/blob/master/nsis-installer/readme.md here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From this repository only the files mentioned [[http://wiki.liberty-eiffel.org/index.php?title=GSoC_-_Windows_Support&amp;amp;action=submit#Progress above]], 'What I coded' paragraph were made by me, plus the images. &lt;br /&gt;
The other files are duplicates from Liberty Eiffel's core structure(only the most relevant files) to create an ease of use of the installer script for testing purposes.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Getting_Started&amp;diff=2754</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Getting_Started&amp;diff=2754"/>
		<updated>2024-10-28T09:24:10Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: /* Windows Installer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prepared Debian/Ubuntu packages ==&lt;br /&gt;
On http://apt.liberty-eiffel.org/ we have prepared some Debian/Ubuntu packages. For the quick start using the last stable release do:&lt;br /&gt;
&lt;br /&gt;
* add the following repository (note: it is currently unsigned)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;deb http://apt.liberty-eiffel.org/ release main&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* then install (as root or with sudo)&lt;br /&gt;
 apt-get install liberty-eiffel-all&lt;br /&gt;
&lt;br /&gt;
That's it, you now can run &amp;quot;se c&amp;quot; to [[Tutorial_tour|compile your first program.]]&lt;br /&gt;
&lt;br /&gt;
== Windows Installer ==&lt;br /&gt;
In the 2016 [[GSoC_-_Windows_Support|GSoC project]] Petru Gurita worked on a Windows installer using NSIS.  His [https://github.com/petr00/Liberty-Eiffel-Windows repository] is hosted on GitHub.&lt;br /&gt;
&lt;br /&gt;
Since October 2024, an installation script exists that loosely mimics the 'install.sh' script that is used on Linux based machines.  The installation process is documented on a separate page:  [[Installing on Windows using the Tiny-C compiler]]&lt;br /&gt;
This Windows cmd-script only assumes that you have a Tiny-C compiler installed - no need to download and run external installation packages.&lt;br /&gt;
&lt;br /&gt;
== Bootstrap from tarball ==&lt;br /&gt;
Download the &amp;lt;release&amp;gt;.tar.gz from http://download.savannah.gnu.org/releases/liberty-eiffel&lt;br /&gt;
unpack it with&lt;br /&gt;
 tar -zxvf &amp;lt;release&amp;gt;.tar.gz&lt;br /&gt;
&lt;br /&gt;
bootstrap Liberty with&lt;br /&gt;
 cd &amp;lt;release&amp;gt;&lt;br /&gt;
 ./install.sh -bootstrap&lt;br /&gt;
&lt;br /&gt;
This will create a default liberty configuration in ~/.config/liberty-eiffel/, bootstrap the compiler and compile all the tools. Afterwards you just need to add &amp;lt;LibertyHome&amp;gt;/target/bin to your path, e. g. in .bashrc:&lt;br /&gt;
 PATH=$PATH:~/&amp;lt;release&amp;gt;/target/bin&lt;br /&gt;
 export PATH&lt;br /&gt;
&lt;br /&gt;
== Bootstrap from git source ==&lt;br /&gt;
On Linux (and most other Unix-like systems) installation of Liberty from source is simple:&lt;br /&gt;
&lt;br /&gt;
Check that the following Pre-requisites are available on your system:&lt;br /&gt;
* git&lt;br /&gt;
* GCC compiler&lt;br /&gt;
* castxml (or GCC-XML)&lt;br /&gt;
* Boehm-Demers-Weiser garbage collector dev-packages&lt;br /&gt;
&lt;br /&gt;
On debian-like systems you may install them with:&lt;br /&gt;
 sudo apt-get install git build-essential castxml libgc-dev&lt;br /&gt;
&lt;br /&gt;
On Fedora you'll need gc-devel, rather than libgc-dev, castxml and of course the basic packages for compiling like gcc, git etc.&lt;br /&gt;
&lt;br /&gt;
Now clone the repository:&lt;br /&gt;
 git clone git://git.sv.gnu.org/liberty-eiffel.git&lt;br /&gt;
&lt;br /&gt;
Change into the directory you created by this:&lt;br /&gt;
 cd liberty-eiffel&lt;br /&gt;
&lt;br /&gt;
and execute&lt;br /&gt;
 ./install.sh -bootstrap&lt;br /&gt;
&lt;br /&gt;
This will create a default liberty configuration in ~/.config/liberty-eiffel/, bootstrap the compiler and compile all the tools. Afterwards you just need to add &amp;lt;LibertyHome&amp;gt;/target/bin to your path, e. g. in .bashrc:&lt;br /&gt;
 PATH=$PATH:~/liberty-eiffel/target/bin&lt;br /&gt;
 export PATH&lt;br /&gt;
&lt;br /&gt;
'''Please note that no legacy SmartEiffel system should be installed on your system. Particularily, any /etc/serc file will prevent you from installing Liberty Eiffel correctly.&lt;br /&gt;
'''&lt;br /&gt;
Now you can call [[Se|se]] as interface for all tools. For examples go to&lt;br /&gt;
 cd &amp;lt;LibertyHome&amp;gt;/tutorial&lt;br /&gt;
and compile with&lt;br /&gt;
 se compile hello_world.e -o hello_world&lt;br /&gt;
your first Liberty Eiffel program.&lt;br /&gt;
&lt;br /&gt;
After this great success, play with the [[Table of contents#Eiffel|language]], [[Tools|tools]] and [[Table of contents#Library|libraries]]. Develop cool applications and for any question, suggestion or complaint [[Get in touch|get in touch]] with us. We are also happy to receive pull requests and provide accounts to this wiki if you want to contribute code or documentation. Be welcome to [[Get involved| get involved]].&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Installing_on_Windows_using_the_Tiny-C_compiler&amp;diff=2753</id>
		<title>Installing on Windows using the Tiny-C compiler</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Installing_on_Windows_using_the_Tiny-C_compiler&amp;diff=2753"/>
		<updated>2024-10-28T09:15:31Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: Created page with &amp;quot;= Installing Liberty Eiffel on Windows using the Tiny-C compiler =  == Prerequisites ==  === Liberty Eiffel repository === The complete Liberty Eiffel source code repository can be downloaded from gnu’s git server.  Install git on your machine if you haven’t done so already and simply use:  “git clone git://git.sv.gnu.org/liberty-eiffel.git”  This will create a directory called ‘liberty-eiffel’ and replicate the entire repository into it.  Personally, I prefe...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installing Liberty Eiffel on Windows using the Tiny-C compiler =&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
=== Liberty Eiffel repository ===&lt;br /&gt;
The complete Liberty Eiffel source code repository can be downloaded from gnu’s git server.  Install git on your machine if you haven’t done so already and simply use:&lt;br /&gt;
&lt;br /&gt;
“git clone git://git.sv.gnu.org/liberty-eiffel.git”&lt;br /&gt;
&lt;br /&gt;
This will create a directory called ‘liberty-eiffel’ and replicate the entire repository into it.  Personally, I prefer directory names to be a bit shorter, so for my case I renamed it to just ‘liberty’, see the screenshot that follows further below.&lt;br /&gt;
For those of you who don’t want to install ‘git’:  it is possible to visit the mirrored Liberty Eiffel repository at GitHub and download the entire repository as a ZIP-file as well.&lt;br /&gt;
&lt;br /&gt;
=== Tiny-C compiler ===&lt;br /&gt;
The installation script assumes that a working Tiny-C compiler (tcc) is installed and that your ‘path’ environment variable points to the tcc installation directory as well.  If you think this is the case, simply open a command prompt and check whether tcc.exe can indeed be found, like I did for the following screenshot. Note that my current directory was C:\Liberty, where I copied the Liberty Eiffel repository to:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:tcc-check-0.png|center|Is Tiny-C installed properly?]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
As you can see, tcc could be found and it reported back that it is version 0.9.27 (x86_64 Windows).  This also means that the ‘path’ environment variable points to the correct Tiny-C installation directory, otherwise the compiler would not have been found.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Open a new command window and navigate to Liberty Eiffel's root installation directory.&lt;br /&gt;
This directory contains a cmd-file named '''win-install-tcc.cmd'''.  Type this command into a CMD-window, like in the following screenshot:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:tcc-check.png|center|Starting the installation cmd file]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
And then press the enter-key.  The following screenshot documents what will happen on your machine:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Liberty-install-Windows.png|center|Installation process using Tiny-C]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Note the time stamps on the output…   Now is the time to grab a cup of coffee, or even a few, and then come back to read the remaining part of this document 😊&lt;br /&gt;
I’ll get back to the time stamps later on….&lt;br /&gt;
&lt;br /&gt;
=== What does this installation script do? ===&lt;br /&gt;
'''The big picture?'''  This script creates your Liberty Eiffel executables by compiling them from the original source code!&lt;br /&gt;
&lt;br /&gt;
* First it verifies the installation prerequisites by creating a number of temporary files.  Then it searches for your Tiny-C installation, which is why it was important to have your installation and your ‘path’ settings checked beforehand, as described above.&lt;br /&gt;
&lt;br /&gt;
* Next, a configuration file is created.  This ‘liberty.cfg’ file is used by the Eiffel compiler and other commands in the tool set. It is created in %USERPROFILE%.  If you want ‘liberty.cfg’ to be readable for all users, you have to copy it manually to %ALLUSERSPROFILE% as well.  You’ll need admin credentials to do this.&lt;br /&gt;
&lt;br /&gt;
* Up next is the first real compilation: bootstrapping ‘compile_to_c’, the command used by most of the other Liberty Eiffel commands.  As the name implies, this command takes an Eiffel source file or files and creates C-files from them.  The C-sources for ‘compile_to_c’ itself are compiled into an initial version of ‘compile_to_c.exe’.  I had Tiny-C emit some statistics about the size of the sources and the time it took to create an executable from it.&lt;br /&gt;
 &lt;br /&gt;
* This initial executable is then used to compile itself again from the original Eiffel sources.  ‘compile_to_c.exe’ creates C-files, and these are again compiled by Tiny-C, resulting in yet another version of ‘compile_to_c.exe’.  This bootstrapping cycle is repeated three times.  The installation script provides a short message about each of these cycles, named T1, T2 and T3.&lt;br /&gt;
&lt;br /&gt;
* The script continues with comparing the ‘compile_to_c.exe’ files from the T2 and T3 cycles.  If they are binary equivalents, the T3-version is moved to the ..\bin directory.  This is how the core compiler is bootstrapped and later used to compile the rest of the Liberty Eiffel commands.  But before that, the script removes all temporary files and directories that were created for the bootstrapping process.&lt;br /&gt;
&lt;br /&gt;
* Using the now stable version of ‘compile_to_c.exe’, the remaining commands are compiled.  The corresponding executables are moved to ..\bin as well.  Any temporary file created by the compilation process is removed (Liberty Eiffel provides the ‘clean’ command for that, which is used after that executable got created).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Now back to the time stamps I alluded to before:'''&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel (and its predecessor too) were predominantly developed on Linux and a number of other Unix-derived operating systems.  On these operating systems, the compilation tasks share multiple processor cores, making the installation rather swift.  On Windows, we still need to work on the Eiffel code for ‘exec’ and a few other features to spawn separate processes.  Until that is finished, it is not yet possible to have parallel compilation to create a single application.&lt;br /&gt;
&lt;br /&gt;
'''The bottom line''': this installation script for Windows is a single-core sequential processing job, which is why it takes three to four times as long as on a comparable Linux machine.  On my quad-core Xeon @ 4 GHz, it takes appr. an hour, but then again, only a single core is used for this job and my machine had other compute intensive tasks in the background as well…&lt;br /&gt;
&lt;br /&gt;
If your installation process shows the ‘Finish:’ time stamp, you should have a working Liberty Eiffel environment on your Windows pc.&lt;br /&gt;
&lt;br /&gt;
=== Looking for a small footprint code editor as well? ===   &lt;br /&gt;
If you’re looking for a minimal footprint editor for your Eiffel endeavours on Windows as well, I recommend using Notepad++.&lt;br /&gt;
&lt;br /&gt;
In your Liberty Eiffel ..\work directory, you’ll find a subdirectory called ‘notepad++_syntax-highlighting’.  Within that directory, you’ll find a Liberty-Eiffel.xml file that can be imported in notepad++.   It loosely implements the Eiffel formatting rules proposed by Bertrand Meyer.  In this directory I also put a pdf-file to show what that looks like.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Good luck and happy Eiffeling….!  😉&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=File:Tcc-check-0.png&amp;diff=2752</id>
		<title>File:Tcc-check-0.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=File:Tcc-check-0.png&amp;diff=2752"/>
		<updated>2024-10-28T09:08:47Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=File:Tcc-check.png&amp;diff=2751</id>
		<title>File:Tcc-check.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=File:Tcc-check.png&amp;diff=2751"/>
		<updated>2024-10-28T09:03:49Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=File:Liberty-install-Windows.png&amp;diff=2750</id>
		<title>File:Liberty-install-Windows.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=File:Liberty-install-Windows.png&amp;diff=2750"/>
		<updated>2024-10-28T08:58:54Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Getting_Started&amp;diff=2749</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Getting_Started&amp;diff=2749"/>
		<updated>2024-10-28T08:28:15Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: /* Windows Installer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prepared Debian/Ubuntu packages ==&lt;br /&gt;
On http://apt.liberty-eiffel.org/ we have prepared some Debian/Ubuntu packages. For the quick start using the last stable release do:&lt;br /&gt;
&lt;br /&gt;
* add the following repository (note: it is currently unsigned)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;deb http://apt.liberty-eiffel.org/ release main&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* then install (as root or with sudo)&lt;br /&gt;
 apt-get install liberty-eiffel-all&lt;br /&gt;
&lt;br /&gt;
That's it, you now can run &amp;quot;se c&amp;quot; to [[Tutorial_tour|compile your first program.]]&lt;br /&gt;
&lt;br /&gt;
== Windows Installer ==&lt;br /&gt;
In the 2016 [[GSoC_-_Windows_Support|GSoC project]] Petru Gurita worked on a Windows installer using NSIS.  His [https://github.com/petr00/Liberty-Eiffel-Windows repository] is hosted on GitHub.&lt;br /&gt;
&lt;br /&gt;
== Bootstrap from tarball ==&lt;br /&gt;
Download the &amp;lt;release&amp;gt;.tar.gz from http://download.savannah.gnu.org/releases/liberty-eiffel&lt;br /&gt;
unpack it with&lt;br /&gt;
 tar -zxvf &amp;lt;release&amp;gt;.tar.gz&lt;br /&gt;
&lt;br /&gt;
bootstrap Liberty with&lt;br /&gt;
 cd &amp;lt;release&amp;gt;&lt;br /&gt;
 ./install.sh -bootstrap&lt;br /&gt;
&lt;br /&gt;
This will create a default liberty configuration in ~/.config/liberty-eiffel/, bootstrap the compiler and compile all the tools. Afterwards you just need to add &amp;lt;LibertyHome&amp;gt;/target/bin to your path, e. g. in .bashrc:&lt;br /&gt;
 PATH=$PATH:~/&amp;lt;release&amp;gt;/target/bin&lt;br /&gt;
 export PATH&lt;br /&gt;
&lt;br /&gt;
== Bootstrap from git source ==&lt;br /&gt;
On Linux (and most other Unix-like systems) installation of Liberty from source is simple:&lt;br /&gt;
&lt;br /&gt;
Check that the following Pre-requisites are available on your system:&lt;br /&gt;
* git&lt;br /&gt;
* GCC compiler&lt;br /&gt;
* castxml (or GCC-XML)&lt;br /&gt;
* Boehm-Demers-Weiser garbage collector dev-packages&lt;br /&gt;
&lt;br /&gt;
On debian-like systems you may install them with:&lt;br /&gt;
 sudo apt-get install git build-essential castxml libgc-dev&lt;br /&gt;
&lt;br /&gt;
On Fedora you'll need gc-devel, rather than libgc-dev, castxml and of course the basic packages for compiling like gcc, git etc.&lt;br /&gt;
&lt;br /&gt;
Now clone the repository:&lt;br /&gt;
 git clone git://git.sv.gnu.org/liberty-eiffel.git&lt;br /&gt;
&lt;br /&gt;
Change into the directory you created by this:&lt;br /&gt;
 cd liberty-eiffel&lt;br /&gt;
&lt;br /&gt;
and execute&lt;br /&gt;
 ./install.sh -bootstrap&lt;br /&gt;
&lt;br /&gt;
This will create a default liberty configuration in ~/.config/liberty-eiffel/, bootstrap the compiler and compile all the tools. Afterwards you just need to add &amp;lt;LibertyHome&amp;gt;/target/bin to your path, e. g. in .bashrc:&lt;br /&gt;
 PATH=$PATH:~/liberty-eiffel/target/bin&lt;br /&gt;
 export PATH&lt;br /&gt;
&lt;br /&gt;
'''Please note that no legacy SmartEiffel system should be installed on your system. Particularily, any /etc/serc file will prevent you from installing Liberty Eiffel correctly.&lt;br /&gt;
'''&lt;br /&gt;
Now you can call [[Se|se]] as interface for all tools. For examples go to&lt;br /&gt;
 cd &amp;lt;LibertyHome&amp;gt;/tutorial&lt;br /&gt;
and compile with&lt;br /&gt;
 se compile hello_world.e -o hello_world&lt;br /&gt;
your first Liberty Eiffel program.&lt;br /&gt;
&lt;br /&gt;
After this great success, play with the [[Table of contents#Eiffel|language]], [[Tools|tools]] and [[Table of contents#Library|libraries]]. Develop cool applications and for any question, suggestion or complaint [[Get in touch|get in touch]] with us. We are also happy to receive pull requests and provide accounts to this wiki if you want to contribute code or documentation. Be welcome to [[Get involved| get involved]].&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2748</id>
		<title>Bibliography</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2748"/>
		<updated>2024-09-05T12:18:05Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: Added title to list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Literature]]&lt;br /&gt;
__NOTOC__ &amp;lt;!-- Use alphabetical order of keys. --&amp;gt;&lt;br /&gt;
==ETL 1992==&lt;br /&gt;
Bertrand Meyer. &lt;br /&gt;
''Eiffel: The Language''. &lt;br /&gt;
Prentice Hall, 1993, ISBN 0-13-247925-7.&lt;br /&gt;
&lt;br /&gt;
==GC book==&lt;br /&gt;
Richar Jones and Rafael Lins. &lt;br /&gt;
''Garbage Collection. Algorithms for  Automatic Dynamic Memory Management''.&lt;br /&gt;
John Wiley &amp;amp; Sons, ISBN 0-471-941484-4.&lt;br /&gt;
&lt;br /&gt;
==GoF 1995==&lt;br /&gt;
Erich Gamma, Richard Helm and Ralph Johnson and John Vlissides.&lt;br /&gt;
''Design Patterns: Elements of Reusable Object-Oriented Software''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1995, ISBN 0201633612.&lt;br /&gt;
&lt;br /&gt;
==Goldberg 1984==&lt;br /&gt;
Adele Goldberg.&lt;br /&gt;
''Smalltalk-80, The Interactive Programming Environment''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1984, ISBN 0-201-11372-4.&lt;br /&gt;
&lt;br /&gt;
==GR 1983==&lt;br /&gt;
Adele Goldberg and David Robson.&lt;br /&gt;
''Smalltalk-80: The Language and its Implementation''.&lt;br /&gt;
Addison-Wesley, 1983, ISBN 0-201-11371-6.&lt;br /&gt;
&lt;br /&gt;
==JMJ 1996==&lt;br /&gt;
Jean-Marc Jézéquel.&lt;br /&gt;
''Object-Oriented Software Engineering with Eiffel''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-63381-7.  This book is a gentle introduction to Eiffel programming, without the academic verbosity of many of the other titles in this list.&lt;br /&gt;
&lt;br /&gt;
==JTM 1999==&lt;br /&gt;
Jean-Marc Jézéquel, Michel Train and Christine Mingins.&lt;br /&gt;
''Design Patterns and Contracts''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-30959-9.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1989==&lt;br /&gt;
Gérald Masini, Amédéo Napoli, Dominique Colnet, Daniel Léonard et Karl Tombre.&lt;br /&gt;
''Les langages à objets''.&lt;br /&gt;
InterEditions&amp;quot;, Paris&amp;quot;, 1989, ISBN 2-7296-0275-5.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1991==&lt;br /&gt;
Gérald Masini and Amédéo Napoli and Dominique Colnet and Daniel Léonard and Karl Tombre.&lt;br /&gt;
''Object-Oriented Languages''.&lt;br /&gt;
Academic Press, New York, 1991, ISBN 0-12-477390-7.&lt;br /&gt;
&lt;br /&gt;
==OOSC 1997==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Object-oriented Software Construction, 2nd Ed.''.&lt;br /&gt;
Prentice Hall 1997, 1254 pages, ISBN 0-13-629155-4.&lt;br /&gt;
&lt;br /&gt;
==RMJM 2002==&lt;br /&gt;
Richard Mitchel and Jim McKim.&lt;br /&gt;
''Design by Contract, by Example''.&lt;br /&gt;
Adison-Wesley 2002, 238 pages, ISBN 0-201-63460-0.  This title introduces a well structured and very thorough method of using DbC.&lt;br /&gt;
&lt;br /&gt;
==TOCBM 2009==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''TOUCH OF CLASS - Learning to program well with Objects and Contracts''.&lt;br /&gt;
Springer Verlag 2009, 876 pages, ISBN 978-81-322-0374-2.  Unfortunately, this title assumes that you download supporting code and libraries, but the URL in the book is no longer valid.&lt;br /&gt;
&lt;br /&gt;
==RS 1994==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Reusable Software: The Base Object-Oriented Component Libraries''.&lt;br /&gt;
Prentice Hall, 1994, 514 pages, ISBN-10: 013-245-499-8 ISBN-13: 978-013-245-499-5&lt;br /&gt;
&lt;br /&gt;
==ECMA 367 / 2006==&lt;br /&gt;
ECMA International 2006.&lt;br /&gt;
''Eiffel: Analysis, Design and Programming Language''.&lt;br /&gt;
https://www.ecma-international.org/wp-content/uploads/ECMA-367_2nd_edition_june_2006.pdf&lt;br /&gt;
&lt;br /&gt;
==SOOSA 2015==&lt;br /&gt;
Kim Waldén and Jean-Marc Nelson.&lt;br /&gt;
''Seamless Object-Oriented Software Architecture''.&lt;br /&gt;
Prentice Hall, 2015, 438 pages, ISBN 0-13-031303-3.  This title is about BON (Business Object Notation), less so about the Eiffel language. BON as a method was developed by the authors of this book. BON is perceived to be simpler than the UML method.&lt;br /&gt;
&lt;br /&gt;
==FUNCPTRN 1999==&lt;br /&gt;
Thomas Kühne.&lt;br /&gt;
''A Functional Pattern System for Object-Oriented Design''.&lt;br /&gt;
Verlag Dr. Kovac, 1999, 346 pages, ISBN 9783860647707.  The thesis of this book is that design patterns inspired by functional programming concepts can advance object-oriented design.  The code examples given are implemented with Eiffel.  Some of the design patterns presented here are not current any more after the Eiffel language adopted 'agents', but the discussions about it are an excellent read nonetheless.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Related_Projects&amp;diff=2747</id>
		<title>Related Projects</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Related_Projects&amp;diff=2747"/>
		<updated>2024-08-06T20:53:14Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: changed URL to LE-specific repository&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here a list of related projects with Liberty Eiffel:&lt;br /&gt;
&lt;br /&gt;
= eiffel-iup =&lt;br /&gt;
&lt;br /&gt;
A wrapper for the IUP toolkit. IUP is a multi-platform toolkit for building graphical user interfaces. IUP's purpose is to allow a program source code to be compiled in different systems without any modification. Its main advantages are:&lt;br /&gt;
&lt;br /&gt;
* High performance, due to the fact that it uses native interface elements.&lt;br /&gt;
* Fast learning by the user, due to the simplicity of its API.&lt;br /&gt;
&lt;br /&gt;
This wrapper is still under development, but is almost complete and we encourage you to use it and send feedback.&lt;br /&gt;
&lt;br /&gt;
The project website is: [https://notabug.org/GermanGT/eiffel-iup/src/liberty-eiffel]&lt;br /&gt;
&lt;br /&gt;
Tecgraf's IUP (currently in version 3.31) site: [https://www.tecgraf.puc-rio.br/iup/ Tecgraf IUP]&lt;br /&gt;
&lt;br /&gt;
This package is released under the MIT license.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Introduction&amp;diff=2746</id>
		<title>Introduction</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Introduction&amp;diff=2746"/>
		<updated>2024-07-30T16:43:54Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Liberty Eiffel is a free compiler for the Eiffel programming language&lt;br /&gt;
&lt;br /&gt;
It '''continues''' the development of the legacy SmartEiffel system, which was the former GNU Eiffel Compiler - a role proudly taken over by Liberty Eiffel a number of years ago.&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel is a complete, small and fast Eiffel compiler, including an Eiffel to C compiler, documentation tools, a pretty printer, a debugger and various other tools. It also includes a large library of classes distributed under the terms of the MIT/X Consortium License as well as a comprehensive set of wrappers/bindings for widespread Free-Software libraries.&lt;br /&gt;
&lt;br /&gt;
Eiffel is an advanced object-oriented programming language that emphasizes the design and construction of high-quality and reusable software.&lt;br /&gt;
&lt;br /&gt;
If you are impatient hop over to [[Getting Started]] directly, otherwise read a few words about Liberty Eiffel's history:&lt;br /&gt;
&lt;br /&gt;
= Liberty's roots =&lt;br /&gt;
&lt;br /&gt;
== Etymology ==&lt;br /&gt;
&lt;br /&gt;
Liberty - as a name for our Eiffel compiler - has its origin in the [http://en.wikipedia.org/wiki/Statue_of_Liberty Statue of Liberty]. The structure of the statue was designed and built by [http://en.wikipedia.org/wiki/Gustave_Eiffel Gustave Eiffel], a famous French engineer.&lt;br /&gt;
&lt;br /&gt;
The origins of the language is [http://www.eiffel.com Eiffel] and more specifically [http://smarteiffel.loria.fr SmartEiffel], hereafter called '''SE'''. At one point in time one could consider Liberty Eiffel a direct [http://en.wikipedia.org/wiki/Fork_(software_development) fork] of the legacy SE code base.  Since then Liberty Eiffel has evolved quite significantly beyond the original code base in multiple areas.&lt;br /&gt;
&lt;br /&gt;
== Manifesto ==&lt;br /&gt;
&lt;br /&gt;
We want to retain from SE its rigour, but not its rigidity. Think of Liberty as ''SE liberated from its academic constraints''.&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel is free as in ''freedom''. We want people to contribute to Liberty from the start. So please, do join us to give Eiffel the leading position it should have won twenty years ago :-)&lt;br /&gt;
&lt;br /&gt;
== Foundation documents ==&lt;br /&gt;
&lt;br /&gt;
The following documents were published by the SmartEiffel team:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jot.fm/issues/issue_2004_04/article7/ Conformance of agents in the Eiffel language]&lt;br /&gt;
* Reconciling Subtyping and Code Reuse in Object-Oriented Languages&lt;br /&gt;
&lt;br /&gt;
= Liberty Eiffel's future =&lt;br /&gt;
To get a glimpse of Liberty's future, please take a look at our plans for [[ECMA|EMCA features]] (partially implemented already) and our [https://savannah.gnu.org/bugs/?group=liberty-eiffel issue tracker].&lt;br /&gt;
&lt;br /&gt;
== Release names ==&lt;br /&gt;
See [[Versions history|list of released versions]] and [[Upcoming releases]].&lt;br /&gt;
&lt;br /&gt;
== Liberty Eiffel Community ==&lt;br /&gt;
Join us via our mailing list by simply e-mailing to [mailto:liberty-eiffel@gnu.org liberty-eiffel@gnu.org] or browse the [http://lists.gnu.org/archive/html/liberty-eiffel/ list archives]. Or choose any other way to [[Get in touch]] with the Liberty Eiffel team.&lt;br /&gt;
&lt;br /&gt;
==Origins of Liberty Eiffel's predecessor==&lt;br /&gt;
&lt;br /&gt;
During the course of his work on his thesis, [[User:Colnet|Dominique Colnet]], principal author of the legacy SmartEiffel system, discovered the Eiffel language while editing an encyclopedic work on object oriented languages &lt;br /&gt;
([[Bibliography#MNCLT 1989|[MNCLT 1989]]], [[Bibliography#MNCLT 1991|[MNCLT 1991]]]).&lt;br /&gt;
&lt;br /&gt;
Holding the post of Assistant Professor of Computer Science in 1989, the Powers That Be at his educational institution at the time (1990) decided to use the Eiffel language for introductory computer science.&lt;br /&gt;
It is amusing to mention here that Dominique Colnet was at the time a fervent defender of Smalltalk.&lt;br /&gt;
As everyone knows, it's a pretty good thing that it's not up to a young Assistant Professor of Computer Science to decide which programming language is the best one to use.&lt;br /&gt;
So, it is amusing to note that Dominique Colnet was forced to use Eiffel against his will in 1990!&lt;br /&gt;
&lt;br /&gt;
In order to reconcile his teaching and research work on the compilation of object oriented languages, Dominique Colnet decided to abandon Smalltalk for Eiffel and to establish a project to kill two birds with one stone: combine interesting research with a free product that would also be useful for teaching - which actually started in 1994 when he decided to write his own Eiffel compiler.&lt;br /&gt;
&lt;br /&gt;
Writing an Eiffel compiler is no small undertaking. Before making this decision, Dominique Colnet had begun to write a new Eiffel class library whose architecture simply corresponded nearly word for word with the base classes of Smalltalk-80 libraries at the time ([[Bibliography#GR 1983|[GR 1983]]], &lt;br /&gt;
[[Bibliography#Goldberg 1984|[Goldberg 1984]]]).&lt;br /&gt;
Because of the very bad quality of the commercial Eiffel compilers available at that time the decision was taken to write a new one from scratch.&lt;br /&gt;
The new compiler was named ''SmallEiffel'' to make reference to both Smalltalk &lt;br /&gt;
and Eiffel ([[Bibliography#OOSC 1988|[OOSC 1988]]], [[Bibliography#ETL 1992|[ETL 1992]]]).&lt;br /&gt;
An entire year was necessary to write the first version of SmallEiffel and it was not until July 1995 that SmallEiffel was able to compile itself. Since that time, more than &lt;br /&gt;
[[versions_history|thirty versions]] have seen the light of day.&lt;br /&gt;
&lt;br /&gt;
==Little SmartEiffel developing into something bigger?==&lt;br /&gt;
Starting out as simple research prototype and teaching aid in 1995, SE saw its capabilities steadily increase from version to version.&lt;br /&gt;
&lt;br /&gt;
In 1998, on the occasion of a visit to LORIA by Richard Stallman, president and founder of the FSF (Free Software Foundation), the GNU designation was added to the project's name. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;EcmaEiffel&amp;quot;&amp;gt;&lt;br /&gt;
From 2002 and up to 2005, Dominique Colnet participated actively in meetings with the initial objective of standardizing the Eiffel language &lt;br /&gt;
('''ECMA''' standards committee TC39-TG4, ECMA standard number 367).&lt;br /&gt;
Of course it goes without saying that the entire SE-team was associated with the standards work and its many long discussions...&lt;br /&gt;
&lt;br /&gt;
Finally, in May 2005, the SE-project team announced that it was going to continue to work on the ''true Eiffel language''. In reality, the language described by the ECMA TC39-TG4 working group clearly had diverged from what was conventionally called Eiffel. ECMA-Eiffel is a very different language, and above all, not yet experimented. The SE-team decided to never implement ECMA TC39-TG4.&lt;br /&gt;
 '''Note:''' In this respect the Liberty Eiffel development team is&amp;lt;br&amp;gt; not as strict as the original SE-developers used to be.&amp;lt;br&amp;gt; See [[ECMA]] about Liberty's attitude to ECMA.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In July 2005, at the time when these lines got written, after more than 10 years of work not only on the compiler but also on the Eiffel language itself, the SE-team considered that the Eiffel language as they knew it contained nearly all desirable features.&lt;br /&gt;
Therefore, version 2.2 of SE marked the debut of a new level of stability and corresponded to what the team thought of as being the ''true Eiffel language''.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Comparison_of_objects&amp;diff=2745</id>
		<title>Comparison of objects</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Comparison_of_objects&amp;diff=2745"/>
		<updated>2024-07-30T15:41:57Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Comparing two objects==&lt;br /&gt;
How to compare two objects is a problem that has to be mastered fairly quickly, for it is a very common problem posed in many, if not '''almost all applications'''.&lt;br /&gt;
&lt;br /&gt;
In Eiffel, as in most object-oriented languages, there are several ways to compare two objects, whether by comparing their respective addresses or by comparing the information contained in each of the two objects. In other words, using Eiffel terminology, one must choose whether to use [[#EqNeq|the predefined = operator]] or the redefinable [[#is_equal|&amp;lt;TT&amp;gt;is_equal&amp;lt;/TT&amp;gt;]] routine.&lt;br /&gt;
&lt;br /&gt;
Because the Eiffel language aims, as far as possible, to prevent careless mistakes, it is not possible to compare just any type of expression with any other type of expression. The [[#ValidComparison|validity of a comparison]] will be explained in detail below.&lt;br /&gt;
&lt;br /&gt;
Finally, just for completeness, this part will also discuss the possibility of carrying out a third sort of comparison, [[#is_deep_equal|deep equality]], a comparison reserved only for a very rare family of applications.&lt;br /&gt;
&amp;lt;div id=&amp;quot;EqNeq&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comparison using the operators &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; or &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt;==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Let there be two variables &amp;lt;TT&amp;gt;point_a&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;point_b&amp;lt;/TT&amp;gt;,&lt;br /&gt;
both of type &amp;lt;TT&amp;gt;POINT&amp;lt;/TT&amp;gt;.&lt;br /&gt;
Let us suppose that these two variables have been initialised with&lt;br /&gt;
something other than [[Void|&amp;lt;tt&amp;gt;Void&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
The following code fragment shows a possible usage of the&lt;br /&gt;
predefined &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; comparison operator:&lt;br /&gt;
 if point_a = point_b then&lt;br /&gt;
    io.put_string(&amp;quot;We have a single, unique POINT !&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;We have two POINTs at different memory locations.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
The &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; operator is the fundamental building block for&lt;br /&gt;
comparison.&lt;br /&gt;
In the case of a reference type, it corresponds simply to the direct comparison of&lt;br /&gt;
the two addresses;&lt;br /&gt;
what the two addresses point to is not considered.&lt;br /&gt;
If our two variables &amp;lt;TT&amp;gt;point_a&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;point_b&amp;lt;/TT&amp;gt; actually designate &lt;br /&gt;
a single, unique &amp;lt;TT&amp;gt;POINT&amp;lt;/TT&amp;gt; in memory, then the test above evaluates to true.&lt;br /&gt;
Once there are two distinct &amp;lt;TT&amp;gt;POINT&amp;lt;/TT&amp;gt;s in memory,&lt;br /&gt;
then the test is false even if the two &amp;lt;TT&amp;gt;POINT&amp;lt;/TT&amp;gt;s seem exactly identical,&lt;br /&gt;
in the debugger, for example, or when printed.&lt;br /&gt;
&lt;br /&gt;
Note that we also have the &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operator, which corresponds to the&lt;br /&gt;
negation of the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; operator.&lt;br /&gt;
The &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operator is also predefined and is simply a shortcut to avoid&lt;br /&gt;
having to use &amp;lt;TT&amp;gt;not&amp;lt;/TT&amp;gt; for negation.&lt;br /&gt;
So to test whether a reference variable refers to an object, the usage is:&lt;br /&gt;
 if point /= Void then&lt;br /&gt;
    io.put_string(&amp;quot;The variable point refers to a POINT!&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;The variable point does not refer to any object.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
When comparing variables of an expanded type, the effect of the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and&lt;br /&gt;
&amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operators is simply to compare the values in question.&lt;br /&gt;
For two variables of type &amp;lt;TT&amp;gt;INTEGER&amp;lt;/TT&amp;gt;, that boils down to comparing the two numbers:&lt;br /&gt;
 if integer_a = integer_b then&lt;br /&gt;
    io.put_string(&amp;quot;integer_a is the same value as integer_b!&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;The two values are different.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
The essential details about the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; predefined operators have&lt;br /&gt;
now been clearly explained above, at least, so we hope.&lt;br /&gt;
If you are reading this to find out about comparison methods, go straight to the&lt;br /&gt;
section on [[#is_equal|&amp;lt;TT&amp;gt;is_equal&amp;lt;/TT&amp;gt;]].&lt;br /&gt;
Otherwise, continue to the next section for additional information about&lt;br /&gt;
these two predefined operators.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;EqNeqOnExpanded&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==The &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operators with expanded types==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operators, apart from being predefined, are '''non-redefinable''' operators. The effect of &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; is completely fixed in the compiler's internals.&lt;br /&gt;
&lt;br /&gt;
When comparing two expressions of a reference type with the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; or &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operators, as has already been mentioned above, only the two addresses are compared. Now let us see what happens when the two compared expressions are of an expanded type.&lt;br /&gt;
&lt;br /&gt;
Comparing two expanded expressions using &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; simply comes down to comparing, at the lowest level, bit by bit, the two areas of memory corresponding to the two objects. Of course, the expanded type used on the left of the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; operator must be compatible with the expanded type used on the right. Indeed, apart from some [[#ExceptionalRules|rare exceptions]] which we will go into later, a comparison is accepted only when the two expanded types are exactly the same. It is obviously possible to compare two expressions of type &lt;br /&gt;
[[library_class:CHARACTER|&amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt;]] with each other; and, for example, to compare two expressions of type [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]] with each other. In order to avoid any careless mistakes, however, directly comparing a [[library_class:CHARACTER|&amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt;]] with an [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]] is forbidden. In the latter case, it is up to the program's designer to make a call to the appropriate conversion routine. There are multiple possibilities, perhaps to convert the &amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt; expression into a &amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt;, or, contrariwise,&lt;br /&gt;
to convert the &amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt; expression into an &amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;. In both cases there are many possible conversion routines. Several routines exist, for example, to convert from &amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;. Here are two such examples, among many others:&lt;br /&gt;
 if my_character.to_integer = my_integer then&lt;br /&gt;
    io.put_string(&amp;quot;Conversion with possible sign extension.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
and again:&lt;br /&gt;
 if my_character.decimal_value = my_integer then&lt;br /&gt;
     io.put_string(&amp;quot;Conversion using the value of the corresponding number.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
Thus, it seems completely impossible to automate the choice of conversion that should be applied before the comparison. It depends entirely on the context of the comparison, on the problem being dealt with, and this choice must be made manually by the program's designer. The strict rule, to allow the comparison of two expanded objects only when they have exactly the same type, is indeed the simplest and safest. Thus, if the compiler rejects your comparison expression, read the error message carefully and choose the most appropriate conversion with care. That being said, two exceptions to this very strict rule remain, probably for historical reasons.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;ExceptionalRules&amp;quot;&amp;gt;&lt;br /&gt;
The two exceptions concern two special cases that '''leave no doubt''' thanks to the fact that the expanded objects concerned are very elementary. The first exception to the strict rule, requiring two expanded types to be identical, concerns the case of two objects taken from the set &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;[[library_class:INTEGER_8|&amp;lt;tt&amp;gt;INTEGER_8&amp;lt;/tt&amp;gt;]], [[library_class:INTEGER_16|&amp;lt;tt&amp;gt;INTEGER_16&amp;lt;/tt&amp;gt;]], [[library_class:INTEGER_32|&amp;lt;tt&amp;gt;INTEGER_32&amp;lt;/tt&amp;gt;]], [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]], [[library_class:INTEGER_64|&amp;lt;tt&amp;gt;INTEGER_64&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;. Comparison using &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; is true if and only if the two values correspond to exactly the same integer value. In fact, without any loss of information, it is always possible to represent in 16 bits any number that is represented in 8 bits; and so on and so forth. This exception to the ''hard and fast rule'' therefore lets us write simply and without risk:&lt;br /&gt;
 if my_integer_8 = my_integer_16 then ...&lt;br /&gt;
Knowing that, it is as if we had written:&lt;br /&gt;
 if my_integer_8.to_integer_16 = my_integer_16 then ...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second and last exception is similar to the preceding one and concerns the following set of expanded types: &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;[[library_class:REAL_32|&amp;lt;tt&amp;gt;REAL_32&amp;lt;/tt&amp;gt;]], [[library_class:REAL_64|&amp;lt;tt&amp;gt;REAL_64&amp;lt;/tt&amp;gt;]], [[library_class:REAL|&amp;lt;tt&amp;gt;REAL&amp;lt;/tt&amp;gt;]], [[library_class:REAL_80|&amp;lt;tt&amp;gt;REAL_80&amp;lt;/tt&amp;gt;]], [[library_class:REAL_128|&amp;lt;tt&amp;gt;REAL_128&amp;lt;/tt&amp;gt;]], [[library_class:REAL_EXTENDED|&amp;lt;tt&amp;gt;REAL_EXTENDED&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;. Like the integers, for the set of floating point numbers in question, it is always possible to convert a given floating point number to a bigger number of bits without any loss of information. Thus, a comparison expression using &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt; can mix two types taken from the &amp;lt;tt&amp;gt;REAL_*&amp;lt;/tt&amp;gt; family.&lt;br /&gt;
&lt;br /&gt;
Note, finally, that it is forbidden to compare directly any object from the &amp;lt;tt&amp;gt;REAL_*&amp;lt;/tt&amp;gt; family with any object from the &amp;lt;tt&amp;gt;INTEGER_*&amp;lt;/tt&amp;gt; family. If you find yourself having to make such a comparison, which is not illogical, it is up to you to decide which conversion routine is appropriate to your needs. The Eiffel language has no rule that could decide this for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;is_equal&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==The redefinable &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The redefinable &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine provides a more sophisticated comparison than using [[#EqNeq|the predefined = operator]]. Consider once again our example of comparing two variables of type &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt;, but this time let us use &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt;. As in the case above, let us suppose for the moment that the two variables &amp;lt;tt&amp;gt;point_a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;point_b&amp;lt;/tt&amp;gt; are initialised with something other than [[Void|&amp;lt;tt&amp;gt;Void&amp;lt;/tt&amp;gt;]]:&lt;br /&gt;
 if point_a.is_equal(point_b) then&lt;br /&gt;
    io.put_string(&amp;quot;Either they are both the same POINT or else they are 2 identical POINTs.&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;They are two different POINTs.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
In a given class, if the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine has not been redefined by the user, the behaviour of &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; is to compare all attributes of the two objects with each other. That means, for the &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt; example, successively comparing the two &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; attributes and then the two &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; attributes. In other words, it is as if we had written:&lt;br /&gt;
 if (point_a.x = point_b.x) and (point_a.y = point_b.y) then&lt;br /&gt;
    io.put_string(&amp;quot;Either they are both the same POINT or else they are 2 identical POINTs.&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;They are two different POINTs.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
See how the comparison between attributes does not use &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt;, but the basic fixed &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; operator. The following diagram presents a picture of the possible memory contents during comparison of &amp;lt;tt&amp;gt;point_a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;point_b&amp;lt;/tt&amp;gt;. Note that in the following case, these two &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt;s situated in two memory locations are identical and, consequently, comparison using &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; will return &amp;lt;tt&amp;gt;True&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[Image:IsEqualPoints.png|is_equal with some POINTs]]&lt;br /&gt;
&lt;br /&gt;
In the example above, the two objects that are being compared are both instances of the &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt; class: very simple objects. As the diagram shows, a &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt; is composed of two expanded attributes, or, more precisely, the attributes &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; of type [[library_class:REAL|&amp;lt;tt&amp;gt;REAL&amp;lt;/tt&amp;gt;]], a primitive expanded type (i.e. without an intermediate pointer). In this case the default definition of the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function fits perfectly.&lt;br /&gt;
&lt;br /&gt;
Before describing &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; any further, let us make it clear that &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; can be used when the type of the two compared&lt;br /&gt;
objects is expanded. For example, with [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]]s, the result of a comparison using the predefined &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; operator has exactly the same effect as using the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine. Note however that using &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; is quite unusual when the two operands are expanded, especially if it is a basic expanded type like [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]], [[library_class:CHARACTER|&amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt;]], [[library_class:REAL|&amp;lt;tt&amp;gt;REAL&amp;lt;/tt&amp;gt;]] or [[library_class:BOOLEAN|&amp;lt;tt&amp;gt;BOOLEAN&amp;lt;/tt&amp;gt;]]. In general, by convention and especially for the sake of simplicity, &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt; are preferred for primitive expanded types.&lt;br /&gt;
&lt;br /&gt;
As soon as the objects are more complex, with for example some attributes that themselves point towards other objects, it is necessary to pay attention to the predefined behaviour of the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function. Consider for example the case of comparing two &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt;s, as in the following diagram:&lt;br /&gt;
&lt;br /&gt;
[[Image:IsEqualTriangles.png|is_equal with some TRIANGLEs]]&lt;br /&gt;
&lt;br /&gt;
Both objects of class &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt; in the diagram above are identical but if one proceeds to compare them using the predefined &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine the result will be &amp;lt;tt&amp;gt;False&amp;lt;/tt&amp;gt;! In fact, let us emphasise that &amp;lt;tt&amp;gt;triangle_a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;triangle_b&amp;lt;/tt&amp;gt; designate, even if they are similar, two distinct objects in memory. Indeed, if the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function has not been redefined in the &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt; class, the comparison of &amp;lt;tt&amp;gt;triangle_a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;triangle_b&amp;lt;/tt&amp;gt; using &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt;, in other words the [[Glossary#Expression|expression]]:&lt;br /&gt;
&lt;br /&gt;
 triangle_a.is_equal(triangle_b)&lt;br /&gt;
&lt;br /&gt;
is equivalent to the expression:&lt;br /&gt;
&lt;br /&gt;
 (triangle_a.p1 = triangle_b.p1) and (triangle_a.p2 = triangle_b.p2) and (triangle_a.p3 = triangle_b.p3)&lt;br /&gt;
&lt;br /&gt;
The expression above corresponds to the predefined behaviour of &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt;. In order to obtain a more useful comparison function, it is up to the designer of the &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt; class to think of how to alter the predefined definition by redefining &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function like this:&lt;br /&gt;
&lt;br /&gt;
 is_equal (other: TRIANGLE): BOOLEAN is&lt;br /&gt;
    do&lt;br /&gt;
       Result := p1.is_equal(other.p1) and p2.is_equal(other.p2) and p3.is_equal(other.p3)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
It is very hard to imagine how a ''good function'' for comparison could be defined automatically. In particular, it is not always enough to call &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; again on the attributes, as in the &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt; case, rather than using &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;. (To convince youself of this, see the [[library_class:STRING|&amp;lt;tt&amp;gt;STRING&amp;lt;/tt&amp;gt;]] and [[library_class:ARRAY|&amp;lt;tt&amp;gt;ARRAY&amp;lt;/tt&amp;gt;]] classes as examples.) Thus, since we do not know how to automate this task with a language rule or by adding a strong dose of intelligence to the compiler, the job belongs solely to the designer of the class. The conscientious class designer must ensure that the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function behaves properly for objects of that class. The default behaviour described above has been chosen for its simplicity, because it is is for the most part suitable as a ''good'' comparison function and also because it is implemented easily in low level machine instructions that are very fast (comparison instructions for two memory blocks).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;ValidComparison&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comparison validity==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Do not look for the definition of the [[#EqNeq|&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt;]] &lt;br /&gt;
comparison operators in the Eiffel classes' source&lt;br /&gt;
code, because these two operators are predefined and their definition is deliberately fixed in the compiler's internals.&lt;br /&gt;
Since one of the goals of the Eiffel language is to limit the possibility of careless errors,&lt;br /&gt;
it would not be reasonable to allow just any comparison (that is, to allow all mixtures, like&lt;br /&gt;
comparing a &amp;lt;tt&amp;gt;LORRY&amp;lt;/tt&amp;gt; with a&lt;br /&gt;
&amp;lt;tt&amp;gt;FLOWER&amp;lt;/tt&amp;gt;, to take an extreme example).&lt;br /&gt;
The [[Glossary#StaticType|static types]] of two [[Glossary#Expression|expressions]] to be&lt;br /&gt;
compared must conform to certain constraints. &lt;br /&gt;
Of course -- and this is the usual case -- when the two expressions are of the same &lt;br /&gt;
[[Glossary#StaticType|static type]], the comparison is obviously allowed.&lt;br /&gt;
It is always possible to compare two expressions with the same static type using the comparison operators [[#EqNeq|&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
As soon as the two expressioms are not of the same static type, they have to conform to the following general rule.&lt;br /&gt;
A comparison of the form:&lt;br /&gt;
 x = y&lt;br /&gt;
or again:&lt;br /&gt;
 x /= y&lt;br /&gt;
is valid if it is possible to assign &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; or vice versa. &lt;br /&gt;
More precisely, seeing that &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; are not necessarily variables, either the static type of &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; is acceptable for an assignment to the static type of &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; or else the static type of &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; is acceptable for an assignment to the static type of &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The foregoing validity rule helps to check whether the program designer is writing a ''reasonable comparison''.&lt;br /&gt;
From experience, we have established that this rule, guided by common sense, is crucial for detecting upstream errors, &lt;br /&gt;
which are often careless mistakes.&lt;br /&gt;
&lt;br /&gt;
In a few ''uncommon and often obscure'' cases, this rule can perhaps be found to be too restrictive.&lt;br /&gt;
If you should find yourself in the situation where the compiler is rejecting your comparison but nevertheless you genuinely think that comparing the two expressions is desirable, you can achieve your ends by using two local variables with a more general static type (ultimately, you can use type [[library_class:ANY|&amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;]]).&lt;br /&gt;
&lt;br /&gt;
To conclude this section on the general verification rule for comparisons with the &lt;br /&gt;
[[#EqNeq|&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt;]] operators, &lt;br /&gt;
let us remember that the rule just declared above also includes the [[#ExceptionalRules|previously mentioned case]] concerning the comparison of two expressions of type &amp;lt;tt&amp;gt;INTEGER_*&amp;lt;/tt&amp;gt; or of type &amp;lt;tt&amp;gt;REAL_*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
For example, it is possible to assign an expression of type &lt;br /&gt;
[[library_class:INTEGER_16|&amp;lt;tt&amp;gt;INTEGER_16&amp;lt;/tt&amp;gt;]] to a variable of type [[library_class:INTEGER_32|&amp;lt;tt&amp;gt;INTEGER_32&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
A comparison between an expression of type &lt;br /&gt;
[[library_class:INTEGER_16|&amp;lt;tt&amp;gt;INTEGER_16&amp;lt;/tt&amp;gt;]] and one of type&lt;br /&gt;
[[library_class:INTEGER_32|&amp;lt;tt&amp;gt;INTEGER_32&amp;lt;/tt&amp;gt;]] is therefore valid.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;is_deep_equal&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comparison using &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt;, the fixed method==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Just for the sake of completeness in this section on comparing objects, let us finally be aware that the [[library_class:ANY|&amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;]] class offers the possibility of a deep comparison of two objects: the &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
The attributes of the two objects to be compared are themselves compared with the &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function and so on recursively.&lt;br /&gt;
This function recursively checks that the two objects are structurally identical.&lt;br /&gt;
Note that it is sometimes possible to have an endless loop in the object graph, for example when comparing two linked lists with a circular structure.&lt;br /&gt;
In order to be considered identical by &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt;, it must be possible to superimpose the graph of the two objects.&lt;br /&gt;
&lt;br /&gt;
The definition of the &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function is fixed in the [[library_class:ANY|&amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;]] class.&lt;br /&gt;
The &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function must be used with care because it depends entirely on the implementation of the objects which it is comparing.&lt;br /&gt;
In fact, as a general rule, it is always preferable to avoid using the &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Clean&amp;diff=2744</id>
		<title>Clean</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Clean&amp;diff=2744"/>
		<updated>2024-07-30T15:39:58Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tool]]&lt;br /&gt;
&lt;br /&gt;
= Usage =&lt;br /&gt;
 se clean [options] &amp;lt;Root-Name&amp;gt; ... &lt;br /&gt;
Command clean removes all intermediate files produced by previous compile, or compile_to_c runs. &lt;br /&gt;
Names (&amp;lt;Root-Name&amp;gt; ...) can have the Eiffel suffix, no suffix at all, or the suffix used for Liberty Eiffel command files on your system (.make on UNIX or .BAT on Windows, for example).&lt;br /&gt;
&lt;br /&gt;
= Options =&lt;br /&gt;
  -help:&lt;br /&gt;
&lt;br /&gt;
Display a brief summary of the command-line syntax and a complete list of finder options. &lt;br /&gt;
&lt;br /&gt;
 -no_remove:&lt;br /&gt;
&lt;br /&gt;
Print the name of files that would be removed, but do not remove them.e. &lt;br /&gt;
&lt;br /&gt;
 -verbose:&lt;br /&gt;
&lt;br /&gt;
Print system information during the compilation (full path of loaded files, type inference score, removed files, etc.). &lt;br /&gt;
&lt;br /&gt;
 -version:&lt;br /&gt;
&lt;br /&gt;
Show the number of the version of Liberty Eiffel you're using.&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
== Example 1 ==&lt;br /&gt;
To remove intermediate files produced for the HELLO_WORLD program. &lt;br /&gt;
Type:  clean hello_world&lt;br /&gt;
You can also type:  clean hello_world.e &lt;br /&gt;
or you can also type:  clean HELLO_WORLD &lt;br /&gt;
on Unix, you can type:  clean hello_world.make &lt;br /&gt;
on Windows, you can do:  clean hello_world.BAT &lt;br /&gt;
&lt;br /&gt;
== Example 2 ==&lt;br /&gt;
Under Unix or Windows, remove all intermediates files in the current directory : clean *.e&lt;br /&gt;
&lt;br /&gt;
If the root class file is not in the current directory, you can type (for Unix) : clean *.make&lt;br /&gt;
&lt;br /&gt;
Option -verbose can be used to see which files are removed.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Clean&amp;diff=2743</id>
		<title>Clean</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Clean&amp;diff=2743"/>
		<updated>2024-07-30T15:39:31Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tool]]&lt;br /&gt;
&lt;br /&gt;
= Usage =&lt;br /&gt;
 se clean [options] &amp;lt;Root-Name&amp;gt; ... &lt;br /&gt;
Command clean removes all intermediate files produced by previous compile, or compile_to_c runs. &lt;br /&gt;
Names (&amp;lt;Root-Name&amp;gt; ...) can have the Eiffel suffix, no suffix at all, or the suffix used for Liberty Eiffel command files on your system (.make on UNIX or .BAT on Windows, for example).&lt;br /&gt;
&lt;br /&gt;
= Options =&lt;br /&gt;
  -help:&lt;br /&gt;
&lt;br /&gt;
Display a brief summary of the command-line syntax and a complete list of finder options. &lt;br /&gt;
&lt;br /&gt;
 -no_remove:&lt;br /&gt;
&lt;br /&gt;
Print the name of files that would be removed, but do not remove them.e. &lt;br /&gt;
&lt;br /&gt;
 -verbose:&lt;br /&gt;
&lt;br /&gt;
Print system information during the compilation (full path of loaded files, type inference score, removed files, etc.). &lt;br /&gt;
&lt;br /&gt;
 -version:&lt;br /&gt;
&lt;br /&gt;
Show the number of the version of LibertyEiffel you're using. &lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
== Example 1 ==&lt;br /&gt;
To remove intermediate files produced for the HELLO_WORLD program. &lt;br /&gt;
Type:  clean hello_world&lt;br /&gt;
You can also type:  clean hello_world.e &lt;br /&gt;
or you can also type:  clean HELLO_WORLD &lt;br /&gt;
on Unix, you can type:  clean hello_world.make &lt;br /&gt;
on Windows, you can do:  clean hello_world.BAT &lt;br /&gt;
&lt;br /&gt;
== Example 2 ==&lt;br /&gt;
Under Unix or Windows, remove all intermediates files in the current directory : clean *.e&lt;br /&gt;
&lt;br /&gt;
If the root class file is not in the current directory, you can type (for Unix) : clean *.make&lt;br /&gt;
&lt;br /&gt;
Option -verbose can be used to see which files are removed.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Lib/xml&amp;diff=2742</id>
		<title>Lib/xml</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Lib/xml&amp;diff=2742"/>
		<updated>2024-07-30T15:38:55Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Library]]&lt;br /&gt;
== XML parsing ==&lt;br /&gt;
&lt;br /&gt;
XML is used a lot these days, even by the library itself (the [[library_class:STORABLE|storable]] [[library_class:REPOSITORY|repository]] uses it, see [[lib/storage]]).&lt;br /&gt;
&lt;br /&gt;
=== The parser ===&lt;br /&gt;
&lt;br /&gt;
To use the XML parser, you need to proceed in two steps:&lt;br /&gt;
# Connect the parser to an [[library_class:OUTPUT_STREAM|output stream]], using the &amp;lt;tt&amp;gt;[[library_class:XML_PARSER|XML_PARSER]].connect_to&amp;lt;/tt&amp;gt; feature;&lt;br /&gt;
# Parse the document by sending parsing events to the provided [[library_class:XML_CALLBACKS|events receiver]], using the &amp;lt;tt&amp;gt;[[library_class:XML_PARSER|XML_PARSER]].parse&amp;lt;/tt&amp;gt; feature. Either you use a real events receiver, SAX-fashion (just inherit from [[library_class:XML_CALLBACKS|&amp;lt;tt&amp;gt;XML_CALLBACKS&amp;lt;/tt&amp;gt;]]); or you can provide an [[library_class:XML_TREE|&amp;lt;tt&amp;gt;XML_TREE&amp;lt;/tt&amp;gt;]], DOM-fashion (this tree implements the events receiver interface and builds its nodes when receiving events from the parser).&lt;br /&gt;
&lt;br /&gt;
=== Events interface (&amp;quot;SAX&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
[http://www.saxproject.org/ SAX] means &amp;quot;Simple API for XML&amp;quot;. Liberty Eiffel's API is not exactly identical; nonetheless it resembles the API found in other languages.&lt;br /&gt;
&lt;br /&gt;
In this case, you have to inherit from [[library_class:XML_CALLBACKS|&amp;lt;tt&amp;gt;XML_CALLBACKS&amp;lt;/tt&amp;gt;]] and implement its many deferred features.&lt;br /&gt;
&lt;br /&gt;
During the parsing, the [[library_class:XML_PARSER|XML parser]] calls that class to tell it, it enters a node, finds some attribute, some text, and so on. Errors are also reported.&lt;br /&gt;
&lt;br /&gt;
=== Tree interface (&amp;quot;DOM&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
[http://www.w3.org/DOM/ DOM] means &amp;quot;Document Object Model&amp;quot;. Liberty Eiffel's DOM implementation is not endorsed by W3C but its API is equivalent.&lt;br /&gt;
&lt;br /&gt;
To use an [[library_class:XML_TREE|XML tree]], you have to give it to the [[library_class:XML_PARSER|XML parser]]. The tree builds itself when called back by the parser's events.&lt;br /&gt;
&lt;br /&gt;
If there were no errors, the XML tree provides a &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; feature that is an [[library_class:XML_NODE|&amp;lt;tt&amp;gt;XML_NODE&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
Errors can be managed by using the &amp;lt;tt&amp;gt;with_error_handler&amp;lt;/tt&amp;gt; feature. The given agent will be called with the errors the parser finds.&lt;br /&gt;
&lt;br /&gt;
=== Small Comparison SAX vs. DOM ===&lt;br /&gt;
&lt;br /&gt;
Using one or the other is not only a matter of taste, but it also depends on where you put your priorities. In other words, you have to evaluate performance against simplicity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;10px&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #fff3f3&amp;quot;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; align=&amp;quot;center&amp;quot;| Topic&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; align=&amp;quot;center&amp;quot;| '''DOM'''&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; align=&amp;quot;center&amp;quot;| '''SAX'''&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;center&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color: #fff3f3&amp;quot;| Simplicity&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Very simple: the whole tree is built in a preliminary pass and all the nodes are available for as long as needed afterwards.&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Less simple: the parser provides a stream of events that have to be dealt with.&lt;br /&gt;
On the other hand you have more control over which events are important and what you actually ''do'' with them.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;center&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color: #fff3f3&amp;quot;| Memory&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Memory hungry since objects are built to represent the whole tree&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Not necessarily memory hungry since there is only a stream of feature calls. Of course you may need to create your own objects but that's up to you.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;center&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color: #fff3f3&amp;quot;| Performance&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|The XML document is used in two passes:&lt;br /&gt;
# create the tree (parse the whole document)&lt;br /&gt;
# use the tree (navigate in the tree to find nodes of interest)&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|The XML document may be exploited in one pass since you have first-hand access to the events during the parsing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
&lt;br /&gt;
To validate an XML file, Liberty Eiffel provides a DTD parser. The XML parser may parse the provided DTD and validate your file.&lt;br /&gt;
&lt;br /&gt;
The parser recognizes any kind of DTD: inlined, in a file or on the network. You may also use a cache that locally provides network DTDs (see [[library_class:XML_DTD_PUBLIC_REPOSITORY|&amp;lt;tt&amp;gt;XML_DTD_PUBLIC_REPOSITORY&amp;lt;/tt&amp;gt;]]).&lt;br /&gt;
&lt;br /&gt;
== Namespaces and other advanced features ==&lt;br /&gt;
&lt;br /&gt;
Namespaces are not yet natively implemented in Liberty Eiffel, but they will be added later ('''contributions welcome!!''')&lt;br /&gt;
&lt;br /&gt;
The idea is to implement some new kind of XML_CALLBACK that takes the semicolon in nodes names into account.&lt;br /&gt;
&lt;br /&gt;
Schema validation (therefore using namespaces) may be set by calling &amp;lt;tt&amp;gt;[[library_class:XML_CALLBACKS|XML_CALLBACKS]].set_validator&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Path parsing has to be implemented.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Lib/xml&amp;diff=2741</id>
		<title>Lib/xml</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Lib/xml&amp;diff=2741"/>
		<updated>2024-07-30T15:37:21Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Library]]&lt;br /&gt;
== XML parsing ==&lt;br /&gt;
&lt;br /&gt;
XML is used a lot these days, even by the library itself (the [[library_class:STORABLE|storable]] [[library_class:REPOSITORY|repository]] uses it, see [[lib/storage]]).&lt;br /&gt;
&lt;br /&gt;
=== The parser ===&lt;br /&gt;
&lt;br /&gt;
To use the XML parser, you need to proceed in two steps:&lt;br /&gt;
# Connect the parser to an [[library_class:OUTPUT_STREAM|output stream]], using the &amp;lt;tt&amp;gt;[[library_class:XML_PARSER|XML_PARSER]].connect_to&amp;lt;/tt&amp;gt; feature;&lt;br /&gt;
# Parse the document by sending parsing events to the provided [[library_class:XML_CALLBACKS|events receiver]], using the &amp;lt;tt&amp;gt;[[library_class:XML_PARSER|XML_PARSER]].parse&amp;lt;/tt&amp;gt; feature. Either you use a real events receiver, SAX-fashion (just inherit from [[library_class:XML_CALLBACKS|&amp;lt;tt&amp;gt;XML_CALLBACKS&amp;lt;/tt&amp;gt;]]); or you can provide an [[library_class:XML_TREE|&amp;lt;tt&amp;gt;XML_TREE&amp;lt;/tt&amp;gt;]], DOM-fashion (this tree implements the events receiver interface and builds its nodes when receiving events from the parser).&lt;br /&gt;
&lt;br /&gt;
=== Events interface (&amp;quot;SAX&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
[http://www.saxproject.org/ SAX] means &amp;quot;Simple API for XML&amp;quot;. Liberty Eiffel's API is not exactly identical; nonetheless it resembles the API found in other languages.&lt;br /&gt;
&lt;br /&gt;
In this case, you have to inherit from [[library_class:XML_CALLBACKS|&amp;lt;tt&amp;gt;XML_CALLBACKS&amp;lt;/tt&amp;gt;]] and implement its many deferred features.&lt;br /&gt;
&lt;br /&gt;
During the parsing, the [[library_class:XML_PARSER|XML parser]] calls that class to tell it, it enters a node, finds some attribute, some text, and so on. Errors are also reported.&lt;br /&gt;
&lt;br /&gt;
=== Tree interface (&amp;quot;DOM&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
[http://www.w3.org/DOM/ DOM] means &amp;quot;Document Object Model&amp;quot;. Liberty Eiffel's DOM implementation is not endorsed by W3C but its API is equivalent.&lt;br /&gt;
&lt;br /&gt;
To use an [[library_class:XML_TREE|XML tree]], you have to give it to the [[library_class:XML_PARSER|XML parser]]. The tree builds itself when called back by the parser's events.&lt;br /&gt;
&lt;br /&gt;
If there were no errors, the XML tree provides a &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; feature that is an [[library_class:XML_NODE|&amp;lt;tt&amp;gt;XML_NODE&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
Errors can be managed by using the &amp;lt;tt&amp;gt;with_error_handler&amp;lt;/tt&amp;gt; feature. The given agent will be called with the errors the parser finds.&lt;br /&gt;
&lt;br /&gt;
=== Small Comparison SAX vs. DOM ===&lt;br /&gt;
&lt;br /&gt;
Using one or the other is not only a matter of taste, but it also depends on where you put your priorities. In other words, you have to evaluate performance against simplicity.&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;10px&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #fff3f3&amp;quot;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; align=&amp;quot;center&amp;quot;| Topic&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; align=&amp;quot;center&amp;quot;| '''DOM'''&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; align=&amp;quot;center&amp;quot;| '''SAX'''&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;center&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color: #fff3f3&amp;quot;| Simplicity&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Very simple: the whole tree is built in a preliminary pass and all the nodes are available for as long as needed afterwards.&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Less simple: the parser provides a stream of events that have to be dealt with.&lt;br /&gt;
On the other hand you have more control over which events are important and what you actually ''do'' with them.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;center&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color: #fff3f3&amp;quot;| Memory&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Memory hungry since objects are built to represent the whole tree&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|Not necessarily memory hungry since there is only a stream of feature calls. Of course you may need to create your own objects but that's up to you.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;center&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color: #fff3f3&amp;quot;| Performance&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|The XML document is used in two passes:&lt;br /&gt;
# create the tree (parse the whole document)&lt;br /&gt;
# use the tree (navigate in the tree to find nodes of interest)&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|The XML document may be exploited in one pass since you have first-hand access to the events during the parsing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
&lt;br /&gt;
To validate an XML file, Liberty Eiffel provides a DTD parser. The XML parser may parse the provided DTD and validate your file.&lt;br /&gt;
&lt;br /&gt;
The parser recognizes any kind of DTD: inlined, in a file or on the network. You may also use a cache that locally provides network DTDs (see [[library_class:XML_DTD_PUBLIC_REPOSITORY|&amp;lt;tt&amp;gt;XML_DTD_PUBLIC_REPOSITORY&amp;lt;/tt&amp;gt;]]).&lt;br /&gt;
&lt;br /&gt;
== Namespaces and other advanced features ==&lt;br /&gt;
&lt;br /&gt;
Namespaces are not yet natively implemented in Liberty Eiffel, but they will be added later ('''contributions welcome!!''')&lt;br /&gt;
&lt;br /&gt;
The idea is to implement some new kind of XML_CALLBACK that takes the semi-colon in nodes names into account.&lt;br /&gt;
&lt;br /&gt;
Schema validation (therefore using namespaces) may be set by calling &amp;lt;tt&amp;gt;[[library_class:XML_CALLBACKS|XML_CALLBACKS]].set_validator&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Path parsing has to be implemented.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Tools&amp;diff=2740</id>
		<title>Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Tools&amp;diff=2740"/>
		<updated>2024-07-30T12:29:01Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Tool]]&lt;br /&gt;
Liberty Eiffel provides many tools besides the [[compile|compiler]].&lt;br /&gt;
&lt;br /&gt;
All these tools use the [[configuration file]].&lt;br /&gt;
&lt;br /&gt;
== The tools ==&lt;br /&gt;
&lt;br /&gt;
=== Toolbox ===&lt;br /&gt;
&lt;br /&gt;
* [[se]]: a facade to all those tools&lt;br /&gt;
&lt;br /&gt;
=== Compiling ===&lt;br /&gt;
&lt;br /&gt;
* [[clean]]: remove temporary C files after compilation&lt;br /&gt;
* [[compile]]: the compiler (calls [[compile_to_c]])&lt;br /&gt;
* [[compile_to_c]]: the C compiler core&lt;br /&gt;
* [[extract_internals]]: the tentative inter-program object sharing tool&lt;br /&gt;
* [[Wrapping_C_libraries|wrappers_generator]]: a tools to generate low-level Eiffel wrappers for C code&lt;br /&gt;
&lt;br /&gt;
=== Searching and documenting ===&lt;br /&gt;
&lt;br /&gt;
* [[eiffeldoc]]: generates the whole documentation of a project&lt;br /&gt;
* [[finder]]: finds a class&lt;br /&gt;
* [[pretty]]: makes your source file pretty&lt;br /&gt;
* [[short]]: generates the interface documentation of a single class&lt;br /&gt;
&lt;br /&gt;
=== Testing ===&lt;br /&gt;
&lt;br /&gt;
* [[ace_check]]: checks an [[ACE|ACE file]]&lt;br /&gt;
* [[class_check]]: checks the [[parsing|syntax]] and the [[semantics]] of a source code&lt;br /&gt;
* [[eiffeltest]]: the Liberty Eiffel testing tool&lt;br /&gt;
* [[mock]]: the Liberty Eiffel mock tool&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
&lt;br /&gt;
* [[install]]: installs the Liberty Eiffel tools&lt;br /&gt;
&lt;br /&gt;
== The system core ==&lt;br /&gt;
&lt;br /&gt;
If you are interested in how the system works, either by sheer curiosity, or because you want to modify it, here are some explanations.&lt;br /&gt;
&lt;br /&gt;
If you want to create a new Liberty Eiffel-oriented tool, this information is important too; also look at [[tool_class:EXTERNAL_TOOL|&amp;lt;tt&amp;gt;EXTERNAL_TOOL&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
* [[class loading]]&lt;br /&gt;
* [[parsing|syntactic analysis]]&lt;br /&gt;
* [[semantics|semantic analysis]]&lt;br /&gt;
* the [[optimizer]]&lt;br /&gt;
* the [[visitor|visitors]]&lt;br /&gt;
* code generation&lt;br /&gt;
** [[compile_to_c#Generation|compile_to_c]]&lt;br /&gt;
** [[compile_to_jvm#Generation|compile_to_jvm (obsolete)]]&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Lib/sequencer_offers_Multitasking&amp;diff=2739</id>
		<title>Lib/sequencer offers Multitasking</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Lib/sequencer_offers_Multitasking&amp;diff=2739"/>
		<updated>2024-07-30T12:28:00Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Library]]&lt;br /&gt;
The &amp;lt;tt&amp;gt;lib/sequencer&amp;lt;/tt&amp;gt; library implements an event-driven, priority-based, cooperative multitasker. The sequencer library does not start new threads or any other separate processes. Unlike &amp;quot;pure&amp;quot; cooperative multitasking, a task cannot stop at any time (using a hypothetical &amp;lt;tt&amp;gt;yield&amp;lt;/tt&amp;gt; feature) but only in known and stable states. The sequencer library does it this way to retain conformance to Eiffel principles.&lt;br /&gt;
&lt;br /&gt;
The sequencer library concepts:&lt;br /&gt;
&lt;br /&gt;
* the class [[library_class:LOOP_STACK|&amp;lt;tt&amp;gt;LOOP_STACK&amp;lt;/tt&amp;gt;]] manages the multitasking;&lt;br /&gt;
* the class [[library_class:JOB|&amp;lt;tt&amp;gt;JOB&amp;lt;/TT&amp;gt;]] represents a task. The task core is the &amp;lt;tt&amp;gt;continue&amp;lt;/tt&amp;gt; feature, during the execution of which the task controls the whole system;&lt;br /&gt;
* the class [[library_class:EVENTS_SET|&amp;lt;tt&amp;gt;EVENTS_SET&amp;lt;/tt&amp;gt;]] describes the condition(s) in which a task can be executed.&lt;br /&gt;
&lt;br /&gt;
We will successively document each of these concepts:&lt;br /&gt;
&lt;br /&gt;
== The multitasking manager ==&lt;br /&gt;
The class [[library_class:LOOP_STACK|&amp;lt;tt&amp;gt;LOOP_STACK&amp;lt;/tt&amp;gt;]] is in charge of managing the multitasking. It is used in two steps:&lt;br /&gt;
* initialization: creation of the &amp;lt;tt&amp;gt;LOOP_STACK&amp;lt;/tt&amp;gt; object and adding the task(s) to be executed&lt;br /&gt;
* execution: execution of the &amp;lt;tt&amp;gt;run&amp;lt;/tt&amp;gt; feature&lt;br /&gt;
&lt;br /&gt;
Of course, additional tasks can be added during the execution. The manager can also be stopped, thanks to the &amp;lt;tt&amp;gt;break&amp;lt;/tt&amp;gt; feature.&lt;br /&gt;
&lt;br /&gt;
Note that the loop stack contains many execution loops ([[library_class:LOOP_ITEM|&amp;lt;tt&amp;gt;LOOP_ITEM&amp;lt;/tt&amp;gt;]]). This allows, for instance, the implementation of a kind of ''modality'' (e.g. the modal windows in [[lib/vision|Vision]]).&lt;br /&gt;
&lt;br /&gt;
== Tasks ==&lt;br /&gt;
&lt;br /&gt;
A task has a life cycle represented by the features executed by the manager (indeed a [[library_class:LOOP_ITEM|&amp;lt;tt&amp;gt;LOOP_ITEM&amp;lt;/tt&amp;gt;]] hence the export clauses of those features).&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;prepare&amp;lt;/tt&amp;gt; allows preparing the task; in this phase, the task sets the events upon which it wants to be activated. The [[library_class:EVENTS_SET|&amp;lt;tt&amp;gt;EVENTS_SET&amp;lt;/tt&amp;gt;]] object is an object upon which one can set conditions (thanks to its &amp;lt;tt&amp;gt;expect&amp;lt;/tt&amp;gt; feature).&lt;br /&gt;
# &amp;lt;tt&amp;gt;is_ready&amp;lt;/tt&amp;gt; allows testing if the task has really been activated. The [[library_class:EVENTS_SET|&amp;lt;tt&amp;gt;EVENTS_SET&amp;lt;/tt&amp;gt;]] object is an object upon which one can test conditions (thanks to its &amp;lt;tt&amp;gt;event_occurred&amp;lt;/tt&amp;gt; feature).&lt;br /&gt;
# &amp;lt;tt&amp;gt;continue&amp;lt;/tt&amp;gt; contains the execution body of the task, and is executed upon task activation.&lt;br /&gt;
# &amp;lt;tt&amp;gt;done&amp;lt;/tt&amp;gt; tells if the task has finished its execution. If so, it will be removed from the execution loop. Otherwise, the cycle begins again.&lt;br /&gt;
# &amp;lt;tt&amp;gt;restart&amp;lt;/tt&amp;gt; allows reinserting a task in the execution loop.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;restart&amp;lt;/tt&amp;gt; feature is seldom useful. See [[lib/vision|Vision]] for some use cases.&lt;br /&gt;
&lt;br /&gt;
== Execution conditions ==&lt;br /&gt;
&lt;br /&gt;
The class [[library_class:EVENTS_SET|&amp;lt;tt&amp;gt;EVENTS_SET&amp;lt;/tt&amp;gt;]] allows setting and test conditions ([[library_class:EVENT_DESCRIPTOR|&amp;lt;tt&amp;gt;EVENT_DESCRIPTOR&amp;lt;/tt&amp;gt;]]s).&lt;br /&gt;
&lt;br /&gt;
The possible conditions are:&lt;br /&gt;
&lt;br /&gt;
* '''Time''': this allows to create periodic tasks. See the classes [[library_class:PERIODIC_JOB|&amp;lt;tt&amp;gt;PERIODIC_JOB&amp;lt;/tt&amp;gt;]], [[library_class:BACKGROUND_JOB|&amp;lt;tt&amp;gt;BACKGROUND_JOB&amp;lt;/tt&amp;gt;]], and [[library_class:TIME_EVENTS|&amp;lt;tt&amp;gt;TIME_EVENTS&amp;lt;/tt&amp;gt;]];&lt;br /&gt;
* '''Input-output''':&lt;br /&gt;
** ''Data on an input stream'': this allows to build tasks that wait for input data to be available (feature [[library_class:INPUT_STREAM|&amp;lt;tt&amp;gt;INPUT_STREAM&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.event_can_read&amp;lt;/tt&amp;gt;),&lt;br /&gt;
** ''Data on an output stream'': this allows to build tasks that wait until they can write on an output stream (feature [[library_class:OUTPUT_STREAM|&amp;lt;tt&amp;gt;OUTPUT_STREAM&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.event_can_write&amp;lt;/tt&amp;gt;);&lt;br /&gt;
* '''Network''': this allows to build tasks waiting network connections (feature [[library_class:SOCKET_SERVER|&amp;lt;tt&amp;gt;SOCKET_SERVER&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.event_connection&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Tasks scheduling ==&lt;br /&gt;
&lt;br /&gt;
The manager implements the following cycle:&lt;br /&gt;
&lt;br /&gt;
* call to the feature [[library_class:EVENTS_SET|&amp;lt;tt&amp;gt;EVENTS_SET&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.reset&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* call to the feature [[library_class:JOB|&amp;lt;tt&amp;gt;JOB&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.prepare&amp;lt;/tt&amp;gt; on each task;&lt;br /&gt;
* call to the feature [[library_class:EVENTS_SET|&amp;lt;tt&amp;gt;EVENTS_SET&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.wait&amp;lt;/tt&amp;gt; to wait for at least one condition to happen;&lt;br /&gt;
* call to the feature [[library_class:JOB|&amp;lt;tt&amp;gt;JOB&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.is_ready&amp;lt;/tt&amp;gt; on each task;&lt;br /&gt;
* for all the ready tasks, call to the feature [[library_class:JOB|&amp;lt;tt&amp;gt;JOB&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.continue&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* for those tasks, call to the feature [[library_class:JOB|&amp;lt;tt&amp;gt;JOB&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;.done&amp;lt;/tt&amp;gt; and if relevant, remove the task;&lt;br /&gt;
* and back to the beginning.&lt;br /&gt;
&lt;br /&gt;
== Priorities ==&lt;br /&gt;
&lt;br /&gt;
Tasks execution is by priority order. Only the ready task with the ''lowest'' priority is executed. All other tasks, even if ready, will have to wait until no other task with a lower priority is ready.&lt;br /&gt;
&lt;br /&gt;
 -note: we need to document how many priority levels &amp;lt;br&amp;gt; are supported and how the scheduling works when multiple or all tasks were given&amp;lt;br&amp;gt; an identical priority level. Would the scheduler then resort to some sort&amp;lt;br&amp;gt; of round-robin method? By what rules? Apparently '''not''' by evaluating the duration of the&amp;lt;br&amp;gt; wait for next execution, see the '''LOOP_ITEM.run''' method.  /HZ&lt;br /&gt;
&lt;br /&gt;
== Libraries using the sequencer ==&lt;br /&gt;
&lt;br /&gt;
* [[lib/net]]: servers usually allow many simultaneous connections. This is implemented with the sequencer library.&lt;br /&gt;
&lt;br /&gt;
* [[lib/vision]]: the event manager loop is implemented with a sequencer.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Comparison_of_objects&amp;diff=2738</id>
		<title>Comparison of objects</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Comparison_of_objects&amp;diff=2738"/>
		<updated>2024-07-30T12:26:34Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Comparing two objects==&lt;br /&gt;
How to compare two objects is a problem that has to be mastered fairly quickly, for it is a very common problem posed in many, if not '''almost all applications'''.&lt;br /&gt;
&lt;br /&gt;
In Eiffel, as in most object-oriented languages, there are several ways to compare two objects, whether by comparing their respective addresses or by comparing the information contained in each of the two objects. In other words, using Eiffel terminology, one must choose whether to use [[#EqNeq|the predefined = operator]] or the redefinable [[#is_equal|&amp;lt;TT&amp;gt;is_equal&amp;lt;/TT&amp;gt;]] routine.&lt;br /&gt;
&lt;br /&gt;
Because the Eiffel language aims, as far as possible, to prevent careless mistakes, it is not possible to compare just any type of expression with any other type of expression. The [[#ValidComparison|validity of a comparison]] will be explained in detail below.&lt;br /&gt;
&lt;br /&gt;
Finally, just for completeness, this part will also discuss the possibility of carrying out a third sort of comparison, [[#is_deep_equal|deep equality]], a comparison reserved only for a very rare family of applications.&lt;br /&gt;
&amp;lt;div id=&amp;quot;EqNeq&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comparison using the operators &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; or &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt;==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Let there be two variables &amp;lt;TT&amp;gt;point_a&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;point_b&amp;lt;/TT&amp;gt;,&lt;br /&gt;
both of type &amp;lt;TT&amp;gt;POINT&amp;lt;/TT&amp;gt;.&lt;br /&gt;
Let us suppose that these two variables have been initialised with&lt;br /&gt;
something other than [[Void|&amp;lt;tt&amp;gt;Void&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
The following code fragment shows a possible usage of the&lt;br /&gt;
predefined &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; comparison operator:&lt;br /&gt;
 if point_a = point_b then&lt;br /&gt;
    io.put_string(&amp;quot;We have a single, unique POINT !&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;We have two POINTs at different memory locations.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
The &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; operator is the fundamental building block for&lt;br /&gt;
comparison.&lt;br /&gt;
In the case of a reference type, it corresponds simply to the direct comparison of&lt;br /&gt;
the two addresses;&lt;br /&gt;
what the two addresses point to is not considered.&lt;br /&gt;
If our two variables &amp;lt;TT&amp;gt;point_a&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;point_b&amp;lt;/TT&amp;gt; actually designate &lt;br /&gt;
a single, unique &amp;lt;TT&amp;gt;POINT&amp;lt;/TT&amp;gt; in memory, then the test above evaluates to true.&lt;br /&gt;
Once there are two distinct &amp;lt;TT&amp;gt;POINT&amp;lt;/TT&amp;gt;s in memory,&lt;br /&gt;
then the test is false even if the two &amp;lt;TT&amp;gt;POINT&amp;lt;/TT&amp;gt;s seem exactly identical,&lt;br /&gt;
in the debugger for example, or when printed.&lt;br /&gt;
&lt;br /&gt;
Note that we also have the &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operator, which corresponds to the&lt;br /&gt;
negation of the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; operator.&lt;br /&gt;
The &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operator is also predefined and is simply a shortcut to avoid&lt;br /&gt;
having to use &amp;lt;TT&amp;gt;not&amp;lt;/TT&amp;gt; for negation.&lt;br /&gt;
So to test whether a reference variable refers to an object, the usage is:&lt;br /&gt;
 if point /= Void then&lt;br /&gt;
    io.put_string(&amp;quot;The variable point refers to a POINT!&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;The variable point does not refer to any object.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
When comparing variables of an expanded type, the effect of the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and&lt;br /&gt;
&amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operators is simply to compare the values in question.&lt;br /&gt;
For two variables of type &amp;lt;TT&amp;gt;INTEGER&amp;lt;/TT&amp;gt;, that boils down to comparing the two numbers:&lt;br /&gt;
 if integer_a = integer_b then&lt;br /&gt;
    io.put_string(&amp;quot;integer_a is the same value as integer_b!&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;The two values are different.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
The essential details about the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; predefined operators have&lt;br /&gt;
now been clearly explained above, at least, so we hope.&lt;br /&gt;
If you are reading this to find out about comparison methods, go straight to the&lt;br /&gt;
section on [[#is_equal|&amp;lt;TT&amp;gt;is_equal&amp;lt;/TT&amp;gt;]].&lt;br /&gt;
Otherwise, continue to the next section for additional information about&lt;br /&gt;
these two predefined operators.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;EqNeqOnExpanded&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==The &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operators with expanded types==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operators, apart from being predefined, are '''non-redefinable''' operators. The effect of &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; is completely fixed in the compiler's internals.&lt;br /&gt;
&lt;br /&gt;
When comparing two expressions of a reference type with the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; or &amp;lt;TT&amp;gt;/=&amp;lt;/TT&amp;gt; operators, as has already been mentioned above, only the two addresses are compared. Now let us see what happens when the two compared expressions are of an expanded type.&lt;br /&gt;
&lt;br /&gt;
Comparing two expanded expressions using &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; simply comes down to comparing, at the lowest level, bit by bit, the two areas of memory corresponding to the two objects. Of course, the expanded type used on the left of the &amp;lt;TT&amp;gt;=&amp;lt;/TT&amp;gt; operator must be compatible with the expanded type used on the right. Indeed, apart from some [[#ExceptionalRules|rare exceptions]] which we will go into later, a comparison is accepted only when the two expanded types are exactly the same. It is obviously possible to compare two expressions of type &lt;br /&gt;
[[library_class:CHARACTER|&amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt;]] with each other; and, for example, to compare two expressions of type [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]] with each other. In order to avoid any careless mistakes, however, directly comparing a [[library_class:CHARACTER|&amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt;]] with an [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]] is forbidden. In the latter case, it is up to the program's designer to make a call to the appropriate conversion routine. There are multiple possibilities, perhaps to convert the &amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt; expression into a &amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt;, or, contrariwise,&lt;br /&gt;
to convert the &amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt; expression into an &amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;. In both cases there are many possible conversion routines. Several routines exist, for example, to convert from &amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;. Here are two such examples, among many others:&lt;br /&gt;
 if my_character.to_integer = my_integer then&lt;br /&gt;
    io.put_string(&amp;quot;Conversion with possible sign extension.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
and again:&lt;br /&gt;
 if my_character.decimal_value = my_integer then&lt;br /&gt;
     io.put_string(&amp;quot;Conversion using the value of the corresponding number.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
Thus, it seems completely impossible to automate the choice of conversion that should be applied before the comparison. It depends entirely on the context of the comparison, on the problem being dealt with, and this choice must be made manually by the program's designer. The strict rule, to allow the comparison of two expanded objects only when they have exactly the same type, is indeed the simplest and safest. Thus, if the compiler rejects your comparison expression, read the error message carefully and choose the most appropriate conversion with care. That being said, two exceptions to this very strict rule remain, probably for historical reasons.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;ExceptionalRules&amp;quot;&amp;gt;&lt;br /&gt;
The two exceptions concern two special cases that '''leave no doubt''' thanks to the fact that the expanded objects concerned are very elementary. The first exception to the strict rule, requiring two expanded types to be identical, concerns the case of two objects taken from the set &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;[[library_class:INTEGER_8|&amp;lt;tt&amp;gt;INTEGER_8&amp;lt;/tt&amp;gt;]], [[library_class:INTEGER_16|&amp;lt;tt&amp;gt;INTEGER_16&amp;lt;/tt&amp;gt;]], [[library_class:INTEGER_32|&amp;lt;tt&amp;gt;INTEGER_32&amp;lt;/tt&amp;gt;]], [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]], [[library_class:INTEGER_64|&amp;lt;tt&amp;gt;INTEGER_64&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;. Comparison using &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; is true if and only if the two values correspond to exactly the same integer value. In fact, without any loss of information, it is always possible to represent in 16 bits any number that is represented in 8 bits; and so on and so forth. This exception to the ''hard and fast rule'' therefore lets us write simply and without risk:&lt;br /&gt;
 if my_integer_8 = my_integer_16 then ...&lt;br /&gt;
Knowing that, it is as if we had written:&lt;br /&gt;
 if my_integer_8.to_integer_16 = my_integer_16 then ...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The second and last exception is similar to the preceding one and concerns the following set of expanded types: &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;[[library_class:REAL_32|&amp;lt;tt&amp;gt;REAL_32&amp;lt;/tt&amp;gt;]], [[library_class:REAL_64|&amp;lt;tt&amp;gt;REAL_64&amp;lt;/tt&amp;gt;]], [[library_class:REAL|&amp;lt;tt&amp;gt;REAL&amp;lt;/tt&amp;gt;]], [[library_class:REAL_80|&amp;lt;tt&amp;gt;REAL_80&amp;lt;/tt&amp;gt;]], [[library_class:REAL_128|&amp;lt;tt&amp;gt;REAL_128&amp;lt;/tt&amp;gt;]], [[library_class:REAL_EXTENDED|&amp;lt;tt&amp;gt;REAL_EXTENDED&amp;lt;/tt&amp;gt;]]&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;. Like the integers, for the set of floating point numbers in question, it is always possible to convert a given floating point number to a bigger number of bits without any loss of information. Thus, a comparison expression using &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt; can mix two types taken from the &amp;lt;tt&amp;gt;REAL_*&amp;lt;/tt&amp;gt; family.&lt;br /&gt;
&lt;br /&gt;
Note, finally, that it is forbidden to compare directly any object from the &amp;lt;tt&amp;gt;REAL_*&amp;lt;/tt&amp;gt; family with any object from the &amp;lt;tt&amp;gt;INTEGER_*&amp;lt;/tt&amp;gt; family. If you find yourself having to make such a comparison, which is not illogical, it is up to you to decide which conversion routine is appropriate to your needs. The Eiffel language has no rule that could decide this for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;is_equal&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==The redefinable &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The redefinable &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine provides a more sophisticated comparison than using [[#EqNeq|the predefined = operator]]. Consider once again our example of comparing two variables of type &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt;, but this time let us use &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt;. As in the case above, let us suppose for the moment that the two variables &amp;lt;tt&amp;gt;point_a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;point_b&amp;lt;/tt&amp;gt; are initialised with something other than [[Void|&amp;lt;tt&amp;gt;Void&amp;lt;/tt&amp;gt;]]:&lt;br /&gt;
 if point_a.is_equal(point_b) then&lt;br /&gt;
    io.put_string(&amp;quot;Either they are both the same POINT or else they are 2 identical POINTs.&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;They are two different POINTs.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
In a given class, if the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine has not been redefined by the user, the behaviour of &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; is to compare all attributes of the two objects with each other. That means, for the &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt; example, successively comparing the two &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; attributes and then the two &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; attributes. In other words, it is as if we had written:&lt;br /&gt;
 if (point_a.x = point_b.x) and (point_a.y = point_b.y) then&lt;br /&gt;
    io.put_string(&amp;quot;Either they are both the same POINT or else they are 2 identical POINTs.&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
    io.put_string(&amp;quot;They are two different POINTs.&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
See how the comparison between attributes does not use &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt;, but the basic fixed &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; operator. The following diagram presents a picture of the possible memory contents during comparison of &amp;lt;tt&amp;gt;point_a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;point_b&amp;lt;/tt&amp;gt;. Note that in the following case, these two &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt;s situated in two memory locations are identical and, consequently, comparison using &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; will return &amp;lt;tt&amp;gt;True&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[Image:IsEqualPoints.png|is_equal with some POINTs]]&lt;br /&gt;
&lt;br /&gt;
In the example above, the two objects that are being compared are both instances of the &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt; class: very simple objects. As the diagram shows, a &amp;lt;tt&amp;gt;POINT&amp;lt;/tt&amp;gt; is composed of two expanded attributes, or, more precisely, the attributes &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; of type [[library_class:REAL|&amp;lt;tt&amp;gt;REAL&amp;lt;/tt&amp;gt;]], a primitive expanded type (i.e. without an intermediate pointer). In this case the default definition of the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function fits perfectly.&lt;br /&gt;
&lt;br /&gt;
Before describing &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; any further, let us make it clear that &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; can be used when the type of the two compared&lt;br /&gt;
objects is expanded. For example, with [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]]s, the result of a comparison using the predefined &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; operator has exactly the same effect as using the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine. Note however that using &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; is quite unusual when the two operands are expanded, especially if it is a basic expanded type like [[library_class:INTEGER|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]], [[library_class:CHARACTER|&amp;lt;tt&amp;gt;CHARACTER&amp;lt;/tt&amp;gt;]], [[library_class:REAL|&amp;lt;tt&amp;gt;REAL&amp;lt;/tt&amp;gt;]] or [[library_class:BOOLEAN|&amp;lt;tt&amp;gt;BOOLEAN&amp;lt;/tt&amp;gt;]]. In general, by convention and especially for the sake of simplicity, &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt; are preferred for primitive expanded types.&lt;br /&gt;
&lt;br /&gt;
As soon as the objects are more complex, with for example some attributes that themselves point towards other objects, it is necessary to pay attention to the predefined behaviour of the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function. Consider for example the case of comparing two &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt;s, as in the following diagram:&lt;br /&gt;
&lt;br /&gt;
[[Image:IsEqualTriangles.png|is_equal with some TRIANGLEs]]&lt;br /&gt;
&lt;br /&gt;
Both objects of class &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt; in the diagram above are identical but if one proceeds to compare them using the predefined &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; routine the result will be &amp;lt;tt&amp;gt;False&amp;lt;/tt&amp;gt;! In fact, let us emphasise that &amp;lt;tt&amp;gt;triangle_a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;triangle_b&amp;lt;/tt&amp;gt; designate, even if they are similar, two distinct objects in memory. Indeed, if the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function has not been redefined in the &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt; class, the comparison of &amp;lt;tt&amp;gt;triangle_a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;triangle_b&amp;lt;/tt&amp;gt; using &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt;, in other words the [[Glossary#Expression|expression]]:&lt;br /&gt;
&lt;br /&gt;
 triangle_a.is_equal(triangle_b)&lt;br /&gt;
&lt;br /&gt;
is equivalent to the expression:&lt;br /&gt;
&lt;br /&gt;
 (triangle_a.p1 = triangle_b.p1) and (triangle_a.p2 = triangle_b.p2) and (triangle_a.p3 = triangle_b.p3)&lt;br /&gt;
&lt;br /&gt;
The expression above corresponds to the predefined behaviour of &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt;. In order to obtain a more useful comparison function, it is up to the designer of the &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt; class to think of how to alter the predefined definition by redefining &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function like this:&lt;br /&gt;
&lt;br /&gt;
 is_equal (other: TRIANGLE): BOOLEAN is&lt;br /&gt;
    do&lt;br /&gt;
       Result := p1.is_equal(other.p1) and p2.is_equal(other.p2) and p3.is_equal(other.p3)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
It is very hard to imagine how a ''good function'' for comparison could be defined automatically. In particular, it is not always enough to call &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; again on the attributes, as in the &amp;lt;tt&amp;gt;TRIANGLE&amp;lt;/tt&amp;gt; case, rather than using &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;. (To convince youself of this, see the [[library_class:STRING|&amp;lt;tt&amp;gt;STRING&amp;lt;/tt&amp;gt;]] and [[library_class:ARRAY|&amp;lt;tt&amp;gt;ARRAY&amp;lt;/tt&amp;gt;]] classes as examples.) Thus, since we do not know how to automate this task with a language rule or by adding a strong dose of intelligence to the compiler, the job belongs solely to the designer of the class. The conscientious class designer must ensure that the &amp;lt;tt&amp;gt;is_equal&amp;lt;/tt&amp;gt; function behaves properly for objects of that class. The default behaviour described above has been chosen for its simplicity, because it is is for the most part suitable as a ''good'' comparison function and also because it is implemented easily in low level machine instructions that are very fast (comparison instructions for two memory blocks).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;ValidComparison&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comparison validity==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Do not look for the definition of the [[#EqNeq|&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt;]] &lt;br /&gt;
comparison operators in the Eiffel classes' source&lt;br /&gt;
code, because these two operators are predefined and their definition is deliberately fixed in the compiler's internals.&lt;br /&gt;
Since one of the goals of the Eiffel language is to limit the possibility of careless errors,&lt;br /&gt;
it would not be reasonable to allow just any comparison (that is, to allow all mixtures, like&lt;br /&gt;
comparing a &amp;lt;tt&amp;gt;LORRY&amp;lt;/tt&amp;gt; with a&lt;br /&gt;
&amp;lt;tt&amp;gt;FLOWER&amp;lt;/tt&amp;gt;, to take an extreme example).&lt;br /&gt;
The [[Glossary#StaticType|static types]] of two [[Glossary#Expression|expressions]] to be&lt;br /&gt;
compared must conform to certain constraints. &lt;br /&gt;
Of course -- and this is the usual case -- when the two expressions are of the same &lt;br /&gt;
[[Glossary#StaticType|static type]], the comparison is obviously allowed.&lt;br /&gt;
It is always possible to compare two expressions with the same static type using the comparison operators [[#EqNeq|&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
As soon as the two expressioms are not of the same static type, they have to conform to the following general rule.&lt;br /&gt;
A comparison of the form:&lt;br /&gt;
 x = y&lt;br /&gt;
or again:&lt;br /&gt;
 x /= y&lt;br /&gt;
is valid if it is possible to assign &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; or vice versa. &lt;br /&gt;
More precisely, seeing that &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; are not necessarily variables, either the static type of &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; is acceptable for an assignment to the static type of &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; or else the static type of &amp;lt;tt&amp;gt;y&amp;lt;/tt&amp;gt; is acceptable for an assignment to the static type of &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The foregoing validity rule helps to check whether the program designer is writing a ''reasonable comparison''.&lt;br /&gt;
From experience, we have established that this rule, guided by common sense, is crucial for detecting upstream errors, &lt;br /&gt;
which are often careless mistakes.&lt;br /&gt;
&lt;br /&gt;
In a few ''uncommon and often obscure'' cases, this rule can perhaps be found to be too restrictive.&lt;br /&gt;
If you should find yourself in the situation where the compiler is rejecting your comparison but nevertheless you genuinely think that comparing the two expressions is desirable, you can achieve your ends by using two local variables with a more general static type (ultimately, you can use type [[library_class:ANY|&amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;]]).&lt;br /&gt;
&lt;br /&gt;
To conclude this section on the general verification rule for comparisons with the &lt;br /&gt;
[[#EqNeq|&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/=&amp;lt;/tt&amp;gt;]] operators, &lt;br /&gt;
let us remember that the rule just declared above also includes the [[#ExceptionalRules|previously mentioned case]] concerning the comparison of two expressions of type &amp;lt;tt&amp;gt;INTEGER_*&amp;lt;/tt&amp;gt; or of type &amp;lt;tt&amp;gt;REAL_*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
For example, it is possible to assign an expression of type &lt;br /&gt;
[[library_class:INTEGER_16|&amp;lt;tt&amp;gt;INTEGER_16&amp;lt;/tt&amp;gt;]] to a variable of type [[library_class:INTEGER_32|&amp;lt;tt&amp;gt;INTEGER_32&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
A comparison between an expression of type &lt;br /&gt;
[[library_class:INTEGER_16|&amp;lt;tt&amp;gt;INTEGER_16&amp;lt;/tt&amp;gt;]] and one of type&lt;br /&gt;
[[library_class:INTEGER_32|&amp;lt;tt&amp;gt;INTEGER_32&amp;lt;/tt&amp;gt;]] is therefore valid.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;is_deep_equal&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comparison using &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt;, the fixed method==&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Just for the sake of completeness in this section on comparing objects, let us finally be aware that the [[library_class:ANY|&amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;]] class offers the possibility of a deep comparison of two objects: the &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
The attributes of the two objects to be compared are themselves compared with the &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function and so on recursively.&lt;br /&gt;
This function recursively checks that the two objects are structurally identical.&lt;br /&gt;
Note that it is sometimes possible to have an endless loop in the object graph, for example when comparing two linked lists with a circular structure.&lt;br /&gt;
In order to be considered identical by &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt;, it must be possible to superimpose the graph of the two objects.&lt;br /&gt;
&lt;br /&gt;
The definition of the &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function is fixed in the [[library_class:ANY|&amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;]] class.&lt;br /&gt;
The &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function must be used with care because it depends entirely on the implementation of the objects which it is comparing.&lt;br /&gt;
In fact, as a general rule, it is always preferable to avoid using the &amp;lt;tt&amp;gt;is_deep_equal&amp;lt;/tt&amp;gt; function.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Class_loading&amp;diff=2737</id>
		<title>Class loading</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Class_loading&amp;diff=2737"/>
		<updated>2024-07-30T12:24:49Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The class loading algorithm =&lt;br /&gt;
&lt;br /&gt;
== How must the source files be named? ==&lt;br /&gt;
&lt;br /&gt;
The algorithm used by Liberty to look for an Eiffel source file is the following: &lt;br /&gt;
# Lower case filenames -  Liberty looks all along the loading path (see below) using the class name in lower case as prefix. If needed, the Eiffel suffix (&amp;quot;.e&amp;quot;) is added automatically. Liberty only looks for suffixed files on the disk. Only the first file encountered according to the order of the path is taken in account. An Eiffel file is always supposed to have the same name as the inside class definition. &lt;br /&gt;
# Upper case filenames - When the previous step did not find the required Eiffel class file, Liberty looks along the loading path (see below) for a file bearing the class name upper in upper case letters. If needed, the Eiffel suffix &amp;quot;.e&amp;quot; is added automatically. One must note that the overhead to find an upper case file name is not negligible at all, and that a lower case file name may hide some upper case name.&lt;br /&gt;
&lt;br /&gt;
== How is the loading path built? ==&lt;br /&gt;
&lt;br /&gt;
As described above, Liberty looks for classes in &amp;lt;code&amp;gt;.e&amp;lt;/code&amp;gt; files. But where should those files be situated? The answer is, in the loading path. The thing is, how is the loading path built, what are the default values, and how can it be changed?&lt;br /&gt;
&lt;br /&gt;
Liberty builds a &amp;quot;universe&amp;quot; where it looks for all the classes. This &amp;quot;universe&amp;quot; is a tree of clusters. The root of the tree is the universe. This universe is either made of clusters and &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; files provided by:&lt;br /&gt;
* either the ACE file&lt;br /&gt;
* or a combination of the following:&lt;br /&gt;
** the command line (&amp;lt;code&amp;gt;-loadpath&amp;lt;/code&amp;gt; arguments)&lt;br /&gt;
** the current directory (a &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file in the current directory if it exists, the cluster represented by the current directory otherwise)&lt;br /&gt;
** the [[configuration file]]&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file is a node of the tree. It contains other nodes (referenced &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; files), and clusters (directories). Note that ''all the clusters in a &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file are direct children of the node''. It means that, even if directories are arborescent this is not reflected in Liberty's universe.&lt;br /&gt;
&lt;br /&gt;
To look for a supplier class, Liberty starts from its client. It tries to look for the &amp;quot;closest&amp;quot; class with the good name. It allows one to have many classes with the same name in the system. The algorithm is the following:&lt;br /&gt;
# try to look for a class with the good name in a sub-cluster of the client. The less deep, the better.&lt;br /&gt;
# try again, starting from the parent cluster of the client.&lt;br /&gt;
# and so on, until the universe (the tree root) is reached.&lt;br /&gt;
&lt;br /&gt;
If there is no client (e.g. a class given on the command line) the universe is searched and the class nearest to the root is selected.&lt;br /&gt;
&lt;br /&gt;
If more than one class have the smallest distance, the compiler will bail because it cannot decide which to use. In the future, an extension to ACE files will allow someone to provide custom distances (a &amp;quot;distance&amp;quot; is the amount of depth to add from a cluster to a child; it defaults to 1)&lt;br /&gt;
&lt;br /&gt;
'''For example:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/my/loadpath.se&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./&lt;br /&gt;
internal/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file represents a node with two children: the cluster in the directory of the &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file, and the cluster in the directory named &amp;quot;internal&amp;quot; in the former directory. Both have a distance equal to one, meaning that if there are two classes named &amp;lt;code&amp;gt;FOO&amp;lt;/code&amp;gt; in both &amp;lt;code&amp;gt;./&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;internal/&amp;lt;/code&amp;gt; then the compiler will emit an error.&lt;br /&gt;
&lt;br /&gt;
The tree will be the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 + &amp;lt;Universe&amp;gt;&lt;br /&gt;
    + &amp;quot;/my/loadpath.se&amp;quot;&lt;br /&gt;
    |  + /my/&lt;br /&gt;
    |  + /my/internal/&lt;br /&gt;
    + . . .&lt;br /&gt;
    |&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; files ==&lt;br /&gt;
&lt;br /&gt;
Those files contain directories (clusters: the leaves of the &amp;quot;universe&amp;quot; tree) and references to other &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; files (nodes of the &amp;quot;universe&amp;quot; tree).&lt;br /&gt;
&lt;br /&gt;
Those path names may be written using&lt;br /&gt;
- either a POSIX notation&lt;br /&gt;
- or your local system notation&lt;br /&gt;
&lt;br /&gt;
Note that for a library to be portable, you should prefer the POSIX notation.&lt;br /&gt;
&lt;br /&gt;
= Internals =&lt;br /&gt;
&lt;br /&gt;
Here are the gory details on how the &amp;quot;universe&amp;quot; tree is managed:&lt;br /&gt;
&lt;br /&gt;
The tree itself is a bunch of classes situated in the &amp;lt;code&amp;gt;smarteiffel/tools/ace&amp;lt;/code&amp;gt; cluster. It is a Composite which abstract class is [[tool class:CLASSES|&amp;lt;code&amp;gt;CLASSES&amp;lt;/code&amp;gt;]]; most of the parent-children handling is done by concrete features in the [[tool class:CLUSTERS|&amp;lt;code&amp;gt;CLUSTERS&amp;lt;/code&amp;gt;]] class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                            *&lt;br /&gt;
             .---  CLASSES  &amp;lt;--.&lt;br /&gt;
             |         ^       | children&lt;br /&gt;
      parent |         |       |&lt;br /&gt;
             `--&amp;gt;  CLUSTERS ---'&lt;br /&gt;
              0-1      ^&lt;br /&gt;
                       |&lt;br /&gt;
            +----------+-------------+&lt;br /&gt;
            |          |             |&lt;br /&gt;
ACE --&amp;gt; UNIVERSE   LOADPATH   CLASSES_TREE --&amp;gt; CLUSTER&lt;br /&gt;
       (singleton)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[tool class:LOADPATH|&amp;lt;code&amp;gt;LOADPATH&amp;lt;/code&amp;gt;]] is a node of the tree. It references a &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file&lt;br /&gt;
* [[tool class:UNIVERSE|&amp;lt;code&amp;gt;UNIVERSE&amp;lt;/code&amp;gt;]] is a singleton object held by [[tool class:ACE|&amp;lt;code&amp;gt;ACE&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[tool class:CLASSES_TREE|&amp;lt;code&amp;gt;CLASSES_TREE&amp;lt;/code&amp;gt;]] is a leaf of the tree. It is a facade to the old [[tool class:CLUSTER|&amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;]] class&lt;br /&gt;
* [[tool class:CLASSES_TREE_FACTORY|&amp;lt;code&amp;gt;CLASSES_TREE_FACTORY&amp;lt;/code&amp;gt;]] is used to create a node or a leaf depending on whether the given path is a directory or a plain file. It creates [[tool class:CLASSES|&amp;lt;code&amp;gt;CLASSES&amp;lt;/code&amp;gt;]] objects&lt;br /&gt;
* [[tool class:CLUSTER|&amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;]] holds references to the known and loaded classes in that cluster&lt;br /&gt;
* [[tool class:ACE|&amp;lt;code&amp;gt;ACE&amp;lt;/code&amp;gt;]] stays the Universe facade for the remaining of the Liberty system and dispatches request to the [[tool class:CLASSES|&amp;lt;code&amp;gt;CLASSES&amp;lt;/code&amp;gt;]] tree (via the [[tool class:UNIVERSE|&amp;lt;code&amp;gt;UNIVERSE&amp;lt;/code&amp;gt;]])&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Class_loading&amp;diff=2736</id>
		<title>Class loading</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Class_loading&amp;diff=2736"/>
		<updated>2024-07-30T12:24:12Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The class loading algorithm =&lt;br /&gt;
&lt;br /&gt;
== How must the source files be named? ==&lt;br /&gt;
&lt;br /&gt;
The algorithm used by Liberty to look for an Eiffel source file is the following: &lt;br /&gt;
# Lower case filenames -  Liberty looks all along the loading path (see below) using the class name in lower case as prefix. If needed, the Eiffel suffix (&amp;quot;.e&amp;quot;) is added automatically. Liberty only looks for suffixed files on the disk. Only the first file encountered according to the order of the path is taken in account. An Eiffel file is always supposed to have the same name as the inside class definition. &lt;br /&gt;
# Upper case filenames - When the previous step did not find the required Eiffel class file, Liberty looks along the loading path (see below) for a file bearing the class name upper in upper case letters. If needed, the Eiffel suffix &amp;quot;.e&amp;quot; is added automatically. One must note that the overhead to find an upper case file name is not negligible at all, and that a lower case file name may hide some upper case name.&lt;br /&gt;
&lt;br /&gt;
== How is the loading path built? ==&lt;br /&gt;
&lt;br /&gt;
As described above, Liberty looks for classes in &amp;lt;code&amp;gt;.e&amp;lt;/code&amp;gt; files. But where should those files be situated? The answer is, in the loading path. The thing is, how is the loading path built, what are the default values, and how can it be changed?&lt;br /&gt;
&lt;br /&gt;
Liberty builds a &amp;quot;universe&amp;quot; where it looks for all the classes. This &amp;quot;universe&amp;quot; is a tree of clusters. The root of the tree is the universe. This universe is either made of clusters and &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; files provided by:&lt;br /&gt;
* either the ACE file&lt;br /&gt;
* or a combination of the following:&lt;br /&gt;
** the command line (&amp;lt;code&amp;gt;-loadpath&amp;lt;/code&amp;gt; arguments)&lt;br /&gt;
** the current directory (a &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file in the current directory if it exists, the cluster represented by the current directory otherwise)&lt;br /&gt;
** the [[configuration file]]&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file is a node of the tree. It contains other nodes (referenced &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; files), and clusters (directories). Note that ''all the clusters in a &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file are direct children of the node''. It means that, even if directories are arborescent this is not reflected in Liberty's universe.&lt;br /&gt;
&lt;br /&gt;
To look for a supplier class, Liberty starts from its client. It tries to look for the &amp;quot;closest&amp;quot; class with the good name. It allows one to have many classes with the same name in the system. The algorithm is the following:&lt;br /&gt;
# try to look for a class with the good name in a sub-cluster of the client. The less deep, the better.&lt;br /&gt;
# try again starting from the parent cluster of the client.&lt;br /&gt;
# and so on, until the universe (the tree root) is reached.&lt;br /&gt;
&lt;br /&gt;
If there is no client (e.g. a class given on the command line) the universe is searched and the class nearest to the root is selected.&lt;br /&gt;
&lt;br /&gt;
If more than one class have the smallest distance, the compiler will bail because it cannot decide which to use. In the future, an extension to ACE files will allow someone to provide custom distances (a &amp;quot;distance&amp;quot; is the amount of depth to add from a cluster to a child; it defaults to 1)&lt;br /&gt;
&lt;br /&gt;
'''For example:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/my/loadpath.se&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./&lt;br /&gt;
internal/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file represents a node with two children: the cluster in the directory of the &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file, and the cluster in the directory named &amp;quot;internal&amp;quot; in the former directory. Both have a distance equal to one, meaning that if there are two classes named &amp;lt;code&amp;gt;FOO&amp;lt;/code&amp;gt; in both &amp;lt;code&amp;gt;./&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;internal/&amp;lt;/code&amp;gt; then the compiler will emit an error.&lt;br /&gt;
&lt;br /&gt;
The tree will be the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 + &amp;lt;Universe&amp;gt;&lt;br /&gt;
    + &amp;quot;/my/loadpath.se&amp;quot;&lt;br /&gt;
    |  + /my/&lt;br /&gt;
    |  + /my/internal/&lt;br /&gt;
    + . . .&lt;br /&gt;
    |&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; files ==&lt;br /&gt;
&lt;br /&gt;
Those files contain directories (clusters: the leaves of the &amp;quot;universe&amp;quot; tree) and references to other &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; files (nodes of the &amp;quot;universe&amp;quot; tree).&lt;br /&gt;
&lt;br /&gt;
Those path names may be written using&lt;br /&gt;
- either a POSIX notation&lt;br /&gt;
- or your local system notation&lt;br /&gt;
&lt;br /&gt;
Note that for a library to be portable, you should prefer the POSIX notation.&lt;br /&gt;
&lt;br /&gt;
= Internals =&lt;br /&gt;
&lt;br /&gt;
Here are the gory details on how the &amp;quot;universe&amp;quot; tree is managed:&lt;br /&gt;
&lt;br /&gt;
The tree itself is a bunch of classes situated in the &amp;lt;code&amp;gt;smarteiffel/tools/ace&amp;lt;/code&amp;gt; cluster. It is a Composite which abstract class is [[tool class:CLASSES|&amp;lt;code&amp;gt;CLASSES&amp;lt;/code&amp;gt;]]; most of the parent-children handling is done by concrete features in the [[tool class:CLUSTERS|&amp;lt;code&amp;gt;CLUSTERS&amp;lt;/code&amp;gt;]] class.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                            *&lt;br /&gt;
             .---  CLASSES  &amp;lt;--.&lt;br /&gt;
             |         ^       | children&lt;br /&gt;
      parent |         |       |&lt;br /&gt;
             `--&amp;gt;  CLUSTERS ---'&lt;br /&gt;
              0-1      ^&lt;br /&gt;
                       |&lt;br /&gt;
            +----------+-------------+&lt;br /&gt;
            |          |             |&lt;br /&gt;
ACE --&amp;gt; UNIVERSE   LOADPATH   CLASSES_TREE --&amp;gt; CLUSTER&lt;br /&gt;
       (singleton)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[tool class:LOADPATH|&amp;lt;code&amp;gt;LOADPATH&amp;lt;/code&amp;gt;]] is a node of the tree. It references a &amp;lt;code&amp;gt;loadpath.se&amp;lt;/code&amp;gt; file&lt;br /&gt;
* [[tool class:UNIVERSE|&amp;lt;code&amp;gt;UNIVERSE&amp;lt;/code&amp;gt;]] is a singleton object held by [[tool class:ACE|&amp;lt;code&amp;gt;ACE&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[tool class:CLASSES_TREE|&amp;lt;code&amp;gt;CLASSES_TREE&amp;lt;/code&amp;gt;]] is a leaf of the tree. It is a facade to the old [[tool class:CLUSTER|&amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;]] class&lt;br /&gt;
* [[tool class:CLASSES_TREE_FACTORY|&amp;lt;code&amp;gt;CLASSES_TREE_FACTORY&amp;lt;/code&amp;gt;]] is used to create a node or a leaf depending on whether the given path is a directory or a plain file. It creates [[tool class:CLASSES|&amp;lt;code&amp;gt;CLASSES&amp;lt;/code&amp;gt;]] objects&lt;br /&gt;
* [[tool class:CLUSTER|&amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;]] holds references to the known and loaded classes in that cluster&lt;br /&gt;
* [[tool class:ACE|&amp;lt;code&amp;gt;ACE&amp;lt;/code&amp;gt;]] stays the Universe facade for the remaining of the Liberty system and dispatches request to the [[tool class:CLASSES|&amp;lt;code&amp;gt;CLASSES&amp;lt;/code&amp;gt;]] tree (via the [[tool class:UNIVERSE|&amp;lt;code&amp;gt;UNIVERSE&amp;lt;/code&amp;gt;]])&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Finder&amp;diff=2735</id>
		<title>Finder</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Finder&amp;diff=2735"/>
		<updated>2024-07-30T12:23:24Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tool]]&lt;br /&gt;
== Usage ==&lt;br /&gt;
  se find [options] [&amp;lt;ACEfile.ace&amp;gt;] &amp;lt;Class&amp;gt; &lt;br /&gt;
The find command tells you which file the compiler loads when searching for an Eiffel &amp;lt;Class&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
When an Eiffel file is found, find prints the full path name on standard output. &lt;br /&gt;
&lt;br /&gt;
The exit status is set to GENERAL.exit_success_code only when an existing file is found (thus allowing usage of the find command in shell scripts). &lt;br /&gt;
As for other commands, when the ACE file mode is used, only the content of the &amp;lt;ACEfile.ace&amp;gt; file is used to search the source file. &lt;br /&gt;
To see the loading path used by Liberty Eiffel, you can for example type the find command using a bad (non-existent) class name. &lt;br /&gt;
In ACE file mode, the loading path can be updated by modifying the ACE file itself. In traditional mode (i.e. no ACE file), the default loading path may also be tailored (see below).&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
 -help:&lt;br /&gt;
Display a brief summary of the command-line syntax and a complete list of find options. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 -version:&lt;br /&gt;
Show the number of the version of Liberty Eiffel you're using. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 -verbose:&lt;br /&gt;
Print system information during the compilation (full path of loaded files, type inference score, removed files, etc.). &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 -loadpath &amp;lt;loadpath_file&amp;gt;:&lt;br /&gt;
Adds a loadpath file for class lookup. See below for details on the loading path constitution.&lt;br /&gt;
&lt;br /&gt;
-raw:&lt;br /&gt;
Does not display the cluster name. Its only output is usually the path name of the class, so it is useful in scripts.&lt;br /&gt;
&lt;br /&gt;
== Where does Find search? ==&lt;br /&gt;
&lt;br /&gt;
This is explained in detail in the [[class loading]] section. Note that finder will find all classes with a given name.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Plugins&amp;diff=2734</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Plugins&amp;diff=2734"/>
		<updated>2024-07-30T12:20:56Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Interfacing]]&lt;br /&gt;
Plugins are a means to augment the capabilities of Liberty Eiffel, by incorporating libraries which have the colour, smell, and taste of the standard libraries. In fact, it's an extension of the standard Eiffel mechanism, [[externals]].&lt;br /&gt;
&lt;br /&gt;
The goal of plugins is independence from the [[Glossary#BackEnd|back-end]]. This means that, potentially, the ''same'' library could be used simultaneously by [[compile_to_c]] and [[compile_to_jvm]]. Note that in the future we might want to provide other [[Glossary#BackEnd|back-ends]]. In this case, the plugin system will become more important.&lt;br /&gt;
&lt;br /&gt;
== How does it work&amp;amp;nbsp;? ==&lt;br /&gt;
&lt;br /&gt;
A plugin is made up of two interdependent parts&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
* the Eiffel side, which provides an interface usable by other Eiffel objects&amp;amp;nbsp;;&lt;br /&gt;
* the external side, which implements the plugin's interface for one or several  [[Glossary#BackEnd|back-ends]] (for example, C and Java).&lt;br /&gt;
&lt;br /&gt;
The Eiffel side is 100% Eiffel code, and it uses ''external'' features that allow crossing the barrier to the other side of the plugin. The barrier is managed by the Liberty Eiffel compiler, which associates external functions with the ''external'' features using configuration files furnished by the plugin.&lt;br /&gt;
&lt;br /&gt;
== Eiffel Side ==&lt;br /&gt;
&lt;br /&gt;
The Eiffel side uses ''external'' features. The syntax is as follows:&lt;br /&gt;
&lt;br /&gt;
 feature&lt;br /&gt;
    my_plugin_feature is&lt;br /&gt;
       external &amp;quot;plug_in&amp;quot;&lt;br /&gt;
       alias &amp;quot;{&lt;br /&gt;
          location: &amp;quot;/path/to/my/plugins&amp;quot;&lt;br /&gt;
          module_name: &amp;quot;my_plugin&amp;quot;&lt;br /&gt;
          feature_name: &amp;quot;feature&amp;quot;&lt;br /&gt;
       }&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Of course, a feature can take arguments and return a result&amp;amp;nbsp;! (after all, it's an ''external'') ;-)&lt;br /&gt;
&lt;br /&gt;
'''Beware''' however, it is necessary to only pass and return only basic ''expanded'' base types&amp;amp;nbsp;:&lt;br /&gt;
([[library_class:INTEGER|&amp;lt;TT&amp;gt;INTEGER&amp;lt;/TT&amp;gt;]], [[library_class:BOOLEAN|&amp;lt;TT&amp;gt;BOOLEAN&amp;lt;/TT&amp;gt;]], etc.) or use [[library_class:POINTER|&amp;lt;TT&amp;gt;POINTER&amp;lt;/TT&amp;gt;]] (common usage: &amp;lt;TT&amp;gt;a_string.to_external&amp;lt;/TT&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* '''location''' indicates the directory where you store one or many of your plugins. This path can contain environment variables (either true system environment variables, or variables defined in the &amp;lt;TT&amp;gt;[Environment]&amp;lt;/TT&amp;gt; section of your [[Configuration file|configuration file]]).&lt;br /&gt;
For example, the standard Liberty Eiffel libraries are defined by using the following ''location'':&lt;br /&gt;
 location: &amp;quot;${sys}plugins&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''module_name''' contains the plugin name itself. This must be the name of a sub-directory of ''location'' that contains a directory for a specific [[Glossary#BackEnd|back-end]] (for example, &amp;lt;TT&amp;gt;c&amp;lt;/TT&amp;gt; for the C generator, &amp;lt;TT&amp;gt;java&amp;lt;/TT&amp;gt; for the Java generator). The content of each of these sub-repositories depends on the generator, and is specified below.&lt;br /&gt;
&lt;br /&gt;
* '''feature_name''' is the name of the feature, function, method etc. named by the [[Glossary#BackEnd|back-end]] (for example, C calls functions, Java calls methods). What they're called is not important&amp;amp;nbsp;: they're all features ;-)&lt;br /&gt;
&lt;br /&gt;
== Dark side ==&lt;br /&gt;
&lt;br /&gt;
=== C Generation ===&lt;br /&gt;
&lt;br /&gt;
The C [[Glossary#BackEnd|back-end]] uses a subdirectory of your plugin named &amp;lt;TT&amp;gt;c&amp;lt;/TT&amp;gt;. The files used are:&lt;br /&gt;
&lt;br /&gt;
* all the &amp;lt;TT&amp;gt;.c&amp;lt;/TT&amp;gt; files, which are included in the compiler-generated C files&lt;br /&gt;
* all the &amp;lt;TT&amp;gt;.h&amp;lt;/TT&amp;gt; files, which are included in the compiler-generated header file&lt;br /&gt;
* the &amp;lt;TT&amp;gt;libs&amp;lt;/TT&amp;gt; file, which contains a description of the native libraries to link&lt;br /&gt;
* the &amp;lt;TT&amp;gt;paths&amp;lt;/TT&amp;gt; file, which contains a description of the paths used to find the libraries&lt;br /&gt;
* the &amp;lt;TT&amp;gt;includes&amp;lt;/TT&amp;gt; file, which contains a description of the paths used to find header files&lt;br /&gt;
* the &amp;lt;TT&amp;gt;auto_init&amp;lt;/TT&amp;gt; file, which contains a description of a possible initialization function called at the very start of the program&lt;br /&gt;
* the &amp;lt;TT&amp;gt;cecil.se&amp;lt;/TT&amp;gt; file, which is a [[cecil]] description automatically taken into account&lt;br /&gt;
* the &amp;lt;TT&amp;gt;compiler_options&amp;lt;/TT&amp;gt; and the &amp;lt;TT&amp;gt;linker_options&amp;lt;/TT&amp;gt; files which are passed verbatim to the underlying strata of compiling chain, usually a C compiler, where they are parsed with a shell. They usually contain invocation of tools that gives the mutable correct flags to compile and link the library, i.e. pkg-config.&lt;br /&gt;
&lt;br /&gt;
The '''&amp;lt;TT&amp;gt;.c&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;.h&amp;lt;/TT&amp;gt;''' files are included in alphabetic order.&lt;br /&gt;
&lt;br /&gt;
The '''&amp;lt;TT&amp;gt;includes&amp;lt;/TT&amp;gt;, &amp;lt;TT&amp;gt;libs&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;paths&amp;lt;/TT&amp;gt;''' files use an identical syntax to that of the [[configuration file]], but with different keys:&lt;br /&gt;
* The sections carry the operating system name, the ''flavor'' from the configuration file and finally the C compiler used, in that order and separated by a period. If the plugin doesn't depend on one of these elements, it can be omitted.&lt;br /&gt;
* The keys in these files are only informative; however, the values are used to generate command line calls to the C compiler.&lt;br /&gt;
&lt;br /&gt;
The '''&amp;lt;TT&amp;gt;auto_init&amp;lt;/TT&amp;gt;''' file uses the same syntax as the [[configuration file]], but with yet other keys:&lt;br /&gt;
* The default section (i.e. the first one, without a name between square brackets) contains one key, &amp;lt;TT&amp;gt;function&amp;lt;/TT&amp;gt; which value gives the name of the initialization function to call at the start of the system&lt;br /&gt;
* Any other section describes plugin dependencies. These must have two keys: &amp;lt;TT&amp;gt;location&amp;lt;/TT&amp;gt; and &amp;lt;TT&amp;gt;module_name&amp;lt;/TT&amp;gt; which have the same meaning as in the Eiffel alias. Those dependencies describe initialization order (initialize dependencies first).&lt;br /&gt;
&lt;br /&gt;
The '''&amp;lt;TT&amp;gt;cecil.se&amp;lt;/TT&amp;gt;''' file is automatically included as it were specified by the &amp;lt;TT&amp;gt;-cecil&amp;lt;/TT&amp;gt; option.&lt;br /&gt;
&lt;br /&gt;
For examples, you can examine the configurations files for Vision or ncurses. There is also a tutorial called '''mini_gtk''' (in the &amp;lt;TT&amp;gt;SmartEiffel/tutorial/plugin&amp;lt;/TT&amp;gt; directory).&lt;br /&gt;
&lt;br /&gt;
'''Note''': when there are no arguments, names are generated without parentheses. This permits to attributes, variables and to macros. The absence of parentheses is not then a bug but a desired behaviour. In the case where one wants access to a function without an argument, it suffices to use a macro to replace a name without parentheses with the name of the function to call.&lt;br /&gt;
&lt;br /&gt;
=== Java Generation===&lt;br /&gt;
&lt;br /&gt;
 NB: Liberty Eiffel currently does not provide a Java back-end.&amp;lt;BR&amp;gt;  The information in this paragraph refers to Liberty Eiffel's legacy predecessor.&lt;br /&gt;
&lt;br /&gt;
For the Java [[Glossary#BackEnd|back-end]], the plugin subdirectory must be named &amp;lt;TT&amp;gt;java&amp;lt;/TT&amp;gt;.&lt;br /&gt;
The compiler uses the following files&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
* the &amp;lt;TT&amp;gt;.java&amp;lt;/TT&amp;gt; files are compiled using the command line options and/or from the configuration file (see [[compile_to_jvm]] for more detail). The &amp;lt;TT&amp;gt;.class&amp;lt;/TT&amp;gt; files so generated are automatically copied in the compilation directory of the program.&lt;br /&gt;
* the &amp;lt;TT&amp;gt;.class&amp;lt;/TT&amp;gt; files, if they are present and if they are more recent than the corresponding &amp;lt;TT&amp;gt;.java&amp;lt;/TT&amp;gt; files are utilized in place of a compilation of the &amp;lt;TT&amp;gt;.java&amp;lt;/TT&amp;gt; files, in the same manner as the  &amp;lt;TT&amp;gt;make&amp;lt;/TT&amp;gt; command under UNIX.&lt;br /&gt;
&lt;br /&gt;
To shorten the compilation time of a program dependent on plugins supplied with the compiler (like for example the &amp;lt;TT&amp;gt;io&amp;lt;/TT&amp;gt; plugin), the installer will compile the &amp;lt;TT&amp;gt;.java&amp;lt;/TT&amp;gt; plugin files during installation.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Eiffeldoc&amp;diff=2733</id>
		<title>Eiffeldoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Eiffeldoc&amp;diff=2733"/>
		<updated>2024-07-30T12:18:04Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tool]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;eiffeldoc&amp;lt;/code&amp;gt; is the tool that documents your Liberty Eiffel project. Currently only HTML output is supported, but maybe others will be added in the future.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;eiffeldoc  {-title title} {-home_address address} {-nav_css file} {-doc_css file} {-class_css file} {-arrow_address address} {-separator_address address} {-depends} {-prune cluster...} {-verbose} {-help} {-wiki_prefix prefix} [loadpath.se | ACE file] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;4&amp;quot; cellpadding=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;20%&amp;quot; | &amp;lt;code&amp;gt;-title&amp;lt;/code&amp;gt;&lt;br /&gt;
| The title of the generated documentation&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-home_address&amp;lt;/code&amp;gt;&lt;br /&gt;
| The address of the ''go home'' upper-left link. If &amp;lt;code&amp;gt;-home_address&amp;lt;/code&amp;gt; is not given, the ''go home'' upper link won't be generated.&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-home_image_address&amp;lt;/code&amp;gt;&lt;br /&gt;
| The address of the ''go home'' image&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-nav_css&amp;lt;/code&amp;gt;&lt;br /&gt;
| The stylesheet to use in the navigation bar (i.e. the left frames)&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-doc_css&amp;lt;/code&amp;gt;&lt;br /&gt;
| The stylesheet to use in the cluster documentation (i.e. on the right frames)&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-class_css&amp;lt;/code&amp;gt;&lt;br /&gt;
| The stylesheet to use in the class documentation (i.e. on the right frames)&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-arrow_address&amp;lt;/code&amp;gt;&lt;br /&gt;
| The address of the arrow image. If the &amp;lt;code&amp;gt;-arrow_address&amp;lt;/code&amp;gt; is not given, links in the left navigation bar won't have an arrow.&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-separator_address&amp;lt;/code&amp;gt;&lt;br /&gt;
| The address of the separator image. If the &amp;lt;code&amp;gt;-separator_address&amp;lt;/code&amp;gt; is not given, there will be no separation before the description of a cluster.&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-prune&amp;lt;/code&amp;gt;&lt;br /&gt;
| Don't show the cluster nor its classes in the left navigation bar. It uses the loadpath.se or ACE syntax for paths. Note that it also removes all the subclusters.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-remote&amp;lt;/code&amp;gt;&lt;br /&gt;
| replace the generation of that class by the address of the class generated by another instance of eiffeldoc at the given address. Note that, like -prune, the clusters don't show in eiffeldoc. It is useful for consistency. For example: &amp;lt;code&amp;gt;eiffeldoc -remote 'lib' 'http://doc.liberty-eiffel.org/libraries/'&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a special case, &amp;lt;tt&amp;gt;-prune cwd&amp;lt;/tt&amp;gt; allows not to take the current working directory into account.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 se doc -prune 'lib/scoop'&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-depends&amp;lt;/code&amp;gt;&lt;br /&gt;
| Generate dependant classes even if their cluster is pruned. This helps avoiding dangling links.&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-verbose&amp;lt;/code&amp;gt;&lt;br /&gt;
| Output a lot of information about what eiffeldoc is doing.&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;code&amp;gt;-wiki_prefix&amp;lt;/code&amp;gt;&lt;br /&gt;
| Generate links to wiki URLs (in square brackets)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stylesheets ==&lt;br /&gt;
&lt;br /&gt;
The stylesheets are heavily used to customize the output of Eiffeldoc. The known classes are:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| A.home&lt;br /&gt;
| for the home link&lt;br /&gt;
|-&lt;br /&gt;
| A.title&lt;br /&gt;
| for the titles&lt;br /&gt;
|-&lt;br /&gt;
| A.cluster&lt;br /&gt;
| for the clusters&lt;br /&gt;
|-&lt;br /&gt;
| A.class&lt;br /&gt;
| for the classes&lt;br /&gt;
|-&lt;br /&gt;
| A.client&lt;br /&gt;
| for the upper-right clients frame&lt;br /&gt;
|-&lt;br /&gt;
| A.description&lt;br /&gt;
| for the one-sentence description in the cluster summary&lt;br /&gt;
|-&lt;br /&gt;
| TD.home&lt;br /&gt;
| for the home link&lt;br /&gt;
|-&lt;br /&gt;
| TD.title&lt;br /&gt;
| for the titles&lt;br /&gt;
|-&lt;br /&gt;
| TD.cluster&lt;br /&gt;
| for the clusters&lt;br /&gt;
|-&lt;br /&gt;
| TD.class&lt;br /&gt;
| for the classes (except in the short proper)&lt;br /&gt;
|-&lt;br /&gt;
| TD.client&lt;br /&gt;
| for the upper-right clients frame&lt;br /&gt;
|-&lt;br /&gt;
| TD.description&lt;br /&gt;
| for the one-sentence description in the cluster summary&lt;br /&gt;
|-&lt;br /&gt;
| B.obsolete&lt;br /&gt;
| for the obsolete header&lt;br /&gt;
|-&lt;br /&gt;
| I.obsolete&lt;br /&gt;
| for the obsolete message&lt;br /&gt;
|-&lt;br /&gt;
| TD.comment&lt;br /&gt;
| for a class comment&lt;br /&gt;
|-&lt;br /&gt;
| PRE.comment&lt;br /&gt;
| for a class comment&lt;br /&gt;
|-&lt;br /&gt;
| B.comment&lt;br /&gt;
| for a feature clause comment&lt;br /&gt;
|-&lt;br /&gt;
| I.comment&lt;br /&gt;
| for a feature comment&lt;br /&gt;
|-&lt;br /&gt;
| LI.summary&lt;br /&gt;
| for a feature in the summary&lt;br /&gt;
|-&lt;br /&gt;
| A.summary&lt;br /&gt;
| for the feature link in the summary&lt;br /&gt;
|-&lt;br /&gt;
| TD.details&lt;br /&gt;
| for a feature definition in the details section&lt;br /&gt;
|-&lt;br /&gt;
| B.details&lt;br /&gt;
| for the feature name in the details section&lt;br /&gt;
|-&lt;br /&gt;
| B.assertion&lt;br /&gt;
| for the assertion tags&lt;br /&gt;
|-&lt;br /&gt;
| TT.assertion&lt;br /&gt;
| for the assertion expressions&lt;br /&gt;
|-&lt;br /&gt;
| I.assertion&lt;br /&gt;
| for the assertion comments&lt;br /&gt;
|-&lt;br /&gt;
| A.link&lt;br /&gt;
| for a class link in the class documentation&lt;br /&gt;
|-&lt;br /&gt;
| U.wiki_entity&lt;br /&gt;
| for a link to a field in a comment, not anchored ''?Is 'anchor' the correct translation of 'lier' here?''&lt;br /&gt;
|-&lt;br /&gt;
| A.wiki_entity&lt;br /&gt;
| for a link to a field in a comment, anchored&lt;br /&gt;
|-&lt;br /&gt;
| B.wiki_bold&lt;br /&gt;
| for bold elements in a comment (wiki syntax)&lt;br /&gt;
|-&lt;br /&gt;
| I.wiki_italics&lt;br /&gt;
| for italic elements in a comment (wiki syntax)&lt;br /&gt;
|-&lt;br /&gt;
| TT.wiki_class_name&lt;br /&gt;
| for class names in a comment&lt;br /&gt;
|-&lt;br /&gt;
| TT.wiki_string&lt;br /&gt;
| for character strings in a comment&lt;br /&gt;
|-&lt;br /&gt;
| TT.wiki_character&lt;br /&gt;
| for characters in a comment&lt;br /&gt;
|-&lt;br /&gt;
| UL.wiki_bullet_list&lt;br /&gt;
| for bullet-point lists&lt;br /&gt;
|-&lt;br /&gt;
| LI.wiki_bullet_list&lt;br /&gt;
| for bullet-point list items&lt;br /&gt;
|-&lt;br /&gt;
| OL.wiki_numbered_list&lt;br /&gt;
| for numbered lists&lt;br /&gt;
|-&lt;br /&gt;
| LI.wiki_numbered_list&lt;br /&gt;
| for numbered list items&lt;br /&gt;
|-&lt;br /&gt;
| A.wiki_url&lt;br /&gt;
| for URLs (between &amp;lt;nowiki&amp;gt;[...]&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| A.wiki_word&lt;br /&gt;
| for wiki words (between &amp;lt;nowiki&amp;gt;[[...]]&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Project ===&lt;br /&gt;
&lt;br /&gt;
Eiffeldoc analyses a project's whole set of classes in order to provide HTML&amp;lt;sup&amp;gt;[[Eiffeldoc#note1|1]]&amp;lt;/sup&amp;gt; documentation organised by cluster and class.  Eiffeldoc can be used to produce the API for these classes.&lt;br /&gt;
&lt;br /&gt;
Eiffeldoc has been designed to generate the documentation for a whole '''project'''.  But what is a project?&lt;br /&gt;
&lt;br /&gt;
A project is a set of classes that makes a coherent whole: a library, an application, a set of applications, a plug-in, and so on.&lt;br /&gt;
&lt;br /&gt;
Eiffeldoc defines the project by the set of class search paths.  It uses the same method as &amp;lt;TT&amp;gt;[[finder]]&amp;lt;/TT&amp;gt;:&lt;br /&gt;
using the ACE file or else &amp;lt;TT&amp;gt;loadpath.se&amp;lt;/TT&amp;gt; and the paths from the system [[Configuration file|configuration file]].&lt;br /&gt;
&lt;br /&gt;
=== Documentation ===&lt;br /&gt;
&lt;br /&gt;
A high quality API does not only list its features with their signatures and contracts.  The reader generally needs documentation at a higher level, which does not only explain how to call some method, but also explains the purpose of each feature and the way it is implemented, together with more general considerations.&lt;br /&gt;
&lt;br /&gt;
In order to do this, Eiffeldoc uses two complementary mechanisms.  The classes and their features are described by their comments; the clusters are described by a special file.&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
Eiffeldoc makes full use of comments.  There is a convention about the ''position'' of comments.&lt;br /&gt;
&lt;br /&gt;
'''For classes''', the ''class comment'' is the comment placed just after the class declaration.  For example:&lt;br /&gt;
 class MY_CLASS&lt;br /&gt;
    -- this is the class comment&lt;br /&gt;
 end&lt;br /&gt;
''The convention'' is to describe the overall purpose of the class, what it is used for, in what context, and so on.&lt;br /&gt;
&lt;br /&gt;
'''For groups of features''', the ''feature group comment'' is the comment placed just after the &amp;lt;TT&amp;gt;'''feature'''&amp;lt;/TT&amp;gt; clause.  For example:&lt;br /&gt;
 feature {ANY} -- Consultation:&lt;br /&gt;
''The convention'' is to use short comments, because they are used as feature group headings.&lt;br /&gt;
&lt;br /&gt;
'''For features''', the ''feature comment'' is the comment placed just after the feature signature (after the return type for attributes, after the keyword  &amp;lt;TT&amp;gt;'''is'''&amp;lt;/TT&amp;gt;  for routines).  For example:&lt;br /&gt;
 my_routine (i: INTEGER): INTEGER is&lt;br /&gt;
    -- a function that depends on the argument `i'&lt;br /&gt;
''The convention'' for complicated comments is to begin with a summary sentence.  This sentence&amp;lt;sup&amp;gt;[[Eiffeldoc#note2|2]]&amp;lt;/sup&amp;gt; is extracted and used in the first part of the class description.&lt;br /&gt;
&lt;br /&gt;
==== cluster.html ====&lt;br /&gt;
&lt;br /&gt;
Each cluster can be documented by a file &amp;lt;TT&amp;gt;cluster.html&amp;lt;/TT&amp;gt;, stored in the same directory as the cluster's classes.  If this file exists, Eiffeldoc extracts from it the HTML code between the elements &amp;amp;lt;body&amp;amp;gt; and &amp;amp;lt;/body&amp;amp;gt;.  Here, too, it extracts the first sentence to use in the page that describes the whole group of clusters.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;DIV id=&amp;quot;note1&amp;quot;&amp;gt;1. Other output formats are expected to be possible in the future.&amp;lt;/DIV&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;DIV id=&amp;quot;note2&amp;quot;&amp;gt;2. A sentence is delimited by a full-stop, ellipsis,  question mark or exclamation mark, followed by a space.  Note that Eiffeldoc keeps track of parentheses, so that &amp;lt;TT&amp;gt;(`lower' .. `upper')&amp;lt;/TT&amp;gt; is not the end of a sentence.  As a special case, a sentence like &amp;lt;TT&amp;gt; does lots of things (this, that, etc.)&amp;lt;/TT&amp;gt; finishes ''after the parenthesis''.&amp;lt;/DIV&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Build_your_library&amp;diff=2732</id>
		<title>Build your library</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Build_your_library&amp;diff=2732"/>
		<updated>2024-07-30T12:16:47Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Library]]&lt;br /&gt;
We're not going to give a course in architectural concepts here, but we'll give the details of how the Liberty Eiffel utilities can help you write high quality libraries.&lt;br /&gt;
&lt;br /&gt;
The simplest case is that of a &amp;quot;100% Eiffel&amp;quot; library. In this case, Liberty Eiffel provides its compiler and its [[Library interface|standard library]], which already contains a rich variety of features.&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel also provides a documentation utility: [[eiffeldoc|eiffeldoc]].&lt;br /&gt;
&lt;br /&gt;
In certain cases, a library must be able to interface with the underlying system, to get access to low level functions. One can imagine, for example, creating an audio library (sorry, these days one says &amp;quot;multimedia&amp;quot;), to make system calls to access the sound card.&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel provides a powerful utility: [[plugins]]. You can also use, even though it has been superseded, an older mechanism, [[externals|externals]].&lt;br /&gt;
&lt;br /&gt;
There are also two other mechanisms: [[inlining|inlining]] and [[cecil]].&lt;br /&gt;
&lt;br /&gt;
For more in-depth background information about building reusable software components and libraries, check out reference &amp;quot;RS 1994&amp;quot; on the [[Bibliography]] page.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Build_your_library&amp;diff=2731</id>
		<title>Build your library</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Build_your_library&amp;diff=2731"/>
		<updated>2024-07-30T12:15:33Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Library]]&lt;br /&gt;
We're not going to give a course in architectural concepts here, but we'll give the details of how the Liberty Eiffel utilities can help you write high quality libraries.&lt;br /&gt;
&lt;br /&gt;
The simplest case is that of a &amp;quot;100% Eiffel&amp;quot; library. In this case, Liberty Eiffel provides its compiler and its [[Library interface|standard library]], which already contains a rich variety of features.&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel also provides a documentation utility: [[eiffeldoc|eiffeldoc]].&lt;br /&gt;
&lt;br /&gt;
In certain cases, a library must be able to interface with the underlying system, to get access to low level functions. One can imagine, for example, creating an audio library (sorry, these days one says &amp;quot;multimedia&amp;quot;), to make system calls to access the sound card.&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel provides a powerful utility: [[plugins]]. You can also use , even though it has been superseded, an older mechanism, [[externals|externals]].&lt;br /&gt;
&lt;br /&gt;
There are also two other mechanisms: [[inlining|inlining]] and [[cecil]].&lt;br /&gt;
&lt;br /&gt;
For more in-depth background information about building reusable software components and libraries, check out reference &amp;quot;RS 1994&amp;quot; on the [[Bibliography]] page.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Externals&amp;diff=2730</id>
		<title>Externals</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Externals&amp;diff=2730"/>
		<updated>2024-07-30T11:35:16Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Interfacing]]&lt;br /&gt;
See &amp;quot;External Types&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Externals'' build on top of a standard Eiffel mechanism. This mechanism permits calling code in a language different from Eiffel.&lt;br /&gt;
&lt;br /&gt;
You will find below the current list of ''external'' specifications supported by Liberty.&lt;br /&gt;
&lt;br /&gt;
== external &amp;quot;C&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
This specification permits calling C code from Eiffel. This mechanism is described in [[Bibliography#ETL_1992|''Eiffel: The Language'']].&lt;br /&gt;
&lt;br /&gt;
Some examples are available in the tutorial, &amp;lt;TT&amp;gt;tutorial/external/C&amp;lt;/TT&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This mechanism is only available with [[compile_to_c]].&lt;br /&gt;
&lt;br /&gt;
This mechanism has since been supplanted with [[plugins]] (see below).&lt;br /&gt;
&lt;br /&gt;
== external &amp;quot;C++&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
This specification permits calling C++ code from  Eiffel. This mechanism is described in [[Bibliography#ETL_1992|''Eiffel: The Language'']].&lt;br /&gt;
&lt;br /&gt;
Some examples are available in the tutorial, &amp;lt;TT&amp;gt;tutorial/external/C++&amp;lt;/TT&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This mechanism is only available with [[compile_to_c]].&lt;br /&gt;
&lt;br /&gt;
This mechanism has since been supplanted with [[plugins]] (see below).&lt;br /&gt;
&lt;br /&gt;
== external &amp;quot;plug_in&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
This specification is particularly utilized by the Liberty standard libraries. This form is preferred to ''external &amp;quot;C&amp;quot;'' and ''external &amp;quot;Java&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Examples are available throughout the standard library.&lt;br /&gt;
&lt;br /&gt;
A [[plugins|dedicated page]] is devoted to this functionality.&lt;br /&gt;
&lt;br /&gt;
== external &amp;quot;built_in&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
This specification is reserved for the compiler and its base libraries. It is not usable outside of very specific cases, unique to [[compile_to_c]] and [[compile_to_jvm]]. These cases are the &amp;quot;building blocks&amp;quot; that produce specialized output code depending on the code generator being used.&lt;br /&gt;
&lt;br /&gt;
For example, &amp;lt;TT&amp;gt;infix &amp;quot;#+&amp;quot;&amp;lt;/TT&amp;gt; in the class [[library_class:INTEGER|&amp;lt;TT&amp;gt;INTEGER&amp;lt;/TT&amp;gt;]] is directly translated in C by a &amp;lt;TT&amp;gt;+&amp;lt;/TT&amp;gt;, and in Java by the &amp;lt;TT&amp;gt;iadd&amp;lt;/TT&amp;gt; bytecode.&lt;br /&gt;
&lt;br /&gt;
== external types ==&lt;br /&gt;
&lt;br /&gt;
A mechanism for embedding [[external types]] from the underlying language is being designed for a future release.&lt;br /&gt;
&lt;br /&gt;
== external &amp;quot;Java&amp;quot; - currently not supported ==&lt;br /&gt;
&lt;br /&gt;
This specification would permit calling Java code from Eiffel. Some examples used to be available in the tutorial, &amp;lt;TT&amp;gt;tutorial/external/Java&amp;lt;/TT&amp;gt;. This mechanism would only be available with [[compile_to_jvm]], which currently is not supported.&lt;br /&gt;
&lt;br /&gt;
This mechanism has since been supplanted with [[plugins]] (see below).&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Compile_to_jvm&amp;diff=2729</id>
		<title>Compile to jvm</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Compile_to_jvm&amp;diff=2729"/>
		<updated>2024-07-30T11:29:38Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Obsolete]]&lt;br /&gt;
In the old days of Liberty Eiffel's predecessor, there existed a backend &amp;lt;code&amp;gt;compile_to_jvm&amp;lt;/code&amp;gt; - an alternative compiler that produced Java byte-code. It generated a subdirectory named from the main class of a project that was suitable for either direct execution or JAR generation.&lt;br /&gt;
&lt;br /&gt;
 '''This backend is no longer supported, as no one seems to&amp;lt;br&amp;gt;care about it or use it for any interesting project.'''&lt;br /&gt;
&lt;br /&gt;
We will keep this for some time, but for the time being there are no plans to continue compile_to_jvm. If you think it would be worth resurrecting this backend, please [[Get_in_touch|let use know]].&lt;br /&gt;
&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compile_to_jvm [options] &amp;amp;lt;Root-Class&amp;amp;gt; &amp;amp;lt;Root-Procedure&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;compile_to_jvm [options] &amp;amp;lt;ACEfilename&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;compile_to_jvm -help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This tool works similarly to the standard [[compile_to_c|'''compile_to_c''']] compiler and thus shares many options: assertion control, path loading...&lt;br /&gt;
&lt;br /&gt;
Current (2.2) specific options are:&lt;br /&gt;
&lt;br /&gt;
* -jar: tell the compiler to also produce a .jar file of the project&lt;br /&gt;
* -run: tell the compiler to automatically run the project after successful compilation&lt;br /&gt;
* -use_jar &amp;amp;lt;jar&amp;amp;gt;: use &amp;amp;lt;jar&amp;amp;gt; application to generate the .jar file instead of the default one (implies -jar)&lt;br /&gt;
* -use_jvm &amp;amp;lt;jvm&amp;amp;gt;: use &amp;amp;lt;jvm&amp;amp;gt; to run the program instead of the default one (implies -run)&lt;br /&gt;
* -extern_compiler &amp;amp;lt;compiler&amp;amp;gt;: Use the Java &amp;amp;lt;compiler&amp;amp;gt; compiler to compile plugins and runtime&lt;br /&gt;
* -ss &amp;amp;lt;size&amp;amp;gt;: Set the maximum stack size to &amp;amp;lt;size&amp;amp;gt; (implies -run)&lt;br /&gt;
* -mx &amp;amp;lt;size&amp;amp;gt;: Set the maximum heap size to &amp;amp;lt;size&amp;amp;gt; (implies -run)&lt;br /&gt;
* -ms &amp;amp;lt;size&amp;amp;gt;: Set the initial heap size to &amp;amp;lt;size&amp;amp;gt; (implies -run)&lt;br /&gt;
* -classpath &amp;amp;lt;path&amp;amp;gt;: Set the path which is search for compiled classes (implies -run)&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Finder&amp;diff=2728</id>
		<title>Finder</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Finder&amp;diff=2728"/>
		<updated>2024-07-30T10:00:08Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tool]]&lt;br /&gt;
== Usage ==&lt;br /&gt;
  se find [options] [&amp;lt;ACEfile.ace&amp;gt;] &amp;lt;Class&amp;gt; &lt;br /&gt;
The find command tells you which file the compiler loads when searching for an Eiffel &amp;lt;Class&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
When an Eiffel file is found, find prints the full path name on standard output. &lt;br /&gt;
&lt;br /&gt;
The exit status is set to GENERAL.exit_success_code only when an existing file is found (thus allowing usage of the find command in shell scripts). &lt;br /&gt;
As for other commands, when the ACE file mode is used, only the content of the &amp;lt;ACEfile.ace&amp;gt; file is used to search the source file. &lt;br /&gt;
To see the loading path used by Liberty Eiffel, you can for example type the find command using a bad (non-existent) class name. &lt;br /&gt;
In ACE file mode, the loading path can be updated by modifying the ACE file itself. In traditional mode (i.e. no ACE file), the default loading path may also be tailored (see below).&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
 -help:&lt;br /&gt;
Display a brief summary of the command-line syntax and a complete list of find options. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 -version:&lt;br /&gt;
Show the number of the version of Liberty Eiffel you're using. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 -verbose:&lt;br /&gt;
Print system information during the compilation (full path of loaded files, type inference score, removed files, etc.). &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 -loadpath &amp;lt;loadpath_file&amp;gt;:&lt;br /&gt;
Adds a loadpath file for class lookup. See below for details on the loading path constitution.&lt;br /&gt;
&lt;br /&gt;
-raw:&lt;br /&gt;
Does not display the cluster name. Its only output is usually the path name of the class so it is useful in scripts.&lt;br /&gt;
&lt;br /&gt;
== Where does Find search? ==&lt;br /&gt;
&lt;br /&gt;
This is explained in detail in the [[class loading]] section. Note that finder will find all classes with a given name.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Related_Projects&amp;diff=2727</id>
		<title>Related Projects</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Related_Projects&amp;diff=2727"/>
		<updated>2024-07-12T17:21:22Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here a list of related projects with Liberty Eiffel:&lt;br /&gt;
&lt;br /&gt;
= eiffel-iup =&lt;br /&gt;
&lt;br /&gt;
A wrapper for the IUP toolkit. IUP is a multi-platform toolkit for building graphical user interfaces. IUP's purpose is to allow a program source code to be compiled in different systems without any modification. Its main advantages are:&lt;br /&gt;
&lt;br /&gt;
* High performance, due to the fact that it uses native interface elements.&lt;br /&gt;
* Fast learning by the user, due to the simplicity of its API.&lt;br /&gt;
&lt;br /&gt;
This wrapper is still under development, but is almost complete and we encourage you to use it and send feedback.&lt;br /&gt;
&lt;br /&gt;
The project website is: [https://notabug.org/GermanGT/eiffel-iup eiffel-iup]&lt;br /&gt;
&lt;br /&gt;
Tecgraf's IUP (currently in version 3.31) site: [https://www.tecgraf.puc-rio.br/iup/ Tecgraf IUP]&lt;br /&gt;
&lt;br /&gt;
This package is released under the MIT license.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Related_Projects&amp;diff=2726</id>
		<title>Related Projects</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Related_Projects&amp;diff=2726"/>
		<updated>2024-07-12T17:18:09Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here a list of related projects with Liberty Eiffel:&lt;br /&gt;
&lt;br /&gt;
= eiffel-iup =&lt;br /&gt;
&lt;br /&gt;
A wrapper for the IUP toolkit. IUP is a multi-platform toolkit for building graphical user interfaces. IUP's purpose is to allow a program source code to be compiled in different systems without any modification. Its main advantages are:&lt;br /&gt;
&lt;br /&gt;
* High performance, due to the fact that it uses native interface elements.&lt;br /&gt;
* Fast learning by the user, due to the simplicity of its API.&lt;br /&gt;
&lt;br /&gt;
This wrapper is still under development, but is almost complete and we encourage you to use it and send feedback.&lt;br /&gt;
&lt;br /&gt;
The project website is: [https://notabug.org/GermanGT/eiffel-iup eiffel-iup]&lt;br /&gt;
&lt;br /&gt;
Tecgraf's IUP (currently in version 3.30) site: [https://www.tecgraf.puc-rio.br/iup/ Tecgraf IUP]&lt;br /&gt;
&lt;br /&gt;
This package is released under the MIT license.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Related_Projects&amp;diff=2725</id>
		<title>Related Projects</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Related_Projects&amp;diff=2725"/>
		<updated>2024-07-12T17:16:50Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: updated Tecgraf IUP link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here a list of related projects with Liberty Eiffel:&lt;br /&gt;
&lt;br /&gt;
= eiffel-iup =&lt;br /&gt;
&lt;br /&gt;
A wrapper for the IUP toolkit. IUP is a multi-platform toolkit for building graphical user interfaces. IUP's purpose is to allow a program source code to be compiled in different systems without any modification. Its main advantages are:&lt;br /&gt;
&lt;br /&gt;
* High performance, due to the fact that it uses native interface elements.&lt;br /&gt;
* Fast learning by the user, due to the simplicity of its API.&lt;br /&gt;
&lt;br /&gt;
This wrapper is still under development, but is almost complete and we encourage you to use it and send feedback.&lt;br /&gt;
&lt;br /&gt;
The project website is: [https://notabug.org/GermanGT/eiffel-iup eiffel-iup]&lt;br /&gt;
&lt;br /&gt;
Tecgraph's IUP (currently in version 3.30) site: [https://www.tecgraf.puc-rio.br/iup/ Tecgraf IUP]&lt;br /&gt;
&lt;br /&gt;
This package is released under the MIT license.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2724</id>
		<title>Bibliography</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Bibliography&amp;diff=2724"/>
		<updated>2024-07-12T09:28:59Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: Added book title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Literature]]&lt;br /&gt;
__NOTOC__ &amp;lt;!-- Use alphabetical order of keys. --&amp;gt;&lt;br /&gt;
==ETL 1992==&lt;br /&gt;
Bertrand Meyer. &lt;br /&gt;
''Eiffel: The Language''. &lt;br /&gt;
Prentice Hall, 1993, ISBN 0-13-247925-7.&lt;br /&gt;
&lt;br /&gt;
==GC book==&lt;br /&gt;
Richar Jones and Rafael Lins. &lt;br /&gt;
''Garbage Collection. Algorithms for  Automatic Dynamic Memory Management''.&lt;br /&gt;
John Wiley &amp;amp; Sons, ISBN 0-471-941484-4.&lt;br /&gt;
&lt;br /&gt;
==GoF 1995==&lt;br /&gt;
Erich Gamma, Richard Helm and Ralph Johnson and John Vlissides.&lt;br /&gt;
''Design Patterns: Elements of Reusable Object-Oriented Software''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1995, ISBN 0201633612.&lt;br /&gt;
&lt;br /&gt;
==Goldberg 1984==&lt;br /&gt;
Adele Goldberg.&lt;br /&gt;
''Smalltalk-80, The Interactive Programming Environment''.&lt;br /&gt;
Addisson-Wesley, Reading Massachusetts, 1984, ISBN 0-201-11372-4.&lt;br /&gt;
&lt;br /&gt;
==GR 1983==&lt;br /&gt;
Adele Goldberg and David Robson.&lt;br /&gt;
''Smalltalk-80: The Language and its Implementation''.&lt;br /&gt;
Addison-Wesley, 1983, ISBN 0-201-11371-6.&lt;br /&gt;
&lt;br /&gt;
==JMJ 1996==&lt;br /&gt;
Jean-Marc Jézéquel.&lt;br /&gt;
''Object-Oriented Software Engineering with Eiffel''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-63381-7.  This book is a gentle introduction to Eiffel programming, without the academic verbosity of many of the other titles in this list.&lt;br /&gt;
&lt;br /&gt;
==JTM 1999==&lt;br /&gt;
Jean-Marc Jézéquel, Michel Train and Christine Mingins.&lt;br /&gt;
''Design Patterns and Contracts''.&lt;br /&gt;
Addison-Wesley, 1999, ISBN 0-201-30959-9.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1989==&lt;br /&gt;
Gérald Masini, Amédéo Napoli, Dominique Colnet, Daniel Léonard et Karl Tombre.&lt;br /&gt;
''Les langages à objets''.&lt;br /&gt;
InterEditions&amp;quot;, Paris&amp;quot;, 1989, ISBN 2-7296-0275-5.&lt;br /&gt;
&lt;br /&gt;
==MNCLT 1991==&lt;br /&gt;
Gérald Masini and Amédéo Napoli and Dominique Colnet and Daniel Léonard and Karl Tombre.&lt;br /&gt;
''Object-Oriented Languages''.&lt;br /&gt;
Academic Press, New York, 1991, ISBN 0-12-477390-7.&lt;br /&gt;
&lt;br /&gt;
==OOSC 1997==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Object-oriented Software Construction, 2nd Ed.''.&lt;br /&gt;
Prentice Hall 1997, 1254 pages, ISBN 0-13-629155-4.&lt;br /&gt;
&lt;br /&gt;
==RMJM 2002==&lt;br /&gt;
Richard Mitchel and Jim McKim.&lt;br /&gt;
''Design by Contract, by Example''.&lt;br /&gt;
Adison-Wesley 2002, 238 pages, ISBN 0-201-63460-0.  This title introduces a well structured and very thorough method of using DbC.&lt;br /&gt;
&lt;br /&gt;
==TOCBM 2009==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''TOUCH OF CLASS - Learning to program well with Objects and Contracts''.&lt;br /&gt;
Springer Verlag 2009, 876 pages, ISBN 978-81-322-0374-2.  Unfortunately, this title assumes that you download supporting code and libraries, but the URL in the book is no longer valid.&lt;br /&gt;
&lt;br /&gt;
==RS 1994==&lt;br /&gt;
Bertrand Meyer.&lt;br /&gt;
''Reusable Software: The Base Object-Oriented Component Libraries''.&lt;br /&gt;
Prentice Hall, 1994, 514 pages, ISBN-10: 013-245-499-8 ISBN-13: 978-013-245-499-5&lt;br /&gt;
&lt;br /&gt;
==ECMA 367 / 2006==&lt;br /&gt;
ECMA International 2006.&lt;br /&gt;
''Eiffel: Analysis, Design and Programming Language''.&lt;br /&gt;
https://www.ecma-international.org/wp-content/uploads/ECMA-367_2nd_edition_june_2006.pdf&lt;br /&gt;
&lt;br /&gt;
==SOOSA 2015==&lt;br /&gt;
Kim Waldén and Jean-Marc Nelson.&lt;br /&gt;
''Seamless Object-Oriented Software Architecture''.&lt;br /&gt;
Prentice Hall, 2015, 438 pages, ISBN 0-13-031303-3.  This title is about BON (Business Object Notation), less so about the Eiffel language. BON as a method was developed by the authors of this book. BON is perceived to be simpler than the UML method.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Coding_Style_Guide&amp;diff=2723</id>
		<title>Coding Style Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Coding_Style_Guide&amp;diff=2723"/>
		<updated>2024-07-10T11:33:28Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some proposals on how to format and comment code; usual common Eiffel practices are recommended of course.&lt;br /&gt;
&lt;br /&gt;
* try to choose feature names that would make code read (as much as) the English language. &lt;br /&gt;
* boolean queries should be named &amp;lt;code&amp;gt;is_....&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
* Describe each feature. Do not leave any feature without a description; while it is surely obvious for the feature writer it may not be so manifest to another person. What does a command do? What's the meaning of a query? Avoid phrasing like &amp;quot;This feature opens a window&amp;quot;, write instead &amp;quot;Opens a window&amp;quot;; instead of &amp;quot;This function returns the number of acorns in tree-hole&amp;quot; write &amp;quot;Number of acorns in the tree-hole&amp;quot;.&lt;br /&gt;
* try to name feature argument prefixing them with generic English preposition (a_, an_, some_); this make code-reading more fluent.&lt;br /&gt;
* omit feature comments in case the feature name fully explains the feature&lt;br /&gt;
* use correct indentation&lt;br /&gt;
* &amp;lt;code&amp;gt;feature&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;creation&amp;lt;/code&amp;gt; clauses should always have an explicit client list (Liberty will raise a warning otherwise). Of course it may be &amp;lt;code&amp;gt;{ANY}&amp;lt;/code&amp;gt;. An empty list i.e. &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; means that only unqualified calls are possible (i. e. the *implicit* &amp;lt;code&amp;gt;Current&amp;lt;/code&amp;gt; target, not the explicit &amp;lt;code&amp;gt;Current&amp;lt;/code&amp;gt;! may use it); &amp;lt;code&amp;gt;{NONE}&amp;lt;/code&amp;gt; is discouraged as the NONE adds no information at all.&lt;br /&gt;
* use 3 spaces for indentation, no TAB&lt;br /&gt;
&lt;br /&gt;
Feel free to make any proposal and improvements.&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Liberty_Eiffel_users_list&amp;diff=2722</id>
		<title>Liberty Eiffel users list</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Liberty_Eiffel_users_list&amp;diff=2722"/>
		<updated>2024-07-10T08:59:03Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Community]]&lt;br /&gt;
&amp;lt;div id=&amp;quot;LibertyEiffelUsersList&amp;quot;&amp;gt;&lt;br /&gt;
'''List of Liberty Eiffel users'''.  You may register yourself in the list below.&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schools or universities==&lt;br /&gt;
Empty slot.&lt;br /&gt;
----&lt;br /&gt;
Empty slot.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==Projects or individuals==&lt;br /&gt;
[[User:Ramack|Raphael Mack]]&lt;br /&gt;
----&lt;br /&gt;
[[User:Cadrian|Cyril Adrian]]&lt;br /&gt;
----&lt;br /&gt;
[[User:Hzwakenberg|Hans Zwakenberg]]&lt;br /&gt;
----&lt;br /&gt;
Empty slot&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Compatibility&amp;diff=2721</id>
		<title>Compatibility</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Compatibility&amp;diff=2721"/>
		<updated>2024-07-10T08:06:56Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: lingual correction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is about language compatibility for Liberty Eiffel. Here you find the most important differences between Liberty Eiffel and other similar languages. The list is not intended to be exhaustive, it just intends to highlight the most significant differences.&lt;br /&gt;
&lt;br /&gt;
See also [[ECMA]].&lt;br /&gt;
&lt;br /&gt;
== Unique peculiarities of Liberty Eiffel ==&lt;br /&gt;
&lt;br /&gt;
Liberty Eiffel has some features not implemented by any other implementation:&lt;br /&gt;
&lt;br /&gt;
* Case sensitivity: &amp;quot;abc&amp;quot;, &amp;quot;Abc&amp;quot; and &amp;quot;ABC&amp;quot; are different identifiers&lt;br /&gt;
* Compiler-enforced casing rules: Class names must be all-uppercase; camelCase is not allowed.&lt;br /&gt;
* ANY is the root of the inheritance tree, but not of the conformance tree. &lt;br /&gt;
* Conformance rules related to expanded types.&lt;br /&gt;
* Non-conforming inheritance. See [[Conforming and non-conforming inheritance]]&lt;br /&gt;
* The notation for non-conforming inheritance is &amp;quot;insert &amp;lt;Type_Class&amp;gt;&amp;quot;.&lt;br /&gt;
* New operators for run-time type checking. See [[Dynamic type testing]]&lt;br /&gt;
* Removed the danger of automatic boxing (object allocation on assignment of expanded types to reference entities)&lt;br /&gt;
* Lots of additional tools in the library. See [[Table of contents#Library|The Liberty Eiffel general purpose library]]&lt;br /&gt;
* Notation for [[Manifest storage notation|manifest collections]]. The old &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;...&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; is still supported for simple arrays.&lt;br /&gt;
* Unicode strings manifest notation.&lt;br /&gt;
* Agents look contravariant, but they are not. Believe us. For details and explanations, see [http://www.jot.fm/issues/issue_2004_04/article7 this article].&lt;br /&gt;
&lt;br /&gt;
== Differences between ETL2 and the former SmartEiffel ==&lt;br /&gt;
&lt;br /&gt;
SmartEiffel was at some time based on ETL2; as all the members of the Eiffel language family, it has grown and improved on that, adding several features (some of them also implemented by other compilers)&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Precursor&amp;quot; mechanism (proposed at OOSC2). see [[Precursor]]&lt;br /&gt;
* Agents and tuples. see [[Agent]] and [[Tuple]]&lt;br /&gt;
&lt;br /&gt;
== Differences between the former SmartEiffel and ECMA Eiffel ==&lt;br /&gt;
&lt;br /&gt;
The [http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA Eiffel specification] does not describe any current implementation at the time of writing this (November 2005). Despite being a standard it describes several features that fork away from what always had been called &amp;quot;Eiffel&amp;quot;. The following aspects of ECMA Eiffel will not be implemented in SmartEiffel:&lt;br /&gt;
&lt;br /&gt;
* Conversions (implemented in ISE Eiffel)&lt;br /&gt;
* Feature aliases (implemented in ISE Eiffel)&lt;br /&gt;
* Bracket indexing (implemented in ISE Eiffel)&lt;br /&gt;
* No-variant agent arguments.&lt;br /&gt;
&lt;br /&gt;
On the other hand, the following features were taken from the ECMA specification process:&lt;br /&gt;
&lt;br /&gt;
* Non-conforming inheritance (although the notation is different)&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Precursor&amp;diff=2720</id>
		<title>Precursor</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Precursor&amp;diff=2720"/>
		<updated>2024-07-09T10:57:49Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Precursor ==&lt;br /&gt;
&lt;br /&gt;
Precursor was introduced in OOSC (second edition), page 523:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;The construct 'Precursor' may be used in lieu of a feature name, but only in the body of a redefined routine.&lt;br /&gt;
A call to this feature, with arguments if required, is a call to the parent’s version of the routine (the precursor).&amp;quot;&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Precursor&amp;diff=2719</id>
		<title>Precursor</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Precursor&amp;diff=2719"/>
		<updated>2024-07-09T10:29:03Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: Created page with &amp;quot;== Precursor ==  Precursor was introduces in OOSC (second edition), page 523:  &amp;quot;The construct 'Precursor' may be used in lieu of a feature name, but only in the body of a redefined routine. A call to this feature, with arguments if required, is a call to the parent’s version of the routine (the precursor).&amp;quot;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Precursor ==&lt;br /&gt;
&lt;br /&gt;
Precursor was introduces in OOSC (second edition), page 523:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;The construct 'Precursor' may be used in lieu of a feature name, but only in the body of a redefined routine.&lt;br /&gt;
A call to this feature, with arguments if required, is a call to the parent’s version of the routine (the precursor).&amp;quot;&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Wish_list&amp;diff=2718</id>
		<title>Wish list</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Wish_list&amp;diff=2718"/>
		<updated>2024-07-08T07:58:55Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: Removed items that were done already, even if this list is obsolete.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Obsolete]]&lt;br /&gt;
 This whish list is obsolete, please use the ticket system for [https://savannah.gnu.org/bugs/?func=additem&amp;amp;group=liberty-eiffel bugs] and [https://savannah.gnu.org/task/?func=additem&amp;amp;group=liberty-eiffel tasks] on [https://savannah.gnu.org/projects/liberty-eiffel/ savannah]. &lt;br /&gt;
&lt;br /&gt;
==COMMAND_LINE_TOOLS==&lt;br /&gt;
I don't think this is worth a task, as [[eiffeldoc]] already is an example for [[tool_class:EXTERNAL_TOOL|&amp;lt;tt&amp;gt;EXTERNAL_TOOL&amp;lt;/tt&amp;gt;]].&lt;br /&gt;
--[[User:Ramack|Ramack]] ([[User talk:Ramack|talk]])&lt;br /&gt;
&lt;br /&gt;
==Class TREE==&lt;br /&gt;
Is it worth a ticket? -&amp;gt; I don't think so. it's too unspecific what TREE should be good for.&lt;br /&gt;
--[[User:Ramack|Ramack]] ([[User talk:Ramack|talk]])&lt;br /&gt;
&lt;br /&gt;
==Incremental Eiffel compilation==&lt;br /&gt;
On C level the code is &amp;quot;incrementally&amp;quot; compiled ;-) But no, there will not be a redesign in near future. So we should better drop this request.&lt;br /&gt;
--[[User:Ramack|Ramack]] ([[User talk:Ramack|talk]])&lt;br /&gt;
&lt;br /&gt;
== Finally implementing SCOOP? ==&lt;br /&gt;
==&amp;gt; [[task:13317]]&lt;br /&gt;
&lt;br /&gt;
== Make generated C code thread-safe? ==&lt;br /&gt;
==&amp;gt; [[task:13320]]&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Liberty_Eiffel_Wiki:About&amp;diff=2717</id>
		<title>Liberty Eiffel Wiki:About</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Liberty_Eiffel_Wiki:About&amp;diff=2717"/>
		<updated>2024-07-07T16:18:40Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki provides documentation for the [http://www.liberty-eiffel.org/ LibertyEiffel] compiler, libraries, wrappers and tools.&lt;br /&gt;
&lt;br /&gt;
If you want to contribute, please feel free to request a user account on [[Get in touch#Mailing list|mailing list]] [mailto:liberty-eiffel@gnu.org liberty-eiffel@gnu.org] and please take note of a few simple [[Author guidelines]].&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=Liberty_Eiffel_Wiki:About&amp;diff=2716</id>
		<title>Liberty Eiffel Wiki:About</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=Liberty_Eiffel_Wiki:About&amp;diff=2716"/>
		<updated>2024-07-07T16:18:09Z</updated>

		<summary type="html">&lt;p&gt;Hzwakenberg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki provides documentation for the [http://www.liberty-eiffel.org/ LibertyEiffel] compiler, libraries, wrappers and tools.&lt;br /&gt;
&lt;br /&gt;
If you want to contribute, please feel free to request a user account on [[Get in touch#Mailing list|mailing list]] [mailto:liberty-eiffel@gnu.org liberty-eiffel@gnu.org] and please take notice of a few simple [[Author guidelines]].&lt;/div&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
</feed>