<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://doc.expecco.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cg</id>
	<title>expecco Wiki (Version 25.x) - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://doc.expecco.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cg"/>
	<link rel="alternate" type="text/html" href="https://doc.expecco.de/wiki/Spezial:Beitr%C3%A4ge/Cg"/>
	<updated>2026-06-09T08:20:55Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://doc.expecco.de/index.php?title=DiagramElements-FreezeValue/en&amp;diff=31406</id>
		<title>DiagramElements-FreezeValue/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=DiagramElements-FreezeValue/en&amp;diff=31406"/>
		<updated>2026-06-09T02:29:40Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Any */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A so called &amp;quot;&#039;&#039;Freeze Value&#039;&#039;&amp;quot; is a constant value attached to an input pin.&lt;br /&gt;
When executed, that value will be presented to the action. Pins with such a constant input are referred to as &amp;quot;&#039;&#039;frozen pins&#039;&#039;&amp;quot; in expecco.&lt;br /&gt;
&lt;br /&gt;
The freeze value can be either specified as a literal (textual) constant, or be provided by a variable (from an environment which is visible at the time the step is active).&lt;br /&gt;
&lt;br /&gt;
Be aware, that frozen pin values should normally not be consumed; &lt;br /&gt;
i.e. in case the step is executed twice,&lt;br /&gt;
the value should still be present for the second incarnation. This is especially important if a step is executed in a loop or triggered by a step which writes multiple values to an output.&lt;br /&gt;
&lt;br /&gt;
Thus, the diagram editor will automatically change the pin&#039;s behavior to non-triggering and non-consuming (i.e. make it a &amp;quot;&#039;&#039;parameter pin&#039;&#039;&amp;quot;).&lt;br /&gt;
&amp;lt;br&amp;gt;You can also change the pin&#039;s behavior via its context menu (&amp;quot;&#039;&#039;Make Parameter Pin&#039;&#039;&amp;quot;) or with  the keyboard shortcut &amp;lt;kbd&amp;gt;CTRL-p&amp;lt;/kbd&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following describes the data format and syntax used for pin freeze values (which btw. is also used for environment variables).&lt;br /&gt;
In general, the text entered as freeze value is parsed by the input pin&#039;s datatype, or if it is provided by a variable, that variable&#039;s data type.&lt;br /&gt;
&lt;br /&gt;
== Format for Particular Types ==&lt;br /&gt;
&lt;br /&gt;
=== Integer ===&lt;br /&gt;
Integer constants can be entered in one of the following formats:&lt;br /&gt;
&lt;br /&gt;
* decimal (for example: &amp;quot;&amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&amp;quot; , &amp;quot;&amp;lt;code&amp;gt;-1234&amp;lt;/code&amp;gt;)&lt;br /&gt;
* with Smalltalk radix prefix: (for example: &amp;quot;&amp;lt;code&amp;gt;16rCAFE&amp;lt;/code&amp;gt;&amp;quot; , &amp;quot;&amp;lt;code&amp;gt;16r-AA&amp;lt;/code&amp;gt;, &amp;quot;&amp;lt;code&amp;gt;8r100&amp;lt;/code&amp;gt;, &amp;quot;&amp;lt;code&amp;gt;2r101010000&amp;lt;/code&amp;gt;).&lt;br /&gt;
::Any radix between 2 and 36 is allowed.&lt;br /&gt;
* with C radix prefix: (for example: &amp;quot;&amp;lt;code&amp;gt;0xCAFE&amp;lt;/code&amp;gt;&amp;quot; , &amp;quot;&amp;lt;code&amp;gt;-0xAA&amp;lt;/code&amp;gt;, &amp;quot;&amp;lt;code&amp;gt;0b101010000&amp;lt;/code&amp;gt;) (&amp;quot;0x&amp;quot; for hex, &amp;quot;0o&amp;quot; for octal and &amp;quot;0b&amp;quot; for binary).&lt;br /&gt;
::Notice that the C-octal notation (prefix 0) is not supported&amp;lt;br&amp;gt;(ie. &amp;quot;&amp;lt;code&amp;gt;0377&amp;lt;/code&amp;gt;&amp;quot; will be read as 377).&lt;br /&gt;
&lt;br /&gt;
=== Float ===&lt;br /&gt;
&lt;br /&gt;
By default, floats are represented as double-precision IEEE limited precision rationals (64 bit).&lt;br /&gt;
You can force single precision floats by using the &#039;f&#039; exponent indicator (or an &#039;f&#039; suffix). &lt;br /&gt;
&lt;br /&gt;
* double precision (64bit) floats such as: &amp;quot;&amp;lt;code&amp;gt;123.0&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;+123.0&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;-123.0&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;.123&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;123.&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;123.0e+2&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;123.0e-2&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* single precision (32 bit): &amp;quot;&amp;lt;code&amp;gt;123.0f+2&amp;lt;/code&amp;gt;&amp;quot; or &amp;quot;&amp;lt;code&amp;gt;-123.0f&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* extended precision (80+ bit): &amp;quot;&amp;lt;code&amp;gt;123.0q+2&amp;lt;/code&amp;gt;&amp;quot; or &amp;quot;&amp;lt;code&amp;gt;-123.0q&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* quadruple precision (128 bit): &amp;quot;&amp;lt;code&amp;gt;123.0Q+2&amp;lt;/code&amp;gt;&amp;quot; or &amp;quot;&amp;lt;code&amp;gt;-123.0Q&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Do not expect any speed or other advantages when using single precision floats (depends on the CPU). Actually, expect problems due to larger errors, non-stable series computations etc. Use them only if you need to emulate less precise computations.&lt;br /&gt;
&lt;br /&gt;
Extended precision floats may not be supported by all CPU types (these use the underlying machine&#039;s &amp;quot;long double&amp;quot; data type, which is either an 80-bit extended IEEE or a 128-bit quadruple IEEE float (eg. on Sparc CPUs). Not all CPUs do support these and we can not guarantee that future machines will. However, currently all supported architectures do.&lt;br /&gt;
&lt;br /&gt;
Notice that depending on the CPU, quadruple precision arithmetic might be performed by software and will therefore be slow (currently the case for all supported architectures)&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
&lt;br /&gt;
If the pin&#039;s datatype is &amp;lt;CODE&amp;gt;String&amp;lt;/code&amp;gt;, then no leading/trailing single quotes are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;In fact, if there are quotes, these will be part of the string. &amp;lt;br&amp;gt;However, &#039;&#039;&#039;quotes are needed&#039;&#039;&#039; if the type is not unambiguously a String type (i.e. Any or a Union type).&lt;br /&gt;
&lt;br /&gt;
By default, NO C-style escape sequences are interpreted - i.e. the string is taken &amp;quot;as-is&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;If you want or need control or non-latin1 characters, either enable the &amp;quot;&#039;&#039;C-Escapes&#039;&#039;&amp;quot; toggle via the freeze-value&#039;s popup menu, or freeze it as &amp;quot;C-String&amp;quot;, which is a pseudo datatype offered in the freeze as menu.&lt;br /&gt;
&lt;br /&gt;
You can then use the escapes:&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;&amp;quot; for a newline character&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt;&amp;quot; for a return character&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;\t&amp;lt;/code&amp;gt;&amp;quot; for a tab&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;\b&amp;lt;/code&amp;gt;&amp;quot; for a backspace&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;\xXX&amp;lt;/code&amp;gt;&amp;quot; for a single byte hex-character code&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;\uXXXX&amp;lt;/code&amp;gt;&amp;quot; for a 32bit hex-character code&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt;&amp;quot; for the &amp;quot;\&amp;quot; character.&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;\0&amp;lt;/code&amp;gt;&amp;quot; for a null character (null byte)&lt;br /&gt;
&lt;br /&gt;
By default, variables of the form &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; are expanded from either an expecco variable or the shell environment. Thus,&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;$(HOME)/foo/bar&amp;lt;/code&amp;gt;&amp;quot; will expand to the name of a subdirectory &amp;quot;foo/bar&amp;quot; under your home directory (in unix). Or if you have a variable named &amp;quot;HOME&amp;quot; in the expecco environment, to whatever that value is.&lt;br /&gt;
This behavior can be disabled via the freeze value&#039;s popup menu.&lt;br /&gt;
&lt;br /&gt;
In addition, variables of the form &amp;quot;&amp;lt;code&amp;gt;%(xxx)&amp;lt;/code&amp;gt;&amp;quot; are expanded by the value of the input pin named &amp;quot;xxx&amp;quot;. This expansion is also controlled by a flag in the popup menu.&lt;br /&gt;
&lt;br /&gt;
Freeze value expansion can be suppressed either at the pin (see the freeze-menu),&lt;br /&gt;
or globally via a flag in the project or import library. Global disabling is discouraged and only to be used for backward compatibility (in the rare situation, that an older library depends on such freeze values being unchanged).&lt;br /&gt;
&lt;br /&gt;
Be reminded, that these variable expansions are only done for freeze values. If the value comes from another pin, it is passed unchanged.&lt;br /&gt;
&lt;br /&gt;
=== Bytes (ByteArray) ===&lt;br /&gt;
&lt;br /&gt;
Byte data can be entered in multiple forms:&lt;br /&gt;
* Smalltalk format: &amp;quot;&amp;lt;code&amp;gt;#[ 1 2 3 ]&amp;lt;/code&amp;gt;&amp;quot; (spaces between byte values)&lt;br /&gt;
* JSON format: &amp;quot;&amp;lt;code&amp;gt;[ 1, 2, 3 ]&amp;lt;/code&amp;gt;&amp;quot; (commas between byte values)&lt;br /&gt;
* C format: &amp;quot;&amp;lt;code&amp;gt;{ 1, 2, 3 }&amp;lt;/code&amp;gt;&amp;quot; (braces and commas between byte values)&lt;br /&gt;
* hex format: &amp;quot;&amp;lt;code&amp;gt;xxXXxxXX&amp;lt;/code&amp;gt;&amp;quot; (two hex characters per byte; no spaces in-between)&lt;br /&gt;
* hex format: &amp;quot;&amp;lt;code&amp;gt;xx XX xx XX&amp;lt;/code&amp;gt;&amp;quot; (two hex characters per byte; with spaces in-between)&lt;br /&gt;
&lt;br /&gt;
=== Arrays (Sequenceables) ===&lt;br /&gt;
given that elements el1, el2, ... elN can be represented as literal constants (i.e. Strings, numbers, bytes or arrays), a sequence of them can be&lt;br /&gt;
written as:&lt;br /&gt;
* Smalltalk format: &amp;quot;&amp;lt;code&amp;gt;#( el1 el2 ... elN )&amp;lt;/code&amp;gt; (with spaces between elements).&lt;br /&gt;
* JSON format: &amp;quot;&amp;lt;code&amp;gt;[ el1 , el2 , ... , elN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geometric Objects (Points and Rectangles) ===&lt;br /&gt;
Points are entered (in Smalltalk syntax) as:&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;&#039;x&#039;&#039; @ &#039;&#039;y&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Point x:&#039;&#039;x&#039;&#039; y:&#039;&#039;y&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
where &#039;&#039;x&amp;amp;&#039;&#039; and &#039;&#039;y&#039;&#039; are numeric constants (typically integers).&lt;br /&gt;
&lt;br /&gt;
Rectangles (in Smalltalk syntax):&lt;br /&gt;
* &amp;lt;code&amp;gt;(&#039;&#039;xL&#039;&#039; @ &#039;&#039;yT&#039;&#039;) extent:(&#039;&#039;w&#039;&#039; @ &#039;&#039;h&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;(&#039;&#039;xL&#039;&#039; @ &#039;&#039;yT&#039;&#039;) corner:(&#039;&#039;xR&#039;&#039; @ &#039;&#039;yB&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Rectangle left:&#039;&#039;xL&#039;&#039; top:&#039;&#039;yT&#039;&#039; width:&#039;&#039;wT&#039;&#039; height:&#039;&#039;hT&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Rectangle left:&#039;&#039;xL&#039;&#039; top:&#039;&#039;yT&#039;&#039; right:&#039;&#039;xR&#039;&#039; bottom:&#039;&#039;yB&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
where &#039;&#039;xL&#039;&#039; and &#039;&#039;y&#039;&#039; are the left and top coordinates, &#039;&#039;xR&#039;&#039; and &#039;&#039;yB&#039;&#039; are the coordinates of the corner (the first pixel outside the rectangle), and &#039;&#039;w&#039;&#039; and &#039;&#039;h&#039;&#039; are the extent (width and height) of the rectangle.&lt;br /&gt;
&lt;br /&gt;
=== Any ===&lt;br /&gt;
To distinguish between strings and non-strings, String-constants for an Any-typed pin or a type which accepts both strings and non-strings (i.e. unions), a string value &#039;&#039;&#039;must&#039;&#039;&#039; be quoted.&lt;br /&gt;
&amp;lt;br&amp;gt;For example:&lt;br /&gt;
* &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt; - will be an integer value&lt;br /&gt;
* &amp;lt;code&amp;gt;1234.56&amp;lt;/code&amp;gt; - will be a float value&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;1234&#039;&amp;lt;/code&amp;gt; - will be a string value&lt;br /&gt;
in contrast, a freeze value of a string-typed pin should NOT have quotes around.&lt;br /&gt;
&lt;br /&gt;
== Variable Expansion ==&lt;br /&gt;
&lt;br /&gt;
Inside a freeze value, variable values can be embedded using the &amp;quot;$(...)&amp;quot; notation,&lt;br /&gt;
unless the freeze value has the &amp;quot;&#039;&#039;No Variable Expansion&#039;&#039; flag set via the freeze value&#039;s popup menu).&lt;br /&gt;
&lt;br /&gt;
=== $(...) Expansion ===&lt;br /&gt;
In addition to the visible environment variables, the following builtin names are allowed:&lt;br /&gt;
* &amp;lt;code&amp;gt;AttachmentsDirectory&amp;lt;/code&amp;gt; - the directory, where all attachments of the suite are located.&lt;br /&gt;
* &amp;lt;code&amp;gt;Attachments&amp;lt;/code&amp;gt; - the same, but a little shorter&lt;br /&gt;
* &amp;lt;code&amp;gt;ExecutionDirectory&amp;lt;/code&amp;gt; - a temporary directory, which vanishes after the execution&lt;br /&gt;
* &amp;lt;code&amp;gt;ExpeccoInstallationDirectory&amp;lt;/code&amp;gt; - the directory, where expecco was installed&lt;br /&gt;
* &amp;lt;code&amp;gt;ExpeccoLibraryDirectory&amp;lt;/code&amp;gt; - the directory, where the libraries delivered with expecco live (first supported in 23.1)&lt;br /&gt;
* &amp;lt;code&amp;gt;ExpeccoPluginDirectory&amp;lt;/code&amp;gt; - the directory, where expecco&#039;s plugins are installed&lt;br /&gt;
* &amp;lt;code&amp;gt;ProjectDirectory&amp;lt;/code&amp;gt; - the temporary project directory&lt;br /&gt;
* &amp;lt;code&amp;gt;HomeDirectory&amp;lt;/code&amp;gt; - the user&#039;s home directory&lt;br /&gt;
* &amp;lt;code&amp;gt;TmpDirectory&amp;lt;/code&amp;gt; - a temporary directory (subfolder of the system&#039;s tmp directory)&lt;br /&gt;
* &amp;lt;code&amp;gt;CurrentDirectory&amp;lt;/code&amp;gt; - the &amp;quot;current&amp;quot; directory (see below)&lt;br /&gt;
* &amp;lt;code&amp;gt;DocumentsDirectory&amp;lt;/code&amp;gt; - the &amp;quot;documents&amp;quot; directory&lt;br /&gt;
* &amp;lt;code&amp;gt;DesktopDirectory&amp;lt;/code&amp;gt; - the &amp;quot;desktop&amp;quot; directory&lt;br /&gt;
* &amp;lt;code&amp;gt;LoginName&amp;lt;/code&amp;gt; - your login name (username under Unix/Linux/OSX)&lt;br /&gt;
* &amp;lt;code&amp;gt;UserName&amp;lt;/code&amp;gt; - your full name (if known, otherwise the login name)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;&#039;&#039;inPinName&#039;&#039;&amp;gt; - where inPinName is the name of an input pin of the containing compound action&lt;br /&gt;
&lt;br /&gt;
If the script must run somewhere else, you can provide the path at the block&#039;s &amp;quot;&#039;&#039;execDir&#039;&#039;&amp;quot; input pin (or for shell scripts, you can also specify it in the editor, which is effectively defining the directory as a freeze value). The execution directory pathname (provided at the pin) may contain placeholders in the form &amp;quot;$(&#039;&#039;xxx&#039;&#039;)&amp;quot;, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is either a shell environment variable, or one of the above listed builtin placeholder variables.&lt;br /&gt;
&lt;br /&gt;
== Popup Menu ==&lt;br /&gt;
&lt;br /&gt;
Of special interest are the entries:&lt;br /&gt;
&lt;br /&gt;
=== JSON Encoded ===&lt;br /&gt;
The freeze value&#039;s text is a JSON string, and the decoded object is passed to the action as pin-value. Be careful to provide correct syntax here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Array:&lt;br /&gt;
 [  &amp;amp;lt;element1&amp;amp;gt; , &amp;amp;lt;element2&amp;amp;gt; , ... &amp;amp;lt;elementN&amp;amp;gt; ]&lt;br /&gt;
Object:&lt;br /&gt;
 { &amp;quot;&amp;amp;lt;fieldName1&amp;amp;gt;&amp;quot;: &amp;amp;lt;fieldValue1&amp;amp;gt; , &lt;br /&gt;
   &amp;quot;&amp;amp;lt;fieldName2&amp;amp;gt;&amp;quot;: &amp;amp;lt;fieldValue2&amp;amp;gt; ,&lt;br /&gt;
              ...&lt;br /&gt;
   &amp;quot;&amp;amp;lt;fieldNameN&amp;amp;gt;&amp;quot;: &amp;amp;lt;fieldValueN&amp;amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
Other:&lt;br /&gt;
   true&lt;br /&gt;
   false&lt;br /&gt;
   null&lt;br /&gt;
   &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
   &amp;amp;lt;float&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
A future version may provide additional syntax checks in this editor.&lt;br /&gt;
For now, we assume that most of us will simply copy-paste a JSON string from some other place. Let us know, if that would be a high priority feature in the next version.&lt;br /&gt;
&lt;br /&gt;
=== C-Style Escapes ===&lt;br /&gt;
The freeze value&#039;s text is a string with C-style escape sequences (see above).&lt;br /&gt;
&lt;br /&gt;
=== No Variable Expansion ===&lt;br /&gt;
No variables are expanded inside the freeze value. Use this, to pass strings eg. to shell scripts, which require strings with embedded $(...) sequences.&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31403</id>
		<title>KI Coding Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31403"/>
		<updated>2026-06-08T08:18:21Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Was kann eine lokale KI (z.B. ollama) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KI Coding Plugin =&lt;br /&gt;
&lt;br /&gt;
Das KI Coding Plugin bindet einen Large Language Model (LLM) basierten&lt;br /&gt;
KI-Assistenten in den Activity-Editor (Aktivitäten-Code), den&lt;br /&gt;
Compound-Netzwerk-Editor, den Dokumentations-Editor und in den&lt;br /&gt;
ST/X Class Browser ein.  Das Plugin unterstützt zwei Anbieter, die im&lt;br /&gt;
Einstellungsdialog umschaltbar sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anthropic Claude&#039;&#039;&#039; (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)&lt;br /&gt;
* &#039;&#039;&#039;OpenAI ChatGPT&#039;&#039;&#039; (gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o1, o3)&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; (codellama:7b, codellama:13b)&lt;br /&gt;
Je nach gewähltem Anbieter erscheint die Toolbar-Schaltfläche als&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Ask Claude&amp;quot;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;quot;Ask ChatGPT&amp;quot;&#039;&#039;&#039;; das Einstellungs-Tab&lt;br /&gt;
heißt &#039;&#039;&#039;&amp;quot;AI Coding&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten-Editor ==&lt;br /&gt;
&lt;br /&gt;
Im Aktivitäten-Code-Editor erscheint in der Toolbar eine Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit folgenden Aktionen:&lt;br /&gt;
&lt;br /&gt;
* Open KI Window — öffnet das eigenständige Chat-Fenster&lt;br /&gt;
* Explain code — erklärt den Code der aktuellen Aktivität&lt;br /&gt;
* Suggest improvement — schlägt Verbesserungen vor&lt;br /&gt;
* Find bugs — sucht nach Fehlern, Race Conditions, nil-Handling-Problemen&lt;br /&gt;
* Generate doc-comment — generiert eine Aktivitäts-Dokumentation inklusive Pin-Kommentaren und füllt den Documentation-Tab&lt;br /&gt;
* Custom prompt... — freier Prompt; der Aktivitäts-Code wird als Kontext mitgesendet&lt;br /&gt;
* Set model ▸ — Untermenü mit den Modellen des aktiven Anbieters (das aktuell aktive ist mit &#039;&#039;(active)&#039;&#039; markiert)&lt;br /&gt;
* Set provider ▸ — nur sichtbar, wenn API-Schlüssel für mehr als einen Anbieter konfiguriert sind; Untermenü zum Umschalten zwischen Claude und ChatGPT&lt;br /&gt;
&lt;br /&gt;
Code-Vorschläge können mit &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (direkt am jeweiligen&lt;br /&gt;
Code-Block im Chat oder über die obere Apply-Schaltfläche) in den&lt;br /&gt;
Aktivitäts-Body übernommen werden.  Vom KI gelieferte Smalltalk/X&lt;br /&gt;
Hilfsmethoden (Form: &amp;lt;code&amp;gt;Klasse &amp;gt;&amp;gt; selector&amp;lt;/code&amp;gt;) werden nach&lt;br /&gt;
Rückfrage in die genannte Klasse compiliert.&lt;br /&gt;
&lt;br /&gt;
== Compound (Netzwerk) Editor ==&lt;br /&gt;
&lt;br /&gt;
Auf der Toolbar von Compound-Worksheets erscheint dieselbe&lt;br /&gt;
Schaltfläche, beschränkt auf die für Netze sinnvollen Aktionen&lt;br /&gt;
(Open KI Window, Generate doc-comment) — ebenfalls mit den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Dokumentations-Editor ==&lt;br /&gt;
&lt;br /&gt;
Der Dokumentations-Tab der Block-Description (Editor für Test-Cases,&lt;br /&gt;
Test-Plans und Aktivitäten) trägt dieselbe Toolbar-Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit den Einträgen&lt;br /&gt;
&#039;&#039;&#039;Open KI Window&#039;&#039;&#039;, &#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; sowie den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; analysiert den aktuellen Block (Name,&lt;br /&gt;
vorhandene Beschreibung, Eingangs-/Ausgangs-Pins, Sub-Steps eines&lt;br /&gt;
Compound-Netzes, referenzierte Environment-Variablen) und schlägt&lt;br /&gt;
eine vollständige Block- und Pin-Dokumentation vor.&lt;br /&gt;
&lt;br /&gt;
Ist der Block schreibgeschützt (importierte Library, RTL-Lizenz),&lt;br /&gt;
fragt &#039;&#039;&#039;[Apply]&#039;&#039;&#039; nach, ob der Block freigeschaltet und die&lt;br /&gt;
Dokumentation eingetragen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Class Browser (ST/X) ==&lt;br /&gt;
&lt;br /&gt;
Im Class Browser stehen die Aktionen unter dem &#039;&#039;&#039;AI&#039;&#039;&#039;-Untermenü&lt;br /&gt;
sowie im Selektor-Kontextmenü zur Verfügung.  Die Aktionen&lt;br /&gt;
operieren auf der aktuell ausgewählten Methode (Klasse + Selektor +&lt;br /&gt;
Quelltext werden als Kontext mitgesendet).  &#039;&#039;&#039;[Apply]&#039;&#039;&#039; kann das&lt;br /&gt;
Resultat direkt in die Methode der aktiven Klasse einbauen.&lt;br /&gt;
Auch hier sind &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039; als&lt;br /&gt;
Untermenüs verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Chat-Fenster ==&lt;br /&gt;
&lt;br /&gt;
Das eigenständige Chat-Fenster trägt den Titel&lt;br /&gt;
&#039;&#039;&#039;AI Coding [&amp;amp;lt;Produkt&amp;amp;gt; / &amp;amp;lt;Modell&amp;amp;gt;]&#039;&#039;&#039; (z.B.&lt;br /&gt;
&amp;quot;AI Coding [Claude / claude-opus-4-7]&amp;quot;) und zeigt nach jedem Turn&lt;br /&gt;
den Tokenverbrauch und die kumulierten Kosten — sofern Preise für&lt;br /&gt;
das gewählte Modell hinterlegt sind.  Anbieter- und Modellwechsel&lt;br /&gt;
im Einstellungsdialog werden live übernommen.&lt;br /&gt;
&lt;br /&gt;
Das Transkript ist als vertikales Panel von &amp;quot;Karten&amp;quot; aufgebaut:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prosa-Karten&#039;&#039;&#039; enthalten den fließenden Text der Antwort; Zeilen werden auf die Fenster-Breite umgebrochen.&lt;br /&gt;
* &#039;&#039;&#039;Code-Karten&#039;&#039;&#039; (eingerahmt) entstehen aus markdown-Code-Blöcken (&amp;lt;code&amp;gt;```...```&amp;lt;/code&amp;gt;) und sind als &#039;&#039;&#039;Workspace&#039;&#039;&#039; editierbar — das Standard-Smalltalk-Popup-Menü bietet doIt / printIt / inspectIt, ein &amp;lt;code&amp;gt;TestCase&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;simulatedSelf&amp;lt;/code&amp;gt; ist gesetzt, so dass &amp;lt;code&amp;gt;self assert:... equals:...&amp;lt;/code&amp;gt; direkt ausgeführt werden kann.  Lange Blöcke scrollen innerhalb der Karte.  Rechts oben sitzen die Schaltflächen &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (sofern für den Kontext sinnvoll) und &#039;&#039;&#039;[⎘ Copy]&#039;&#039;&#039;; links wird der Sprachtag (smalltalk, python, …) angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Doku-Karten&#039;&#039;&#039; (volle Breite, Prosa) entstehen aus dem speziellen &amp;lt;code&amp;gt;```doc&amp;lt;/code&amp;gt;-Block, den der Dokumentations-Generator anfordert; Inhalt ist die Vorschlags-Dokumentation für Block- und Pin-Beschreibungen.&lt;br /&gt;
&lt;br /&gt;
Scroll-Lock: solange der Anwender bereits am unteren Ende des&lt;br /&gt;
Transkripts steht, folgt die Anzeige neu eintreffenden Karten&lt;br /&gt;
automatisch; nach manuellem Hochscrollen bleibt die Position stehen.&lt;br /&gt;
&lt;br /&gt;
Bilder können als Anhang versendet werden (Screenshot oder&lt;br /&gt;
PNG/JPG-Datei).  Anhänge funktionieren mit beiden Anbietern; bei&lt;br /&gt;
OpenAI nur mit vision-fähigen Modellen (gpt-4o-Familie).&lt;br /&gt;
&lt;br /&gt;
== Einstellungen (AI Coding) ==&lt;br /&gt;
&lt;br /&gt;
Im Einstellungsdialog unter &#039;&#039;&#039;Plugins → AI Coding&#039;&#039;&#039; (bzw. unter&lt;br /&gt;
&#039;&#039;&#039;Tools → AI Coding&#039;&#039;&#039; im Smalltalk-Launcher) werden konfiguriert:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Provider&#039;&#039;&#039; — Anthropic oder OpenAI.  Beim Wechsel werden API-URL und Default-Modell entsprechend angepasst; der gespeicherte API-Schlüssel des jeweiligen Anbieters wird geladen.&lt;br /&gt;
* &#039;&#039;&#039;API Key&#039;&#039;&#039; — Schlüssel des aktuell gewählten Anbieters.  Die Schlüssel werden pro Anbieter getrennt gespeichert (&amp;lt;code&amp;gt;#claudeApiKey_anthropic&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;#claudeApiKey_openai&amp;lt;/code&amp;gt;), so dass zwischen den Anbietern ohne erneute Eingabe gewechselt werden kann.  Das Setzen des Schlüssels erfolgt ausschließlich über diesen Dialog.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039; — ein Modell aus der Liste des aktiven Anbieters oder ein selbst eingegebener Modellname.  Kann auch direkt über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü in den Editor-Toolbars umgeschaltet werden.&lt;br /&gt;
* &#039;&#039;&#039;Max output tokens&#039;&#039;&#039; — maximale Antwortlänge.&lt;br /&gt;
* &#039;&#039;&#039;API URL&#039;&#039;&#039; — nur zu ändern für eigene Proxies / Gateways.  Standard: &amp;lt;code&amp;gt;https://api.anthropic.com/v1/messages&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;https://api.openai.com/v1/chat/completions&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API-Schlüssel beschaffen ==&lt;br /&gt;
&lt;br /&gt;
* Anthropic: [https://console.anthropic.com console.anthropic.com], Schlüsselformat &amp;lt;code&amp;gt;sk-ant-...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenAI: [https://platform.openai.com/api-keys platform.openai.com/api-keys], Schlüsselformat &amp;lt;code&amp;gt;sk-...&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sk-proj-...&amp;lt;/code&amp;gt;.  Voraussetzung ist ein aufgeladenes Konto (Mindestbetrag derzeit USD 5).&lt;br /&gt;
&lt;br /&gt;
== Datenschutz / Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Anbieter &#039;&#039;&#039;Anthropic&#039;&#039;&#039; gehen die Anfragen direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.anthropic.com&amp;lt;/code&amp;gt;, bei &#039;&#039;&#039;OpenAI&#039;&#039;&#039; direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.openai.com&amp;lt;/code&amp;gt;.  Es gibt keinen eXept-seitigen Proxy oder&lt;br /&gt;
Zwischenspeicher.  Mit dem Aktivitäts-Quelltext bzw. den Methoden-&lt;br /&gt;
Quelltexten werden auch Pin-Beschreibungen, Sub-Step-Namen und&lt;br /&gt;
referenzierte Environment-Variablen aus dem Block-Description-Modell&lt;br /&gt;
als Kontext versendet.&lt;br /&gt;
&lt;br /&gt;
Bei Benutzung von Anthropic API-Tokens - wie hier der Fall - werden laut Anthropic die Daten nicht zum Training des KI-Modells genutzt ([https://privacy.claude.com/de/articles/7996868-werden-meine-daten-fur-das-modelltraining-verwendet Anthropic Erkärung dazu]). Für die Wahrheit dieser Aussage könne wir nicht garantieren und haften.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sicher sein wollen, daß keine Information Ihr Haus verlässt empfehlen wir eine eigenem geschlossene in-house KI Umgebung, wie sie bei einigen unserer Kunden bereits existiert. Sie dürfen dann selbstverständlich nur die URLs dieser Umgebung konfigurieren. Expecco kommuniziert ausschließlich mit der von Ihnen eingegebenen KI.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mehrere Konversationen&#039;&#039;&#039;: der Chat ist ein Singleton — eine neue Anfrage über ein Browser-/Editor-Menü startet jedesmal eine &#039;&#039;&#039;neue&#039;&#039;&#039; Konversation. Folge-Fragen (Klärung, Vertiefung) gehen über das Eingabefeld in derselben Konversation.&lt;br /&gt;
* &#039;&#039;&#039;Vorsicht:&#039;&#039;&#039; Die Größe der übertragenen Daten (auch die aus dem Chatfenster) geht in die Kostenberechnung ein. Deshalb immer eine neue Konversation starten, wenn es um ein neues Thema geht.&lt;br /&gt;
* &#039;&#039;&#039;Modell wechseln&#039;&#039;&#039;: Für schnelle Routine-Antworten Sonnet, für schwierige Refactorings Opus. Über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü direkt aus der Toolbar oder über die Settings.&lt;br /&gt;
* &#039;&#039;&#039;Anbieter wechseln&#039;&#039;&#039;: Sind Schlüssel für beide Anbieter konfiguriert, schaltet das &#039;&#039;&#039;Set provider&#039;&#039;&#039;-Untermenü ohne Umweg über den Settings-Dialog um.&lt;br /&gt;
* &#039;&#039;&#039;Code direkt ausführen&#039;&#039;&#039;: In Code-Karten kann markierter Smalltalk-Code per doIt / printIt / inspectIt direkt evaluiert werden — praktisch z.B. um vom Modell vorgeschlagene SUnit-Asserts gleich auszuprobieren, ohne den Code erst in einen Workspace zu kopieren.&lt;br /&gt;
* &#039;&#039;&#039;Custom prompt&#039;&#039;&#039; eignet sich gut für „warum macht Methode X es so und nicht so?&amp;quot; oder „schreib mir einen ParameterizedTest dazu mit folgenden Daten: …&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tipps für die Arbeit mit claudeCode ==&lt;br /&gt;
Wenn Sie claudeCode verwenden, stehen ihnen noch weit mehr Funktionen zur Verfügung: sie können zum Beispiel im claudeCode Terminal eingeben: &lt;br /&gt;
* &amp;quot;mach mir eine neue Suite in einem neuen Fenster&amp;quot;,&lt;br /&gt;
* &amp;quot;Mache eine Aktion zur Berechnung des Umfangs eines Kreises bei gegebenen Radius&amp;quot;, &lt;br /&gt;
* &amp;quot;Erstelle eine neue Suite mit einem Testfall der folgendes macht: &lt;br /&gt;
** 1) webbrowser auf &amp;quot;www.exept.de&amp;quot; öffnen. &lt;br /&gt;
** 2) auf das logo oben links klicken. &lt;br /&gt;
** 3) webbrowser schliessen.&lt;br /&gt;
* welche Funktionalität ist in xxx.ets&lt;br /&gt;
&lt;br /&gt;
(Anm.: es spielt keine Rolle, ob Sie sich in Deutsch oder Englisch unterhalten)&lt;br /&gt;
 &lt;br /&gt;
Claude wurde von uns in die Lage versetzt, selbst nach passenden Bibliotheken zu suchen, diese zu importieren, Aktionen zu generieren und den Testplan anzulegen.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich auch, den Test gleich durchzuführen und das Resultat zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind wir am trainieren, so dass claude z.B. selbst entscheidet ob es besser ist, eine fehlende Aktion als  Diagramm oder elementa zu definieren. Es ist in der Lage, die Funktionen des unterliegenden Frameworks zu sehen und auch komplexe Aufgaben zu erledigen:&lt;br /&gt;
* &amp;quot;Aktion zum Lesen der Jahresumsätze eines Jahres aus der Datenbank&amp;quot;&lt;br /&gt;
* extrahiere aus dem xml Dokument alle budget Einträge und liefere die Summe&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen und Tipps für die Arbeit ===&lt;br /&gt;
&lt;br /&gt;
Sonnet-4 ist gefühlt weit intelligenter als Heiku-4.5,&lt;br /&gt;
aber auch weit teurer. Ihr Budget kann sehr schnell schmelzen mit Sonnet. Insbesondere wenn man auf medium oder high Intelligenzlevel arbeitet. Aber Haiku macht auch weit mehr Fehler und man sollte genau hinschauen was er so generiert. Gefühlt war Sonnet selbst im low level besser als Haiku. Aber der Preis...&lt;br /&gt;
&lt;br /&gt;
Folgende konkrete Tipps aus unseren ersten Erfahrungen, diese Liste wird aktualisiert, und kann auch basieren auf unserer eigenen Dummheit. Ist also u.U. mit Vorsicht zu genießen.&lt;br /&gt;
&lt;br /&gt;
* geben Sie Haiku mehr Hinweise, z.B. &amp;quot;schau mal dort, oder nimm das als Beispiel&amp;quot;. Sonnet findet selbst viel besser Lösungen.&lt;br /&gt;
&lt;br /&gt;
* kurze Anweisungen, je konkreter desto günstiger.&lt;br /&gt;
&lt;br /&gt;
* Haiku ist weit &amp;quot;fauler&amp;quot;. Z.B hat sonnet automatisch eine Dokumentation bei neuen Aktionen angelegt, und diese auch aktualisiert. Haiku hingegen musste man explizit eine Regel dazu anlegen (z.B. mit &amp;quot;wenn du eine Aktion anlegst oder änderst, aktualisiere die Dokumentation&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* Heiku ist dümmer. Regeln die von Sonnet angelegt wurden, können von Haiku u.U. nicht befolgt werden, weil Sonnet weit mehr generalisieren kann.&lt;br /&gt;
&lt;br /&gt;
* sagen Sie beiden sie sollten wenn sie ein Problem haben,  nicht lange selbst suchen. sondern nachfragen ob man ihnen einen Tipp geben kann. Wenn Sie das nicht tun, kann es sein dass Sonnet auch eine viertel Stunde nachdenkt und die Dollars schmelzen wie Eis in der Sonne&amp;lt;br&amp;gt;(ist mir passiert, als ein Socket Problem in der Kommunikation auftrat, und er nicht erkannte, das die Antworten von mcp falsch waren, es hat dann selbst alle möglichen Wege gesucht, eine Nachricht abzusetzen, incl. der Erstellung diverser Shell, curl und Python Scripte... obgleich es eigentlich ein Interface dafür gab, das aber einen Fehler hatte). Insbesondere hatte ich dummerweise vorher sinngemäß gesagt er solle, wenn ein Problem auftritt dies und jenes tun, wobei dabei genau dieses Problem wieder auftrat...&lt;br /&gt;
&lt;br /&gt;
* schränken Sie das Modell in seinen Möglichkeiten ein, z.B. sagen sie &amp;quot;editiere nicht die files sondern verwende dazu ein tool&amp;quot;, oder &amp;quot;eine expecco Aktion und sag mir vorher welche du nimmst&amp;quot;. Sonst kann es passieren dass es anfängt ihre ets zu entpacken um darin nach Strings zu suchen, obgleich es das eigentlich einfacher über das interface machen kann (dieses konkrete Problem wird nicht mehr auftreten aber Sie sehen den Punkt). Da war Sonnet weit intelligenter hat aber auch länger nachgedacht. &lt;br /&gt;
&lt;br /&gt;
* wenn sie feststellen, dass es einen Fehler macht, sagen sie (mehr oder weniger wörtlich) &amp;quot;remember: mach dies nicht, oder um das zu machen tu das.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* sie können diese Erinnerungen sowohl in ihrem UserProfile (also im lokalen Filesystem) als auch in ihren expecco Präferenzen halten. Sagen Sie dazu &amp;quot;remember this in in my expecco memory&amp;quot; oder &amp;quot;remember (in my user memory): bla bla&amp;quot;. Erinnerungen kann man auch löschen &amp;quot;forget to ...&amp;quot;. Zu Beginn der nächsten session sagen sie &amp;quot;read your expecco memory&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* wechseln sie das Modell oder den level, je nach Komplexität der Aufgabe. Aber bedenken Sie dass Wissen von Session zu Session verloren geht, wenn es nicht erinnert wird. Technisch sind Erinnerungen nichts anderes als das Lesen einer Liste der vormaligen remember Anweisungen. Kosten also auch Tokens. Sie könnten also die Erinnerunge auch einfach neu eintippen ;-)&lt;br /&gt;
&lt;br /&gt;
* auch wenn es so scheint: das &amp;quot;Ding&amp;quot; ist kein Mensch; lassen sie &amp;quot;bitte, danke, oder Begründungen - es sei denn sie dienen der Entscheidung - weg. Tatsächlich erhöhen sie  den Tokenverbrauch u.U.&lt;br /&gt;
&lt;br /&gt;
Subjektive Zusammenfassung: &lt;br /&gt;
* Haiku ist viel schneller in der Antwort und kostet ein Zehntel. Mit Sonnet war nach 3-4 Std Arbeit mein Limit erreicht und ich durfte Stunden Pause machen. Mit Haiku kann man durcharbeiten. Aber ich brauche auch mindestens doppelt so viel Zeit um haiku anzuleiten und seine Fehler wieder auszubügeln.&lt;br /&gt;
&lt;br /&gt;
== Was kann eine lokale KI (z.B. ollama) ==&lt;br /&gt;
&lt;br /&gt;
Erste Versuche sind eher ernüchternd. Ohne Zugriff auf lokale Quellen &amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt;, mit rein antrainiertem Wissen sind die Modelle vermutlich zu klein. Hier eine Konversation mit gemma3:8b-it-qat (8 Mrd, quantifiziert) auf einem Rechner ohne GPU.&lt;br /&gt;
Die Antwortzeiten sind natürlich schlecht, aber mit einer GPU u.U. brauchbar. Wenn Sie im Haus Zugriff auf Rechner mit GPU haben sollten Sie diese unbedingt nutzen (mit möglichst viel RAM, damit die Modelle auch hineinpassen!)&lt;br /&gt;
&lt;br /&gt;
Wichtig: wir sind selbst noch Anfänger und keine [https://en.wikipedia.org/wiki/Susan_Calvin KI Psychologen].&lt;br /&gt;
Aber die Erfahrungen werden aktuell in einem Feintuning Prozess in die nächste Release eingebracht.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;sup&amp;gt;1)&amp;lt;/sup&amp;gt; z.B. über mcp tools, welche wir in der aktuellen Version für claudeCode bereits implementiert haben.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
 install ollama&lt;br /&gt;
 ollama pull gemma3:8b-it-qat ;; gemma3:8b / gemma3:12b usw.&lt;br /&gt;
 ollama run gemma3:8b-it-qat&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 1 ===&lt;br /&gt;
Hinweise: Wichtig, sonst labert Sie das Modell voll!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; respond short and concise&lt;br /&gt;
 Understood&lt;br /&gt;
&lt;br /&gt;
Hinweise: Smalltalk/X wissen hat er nicht, aber VW und Pharo sind ähnlich genug.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are an expert in smalltalk programming, especially in Smalltalk/X, visualworks and Squeak.&lt;br /&gt;
 &lt;br /&gt;
 You have come to the right place I have a considerable depth of knowledge regarding Smalltalk...&lt;br /&gt;
Angeber- wir werden sehen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what does the smalltalk expression &amp;quot;self at:4 put:&#039;bla&#039; &amp;quot; mean&lt;br /&gt;
 &lt;br /&gt;
 Sets the character &#039;b&#039; at index 4 of `self` (assuming `self` is a string).&lt;br /&gt;
Falsche Antwort; Smalltalk verwendet 1-basierte Indices, und &#039;bla&#039; ist ein String&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to compute the area of a circle given radius&lt;br /&gt;
 &lt;br /&gt;
 ```smalltalk&lt;br /&gt;
 | radius area |&lt;br /&gt;
 radius := 5.0.&lt;br /&gt;
 area := radius * radius * PI.&lt;br /&gt;
 ^area&lt;br /&gt;
 ```&lt;br /&gt;
nicht schlecht. PI gibt es zwar nicht als globale Variable (richtig wäre &amp;quot;Float pi&amp;quot;), aber dennoch bemerkenswert.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to extract a substring&lt;br /&gt;
 &lt;br /&gt;
 `substring:startIndexToEndIndex` (inclusive). E.g., `&amp;quot;hello&amp;quot; substring:2 to:4` yields `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
wieder falsch; 1-basierter index, substring:to: möglicherweise in einem anderen Smalltalk vorhanden. Könnte man durchgehen lassen.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; alternative?&lt;br /&gt;
 &lt;br /&gt;
 `copyFrom:to:` (indexes inclusive). `string copyFrom:1 to:3` gives `&amp;quot;ell&amp;quot;`.&lt;br /&gt;
besser, aber immer noch falscher Index&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;hello&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;llo&amp;quot;&lt;br /&gt;
war zu erwarten&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; smalltalk uses 1 based indexing. what is the result&lt;br /&gt;
 &lt;br /&gt;
 Correct. The result of `&#039;hello&#039; copyFrom:2 to:4` is `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
soso. Er sieht ein, dass ich korrigiert habe - dann aber dickköpfig.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; in smalltalk the first index is 1 the last is the collection&#039;s size. Not as in Python or C.&lt;br /&gt;
 &lt;br /&gt;
 Precisely. 1-based indexing is core to Smalltalk.&lt;br /&gt;
aha, er könnte es wissen; es fehlt ihm aber offensichtlich an Abstraktionsvermögen. Versuchen wir es mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 You are absolutely right! My apologies. `copyFrom:to:` includes both endpoints, so `&#039;hello&#039; copyFrom:2 to:4` results in `&amp;quot;ell&amp;quot;`. Thanks for the correction. I am still under development and learning nuances like this.&lt;br /&gt;
soso, eine Nuance. Und eigentlich hatte ich gesagt, er solle kurz und exact antworten. Die Entschuldigungen kann er sich sparen. Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;bcd&amp;quot;&lt;br /&gt;
na also; geht doch.&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 2 ===&lt;br /&gt;
&lt;br /&gt;
Neuer Versuch; eine neue Session. Gib ihm Grundwissen, das er nicht im Modell hat.&lt;br /&gt;
 /clear&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; answer short an concise&lt;br /&gt;
 Okay.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are expert in smalltalk programming, especially smalltalk/x, visualworks and pharo&lt;br /&gt;
 &lt;br /&gt;
 Acknowledged. I&#039;m ready to leverage my knowledge of Smalltalk (including Smalltalk/X, VisualWorks, and Pharo) to assist you. Ask away!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: because smalltalk is 1-based indexing, the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 Understood. I will keep in mind Smalltalk&#039;s 1-based indexing when answering your questions about string manipulation and other operations&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &#039;bcd&#039;&lt;br /&gt;
richtig!&amp;lt;br&amp;gt;&lt;br /&gt;
Hätte ich hinzufügen müssen, daß das nicht nur für Strings gilt? Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; given Array #(10 20 30 40) what is the result of array at:3&lt;br /&gt;
 &lt;br /&gt;
 30&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
Man muss den Context also mit Wissen füllen (fein tuning), dann kommt durchaus sinnvolles heraus. Wir sind dran, das zu evaluieren damit möglicherweise sogar eine lokale KI (allerdings mit GPU) hilfreich unterstützen kann.&lt;br /&gt;
&lt;br /&gt;
== Wahl der Modellgrösse ==&lt;br /&gt;
&lt;br /&gt;
Versuche mit gemma3:270m (sehr klein; 270Mio), gemma3:1b (1 Mrd) und gemma3:4b (4 Mrd). Alle auf lokalem Rechner ohne GPU.&lt;br /&gt;
Versuch: Übersetzung einer Bausteindokumentation.&lt;br /&gt;
&lt;br /&gt;
Eingabe: translate to German:&lt;br /&gt;
 &amp;quot;show a dialog with an informationstring&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die 270m und 1b Modelle kennen das Geschlecht nicht; sie drücken sich etwas ungeschickt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Zeigen Sie eine Dialoge mit einer Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen: &lt;br /&gt;
   &amp;quot;Zeige einen Dialog mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
bzw (1Mrd).&lt;br /&gt;
 &amp;quot;Zeig eine Dialog mit einem Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Gib ein Dialog mit einem Informationen-String aus&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige einen Dialog, der eine Informations-Stränge enthält&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das 4Mrd Modell scheint brauchbar:&lt;br /&gt;
 &amp;quot;Zeige einen Dialog mit einer Informationsnachricht&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Erstelle ein Dialogfenster mit einer Informationsanzeige&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige ein Dialogfeld mit einer Informationen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In jedem Fall darf man der KI nicht &amp;quot;blind&amp;quot; vertrauen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Plugin]]&lt;br /&gt;
[[Kategorie:Erweiterung]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31402</id>
		<title>KI Coding Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31402"/>
		<updated>2026-06-08T08:15:40Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Was kann eine lokale KI (z.B. ollama) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KI Coding Plugin =&lt;br /&gt;
&lt;br /&gt;
Das KI Coding Plugin bindet einen Large Language Model (LLM) basierten&lt;br /&gt;
KI-Assistenten in den Activity-Editor (Aktivitäten-Code), den&lt;br /&gt;
Compound-Netzwerk-Editor, den Dokumentations-Editor und in den&lt;br /&gt;
ST/X Class Browser ein.  Das Plugin unterstützt zwei Anbieter, die im&lt;br /&gt;
Einstellungsdialog umschaltbar sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anthropic Claude&#039;&#039;&#039; (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)&lt;br /&gt;
* &#039;&#039;&#039;OpenAI ChatGPT&#039;&#039;&#039; (gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o1, o3)&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; (codellama:7b, codellama:13b)&lt;br /&gt;
Je nach gewähltem Anbieter erscheint die Toolbar-Schaltfläche als&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Ask Claude&amp;quot;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;quot;Ask ChatGPT&amp;quot;&#039;&#039;&#039;; das Einstellungs-Tab&lt;br /&gt;
heißt &#039;&#039;&#039;&amp;quot;AI Coding&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten-Editor ==&lt;br /&gt;
&lt;br /&gt;
Im Aktivitäten-Code-Editor erscheint in der Toolbar eine Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit folgenden Aktionen:&lt;br /&gt;
&lt;br /&gt;
* Open KI Window — öffnet das eigenständige Chat-Fenster&lt;br /&gt;
* Explain code — erklärt den Code der aktuellen Aktivität&lt;br /&gt;
* Suggest improvement — schlägt Verbesserungen vor&lt;br /&gt;
* Find bugs — sucht nach Fehlern, Race Conditions, nil-Handling-Problemen&lt;br /&gt;
* Generate doc-comment — generiert eine Aktivitäts-Dokumentation inklusive Pin-Kommentaren und füllt den Documentation-Tab&lt;br /&gt;
* Custom prompt... — freier Prompt; der Aktivitäts-Code wird als Kontext mitgesendet&lt;br /&gt;
* Set model ▸ — Untermenü mit den Modellen des aktiven Anbieters (das aktuell aktive ist mit &#039;&#039;(active)&#039;&#039; markiert)&lt;br /&gt;
* Set provider ▸ — nur sichtbar, wenn API-Schlüssel für mehr als einen Anbieter konfiguriert sind; Untermenü zum Umschalten zwischen Claude und ChatGPT&lt;br /&gt;
&lt;br /&gt;
Code-Vorschläge können mit &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (direkt am jeweiligen&lt;br /&gt;
Code-Block im Chat oder über die obere Apply-Schaltfläche) in den&lt;br /&gt;
Aktivitäts-Body übernommen werden.  Vom KI gelieferte Smalltalk/X&lt;br /&gt;
Hilfsmethoden (Form: &amp;lt;code&amp;gt;Klasse &amp;gt;&amp;gt; selector&amp;lt;/code&amp;gt;) werden nach&lt;br /&gt;
Rückfrage in die genannte Klasse compiliert.&lt;br /&gt;
&lt;br /&gt;
== Compound (Netzwerk) Editor ==&lt;br /&gt;
&lt;br /&gt;
Auf der Toolbar von Compound-Worksheets erscheint dieselbe&lt;br /&gt;
Schaltfläche, beschränkt auf die für Netze sinnvollen Aktionen&lt;br /&gt;
(Open KI Window, Generate doc-comment) — ebenfalls mit den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Dokumentations-Editor ==&lt;br /&gt;
&lt;br /&gt;
Der Dokumentations-Tab der Block-Description (Editor für Test-Cases,&lt;br /&gt;
Test-Plans und Aktivitäten) trägt dieselbe Toolbar-Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit den Einträgen&lt;br /&gt;
&#039;&#039;&#039;Open KI Window&#039;&#039;&#039;, &#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; sowie den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; analysiert den aktuellen Block (Name,&lt;br /&gt;
vorhandene Beschreibung, Eingangs-/Ausgangs-Pins, Sub-Steps eines&lt;br /&gt;
Compound-Netzes, referenzierte Environment-Variablen) und schlägt&lt;br /&gt;
eine vollständige Block- und Pin-Dokumentation vor.&lt;br /&gt;
&lt;br /&gt;
Ist der Block schreibgeschützt (importierte Library, RTL-Lizenz),&lt;br /&gt;
fragt &#039;&#039;&#039;[Apply]&#039;&#039;&#039; nach, ob der Block freigeschaltet und die&lt;br /&gt;
Dokumentation eingetragen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Class Browser (ST/X) ==&lt;br /&gt;
&lt;br /&gt;
Im Class Browser stehen die Aktionen unter dem &#039;&#039;&#039;AI&#039;&#039;&#039;-Untermenü&lt;br /&gt;
sowie im Selektor-Kontextmenü zur Verfügung.  Die Aktionen&lt;br /&gt;
operieren auf der aktuell ausgewählten Methode (Klasse + Selektor +&lt;br /&gt;
Quelltext werden als Kontext mitgesendet).  &#039;&#039;&#039;[Apply]&#039;&#039;&#039; kann das&lt;br /&gt;
Resultat direkt in die Methode der aktiven Klasse einbauen.&lt;br /&gt;
Auch hier sind &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039; als&lt;br /&gt;
Untermenüs verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Chat-Fenster ==&lt;br /&gt;
&lt;br /&gt;
Das eigenständige Chat-Fenster trägt den Titel&lt;br /&gt;
&#039;&#039;&#039;AI Coding [&amp;amp;lt;Produkt&amp;amp;gt; / &amp;amp;lt;Modell&amp;amp;gt;]&#039;&#039;&#039; (z.B.&lt;br /&gt;
&amp;quot;AI Coding [Claude / claude-opus-4-7]&amp;quot;) und zeigt nach jedem Turn&lt;br /&gt;
den Tokenverbrauch und die kumulierten Kosten — sofern Preise für&lt;br /&gt;
das gewählte Modell hinterlegt sind.  Anbieter- und Modellwechsel&lt;br /&gt;
im Einstellungsdialog werden live übernommen.&lt;br /&gt;
&lt;br /&gt;
Das Transkript ist als vertikales Panel von &amp;quot;Karten&amp;quot; aufgebaut:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prosa-Karten&#039;&#039;&#039; enthalten den fließenden Text der Antwort; Zeilen werden auf die Fenster-Breite umgebrochen.&lt;br /&gt;
* &#039;&#039;&#039;Code-Karten&#039;&#039;&#039; (eingerahmt) entstehen aus markdown-Code-Blöcken (&amp;lt;code&amp;gt;```...```&amp;lt;/code&amp;gt;) und sind als &#039;&#039;&#039;Workspace&#039;&#039;&#039; editierbar — das Standard-Smalltalk-Popup-Menü bietet doIt / printIt / inspectIt, ein &amp;lt;code&amp;gt;TestCase&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;simulatedSelf&amp;lt;/code&amp;gt; ist gesetzt, so dass &amp;lt;code&amp;gt;self assert:... equals:...&amp;lt;/code&amp;gt; direkt ausgeführt werden kann.  Lange Blöcke scrollen innerhalb der Karte.  Rechts oben sitzen die Schaltflächen &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (sofern für den Kontext sinnvoll) und &#039;&#039;&#039;[⎘ Copy]&#039;&#039;&#039;; links wird der Sprachtag (smalltalk, python, …) angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Doku-Karten&#039;&#039;&#039; (volle Breite, Prosa) entstehen aus dem speziellen &amp;lt;code&amp;gt;```doc&amp;lt;/code&amp;gt;-Block, den der Dokumentations-Generator anfordert; Inhalt ist die Vorschlags-Dokumentation für Block- und Pin-Beschreibungen.&lt;br /&gt;
&lt;br /&gt;
Scroll-Lock: solange der Anwender bereits am unteren Ende des&lt;br /&gt;
Transkripts steht, folgt die Anzeige neu eintreffenden Karten&lt;br /&gt;
automatisch; nach manuellem Hochscrollen bleibt die Position stehen.&lt;br /&gt;
&lt;br /&gt;
Bilder können als Anhang versendet werden (Screenshot oder&lt;br /&gt;
PNG/JPG-Datei).  Anhänge funktionieren mit beiden Anbietern; bei&lt;br /&gt;
OpenAI nur mit vision-fähigen Modellen (gpt-4o-Familie).&lt;br /&gt;
&lt;br /&gt;
== Einstellungen (AI Coding) ==&lt;br /&gt;
&lt;br /&gt;
Im Einstellungsdialog unter &#039;&#039;&#039;Plugins → AI Coding&#039;&#039;&#039; (bzw. unter&lt;br /&gt;
&#039;&#039;&#039;Tools → AI Coding&#039;&#039;&#039; im Smalltalk-Launcher) werden konfiguriert:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Provider&#039;&#039;&#039; — Anthropic oder OpenAI.  Beim Wechsel werden API-URL und Default-Modell entsprechend angepasst; der gespeicherte API-Schlüssel des jeweiligen Anbieters wird geladen.&lt;br /&gt;
* &#039;&#039;&#039;API Key&#039;&#039;&#039; — Schlüssel des aktuell gewählten Anbieters.  Die Schlüssel werden pro Anbieter getrennt gespeichert (&amp;lt;code&amp;gt;#claudeApiKey_anthropic&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;#claudeApiKey_openai&amp;lt;/code&amp;gt;), so dass zwischen den Anbietern ohne erneute Eingabe gewechselt werden kann.  Das Setzen des Schlüssels erfolgt ausschließlich über diesen Dialog.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039; — ein Modell aus der Liste des aktiven Anbieters oder ein selbst eingegebener Modellname.  Kann auch direkt über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü in den Editor-Toolbars umgeschaltet werden.&lt;br /&gt;
* &#039;&#039;&#039;Max output tokens&#039;&#039;&#039; — maximale Antwortlänge.&lt;br /&gt;
* &#039;&#039;&#039;API URL&#039;&#039;&#039; — nur zu ändern für eigene Proxies / Gateways.  Standard: &amp;lt;code&amp;gt;https://api.anthropic.com/v1/messages&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;https://api.openai.com/v1/chat/completions&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API-Schlüssel beschaffen ==&lt;br /&gt;
&lt;br /&gt;
* Anthropic: [https://console.anthropic.com console.anthropic.com], Schlüsselformat &amp;lt;code&amp;gt;sk-ant-...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenAI: [https://platform.openai.com/api-keys platform.openai.com/api-keys], Schlüsselformat &amp;lt;code&amp;gt;sk-...&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sk-proj-...&amp;lt;/code&amp;gt;.  Voraussetzung ist ein aufgeladenes Konto (Mindestbetrag derzeit USD 5).&lt;br /&gt;
&lt;br /&gt;
== Datenschutz / Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Anbieter &#039;&#039;&#039;Anthropic&#039;&#039;&#039; gehen die Anfragen direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.anthropic.com&amp;lt;/code&amp;gt;, bei &#039;&#039;&#039;OpenAI&#039;&#039;&#039; direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.openai.com&amp;lt;/code&amp;gt;.  Es gibt keinen eXept-seitigen Proxy oder&lt;br /&gt;
Zwischenspeicher.  Mit dem Aktivitäts-Quelltext bzw. den Methoden-&lt;br /&gt;
Quelltexten werden auch Pin-Beschreibungen, Sub-Step-Namen und&lt;br /&gt;
referenzierte Environment-Variablen aus dem Block-Description-Modell&lt;br /&gt;
als Kontext versendet.&lt;br /&gt;
&lt;br /&gt;
Bei Benutzung von Anthropic API-Tokens - wie hier der Fall - werden laut Anthropic die Daten nicht zum Training des KI-Modells genutzt ([https://privacy.claude.com/de/articles/7996868-werden-meine-daten-fur-das-modelltraining-verwendet Anthropic Erkärung dazu]). Für die Wahrheit dieser Aussage könne wir nicht garantieren und haften.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sicher sein wollen, daß keine Information Ihr Haus verlässt empfehlen wir eine eigenem geschlossene in-house KI Umgebung, wie sie bei einigen unserer Kunden bereits existiert. Sie dürfen dann selbstverständlich nur die URLs dieser Umgebung konfigurieren. Expecco kommuniziert ausschließlich mit der von Ihnen eingegebenen KI.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mehrere Konversationen&#039;&#039;&#039;: der Chat ist ein Singleton — eine neue Anfrage über ein Browser-/Editor-Menü startet jedesmal eine &#039;&#039;&#039;neue&#039;&#039;&#039; Konversation. Folge-Fragen (Klärung, Vertiefung) gehen über das Eingabefeld in derselben Konversation.&lt;br /&gt;
* &#039;&#039;&#039;Vorsicht:&#039;&#039;&#039; Die Größe der übertragenen Daten (auch die aus dem Chatfenster) geht in die Kostenberechnung ein. Deshalb immer eine neue Konversation starten, wenn es um ein neues Thema geht.&lt;br /&gt;
* &#039;&#039;&#039;Modell wechseln&#039;&#039;&#039;: Für schnelle Routine-Antworten Sonnet, für schwierige Refactorings Opus. Über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü direkt aus der Toolbar oder über die Settings.&lt;br /&gt;
* &#039;&#039;&#039;Anbieter wechseln&#039;&#039;&#039;: Sind Schlüssel für beide Anbieter konfiguriert, schaltet das &#039;&#039;&#039;Set provider&#039;&#039;&#039;-Untermenü ohne Umweg über den Settings-Dialog um.&lt;br /&gt;
* &#039;&#039;&#039;Code direkt ausführen&#039;&#039;&#039;: In Code-Karten kann markierter Smalltalk-Code per doIt / printIt / inspectIt direkt evaluiert werden — praktisch z.B. um vom Modell vorgeschlagene SUnit-Asserts gleich auszuprobieren, ohne den Code erst in einen Workspace zu kopieren.&lt;br /&gt;
* &#039;&#039;&#039;Custom prompt&#039;&#039;&#039; eignet sich gut für „warum macht Methode X es so und nicht so?&amp;quot; oder „schreib mir einen ParameterizedTest dazu mit folgenden Daten: …&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tipps für die Arbeit mit claudeCode ==&lt;br /&gt;
Wenn Sie claudeCode verwenden, stehen ihnen noch weit mehr Funktionen zur Verfügung: sie können zum Beispiel im claudeCode Terminal eingeben: &lt;br /&gt;
* &amp;quot;mach mir eine neue Suite in einem neuen Fenster&amp;quot;,&lt;br /&gt;
* &amp;quot;Mache eine Aktion zur Berechnung des Umfangs eines Kreises bei gegebenen Radius&amp;quot;, &lt;br /&gt;
* &amp;quot;Erstelle eine neue Suite mit einem Testfall der folgendes macht: &lt;br /&gt;
** 1) webbrowser auf &amp;quot;www.exept.de&amp;quot; öffnen. &lt;br /&gt;
** 2) auf das logo oben links klicken. &lt;br /&gt;
** 3) webbrowser schliessen.&lt;br /&gt;
* welche Funktionalität ist in xxx.ets&lt;br /&gt;
&lt;br /&gt;
(Anm.: es spielt keine Rolle, ob Sie sich in Deutsch oder Englisch unterhalten)&lt;br /&gt;
 &lt;br /&gt;
Claude wurde von uns in die Lage versetzt, selbst nach passenden Bibliotheken zu suchen, diese zu importieren, Aktionen zu generieren und den Testplan anzulegen.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich auch, den Test gleich durchzuführen und das Resultat zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind wir am trainieren, so dass claude z.B. selbst entscheidet ob es besser ist, eine fehlende Aktion als  Diagramm oder elementa zu definieren. Es ist in der Lage, die Funktionen des unterliegenden Frameworks zu sehen und auch komplexe Aufgaben zu erledigen:&lt;br /&gt;
* &amp;quot;Aktion zum Lesen der Jahresumsätze eines Jahres aus der Datenbank&amp;quot;&lt;br /&gt;
* extrahiere aus dem xml Dokument alle budget Einträge und liefere die Summe&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen und Tipps für die Arbeit ===&lt;br /&gt;
&lt;br /&gt;
Sonnet-4 ist gefühlt weit intelligenter als Heiku-4.5,&lt;br /&gt;
aber auch weit teurer. Ihr Budget kann sehr schnell schmelzen mit Sonnet. Insbesondere wenn man auf medium oder high Intelligenzlevel arbeitet. Aber Haiku macht auch weit mehr Fehler und man sollte genau hinschauen was er so generiert. Gefühlt war Sonnet selbst im low level besser als Haiku. Aber der Preis...&lt;br /&gt;
&lt;br /&gt;
Folgende konkrete Tipps aus unseren ersten Erfahrungen, diese Liste wird aktualisiert, und kann auch basieren auf unserer eigenen Dummheit. Ist also u.U. mit Vorsicht zu genießen.&lt;br /&gt;
&lt;br /&gt;
* geben Sie Haiku mehr Hinweise, z.B. &amp;quot;schau mal dort, oder nimm das als Beispiel&amp;quot;. Sonnet findet selbst viel besser Lösungen.&lt;br /&gt;
&lt;br /&gt;
* kurze Anweisungen, je konkreter desto günstiger.&lt;br /&gt;
&lt;br /&gt;
* Haiku ist weit &amp;quot;fauler&amp;quot;. Z.B hat sonnet automatisch eine Dokumentation bei neuen Aktionen angelegt, und diese auch aktualisiert. Haiku hingegen musste man explizit eine Regel dazu anlegen (z.B. mit &amp;quot;wenn du eine Aktion anlegst oder änderst, aktualisiere die Dokumentation&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* Heiku ist dümmer. Regeln die von Sonnet angelegt wurden, können von Haiku u.U. nicht befolgt werden, weil Sonnet weit mehr generalisieren kann.&lt;br /&gt;
&lt;br /&gt;
* sagen Sie beiden sie sollten wenn sie ein Problem haben,  nicht lange selbst suchen. sondern nachfragen ob man ihnen einen Tipp geben kann. Wenn Sie das nicht tun, kann es sein dass Sonnet auch eine viertel Stunde nachdenkt und die Dollars schmelzen wie Eis in der Sonne&amp;lt;br&amp;gt;(ist mir passiert, als ein Socket Problem in der Kommunikation auftrat, und er nicht erkannte, das die Antworten von mcp falsch waren, es hat dann selbst alle möglichen Wege gesucht, eine Nachricht abzusetzen, incl. der Erstellung diverser Shell, curl und Python Scripte... obgleich es eigentlich ein Interface dafür gab, das aber einen Fehler hatte). Insbesondere hatte ich dummerweise vorher sinngemäß gesagt er solle, wenn ein Problem auftritt dies und jenes tun, wobei dabei genau dieses Problem wieder auftrat...&lt;br /&gt;
&lt;br /&gt;
* schränken Sie das Modell in seinen Möglichkeiten ein, z.B. sagen sie &amp;quot;editiere nicht die files sondern verwende dazu ein tool&amp;quot;, oder &amp;quot;eine expecco Aktion und sag mir vorher welche du nimmst&amp;quot;. Sonst kann es passieren dass es anfängt ihre ets zu entpacken um darin nach Strings zu suchen, obgleich es das eigentlich einfacher über das interface machen kann (dieses konkrete Problem wird nicht mehr auftreten aber Sie sehen den Punkt). Da war Sonnet weit intelligenter hat aber auch länger nachgedacht. &lt;br /&gt;
&lt;br /&gt;
* wenn sie feststellen, dass es einen Fehler macht, sagen sie (mehr oder weniger wörtlich) &amp;quot;remember: mach dies nicht, oder um das zu machen tu das.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* sie können diese Erinnerungen sowohl in ihrem UserProfile (also im lokalen Filesystem) als auch in ihren expecco Präferenzen halten. Sagen Sie dazu &amp;quot;remember this in in my expecco memory&amp;quot; oder &amp;quot;remember (in my user memory): bla bla&amp;quot;. Erinnerungen kann man auch löschen &amp;quot;forget to ...&amp;quot;. Zu Beginn der nächsten session sagen sie &amp;quot;read your expecco memory&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* wechseln sie das Modell oder den level, je nach Komplexität der Aufgabe. Aber bedenken Sie dass Wissen von Session zu Session verloren geht, wenn es nicht erinnert wird. Technisch sind Erinnerungen nichts anderes als das Lesen einer Liste der vormaligen remember Anweisungen. Kosten also auch Tokens. Sie könnten also die Erinnerunge auch einfach neu eintippen ;-)&lt;br /&gt;
&lt;br /&gt;
* auch wenn es so scheint: das &amp;quot;Ding&amp;quot; ist kein Mensch; lassen sie &amp;quot;bitte, danke, oder Begründungen - es sei denn sie dienen der Entscheidung - weg. Tatsächlich erhöhen sie  den Tokenverbrauch u.U.&lt;br /&gt;
&lt;br /&gt;
Subjektive Zusammenfassung: &lt;br /&gt;
* Haiku ist viel schneller in der Antwort und kostet ein Zehntel. Mit Sonnet war nach 3-4 Std Arbeit mein Limit erreicht und ich durfte Stunden Pause machen. Mit Haiku kann man durcharbeiten. Aber ich brauche auch mindestens doppelt so viel Zeit um haiku anzuleiten und seine Fehler wieder auszubügeln.&lt;br /&gt;
&lt;br /&gt;
== Was kann eine lokale KI (z.B. ollama) ==&lt;br /&gt;
&lt;br /&gt;
Erste Versuche sind eher ernüchternd. Ohne Zugriff auf lokale Quellen, mit rein antrainiertem Wissen sind die Modelle vermutlich zu klein. Hier eine Konversation mit gemma3:8b-it-qat (8 Mrd, quantifiziert) auf einem Rechner ohne GPU.&lt;br /&gt;
Die Antwortzeiten sind natürlich schlecht, aber mit einer GPU u.U. brauchbar. Wenn Sie im Haus Zugriff auf Rechner mit GPU haben sollten Sie diese unbedingt nutzen (mit möglichst viel RAM, damit die Modelle auch hineinpassen!)&lt;br /&gt;
&lt;br /&gt;
Wichtig: wir sind selbst noch Anfänger und keine [https://en.wikipedia.org/wiki/Susan_Calvin KI Psychologen].&lt;br /&gt;
Aber die Erfahrungen werden aktuell in einem Feintuning Prozess in die nächste Release eingebracht.&lt;br /&gt;
  &lt;br /&gt;
=== Installation ===&lt;br /&gt;
 install ollama&lt;br /&gt;
 ollama pull gemma3:8b-it-qat ;; gemma3:8b / gemma3:12b usw.&lt;br /&gt;
 ollama run gemma3:8b-it-qat&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 1 ===&lt;br /&gt;
Hinweise: Wichtig, sonst labert Sie das Modell voll!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; respond short and concise&lt;br /&gt;
 Understood&lt;br /&gt;
&lt;br /&gt;
Hinweise: Smalltalk/X wissen hat er nicht, aber VW und Pharo sind ähnlich genug.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are an expert in smalltalk programming, especially in Smalltalk/X, visualworks and Squeak.&lt;br /&gt;
 &lt;br /&gt;
 You have come to the right place I have a considerable depth of knowledge regarding Smalltalk...&lt;br /&gt;
Angeber- wir werden sehen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what does the smalltalk expression &amp;quot;self at:4 put:&#039;bla&#039; &amp;quot; mean&lt;br /&gt;
 &lt;br /&gt;
 Sets the character &#039;b&#039; at index 4 of `self` (assuming `self` is a string).&lt;br /&gt;
Falsche Antwort; Smalltalk verwendet 1-basierte Indices, und &#039;bla&#039; ist ein String&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to compute the area of a circle given radius&lt;br /&gt;
 &lt;br /&gt;
 ```smalltalk&lt;br /&gt;
 | radius area |&lt;br /&gt;
 radius := 5.0.&lt;br /&gt;
 area := radius * radius * PI.&lt;br /&gt;
 ^area&lt;br /&gt;
 ```&lt;br /&gt;
nicht schlecht. PI gibt es zwar nicht als globale Variable (richtig wäre &amp;quot;Float pi&amp;quot;), aber dennoch bemerkenswert.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to extract a substring&lt;br /&gt;
 &lt;br /&gt;
 `substring:startIndexToEndIndex` (inclusive). E.g., `&amp;quot;hello&amp;quot; substring:2 to:4` yields `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
wieder falsch; 1-basierter index, substring:to: möglicherweise in einem anderen Smalltalk vorhanden. Könnte man durchgehen lassen.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; alternative?&lt;br /&gt;
 &lt;br /&gt;
 `copyFrom:to:` (indexes inclusive). `string copyFrom:1 to:3` gives `&amp;quot;ell&amp;quot;`.&lt;br /&gt;
besser, aber immer noch falscher Index&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;hello&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;llo&amp;quot;&lt;br /&gt;
war zu erwarten&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; smalltalk uses 1 based indexing. what is the result&lt;br /&gt;
 &lt;br /&gt;
 Correct. The result of `&#039;hello&#039; copyFrom:2 to:4` is `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
soso. Er sieht ein, dass ich korrigiert habe - dann aber dickköpfig.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; in smalltalk the first index is 1 the last is the collection&#039;s size. Not as in Python or C.&lt;br /&gt;
 &lt;br /&gt;
 Precisely. 1-based indexing is core to Smalltalk.&lt;br /&gt;
aha, er könnte es wissen; es fehlt ihm aber offensichtlich an Abstraktionsvermögen. Versuchen wir es mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 You are absolutely right! My apologies. `copyFrom:to:` includes both endpoints, so `&#039;hello&#039; copyFrom:2 to:4` results in `&amp;quot;ell&amp;quot;`. Thanks for the correction. I am still under development and learning nuances like this.&lt;br /&gt;
soso, eine Nuance. Und eigentlich hatte ich gesagt, er solle kurz und exact antworten. Die Entschuldigungen kann er sich sparen. Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;bcd&amp;quot;&lt;br /&gt;
na also; geht doch.&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 2 ===&lt;br /&gt;
&lt;br /&gt;
Neuer Versuch; eine neue Session. Gib ihm Grundwissen, das er nicht im Modell hat.&lt;br /&gt;
 /clear&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; answer short an concise&lt;br /&gt;
 Okay.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are expert in smalltalk programming, especially smalltalk/x, visualworks and pharo&lt;br /&gt;
 &lt;br /&gt;
 Acknowledged. I&#039;m ready to leverage my knowledge of Smalltalk (including Smalltalk/X, VisualWorks, and Pharo) to assist you. Ask away!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: because smalltalk is 1-based indexing, the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 Understood. I will keep in mind Smalltalk&#039;s 1-based indexing when answering your questions about string manipulation and other operations&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &#039;bcd&#039;&lt;br /&gt;
richtig!&amp;lt;br&amp;gt;&lt;br /&gt;
Hätte ich hinzufügen müssen, daß das nicht nur für Strings gilt? Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; given Array #(10 20 30 40) what is the result of array at:3&lt;br /&gt;
 &lt;br /&gt;
 30&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
Man muss den Context also mit Wissen füllen (fein tuning), dann kommt durchaus sinnvolles heraus. Wir sind dran, das zu evaluieren damit möglicherweise sogar eine lokale KI (allerdings mit GPU) hilfreich unterstützen kann.&lt;br /&gt;
&lt;br /&gt;
== Wahl der Modellgrösse ==&lt;br /&gt;
&lt;br /&gt;
Versuche mit gemma3:270m (sehr klein; 270Mio), gemma3:1b (1 Mrd) und gemma3:4b (4 Mrd). Alle auf lokalem Rechner ohne GPU.&lt;br /&gt;
Versuch: Übersetzung einer Bausteindokumentation.&lt;br /&gt;
&lt;br /&gt;
Eingabe: translate to German:&lt;br /&gt;
 &amp;quot;show a dialog with an informationstring&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die 270m und 1b Modelle kennen das Geschlecht nicht; sie drücken sich etwas ungeschickt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Zeigen Sie eine Dialoge mit einer Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen: &lt;br /&gt;
   &amp;quot;Zeige einen Dialog mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
bzw (1Mrd).&lt;br /&gt;
 &amp;quot;Zeig eine Dialog mit einem Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Gib ein Dialog mit einem Informationen-String aus&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige einen Dialog, der eine Informations-Stränge enthält&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das 4Mrd Modell scheint brauchbar:&lt;br /&gt;
 &amp;quot;Zeige einen Dialog mit einer Informationsnachricht&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Erstelle ein Dialogfenster mit einer Informationsanzeige&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige ein Dialogfeld mit einer Informationen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In jedem Fall darf man der KI nicht &amp;quot;blind&amp;quot; vertrauen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Plugin]]&lt;br /&gt;
[[Kategorie:Erweiterung]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31401</id>
		<title>KI Coding Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31401"/>
		<updated>2026-06-08T08:04:40Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Tipps für die Arbeit mit claudeCode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KI Coding Plugin =&lt;br /&gt;
&lt;br /&gt;
Das KI Coding Plugin bindet einen Large Language Model (LLM) basierten&lt;br /&gt;
KI-Assistenten in den Activity-Editor (Aktivitäten-Code), den&lt;br /&gt;
Compound-Netzwerk-Editor, den Dokumentations-Editor und in den&lt;br /&gt;
ST/X Class Browser ein.  Das Plugin unterstützt zwei Anbieter, die im&lt;br /&gt;
Einstellungsdialog umschaltbar sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anthropic Claude&#039;&#039;&#039; (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)&lt;br /&gt;
* &#039;&#039;&#039;OpenAI ChatGPT&#039;&#039;&#039; (gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o1, o3)&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; (codellama:7b, codellama:13b)&lt;br /&gt;
Je nach gewähltem Anbieter erscheint die Toolbar-Schaltfläche als&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Ask Claude&amp;quot;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;quot;Ask ChatGPT&amp;quot;&#039;&#039;&#039;; das Einstellungs-Tab&lt;br /&gt;
heißt &#039;&#039;&#039;&amp;quot;AI Coding&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten-Editor ==&lt;br /&gt;
&lt;br /&gt;
Im Aktivitäten-Code-Editor erscheint in der Toolbar eine Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit folgenden Aktionen:&lt;br /&gt;
&lt;br /&gt;
* Open KI Window — öffnet das eigenständige Chat-Fenster&lt;br /&gt;
* Explain code — erklärt den Code der aktuellen Aktivität&lt;br /&gt;
* Suggest improvement — schlägt Verbesserungen vor&lt;br /&gt;
* Find bugs — sucht nach Fehlern, Race Conditions, nil-Handling-Problemen&lt;br /&gt;
* Generate doc-comment — generiert eine Aktivitäts-Dokumentation inklusive Pin-Kommentaren und füllt den Documentation-Tab&lt;br /&gt;
* Custom prompt... — freier Prompt; der Aktivitäts-Code wird als Kontext mitgesendet&lt;br /&gt;
* Set model ▸ — Untermenü mit den Modellen des aktiven Anbieters (das aktuell aktive ist mit &#039;&#039;(active)&#039;&#039; markiert)&lt;br /&gt;
* Set provider ▸ — nur sichtbar, wenn API-Schlüssel für mehr als einen Anbieter konfiguriert sind; Untermenü zum Umschalten zwischen Claude und ChatGPT&lt;br /&gt;
&lt;br /&gt;
Code-Vorschläge können mit &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (direkt am jeweiligen&lt;br /&gt;
Code-Block im Chat oder über die obere Apply-Schaltfläche) in den&lt;br /&gt;
Aktivitäts-Body übernommen werden.  Vom KI gelieferte Smalltalk/X&lt;br /&gt;
Hilfsmethoden (Form: &amp;lt;code&amp;gt;Klasse &amp;gt;&amp;gt; selector&amp;lt;/code&amp;gt;) werden nach&lt;br /&gt;
Rückfrage in die genannte Klasse compiliert.&lt;br /&gt;
&lt;br /&gt;
== Compound (Netzwerk) Editor ==&lt;br /&gt;
&lt;br /&gt;
Auf der Toolbar von Compound-Worksheets erscheint dieselbe&lt;br /&gt;
Schaltfläche, beschränkt auf die für Netze sinnvollen Aktionen&lt;br /&gt;
(Open KI Window, Generate doc-comment) — ebenfalls mit den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Dokumentations-Editor ==&lt;br /&gt;
&lt;br /&gt;
Der Dokumentations-Tab der Block-Description (Editor für Test-Cases,&lt;br /&gt;
Test-Plans und Aktivitäten) trägt dieselbe Toolbar-Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit den Einträgen&lt;br /&gt;
&#039;&#039;&#039;Open KI Window&#039;&#039;&#039;, &#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; sowie den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; analysiert den aktuellen Block (Name,&lt;br /&gt;
vorhandene Beschreibung, Eingangs-/Ausgangs-Pins, Sub-Steps eines&lt;br /&gt;
Compound-Netzes, referenzierte Environment-Variablen) und schlägt&lt;br /&gt;
eine vollständige Block- und Pin-Dokumentation vor.&lt;br /&gt;
&lt;br /&gt;
Ist der Block schreibgeschützt (importierte Library, RTL-Lizenz),&lt;br /&gt;
fragt &#039;&#039;&#039;[Apply]&#039;&#039;&#039; nach, ob der Block freigeschaltet und die&lt;br /&gt;
Dokumentation eingetragen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Class Browser (ST/X) ==&lt;br /&gt;
&lt;br /&gt;
Im Class Browser stehen die Aktionen unter dem &#039;&#039;&#039;AI&#039;&#039;&#039;-Untermenü&lt;br /&gt;
sowie im Selektor-Kontextmenü zur Verfügung.  Die Aktionen&lt;br /&gt;
operieren auf der aktuell ausgewählten Methode (Klasse + Selektor +&lt;br /&gt;
Quelltext werden als Kontext mitgesendet).  &#039;&#039;&#039;[Apply]&#039;&#039;&#039; kann das&lt;br /&gt;
Resultat direkt in die Methode der aktiven Klasse einbauen.&lt;br /&gt;
Auch hier sind &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039; als&lt;br /&gt;
Untermenüs verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Chat-Fenster ==&lt;br /&gt;
&lt;br /&gt;
Das eigenständige Chat-Fenster trägt den Titel&lt;br /&gt;
&#039;&#039;&#039;AI Coding [&amp;amp;lt;Produkt&amp;amp;gt; / &amp;amp;lt;Modell&amp;amp;gt;]&#039;&#039;&#039; (z.B.&lt;br /&gt;
&amp;quot;AI Coding [Claude / claude-opus-4-7]&amp;quot;) und zeigt nach jedem Turn&lt;br /&gt;
den Tokenverbrauch und die kumulierten Kosten — sofern Preise für&lt;br /&gt;
das gewählte Modell hinterlegt sind.  Anbieter- und Modellwechsel&lt;br /&gt;
im Einstellungsdialog werden live übernommen.&lt;br /&gt;
&lt;br /&gt;
Das Transkript ist als vertikales Panel von &amp;quot;Karten&amp;quot; aufgebaut:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prosa-Karten&#039;&#039;&#039; enthalten den fließenden Text der Antwort; Zeilen werden auf die Fenster-Breite umgebrochen.&lt;br /&gt;
* &#039;&#039;&#039;Code-Karten&#039;&#039;&#039; (eingerahmt) entstehen aus markdown-Code-Blöcken (&amp;lt;code&amp;gt;```...```&amp;lt;/code&amp;gt;) und sind als &#039;&#039;&#039;Workspace&#039;&#039;&#039; editierbar — das Standard-Smalltalk-Popup-Menü bietet doIt / printIt / inspectIt, ein &amp;lt;code&amp;gt;TestCase&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;simulatedSelf&amp;lt;/code&amp;gt; ist gesetzt, so dass &amp;lt;code&amp;gt;self assert:... equals:...&amp;lt;/code&amp;gt; direkt ausgeführt werden kann.  Lange Blöcke scrollen innerhalb der Karte.  Rechts oben sitzen die Schaltflächen &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (sofern für den Kontext sinnvoll) und &#039;&#039;&#039;[⎘ Copy]&#039;&#039;&#039;; links wird der Sprachtag (smalltalk, python, …) angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Doku-Karten&#039;&#039;&#039; (volle Breite, Prosa) entstehen aus dem speziellen &amp;lt;code&amp;gt;```doc&amp;lt;/code&amp;gt;-Block, den der Dokumentations-Generator anfordert; Inhalt ist die Vorschlags-Dokumentation für Block- und Pin-Beschreibungen.&lt;br /&gt;
&lt;br /&gt;
Scroll-Lock: solange der Anwender bereits am unteren Ende des&lt;br /&gt;
Transkripts steht, folgt die Anzeige neu eintreffenden Karten&lt;br /&gt;
automatisch; nach manuellem Hochscrollen bleibt die Position stehen.&lt;br /&gt;
&lt;br /&gt;
Bilder können als Anhang versendet werden (Screenshot oder&lt;br /&gt;
PNG/JPG-Datei).  Anhänge funktionieren mit beiden Anbietern; bei&lt;br /&gt;
OpenAI nur mit vision-fähigen Modellen (gpt-4o-Familie).&lt;br /&gt;
&lt;br /&gt;
== Einstellungen (AI Coding) ==&lt;br /&gt;
&lt;br /&gt;
Im Einstellungsdialog unter &#039;&#039;&#039;Plugins → AI Coding&#039;&#039;&#039; (bzw. unter&lt;br /&gt;
&#039;&#039;&#039;Tools → AI Coding&#039;&#039;&#039; im Smalltalk-Launcher) werden konfiguriert:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Provider&#039;&#039;&#039; — Anthropic oder OpenAI.  Beim Wechsel werden API-URL und Default-Modell entsprechend angepasst; der gespeicherte API-Schlüssel des jeweiligen Anbieters wird geladen.&lt;br /&gt;
* &#039;&#039;&#039;API Key&#039;&#039;&#039; — Schlüssel des aktuell gewählten Anbieters.  Die Schlüssel werden pro Anbieter getrennt gespeichert (&amp;lt;code&amp;gt;#claudeApiKey_anthropic&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;#claudeApiKey_openai&amp;lt;/code&amp;gt;), so dass zwischen den Anbietern ohne erneute Eingabe gewechselt werden kann.  Das Setzen des Schlüssels erfolgt ausschließlich über diesen Dialog.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039; — ein Modell aus der Liste des aktiven Anbieters oder ein selbst eingegebener Modellname.  Kann auch direkt über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü in den Editor-Toolbars umgeschaltet werden.&lt;br /&gt;
* &#039;&#039;&#039;Max output tokens&#039;&#039;&#039; — maximale Antwortlänge.&lt;br /&gt;
* &#039;&#039;&#039;API URL&#039;&#039;&#039; — nur zu ändern für eigene Proxies / Gateways.  Standard: &amp;lt;code&amp;gt;https://api.anthropic.com/v1/messages&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;https://api.openai.com/v1/chat/completions&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API-Schlüssel beschaffen ==&lt;br /&gt;
&lt;br /&gt;
* Anthropic: [https://console.anthropic.com console.anthropic.com], Schlüsselformat &amp;lt;code&amp;gt;sk-ant-...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenAI: [https://platform.openai.com/api-keys platform.openai.com/api-keys], Schlüsselformat &amp;lt;code&amp;gt;sk-...&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sk-proj-...&amp;lt;/code&amp;gt;.  Voraussetzung ist ein aufgeladenes Konto (Mindestbetrag derzeit USD 5).&lt;br /&gt;
&lt;br /&gt;
== Datenschutz / Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Anbieter &#039;&#039;&#039;Anthropic&#039;&#039;&#039; gehen die Anfragen direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.anthropic.com&amp;lt;/code&amp;gt;, bei &#039;&#039;&#039;OpenAI&#039;&#039;&#039; direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.openai.com&amp;lt;/code&amp;gt;.  Es gibt keinen eXept-seitigen Proxy oder&lt;br /&gt;
Zwischenspeicher.  Mit dem Aktivitäts-Quelltext bzw. den Methoden-&lt;br /&gt;
Quelltexten werden auch Pin-Beschreibungen, Sub-Step-Namen und&lt;br /&gt;
referenzierte Environment-Variablen aus dem Block-Description-Modell&lt;br /&gt;
als Kontext versendet.&lt;br /&gt;
&lt;br /&gt;
Bei Benutzung von Anthropic API-Tokens - wie hier der Fall - werden laut Anthropic die Daten nicht zum Training des KI-Modells genutzt ([https://privacy.claude.com/de/articles/7996868-werden-meine-daten-fur-das-modelltraining-verwendet Anthropic Erkärung dazu]). Für die Wahrheit dieser Aussage könne wir nicht garantieren und haften.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sicher sein wollen, daß keine Information Ihr Haus verlässt empfehlen wir eine eigenem geschlossene in-house KI Umgebung, wie sie bei einigen unserer Kunden bereits existiert. Sie dürfen dann selbstverständlich nur die URLs dieser Umgebung konfigurieren. Expecco kommuniziert ausschließlich mit der von Ihnen eingegebenen KI.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mehrere Konversationen&#039;&#039;&#039;: der Chat ist ein Singleton — eine neue Anfrage über ein Browser-/Editor-Menü startet jedesmal eine &#039;&#039;&#039;neue&#039;&#039;&#039; Konversation. Folge-Fragen (Klärung, Vertiefung) gehen über das Eingabefeld in derselben Konversation.&lt;br /&gt;
* &#039;&#039;&#039;Vorsicht:&#039;&#039;&#039; Die Größe der übertragenen Daten (auch die aus dem Chatfenster) geht in die Kostenberechnung ein. Deshalb immer eine neue Konversation starten, wenn es um ein neues Thema geht.&lt;br /&gt;
* &#039;&#039;&#039;Modell wechseln&#039;&#039;&#039;: Für schnelle Routine-Antworten Sonnet, für schwierige Refactorings Opus. Über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü direkt aus der Toolbar oder über die Settings.&lt;br /&gt;
* &#039;&#039;&#039;Anbieter wechseln&#039;&#039;&#039;: Sind Schlüssel für beide Anbieter konfiguriert, schaltet das &#039;&#039;&#039;Set provider&#039;&#039;&#039;-Untermenü ohne Umweg über den Settings-Dialog um.&lt;br /&gt;
* &#039;&#039;&#039;Code direkt ausführen&#039;&#039;&#039;: In Code-Karten kann markierter Smalltalk-Code per doIt / printIt / inspectIt direkt evaluiert werden — praktisch z.B. um vom Modell vorgeschlagene SUnit-Asserts gleich auszuprobieren, ohne den Code erst in einen Workspace zu kopieren.&lt;br /&gt;
* &#039;&#039;&#039;Custom prompt&#039;&#039;&#039; eignet sich gut für „warum macht Methode X es so und nicht so?&amp;quot; oder „schreib mir einen ParameterizedTest dazu mit folgenden Daten: …&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tipps für die Arbeit mit claudeCode ==&lt;br /&gt;
Wenn Sie claudeCode verwenden, stehen ihnen noch weit mehr Funktionen zur Verfügung: sie können zum Beispiel im claudeCode Terminal eingeben: &lt;br /&gt;
* &amp;quot;mach mir eine neue Suite in einem neuen Fenster&amp;quot;,&lt;br /&gt;
* &amp;quot;Mache eine Aktion zur Berechnung des Umfangs eines Kreises bei gegebenen Radius&amp;quot;, &lt;br /&gt;
* &amp;quot;Erstelle eine neue Suite mit einem Testfall der folgendes macht: &lt;br /&gt;
** 1) webbrowser auf &amp;quot;www.exept.de&amp;quot; öffnen. &lt;br /&gt;
** 2) auf das logo oben links klicken. &lt;br /&gt;
** 3) webbrowser schliessen.&lt;br /&gt;
* welche Funktionalität ist in xxx.ets&lt;br /&gt;
&lt;br /&gt;
(Anm.: es spielt keine Rolle, ob Sie sich in Deutsch oder Englisch unterhalten)&lt;br /&gt;
 &lt;br /&gt;
Claude wurde von uns in die Lage versetzt, selbst nach passenden Bibliotheken zu suchen, diese zu importieren, Aktionen zu generieren und den Testplan anzulegen.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich auch, den Test gleich durchzuführen und das Resultat zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind wir am trainieren, so dass claude z.B. selbst entscheidet ob es besser ist, eine fehlende Aktion als  Diagramm oder elementa zu definieren. Es ist in der Lage, die Funktionen des unterliegenden Frameworks zu sehen und auch komplexe Aufgaben zu erledigen:&lt;br /&gt;
* &amp;quot;Aktion zum Lesen der Jahresumsätze eines Jahres aus der Datenbank&amp;quot;&lt;br /&gt;
* extrahiere aus dem xml Dokument alle budget Einträge und liefere die Summe&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen und Tipps für die Arbeit ===&lt;br /&gt;
&lt;br /&gt;
Sonnet-4 ist gefühlt weit intelligenter als Heiku-4.5,&lt;br /&gt;
aber auch weit teurer. Ihr Budget kann sehr schnell schmelzen mit Sonnet. Insbesondere wenn man auf medium oder high Intelligenzlevel arbeitet. Aber Haiku macht auch weit mehr Fehler und man sollte genau hinschauen was er so generiert. Gefühlt war Sonnet selbst im low level besser als Haiku. Aber der Preis...&lt;br /&gt;
&lt;br /&gt;
Folgende konkrete Tipps aus unseren ersten Erfahrungen, diese Liste wird aktualisiert, und kann auch basieren auf unserer eigenen Dummheit. Ist also u.U. mit Vorsicht zu genießen.&lt;br /&gt;
&lt;br /&gt;
* geben Sie Haiku mehr Hinweise, z.B. &amp;quot;schau mal dort, oder nimm das als Beispiel&amp;quot;. Sonnet findet selbst viel besser Lösungen.&lt;br /&gt;
&lt;br /&gt;
* kurze Anweisungen, je konkreter desto günstiger.&lt;br /&gt;
&lt;br /&gt;
* Haiku ist weit &amp;quot;fauler&amp;quot;. Z.B hat sonnet automatisch eine Dokumentation bei neuen Aktionen angelegt, und diese auch aktualisiert. Haiku hingegen musste man explizit eine Regel dazu anlegen (z.B. mit &amp;quot;wenn du eine Aktion anlegst oder änderst, aktualisiere die Dokumentation&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* Heiku ist dümmer. Regeln die von Sonnet angelegt wurden, können von Haiku u.U. nicht befolgt werden, weil Sonnet weit mehr generalisieren kann.&lt;br /&gt;
&lt;br /&gt;
* sagen Sie beiden sie sollten wenn sie ein Problem haben,  nicht lange selbst suchen. sondern nachfragen ob man ihnen einen Tipp geben kann. Wenn Sie das nicht tun, kann es sein dass Sonnet auch eine viertel Stunde nachdenkt und die Dollars schmelzen wie Eis in der Sonne&amp;lt;br&amp;gt;(ist mir passiert, als ein Socket Problem in der Kommunikation auftrat, und er nicht erkannte, das die Antworten von mcp falsch waren, es hat dann selbst alle möglichen Wege gesucht, eine Nachricht abzusetzen, incl. der Erstellung diverser Shell, curl und Python Scripte... obgleich es eigentlich ein Interface dafür gab, das aber einen Fehler hatte). Insbesondere hatte ich dummerweise vorher sinngemäß gesagt er solle, wenn ein Problem auftritt dies und jenes tun, wobei dabei genau dieses Problem wieder auftrat...&lt;br /&gt;
&lt;br /&gt;
* schränken Sie das Modell in seinen Möglichkeiten ein, z.B. sagen sie &amp;quot;editiere nicht die files sondern verwende dazu ein tool&amp;quot;, oder &amp;quot;eine expecco Aktion und sag mir vorher welche du nimmst&amp;quot;. Sonst kann es passieren dass es anfängt ihre ets zu entpacken um darin nach Strings zu suchen, obgleich es das eigentlich einfacher über das interface machen kann (dieses konkrete Problem wird nicht mehr auftreten aber Sie sehen den Punkt). Da war Sonnet weit intelligenter hat aber auch länger nachgedacht. &lt;br /&gt;
&lt;br /&gt;
* wenn sie feststellen, dass es einen Fehler macht, sagen sie (mehr oder weniger wörtlich) &amp;quot;remember: mach dies nicht, oder um das zu machen tu das.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* sie können diese Erinnerungen sowohl in ihrem UserProfile (also im lokalen Filesystem) als auch in ihren expecco Präferenzen halten. Sagen Sie dazu &amp;quot;remember this in in my expecco memory&amp;quot; oder &amp;quot;remember (in my user memory): bla bla&amp;quot;. Erinnerungen kann man auch löschen &amp;quot;forget to ...&amp;quot;. Zu Beginn der nächsten session sagen sie &amp;quot;read your expecco memory&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* wechseln sie das Modell oder den level, je nach Komplexität der Aufgabe. Aber bedenken Sie dass Wissen von Session zu Session verloren geht, wenn es nicht erinnert wird. Technisch sind Erinnerungen nichts anderes als das Lesen einer Liste der vormaligen remember Anweisungen. Kosten also auch Tokens. Sie könnten also die Erinnerunge auch einfach neu eintippen ;-)&lt;br /&gt;
&lt;br /&gt;
* auch wenn es so scheint: das &amp;quot;Ding&amp;quot; ist kein Mensch; lassen sie &amp;quot;bitte, danke, oder Begründungen - es sei denn sie dienen der Entscheidung - weg. Tatsächlich erhöhen sie  den Tokenverbrauch u.U.&lt;br /&gt;
&lt;br /&gt;
Subjektive Zusammenfassung: &lt;br /&gt;
* Haiku ist viel schneller in der Antwort und kostet ein Zehntel. Mit Sonnet war nach 3-4 Std Arbeit mein Limit erreicht und ich durfte Stunden Pause machen. Mit Haiku kann man durcharbeiten. Aber ich brauche auch mindestens doppelt so viel Zeit um haiku anzuleiten und seine Fehler wieder auszubügeln.&lt;br /&gt;
&lt;br /&gt;
== Was kann eine lokale KI (z.B. ollama) ==&lt;br /&gt;
&lt;br /&gt;
Erste Versuche sind eher ernüchternd. Ohne Zugriff auf lokale Quellen, mit rein antrainiertem Wissen sind die Modelle vermutlich zu klein. Hier eine Konversation mit gemma3:8b-it-qat (8 Mrd, quantifiziert) auf einem Rechner ohne GPU.&lt;br /&gt;
Die Antwortzeiten sind natürlich schlecht, aber mit einer GPU u.U. brauchbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig: wir sind selbst noch Anfänger und keine [https://en.wikipedia.org/wiki/Susan_Calvin KI Psychologen].&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
 install ollama&lt;br /&gt;
 ollama pull gemma3:8b-it-qat ;; gemma3:8b / gemma3:12b usw.&lt;br /&gt;
 ollama run gemma3:8b-it-qat&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 1 ===&lt;br /&gt;
Hinweise: Wichtig, sonst labert Sie das Modell voll!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; respond short and concise&lt;br /&gt;
 Understood&lt;br /&gt;
&lt;br /&gt;
Hinweise: Smalltalk/X wissen hat er nicht, aber VW und Pharo sind ähnlich genug.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are an expert in smalltalk programming, especially in Smalltalk/X, visualworks and Squeak.&lt;br /&gt;
 &lt;br /&gt;
 You have come to the right place I have a considerable depth of knowledge regarding Smalltalk...&lt;br /&gt;
Angeber- wir werden sehen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what does the smalltalk expression &amp;quot;self at:4 put:&#039;bla&#039; &amp;quot; mean&lt;br /&gt;
 &lt;br /&gt;
 Sets the character &#039;b&#039; at index 4 of `self` (assuming `self` is a string).&lt;br /&gt;
Falsche Antwort; Smalltalk verwendet 1-basierte Indices, und &#039;bla&#039; ist ein String&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to compute the area of a circle given radius&lt;br /&gt;
 &lt;br /&gt;
 ```smalltalk&lt;br /&gt;
 | radius area |&lt;br /&gt;
 radius := 5.0.&lt;br /&gt;
 area := radius * radius * PI.&lt;br /&gt;
 ^area&lt;br /&gt;
 ```&lt;br /&gt;
nicht schlecht. &lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to extract a substring&lt;br /&gt;
 &lt;br /&gt;
 `substring:startIndexToEndIndex` (inclusive). E.g., `&amp;quot;hello&amp;quot; substring:2 to:4` yields `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
wieder falsch; 1-basierter index, substring:to: möglicherweise in einem anderen Smalltalk vorhanden. Könnte man durchgehen lassen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; alternative?&lt;br /&gt;
 &lt;br /&gt;
 `copyFrom:to:` (indexes inclusive). `string copyFrom:1 to:3` gives `&amp;quot;ell&amp;quot;`.&lt;br /&gt;
besser, aber immer noch falscher Index&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;hello&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;llo&amp;quot;&lt;br /&gt;
war zu erwarten&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; smalltalk uses 1 based indexing. what is the result&lt;br /&gt;
 &lt;br /&gt;
 Correct. The result of `&#039;hello&#039; copyFrom:2 to:4` is `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
soso. Er sieht ein, dass ich korrigiert habe - dann aber dickköpfig.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; in smalltalk the first index is 1 the last is the collection&#039;s size. Not as in Python or C.&lt;br /&gt;
 &lt;br /&gt;
 Precisely. 1-based indexing is core to Smalltalk.&lt;br /&gt;
aha, er könnte es wissen; es fehlt ihm aber offensichtlich an Abstraktionsvermögen. Versuchen wir es mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 You are absolutely right! My apologies. `copyFrom:to:` includes both endpoints, so `&#039;hello&#039; copyFrom:2 to:4` results in `&amp;quot;ell&amp;quot;`. Thanks for the correction. I am still under development and learning nuances like this.&lt;br /&gt;
soso, eine Nuance. Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;bcd&amp;quot;&lt;br /&gt;
na also; geht doch.&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 2 ===&lt;br /&gt;
&lt;br /&gt;
Neuer Versuch; eine neue Session. Gib ihm Grundwissen, das er nicht im Modell hat.&lt;br /&gt;
 /clear&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; answer short an concise&lt;br /&gt;
 Okay.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are expert in smalltalk programming, especially smalltalk/x, visualworks and pharo&lt;br /&gt;
 &lt;br /&gt;
 Acknowledged. I&#039;m ready to leverage my knowledge of Smalltalk (including Smalltalk/X, VisualWorks, and Pharo) to&lt;br /&gt;
assist you. Ask away!&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: because smalltalk is 1-based indexing, the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 Understood. I will keep in mind Smalltalk&#039;s 1-based indexing when answering your questions about string&lt;br /&gt;
manipulation and other operations&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &#039;bcd&#039;&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; given Array #(10 20 30 40) what is the result of array at:3&lt;br /&gt;
 &lt;br /&gt;
 30&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
Man muss den Context also mit Wissen füllen, dann kommt durchaus sinnvolles heraus. Wir sind dran, das zu evaluieren damit möglicherweise sogar eine lokale KI (allerdings mit GPU) hilfreich unterstützen kann.&lt;br /&gt;
&lt;br /&gt;
== Wahl der Modellgrösse ==&lt;br /&gt;
&lt;br /&gt;
Versuche mit gemma3:270m (sehr klein; 270Mio), gemma3:1b (1 Mrd) und gemma3:4b (4 Mrd). Alle auf lokalem Rechner ohne GPU.&lt;br /&gt;
Versuch: Übersetzung einer Bausteindokumentation.&lt;br /&gt;
&lt;br /&gt;
Eingabe: translate to German:&lt;br /&gt;
 &amp;quot;show a dialog with an informationstring&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die 270m und 1b Modelle kennen das Geschlecht nicht; sie drücken sich etwas ungeschickt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Zeigen Sie eine Dialoge mit einer Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen: &lt;br /&gt;
   &amp;quot;Zeige einen Dialog mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
bzw (1Mrd).&lt;br /&gt;
 &amp;quot;Zeig eine Dialog mit einem Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Gib ein Dialog mit einem Informationen-String aus&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige einen Dialog, der eine Informations-Stränge enthält&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das 4Mrd Modell scheint brauchbar:&lt;br /&gt;
 &amp;quot;Zeige einen Dialog mit einer Informationsnachricht&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Erstelle ein Dialogfenster mit einer Informationsanzeige&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige ein Dialogfeld mit einer Informationen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In jedem Fall darf man der KI nicht &amp;quot;blind&amp;quot; vertrauen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Plugin]]&lt;br /&gt;
[[Kategorie:Erweiterung]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31400</id>
		<title>KI Coding Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31400"/>
		<updated>2026-06-07T10:12:47Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Wahl der Modellgrösse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KI Coding Plugin =&lt;br /&gt;
&lt;br /&gt;
Das KI Coding Plugin bindet einen Large Language Model (LLM) basierten&lt;br /&gt;
KI-Assistenten in den Activity-Editor (Aktivitäten-Code), den&lt;br /&gt;
Compound-Netzwerk-Editor, den Dokumentations-Editor und in den&lt;br /&gt;
ST/X Class Browser ein.  Das Plugin unterstützt zwei Anbieter, die im&lt;br /&gt;
Einstellungsdialog umschaltbar sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anthropic Claude&#039;&#039;&#039; (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)&lt;br /&gt;
* &#039;&#039;&#039;OpenAI ChatGPT&#039;&#039;&#039; (gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o1, o3)&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; (codellama:7b, codellama:13b)&lt;br /&gt;
Je nach gewähltem Anbieter erscheint die Toolbar-Schaltfläche als&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Ask Claude&amp;quot;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;quot;Ask ChatGPT&amp;quot;&#039;&#039;&#039;; das Einstellungs-Tab&lt;br /&gt;
heißt &#039;&#039;&#039;&amp;quot;AI Coding&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten-Editor ==&lt;br /&gt;
&lt;br /&gt;
Im Aktivitäten-Code-Editor erscheint in der Toolbar eine Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit folgenden Aktionen:&lt;br /&gt;
&lt;br /&gt;
* Open KI Window — öffnet das eigenständige Chat-Fenster&lt;br /&gt;
* Explain code — erklärt den Code der aktuellen Aktivität&lt;br /&gt;
* Suggest improvement — schlägt Verbesserungen vor&lt;br /&gt;
* Find bugs — sucht nach Fehlern, Race Conditions, nil-Handling-Problemen&lt;br /&gt;
* Generate doc-comment — generiert eine Aktivitäts-Dokumentation inklusive Pin-Kommentaren und füllt den Documentation-Tab&lt;br /&gt;
* Custom prompt... — freier Prompt; der Aktivitäts-Code wird als Kontext mitgesendet&lt;br /&gt;
* Set model ▸ — Untermenü mit den Modellen des aktiven Anbieters (das aktuell aktive ist mit &#039;&#039;(active)&#039;&#039; markiert)&lt;br /&gt;
* Set provider ▸ — nur sichtbar, wenn API-Schlüssel für mehr als einen Anbieter konfiguriert sind; Untermenü zum Umschalten zwischen Claude und ChatGPT&lt;br /&gt;
&lt;br /&gt;
Code-Vorschläge können mit &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (direkt am jeweiligen&lt;br /&gt;
Code-Block im Chat oder über die obere Apply-Schaltfläche) in den&lt;br /&gt;
Aktivitäts-Body übernommen werden.  Vom KI gelieferte Smalltalk/X&lt;br /&gt;
Hilfsmethoden (Form: &amp;lt;code&amp;gt;Klasse &amp;gt;&amp;gt; selector&amp;lt;/code&amp;gt;) werden nach&lt;br /&gt;
Rückfrage in die genannte Klasse compiliert.&lt;br /&gt;
&lt;br /&gt;
== Compound (Netzwerk) Editor ==&lt;br /&gt;
&lt;br /&gt;
Auf der Toolbar von Compound-Worksheets erscheint dieselbe&lt;br /&gt;
Schaltfläche, beschränkt auf die für Netze sinnvollen Aktionen&lt;br /&gt;
(Open KI Window, Generate doc-comment) — ebenfalls mit den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Dokumentations-Editor ==&lt;br /&gt;
&lt;br /&gt;
Der Dokumentations-Tab der Block-Description (Editor für Test-Cases,&lt;br /&gt;
Test-Plans und Aktivitäten) trägt dieselbe Toolbar-Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit den Einträgen&lt;br /&gt;
&#039;&#039;&#039;Open KI Window&#039;&#039;&#039;, &#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; sowie den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; analysiert den aktuellen Block (Name,&lt;br /&gt;
vorhandene Beschreibung, Eingangs-/Ausgangs-Pins, Sub-Steps eines&lt;br /&gt;
Compound-Netzes, referenzierte Environment-Variablen) und schlägt&lt;br /&gt;
eine vollständige Block- und Pin-Dokumentation vor.&lt;br /&gt;
&lt;br /&gt;
Ist der Block schreibgeschützt (importierte Library, RTL-Lizenz),&lt;br /&gt;
fragt &#039;&#039;&#039;[Apply]&#039;&#039;&#039; nach, ob der Block freigeschaltet und die&lt;br /&gt;
Dokumentation eingetragen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Class Browser (ST/X) ==&lt;br /&gt;
&lt;br /&gt;
Im Class Browser stehen die Aktionen unter dem &#039;&#039;&#039;AI&#039;&#039;&#039;-Untermenü&lt;br /&gt;
sowie im Selektor-Kontextmenü zur Verfügung.  Die Aktionen&lt;br /&gt;
operieren auf der aktuell ausgewählten Methode (Klasse + Selektor +&lt;br /&gt;
Quelltext werden als Kontext mitgesendet).  &#039;&#039;&#039;[Apply]&#039;&#039;&#039; kann das&lt;br /&gt;
Resultat direkt in die Methode der aktiven Klasse einbauen.&lt;br /&gt;
Auch hier sind &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039; als&lt;br /&gt;
Untermenüs verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Chat-Fenster ==&lt;br /&gt;
&lt;br /&gt;
Das eigenständige Chat-Fenster trägt den Titel&lt;br /&gt;
&#039;&#039;&#039;AI Coding [&amp;amp;lt;Produkt&amp;amp;gt; / &amp;amp;lt;Modell&amp;amp;gt;]&#039;&#039;&#039; (z.B.&lt;br /&gt;
&amp;quot;AI Coding [Claude / claude-opus-4-7]&amp;quot;) und zeigt nach jedem Turn&lt;br /&gt;
den Tokenverbrauch und die kumulierten Kosten — sofern Preise für&lt;br /&gt;
das gewählte Modell hinterlegt sind.  Anbieter- und Modellwechsel&lt;br /&gt;
im Einstellungsdialog werden live übernommen.&lt;br /&gt;
&lt;br /&gt;
Das Transkript ist als vertikales Panel von &amp;quot;Karten&amp;quot; aufgebaut:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prosa-Karten&#039;&#039;&#039; enthalten den fließenden Text der Antwort; Zeilen werden auf die Fenster-Breite umgebrochen.&lt;br /&gt;
* &#039;&#039;&#039;Code-Karten&#039;&#039;&#039; (eingerahmt) entstehen aus markdown-Code-Blöcken (&amp;lt;code&amp;gt;```...```&amp;lt;/code&amp;gt;) und sind als &#039;&#039;&#039;Workspace&#039;&#039;&#039; editierbar — das Standard-Smalltalk-Popup-Menü bietet doIt / printIt / inspectIt, ein &amp;lt;code&amp;gt;TestCase&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;simulatedSelf&amp;lt;/code&amp;gt; ist gesetzt, so dass &amp;lt;code&amp;gt;self assert:... equals:...&amp;lt;/code&amp;gt; direkt ausgeführt werden kann.  Lange Blöcke scrollen innerhalb der Karte.  Rechts oben sitzen die Schaltflächen &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (sofern für den Kontext sinnvoll) und &#039;&#039;&#039;[⎘ Copy]&#039;&#039;&#039;; links wird der Sprachtag (smalltalk, python, …) angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Doku-Karten&#039;&#039;&#039; (volle Breite, Prosa) entstehen aus dem speziellen &amp;lt;code&amp;gt;```doc&amp;lt;/code&amp;gt;-Block, den der Dokumentations-Generator anfordert; Inhalt ist die Vorschlags-Dokumentation für Block- und Pin-Beschreibungen.&lt;br /&gt;
&lt;br /&gt;
Scroll-Lock: solange der Anwender bereits am unteren Ende des&lt;br /&gt;
Transkripts steht, folgt die Anzeige neu eintreffenden Karten&lt;br /&gt;
automatisch; nach manuellem Hochscrollen bleibt die Position stehen.&lt;br /&gt;
&lt;br /&gt;
Bilder können als Anhang versendet werden (Screenshot oder&lt;br /&gt;
PNG/JPG-Datei).  Anhänge funktionieren mit beiden Anbietern; bei&lt;br /&gt;
OpenAI nur mit vision-fähigen Modellen (gpt-4o-Familie).&lt;br /&gt;
&lt;br /&gt;
== Einstellungen (AI Coding) ==&lt;br /&gt;
&lt;br /&gt;
Im Einstellungsdialog unter &#039;&#039;&#039;Plugins → AI Coding&#039;&#039;&#039; (bzw. unter&lt;br /&gt;
&#039;&#039;&#039;Tools → AI Coding&#039;&#039;&#039; im Smalltalk-Launcher) werden konfiguriert:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Provider&#039;&#039;&#039; — Anthropic oder OpenAI.  Beim Wechsel werden API-URL und Default-Modell entsprechend angepasst; der gespeicherte API-Schlüssel des jeweiligen Anbieters wird geladen.&lt;br /&gt;
* &#039;&#039;&#039;API Key&#039;&#039;&#039; — Schlüssel des aktuell gewählten Anbieters.  Die Schlüssel werden pro Anbieter getrennt gespeichert (&amp;lt;code&amp;gt;#claudeApiKey_anthropic&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;#claudeApiKey_openai&amp;lt;/code&amp;gt;), so dass zwischen den Anbietern ohne erneute Eingabe gewechselt werden kann.  Das Setzen des Schlüssels erfolgt ausschließlich über diesen Dialog.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039; — ein Modell aus der Liste des aktiven Anbieters oder ein selbst eingegebener Modellname.  Kann auch direkt über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü in den Editor-Toolbars umgeschaltet werden.&lt;br /&gt;
* &#039;&#039;&#039;Max output tokens&#039;&#039;&#039; — maximale Antwortlänge.&lt;br /&gt;
* &#039;&#039;&#039;API URL&#039;&#039;&#039; — nur zu ändern für eigene Proxies / Gateways.  Standard: &amp;lt;code&amp;gt;https://api.anthropic.com/v1/messages&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;https://api.openai.com/v1/chat/completions&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API-Schlüssel beschaffen ==&lt;br /&gt;
&lt;br /&gt;
* Anthropic: [https://console.anthropic.com console.anthropic.com], Schlüsselformat &amp;lt;code&amp;gt;sk-ant-...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenAI: [https://platform.openai.com/api-keys platform.openai.com/api-keys], Schlüsselformat &amp;lt;code&amp;gt;sk-...&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sk-proj-...&amp;lt;/code&amp;gt;.  Voraussetzung ist ein aufgeladenes Konto (Mindestbetrag derzeit USD 5).&lt;br /&gt;
&lt;br /&gt;
== Datenschutz / Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Anbieter &#039;&#039;&#039;Anthropic&#039;&#039;&#039; gehen die Anfragen direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.anthropic.com&amp;lt;/code&amp;gt;, bei &#039;&#039;&#039;OpenAI&#039;&#039;&#039; direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.openai.com&amp;lt;/code&amp;gt;.  Es gibt keinen eXept-seitigen Proxy oder&lt;br /&gt;
Zwischenspeicher.  Mit dem Aktivitäts-Quelltext bzw. den Methoden-&lt;br /&gt;
Quelltexten werden auch Pin-Beschreibungen, Sub-Step-Namen und&lt;br /&gt;
referenzierte Environment-Variablen aus dem Block-Description-Modell&lt;br /&gt;
als Kontext versendet.&lt;br /&gt;
&lt;br /&gt;
Bei Benutzung von Anthropic API-Tokens - wie hier der Fall - werden laut Anthropic die Daten nicht zum Training des KI-Modells genutzt ([https://privacy.claude.com/de/articles/7996868-werden-meine-daten-fur-das-modelltraining-verwendet Anthropic Erkärung dazu]). Für die Wahrheit dieser Aussage könne wir nicht garantieren und haften.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sicher sein wollen, daß keine Information Ihr Haus verlässt empfehlen wir eine eigenem geschlossene in-house KI Umgebung, wie sie bei einigen unserer Kunden bereits existiert. Sie dürfen dann selbstverständlich nur die URLs dieser Umgebung konfigurieren. Expecco kommuniziert ausschließlich mit der von Ihnen eingegebenen KI.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mehrere Konversationen&#039;&#039;&#039;: der Chat ist ein Singleton — eine neue Anfrage über ein Browser-/Editor-Menü startet jedesmal eine &#039;&#039;&#039;neue&#039;&#039;&#039; Konversation. Folge-Fragen (Klärung, Vertiefung) gehen über das Eingabefeld in derselben Konversation.&lt;br /&gt;
* &#039;&#039;&#039;Vorsicht:&#039;&#039;&#039; Die Größe der übertragenen Daten (auch die aus dem Chatfenster) geht in die Kostenberechnung ein. Deshalb immer eine neue Konversation starten, wenn es um ein neues Thema geht.&lt;br /&gt;
* &#039;&#039;&#039;Modell wechseln&#039;&#039;&#039;: Für schnelle Routine-Antworten Sonnet, für schwierige Refactorings Opus. Über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü direkt aus der Toolbar oder über die Settings.&lt;br /&gt;
* &#039;&#039;&#039;Anbieter wechseln&#039;&#039;&#039;: Sind Schlüssel für beide Anbieter konfiguriert, schaltet das &#039;&#039;&#039;Set provider&#039;&#039;&#039;-Untermenü ohne Umweg über den Settings-Dialog um.&lt;br /&gt;
* &#039;&#039;&#039;Code direkt ausführen&#039;&#039;&#039;: In Code-Karten kann markierter Smalltalk-Code per doIt / printIt / inspectIt direkt evaluiert werden — praktisch z.B. um vom Modell vorgeschlagene SUnit-Asserts gleich auszuprobieren, ohne den Code erst in einen Workspace zu kopieren.&lt;br /&gt;
* &#039;&#039;&#039;Custom prompt&#039;&#039;&#039; eignet sich gut für „warum macht Methode X es so und nicht so?&amp;quot; oder „schreib mir einen ParameterizedTest dazu mit folgenden Daten: …&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tipps für die Arbeit mit claudeCode ==&lt;br /&gt;
Wenn Sie claudeCode verwenden, stehen ihnen noch weit mehr Funktionen zur Verfügung: sie können zum Beispiel im claudeCode Terminal eingeben: &lt;br /&gt;
* &amp;quot;mach mir eine neue Suite in einem neuen Fenster&amp;quot;,&lt;br /&gt;
* &amp;quot;Mache eine Aktion zur Berechnung des Umfangs eines Kreises bei gegebenen Radius&amp;quot;, &lt;br /&gt;
* &amp;quot;Erstelle eine neue suite mit einem Testfall der folgendes macht: &lt;br /&gt;
** 1) webbrowser auf &amp;quot;www.exept.de&amp;quot; öffnen. &lt;br /&gt;
** 2) auf das logo oben links klicken. &lt;br /&gt;
** 3) webbrowser schliessen.&lt;br /&gt;
* welche Funktionalität ist in xxx.ets&lt;br /&gt;
&lt;br /&gt;
Claude wurde von uns in die Lage versetzt, selbst nach passenden Bibliotheken zu suchen, diese zu importieren, Aktionen zu Generieren und den Testplan anzulegen.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich auch, den Test gleich durchzuführen und das Resultat zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind wir am trainieren, so dass claude z.B. selbst entscheidet ob es besser ist, eine fehlende Aktion als  Diagramm oder als elementare zu definieren. Es ist in der Lage, die Funktionen des unterliegenden Frameworks zu sehen und auch komplexe Aufgaben zu erledigen:&lt;br /&gt;
* &amp;quot;aktion zum Lesen der Jahresumsätze eines Jahres aus der Datenbank&amp;quot;&lt;br /&gt;
* extrahiere aus dem xml Dokument alle budget Einträge und liefere die Summe&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen und Tipps für die Arbeit ===&lt;br /&gt;
&lt;br /&gt;
Sonnet-4 ist gefühlt weit intelligenter als Heiku-4.5,&lt;br /&gt;
aber auch weit teurer. Ihr Budget kann sehr schnell schmelzen mit Sonnet. Insbesondere wenn man auf medium oder high Intelligenzlevel abeitet. Aber Haiku macht auch weit mehr Fehler und man sollte genau hinschauen was er so generiert. Gefühlt war Sonnet selbst im low level besser als Haiku. Aber der Preis...&lt;br /&gt;
&lt;br /&gt;
Folgende konkrete Tipps aus unseren ersten Erfahrungen, diese Liste wird aktualisiert, und kann auch basieren auf unserer eigenen Dummheit. Ist also u.U.mit Vorsicht zu geniessen.&lt;br /&gt;
&lt;br /&gt;
* geben Sie Haiku Hinweise, z.B. schau mal dort, oder nimm das als Beispiel. Sonnet findet selbst viel besser Lösungen.&lt;br /&gt;
* kurze Anweisungen, je konkreter desto günstiger.&lt;br /&gt;
* haiku ist weit &amp;quot;fauler&amp;quot;. Z.B hat sonnet automatisch eine Dokumentation bei neuen Aktionen angelegt, und diese auch aktualisiert. Haiku hingegen musste man explizit eine Regel dazu anlegen (z.B. mit &amp;quot;wenn du eine aktion anlegst oder änderst, aktualisiere die dokumentation&amp;quot;)&lt;br /&gt;
* heiku ist dümmer. Regeln die von sonnet angelegt wurden, können von haiku u.U. nicht befolgt werden, weil sonnet weit mehr generalisieren kann.&lt;br /&gt;
* sagen sie beiden sie sollten wenn sie ein Problem haben,  nicht lange selbst suchen. sondern nachfragen ob man ihnen einen Tipp geben kann. Wenn Sie das nicht tun, kann es sein dass Sonnet auch eine viertel Stunde nachdenkt und die Dollars schmelzen wie Eis in der Sonne&amp;lt;br&amp;gt;(ist mir passiert, als ein Socket Problem in der Kommunikation auftrat, und er nicht erkannte, das die Antworten von mcp falsch waren, es hat dann selbst alle möglichen Wege gesucht, eine Nachricht abzusetzen, incl. der Erstellung diverser Shell, curl und Python Scripte... obgleich es eigentlich ein Interface dafür gab, das aber einen Fehler hatte).&lt;br /&gt;
* schränken Sie das Modell in seinen Möglichkeiten ein, z.B. sagen sie &amp;quot;editiere nicht die files sondern verwende dazu ein tool&amp;quot;, oder &amp;quot;eine expecco aktion und sag mir vorher welche du nimmst&amp;quot;. Sonst kann es passieren dass es anfängt ihre ets zu entpacken um darin nach strings zu suchen, obgleich es das eigentlich einfacher über das interface machen kann (dieses konkrete Problem wird nicht mehr auftreten aber Sie sehen den Punkt). Da war Sonnet weit intelligenter hat aber auch länger nachgedacht. &lt;br /&gt;
* wenn sie feststellen, dass es einen Fehler macht, sagen sie (wörtlich) &amp;quot;remember: mach dies nicht, oder um das zu machen tu das.&amp;quot;&lt;br /&gt;
* sie können diese Erinnerungen sowohl in ihrem UserProfile (also im lokalen Filesystem) als auch in ihren expecco Präferenzen halten. Sagen Sie dazu &amp;quot;remember this in in my expecco memory&amp;quot; oder &amp;quot;remember (in my user memory): bla bla&amp;quot;. Erinnerungen kann man auch löschen &amp;quot;forget to ...&amp;quot;. Zu Beginn der nächsten session sagen sie &amp;quot;read your expecco memory&amp;quot;.&lt;br /&gt;
* wechseln sie das Modell oder den level, je nach Komplexität der Aufgabe. Aber bedenken Sie dass Wissen von Session zu Session verloren geht, wenn es nicht erinnert wird. Technisch sind Erinnerungen nichts anderes als das Lesen einer Liste der vormaligen remember Anweisungen. Kosten also auch Tokens. Sie könnten also die Erinnerunge auch einfach neu eintippen ;-)&lt;br /&gt;
* auch wenn es so scheint: das &amp;quot;Ding&amp;quot; ist kein Mensch; lassen sie &amp;quot;bitte, danke, oder Begründungen - es sei denn sie dienen der Entscheidung - weg. Tatsächlich erhöhen sie  den Tokenverbrauch u.U.&lt;br /&gt;
&lt;br /&gt;
Subjektive Zusammenfassung: &lt;br /&gt;
* haiku ist viel schneller in der Antwort und kostet ein Zehntel. Mit Sonnet war nach 3-4 Std Arbeit mein Limit erreicht und ich durfte Stunden Pause machen. Mit Haiku kann man durcharbeiten. Aber ich brauche auch mindestens doppelt so viel Zeit um haiku anzuleiten und seine Fehler wieder auszubügeln.&lt;br /&gt;
&lt;br /&gt;
== Was kann eine lokale KI (z.B. ollama) ==&lt;br /&gt;
&lt;br /&gt;
Erste Versuche sind eher ernüchternd. Ohne Zugriff auf lokale Quellen, mit rein antrainiertem Wissen sind die Modelle vermutlich zu klein. Hier eine Konversation mit gemma3:8b-it-qat (8 Mrd, quantifiziert) auf einem Rechner ohne GPU.&lt;br /&gt;
Die Antwortzeiten sind natürlich schlecht, aber mit einer GPU u.U. brauchbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig: wir sind selbst noch Anfänger und keine [https://en.wikipedia.org/wiki/Susan_Calvin KI Psychologen].&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
 install ollama&lt;br /&gt;
 ollama pull gemma3:8b-it-qat ;; gemma3:8b / gemma3:12b usw.&lt;br /&gt;
 ollama run gemma3:8b-it-qat&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 1 ===&lt;br /&gt;
Hinweise: Wichtig, sonst labert Sie das Modell voll!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; respond short and concise&lt;br /&gt;
 Understood&lt;br /&gt;
&lt;br /&gt;
Hinweise: Smalltalk/X wissen hat er nicht, aber VW und Pharo sind ähnlich genug.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are an expert in smalltalk programming, especially in Smalltalk/X, visualworks and Squeak.&lt;br /&gt;
 &lt;br /&gt;
 You have come to the right place I have a considerable depth of knowledge regarding Smalltalk...&lt;br /&gt;
Angeber- wir werden sehen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what does the smalltalk expression &amp;quot;self at:4 put:&#039;bla&#039; &amp;quot; mean&lt;br /&gt;
 &lt;br /&gt;
 Sets the character &#039;b&#039; at index 4 of `self` (assuming `self` is a string).&lt;br /&gt;
Falsche Antwort; Smalltalk verwendet 1-basierte Indices, und &#039;bla&#039; ist ein String&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to compute the area of a circle given radius&lt;br /&gt;
 &lt;br /&gt;
 ```smalltalk&lt;br /&gt;
 | radius area |&lt;br /&gt;
 radius := 5.0.&lt;br /&gt;
 area := radius * radius * PI.&lt;br /&gt;
 ^area&lt;br /&gt;
 ```&lt;br /&gt;
nicht schlecht. &lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to extract a substring&lt;br /&gt;
 &lt;br /&gt;
 `substring:startIndexToEndIndex` (inclusive). E.g., `&amp;quot;hello&amp;quot; substring:2 to:4` yields `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
wieder falsch; 1-basierter index, substring:to: möglicherweise in einem anderen Smalltalk vorhanden. Könnte man durchgehen lassen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; alternative?&lt;br /&gt;
 &lt;br /&gt;
 `copyFrom:to:` (indexes inclusive). `string copyFrom:1 to:3` gives `&amp;quot;ell&amp;quot;`.&lt;br /&gt;
besser, aber immer noch falscher Index&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;hello&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;llo&amp;quot;&lt;br /&gt;
war zu erwarten&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; smalltalk uses 1 based indexing. what is the result&lt;br /&gt;
 &lt;br /&gt;
 Correct. The result of `&#039;hello&#039; copyFrom:2 to:4` is `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
soso. Er sieht ein, dass ich korrigiert habe - dann aber dickköpfig.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; in smalltalk the first index is 1 the last is the collection&#039;s size. Not as in Python or C.&lt;br /&gt;
 &lt;br /&gt;
 Precisely. 1-based indexing is core to Smalltalk.&lt;br /&gt;
aha, er könnte es wissen; es fehlt ihm aber offensichtlich an Abstraktionsvermögen. Versuchen wir es mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 You are absolutely right! My apologies. `copyFrom:to:` includes both endpoints, so `&#039;hello&#039; copyFrom:2 to:4` results in `&amp;quot;ell&amp;quot;`. Thanks for the correction. I am still under development and learning nuances like this.&lt;br /&gt;
soso, eine Nuance. Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;bcd&amp;quot;&lt;br /&gt;
na also; geht doch.&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 2 ===&lt;br /&gt;
&lt;br /&gt;
Neuer Versuch; eine neue Session. Gib ihm Grundwissen, das er nicht im Modell hat.&lt;br /&gt;
 /clear&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; answer short an concise&lt;br /&gt;
 Okay.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are expert in smalltalk programming, especially smalltalk/x, visualworks and pharo&lt;br /&gt;
 &lt;br /&gt;
 Acknowledged. I&#039;m ready to leverage my knowledge of Smalltalk (including Smalltalk/X, VisualWorks, and Pharo) to&lt;br /&gt;
assist you. Ask away!&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: because smalltalk is 1-based indexing, the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 Understood. I will keep in mind Smalltalk&#039;s 1-based indexing when answering your questions about string&lt;br /&gt;
manipulation and other operations&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &#039;bcd&#039;&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; given Array #(10 20 30 40) what is the result of array at:3&lt;br /&gt;
 &lt;br /&gt;
 30&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
Man muss den Context also mit Wissen füllen, dann kommt durchaus sinnvolles heraus. Wir sind dran, das zu evaluieren damit möglicherweise sogar eine lokale KI (allerdings mit GPU) hilfreich unterstützen kann.&lt;br /&gt;
&lt;br /&gt;
== Wahl der Modellgrösse ==&lt;br /&gt;
&lt;br /&gt;
Versuche mit gemma3:270m (sehr klein; 270Mio), gemma3:1b (1 Mrd) und gemma3:4b (4 Mrd). Alle auf lokalem Rechner ohne GPU.&lt;br /&gt;
Versuch: Übersetzung einer Bausteindokumentation.&lt;br /&gt;
&lt;br /&gt;
Eingabe: translate to German:&lt;br /&gt;
 &amp;quot;show a dialog with an informationstring&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die 270m und 1b Modelle kennen das Geschlecht nicht; sie drücken sich etwas ungeschickt aus:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Zeigen Sie eine Dialoge mit einer Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen: &lt;br /&gt;
   &amp;quot;Zeige einen Dialog mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
bzw (1Mrd).&lt;br /&gt;
 &amp;quot;Zeig eine Dialog mit einem Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Gib ein Dialog mit einem Informationen-String aus&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige einen Dialog, der eine Informations-Stränge enthält&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das 4Mrd Modell scheint brauchbar:&lt;br /&gt;
 &amp;quot;Zeige einen Dialog mit einer Informationsnachricht&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Erstelle ein Dialogfenster mit einer Informationsanzeige&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige ein Dialogfeld mit einer Informationen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In jedem Fall darf man der KI nicht &amp;quot;blind&amp;quot; vertrauen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Plugin]]&lt;br /&gt;
[[Kategorie:Erweiterung]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31399</id>
		<title>KI Coding Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31399"/>
		<updated>2026-06-07T10:11:51Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Wahl der Modellgrösse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KI Coding Plugin =&lt;br /&gt;
&lt;br /&gt;
Das KI Coding Plugin bindet einen Large Language Model (LLM) basierten&lt;br /&gt;
KI-Assistenten in den Activity-Editor (Aktivitäten-Code), den&lt;br /&gt;
Compound-Netzwerk-Editor, den Dokumentations-Editor und in den&lt;br /&gt;
ST/X Class Browser ein.  Das Plugin unterstützt zwei Anbieter, die im&lt;br /&gt;
Einstellungsdialog umschaltbar sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anthropic Claude&#039;&#039;&#039; (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)&lt;br /&gt;
* &#039;&#039;&#039;OpenAI ChatGPT&#039;&#039;&#039; (gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o1, o3)&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; (codellama:7b, codellama:13b)&lt;br /&gt;
Je nach gewähltem Anbieter erscheint die Toolbar-Schaltfläche als&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Ask Claude&amp;quot;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;quot;Ask ChatGPT&amp;quot;&#039;&#039;&#039;; das Einstellungs-Tab&lt;br /&gt;
heißt &#039;&#039;&#039;&amp;quot;AI Coding&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten-Editor ==&lt;br /&gt;
&lt;br /&gt;
Im Aktivitäten-Code-Editor erscheint in der Toolbar eine Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit folgenden Aktionen:&lt;br /&gt;
&lt;br /&gt;
* Open KI Window — öffnet das eigenständige Chat-Fenster&lt;br /&gt;
* Explain code — erklärt den Code der aktuellen Aktivität&lt;br /&gt;
* Suggest improvement — schlägt Verbesserungen vor&lt;br /&gt;
* Find bugs — sucht nach Fehlern, Race Conditions, nil-Handling-Problemen&lt;br /&gt;
* Generate doc-comment — generiert eine Aktivitäts-Dokumentation inklusive Pin-Kommentaren und füllt den Documentation-Tab&lt;br /&gt;
* Custom prompt... — freier Prompt; der Aktivitäts-Code wird als Kontext mitgesendet&lt;br /&gt;
* Set model ▸ — Untermenü mit den Modellen des aktiven Anbieters (das aktuell aktive ist mit &#039;&#039;(active)&#039;&#039; markiert)&lt;br /&gt;
* Set provider ▸ — nur sichtbar, wenn API-Schlüssel für mehr als einen Anbieter konfiguriert sind; Untermenü zum Umschalten zwischen Claude und ChatGPT&lt;br /&gt;
&lt;br /&gt;
Code-Vorschläge können mit &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (direkt am jeweiligen&lt;br /&gt;
Code-Block im Chat oder über die obere Apply-Schaltfläche) in den&lt;br /&gt;
Aktivitäts-Body übernommen werden.  Vom KI gelieferte Smalltalk/X&lt;br /&gt;
Hilfsmethoden (Form: &amp;lt;code&amp;gt;Klasse &amp;gt;&amp;gt; selector&amp;lt;/code&amp;gt;) werden nach&lt;br /&gt;
Rückfrage in die genannte Klasse compiliert.&lt;br /&gt;
&lt;br /&gt;
== Compound (Netzwerk) Editor ==&lt;br /&gt;
&lt;br /&gt;
Auf der Toolbar von Compound-Worksheets erscheint dieselbe&lt;br /&gt;
Schaltfläche, beschränkt auf die für Netze sinnvollen Aktionen&lt;br /&gt;
(Open KI Window, Generate doc-comment) — ebenfalls mit den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Dokumentations-Editor ==&lt;br /&gt;
&lt;br /&gt;
Der Dokumentations-Tab der Block-Description (Editor für Test-Cases,&lt;br /&gt;
Test-Plans und Aktivitäten) trägt dieselbe Toolbar-Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit den Einträgen&lt;br /&gt;
&#039;&#039;&#039;Open KI Window&#039;&#039;&#039;, &#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; sowie den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; analysiert den aktuellen Block (Name,&lt;br /&gt;
vorhandene Beschreibung, Eingangs-/Ausgangs-Pins, Sub-Steps eines&lt;br /&gt;
Compound-Netzes, referenzierte Environment-Variablen) und schlägt&lt;br /&gt;
eine vollständige Block- und Pin-Dokumentation vor.&lt;br /&gt;
&lt;br /&gt;
Ist der Block schreibgeschützt (importierte Library, RTL-Lizenz),&lt;br /&gt;
fragt &#039;&#039;&#039;[Apply]&#039;&#039;&#039; nach, ob der Block freigeschaltet und die&lt;br /&gt;
Dokumentation eingetragen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Class Browser (ST/X) ==&lt;br /&gt;
&lt;br /&gt;
Im Class Browser stehen die Aktionen unter dem &#039;&#039;&#039;AI&#039;&#039;&#039;-Untermenü&lt;br /&gt;
sowie im Selektor-Kontextmenü zur Verfügung.  Die Aktionen&lt;br /&gt;
operieren auf der aktuell ausgewählten Methode (Klasse + Selektor +&lt;br /&gt;
Quelltext werden als Kontext mitgesendet).  &#039;&#039;&#039;[Apply]&#039;&#039;&#039; kann das&lt;br /&gt;
Resultat direkt in die Methode der aktiven Klasse einbauen.&lt;br /&gt;
Auch hier sind &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039; als&lt;br /&gt;
Untermenüs verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Chat-Fenster ==&lt;br /&gt;
&lt;br /&gt;
Das eigenständige Chat-Fenster trägt den Titel&lt;br /&gt;
&#039;&#039;&#039;AI Coding [&amp;amp;lt;Produkt&amp;amp;gt; / &amp;amp;lt;Modell&amp;amp;gt;]&#039;&#039;&#039; (z.B.&lt;br /&gt;
&amp;quot;AI Coding [Claude / claude-opus-4-7]&amp;quot;) und zeigt nach jedem Turn&lt;br /&gt;
den Tokenverbrauch und die kumulierten Kosten — sofern Preise für&lt;br /&gt;
das gewählte Modell hinterlegt sind.  Anbieter- und Modellwechsel&lt;br /&gt;
im Einstellungsdialog werden live übernommen.&lt;br /&gt;
&lt;br /&gt;
Das Transkript ist als vertikales Panel von &amp;quot;Karten&amp;quot; aufgebaut:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prosa-Karten&#039;&#039;&#039; enthalten den fließenden Text der Antwort; Zeilen werden auf die Fenster-Breite umgebrochen.&lt;br /&gt;
* &#039;&#039;&#039;Code-Karten&#039;&#039;&#039; (eingerahmt) entstehen aus markdown-Code-Blöcken (&amp;lt;code&amp;gt;```...```&amp;lt;/code&amp;gt;) und sind als &#039;&#039;&#039;Workspace&#039;&#039;&#039; editierbar — das Standard-Smalltalk-Popup-Menü bietet doIt / printIt / inspectIt, ein &amp;lt;code&amp;gt;TestCase&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;simulatedSelf&amp;lt;/code&amp;gt; ist gesetzt, so dass &amp;lt;code&amp;gt;self assert:... equals:...&amp;lt;/code&amp;gt; direkt ausgeführt werden kann.  Lange Blöcke scrollen innerhalb der Karte.  Rechts oben sitzen die Schaltflächen &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (sofern für den Kontext sinnvoll) und &#039;&#039;&#039;[⎘ Copy]&#039;&#039;&#039;; links wird der Sprachtag (smalltalk, python, …) angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Doku-Karten&#039;&#039;&#039; (volle Breite, Prosa) entstehen aus dem speziellen &amp;lt;code&amp;gt;```doc&amp;lt;/code&amp;gt;-Block, den der Dokumentations-Generator anfordert; Inhalt ist die Vorschlags-Dokumentation für Block- und Pin-Beschreibungen.&lt;br /&gt;
&lt;br /&gt;
Scroll-Lock: solange der Anwender bereits am unteren Ende des&lt;br /&gt;
Transkripts steht, folgt die Anzeige neu eintreffenden Karten&lt;br /&gt;
automatisch; nach manuellem Hochscrollen bleibt die Position stehen.&lt;br /&gt;
&lt;br /&gt;
Bilder können als Anhang versendet werden (Screenshot oder&lt;br /&gt;
PNG/JPG-Datei).  Anhänge funktionieren mit beiden Anbietern; bei&lt;br /&gt;
OpenAI nur mit vision-fähigen Modellen (gpt-4o-Familie).&lt;br /&gt;
&lt;br /&gt;
== Einstellungen (AI Coding) ==&lt;br /&gt;
&lt;br /&gt;
Im Einstellungsdialog unter &#039;&#039;&#039;Plugins → AI Coding&#039;&#039;&#039; (bzw. unter&lt;br /&gt;
&#039;&#039;&#039;Tools → AI Coding&#039;&#039;&#039; im Smalltalk-Launcher) werden konfiguriert:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Provider&#039;&#039;&#039; — Anthropic oder OpenAI.  Beim Wechsel werden API-URL und Default-Modell entsprechend angepasst; der gespeicherte API-Schlüssel des jeweiligen Anbieters wird geladen.&lt;br /&gt;
* &#039;&#039;&#039;API Key&#039;&#039;&#039; — Schlüssel des aktuell gewählten Anbieters.  Die Schlüssel werden pro Anbieter getrennt gespeichert (&amp;lt;code&amp;gt;#claudeApiKey_anthropic&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;#claudeApiKey_openai&amp;lt;/code&amp;gt;), so dass zwischen den Anbietern ohne erneute Eingabe gewechselt werden kann.  Das Setzen des Schlüssels erfolgt ausschließlich über diesen Dialog.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039; — ein Modell aus der Liste des aktiven Anbieters oder ein selbst eingegebener Modellname.  Kann auch direkt über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü in den Editor-Toolbars umgeschaltet werden.&lt;br /&gt;
* &#039;&#039;&#039;Max output tokens&#039;&#039;&#039; — maximale Antwortlänge.&lt;br /&gt;
* &#039;&#039;&#039;API URL&#039;&#039;&#039; — nur zu ändern für eigene Proxies / Gateways.  Standard: &amp;lt;code&amp;gt;https://api.anthropic.com/v1/messages&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;https://api.openai.com/v1/chat/completions&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API-Schlüssel beschaffen ==&lt;br /&gt;
&lt;br /&gt;
* Anthropic: [https://console.anthropic.com console.anthropic.com], Schlüsselformat &amp;lt;code&amp;gt;sk-ant-...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenAI: [https://platform.openai.com/api-keys platform.openai.com/api-keys], Schlüsselformat &amp;lt;code&amp;gt;sk-...&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sk-proj-...&amp;lt;/code&amp;gt;.  Voraussetzung ist ein aufgeladenes Konto (Mindestbetrag derzeit USD 5).&lt;br /&gt;
&lt;br /&gt;
== Datenschutz / Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Anbieter &#039;&#039;&#039;Anthropic&#039;&#039;&#039; gehen die Anfragen direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.anthropic.com&amp;lt;/code&amp;gt;, bei &#039;&#039;&#039;OpenAI&#039;&#039;&#039; direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.openai.com&amp;lt;/code&amp;gt;.  Es gibt keinen eXept-seitigen Proxy oder&lt;br /&gt;
Zwischenspeicher.  Mit dem Aktivitäts-Quelltext bzw. den Methoden-&lt;br /&gt;
Quelltexten werden auch Pin-Beschreibungen, Sub-Step-Namen und&lt;br /&gt;
referenzierte Environment-Variablen aus dem Block-Description-Modell&lt;br /&gt;
als Kontext versendet.&lt;br /&gt;
&lt;br /&gt;
Bei Benutzung von Anthropic API-Tokens - wie hier der Fall - werden laut Anthropic die Daten nicht zum Training des KI-Modells genutzt ([https://privacy.claude.com/de/articles/7996868-werden-meine-daten-fur-das-modelltraining-verwendet Anthropic Erkärung dazu]). Für die Wahrheit dieser Aussage könne wir nicht garantieren und haften.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sicher sein wollen, daß keine Information Ihr Haus verlässt empfehlen wir eine eigenem geschlossene in-house KI Umgebung, wie sie bei einigen unserer Kunden bereits existiert. Sie dürfen dann selbstverständlich nur die URLs dieser Umgebung konfigurieren. Expecco kommuniziert ausschließlich mit der von Ihnen eingegebenen KI.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mehrere Konversationen&#039;&#039;&#039;: der Chat ist ein Singleton — eine neue Anfrage über ein Browser-/Editor-Menü startet jedesmal eine &#039;&#039;&#039;neue&#039;&#039;&#039; Konversation. Folge-Fragen (Klärung, Vertiefung) gehen über das Eingabefeld in derselben Konversation.&lt;br /&gt;
* &#039;&#039;&#039;Vorsicht:&#039;&#039;&#039; Die Größe der übertragenen Daten (auch die aus dem Chatfenster) geht in die Kostenberechnung ein. Deshalb immer eine neue Konversation starten, wenn es um ein neues Thema geht.&lt;br /&gt;
* &#039;&#039;&#039;Modell wechseln&#039;&#039;&#039;: Für schnelle Routine-Antworten Sonnet, für schwierige Refactorings Opus. Über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü direkt aus der Toolbar oder über die Settings.&lt;br /&gt;
* &#039;&#039;&#039;Anbieter wechseln&#039;&#039;&#039;: Sind Schlüssel für beide Anbieter konfiguriert, schaltet das &#039;&#039;&#039;Set provider&#039;&#039;&#039;-Untermenü ohne Umweg über den Settings-Dialog um.&lt;br /&gt;
* &#039;&#039;&#039;Code direkt ausführen&#039;&#039;&#039;: In Code-Karten kann markierter Smalltalk-Code per doIt / printIt / inspectIt direkt evaluiert werden — praktisch z.B. um vom Modell vorgeschlagene SUnit-Asserts gleich auszuprobieren, ohne den Code erst in einen Workspace zu kopieren.&lt;br /&gt;
* &#039;&#039;&#039;Custom prompt&#039;&#039;&#039; eignet sich gut für „warum macht Methode X es so und nicht so?&amp;quot; oder „schreib mir einen ParameterizedTest dazu mit folgenden Daten: …&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tipps für die Arbeit mit claudeCode ==&lt;br /&gt;
Wenn Sie claudeCode verwenden, stehen ihnen noch weit mehr Funktionen zur Verfügung: sie können zum Beispiel im claudeCode Terminal eingeben: &lt;br /&gt;
* &amp;quot;mach mir eine neue Suite in einem neuen Fenster&amp;quot;,&lt;br /&gt;
* &amp;quot;Mache eine Aktion zur Berechnung des Umfangs eines Kreises bei gegebenen Radius&amp;quot;, &lt;br /&gt;
* &amp;quot;Erstelle eine neue suite mit einem Testfall der folgendes macht: &lt;br /&gt;
** 1) webbrowser auf &amp;quot;www.exept.de&amp;quot; öffnen. &lt;br /&gt;
** 2) auf das logo oben links klicken. &lt;br /&gt;
** 3) webbrowser schliessen.&lt;br /&gt;
* welche Funktionalität ist in xxx.ets&lt;br /&gt;
&lt;br /&gt;
Claude wurde von uns in die Lage versetzt, selbst nach passenden Bibliotheken zu suchen, diese zu importieren, Aktionen zu Generieren und den Testplan anzulegen.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich auch, den Test gleich durchzuführen und das Resultat zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind wir am trainieren, so dass claude z.B. selbst entscheidet ob es besser ist, eine fehlende Aktion als  Diagramm oder als elementare zu definieren. Es ist in der Lage, die Funktionen des unterliegenden Frameworks zu sehen und auch komplexe Aufgaben zu erledigen:&lt;br /&gt;
* &amp;quot;aktion zum Lesen der Jahresumsätze eines Jahres aus der Datenbank&amp;quot;&lt;br /&gt;
* extrahiere aus dem xml Dokument alle budget Einträge und liefere die Summe&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen und Tipps für die Arbeit ===&lt;br /&gt;
&lt;br /&gt;
Sonnet-4 ist gefühlt weit intelligenter als Heiku-4.5,&lt;br /&gt;
aber auch weit teurer. Ihr Budget kann sehr schnell schmelzen mit Sonnet. Insbesondere wenn man auf medium oder high Intelligenzlevel abeitet. Aber Haiku macht auch weit mehr Fehler und man sollte genau hinschauen was er so generiert. Gefühlt war Sonnet selbst im low level besser als Haiku. Aber der Preis...&lt;br /&gt;
&lt;br /&gt;
Folgende konkrete Tipps aus unseren ersten Erfahrungen, diese Liste wird aktualisiert, und kann auch basieren auf unserer eigenen Dummheit. Ist also u.U.mit Vorsicht zu geniessen.&lt;br /&gt;
&lt;br /&gt;
* geben Sie Haiku Hinweise, z.B. schau mal dort, oder nimm das als Beispiel. Sonnet findet selbst viel besser Lösungen.&lt;br /&gt;
* kurze Anweisungen, je konkreter desto günstiger.&lt;br /&gt;
* haiku ist weit &amp;quot;fauler&amp;quot;. Z.B hat sonnet automatisch eine Dokumentation bei neuen Aktionen angelegt, und diese auch aktualisiert. Haiku hingegen musste man explizit eine Regel dazu anlegen (z.B. mit &amp;quot;wenn du eine aktion anlegst oder änderst, aktualisiere die dokumentation&amp;quot;)&lt;br /&gt;
* heiku ist dümmer. Regeln die von sonnet angelegt wurden, können von haiku u.U. nicht befolgt werden, weil sonnet weit mehr generalisieren kann.&lt;br /&gt;
* sagen sie beiden sie sollten wenn sie ein Problem haben,  nicht lange selbst suchen. sondern nachfragen ob man ihnen einen Tipp geben kann. Wenn Sie das nicht tun, kann es sein dass Sonnet auch eine viertel Stunde nachdenkt und die Dollars schmelzen wie Eis in der Sonne&amp;lt;br&amp;gt;(ist mir passiert, als ein Socket Problem in der Kommunikation auftrat, und er nicht erkannte, das die Antworten von mcp falsch waren, es hat dann selbst alle möglichen Wege gesucht, eine Nachricht abzusetzen, incl. der Erstellung diverser Shell, curl und Python Scripte... obgleich es eigentlich ein Interface dafür gab, das aber einen Fehler hatte).&lt;br /&gt;
* schränken Sie das Modell in seinen Möglichkeiten ein, z.B. sagen sie &amp;quot;editiere nicht die files sondern verwende dazu ein tool&amp;quot;, oder &amp;quot;eine expecco aktion und sag mir vorher welche du nimmst&amp;quot;. Sonst kann es passieren dass es anfängt ihre ets zu entpacken um darin nach strings zu suchen, obgleich es das eigentlich einfacher über das interface machen kann (dieses konkrete Problem wird nicht mehr auftreten aber Sie sehen den Punkt). Da war Sonnet weit intelligenter hat aber auch länger nachgedacht. &lt;br /&gt;
* wenn sie feststellen, dass es einen Fehler macht, sagen sie (wörtlich) &amp;quot;remember: mach dies nicht, oder um das zu machen tu das.&amp;quot;&lt;br /&gt;
* sie können diese Erinnerungen sowohl in ihrem UserProfile (also im lokalen Filesystem) als auch in ihren expecco Präferenzen halten. Sagen Sie dazu &amp;quot;remember this in in my expecco memory&amp;quot; oder &amp;quot;remember (in my user memory): bla bla&amp;quot;. Erinnerungen kann man auch löschen &amp;quot;forget to ...&amp;quot;. Zu Beginn der nächsten session sagen sie &amp;quot;read your expecco memory&amp;quot;.&lt;br /&gt;
* wechseln sie das Modell oder den level, je nach Komplexität der Aufgabe. Aber bedenken Sie dass Wissen von Session zu Session verloren geht, wenn es nicht erinnert wird. Technisch sind Erinnerungen nichts anderes als das Lesen einer Liste der vormaligen remember Anweisungen. Kosten also auch Tokens. Sie könnten also die Erinnerunge auch einfach neu eintippen ;-)&lt;br /&gt;
* auch wenn es so scheint: das &amp;quot;Ding&amp;quot; ist kein Mensch; lassen sie &amp;quot;bitte, danke, oder Begründungen - es sei denn sie dienen der Entscheidung - weg. Tatsächlich erhöhen sie  den Tokenverbrauch u.U.&lt;br /&gt;
&lt;br /&gt;
Subjektive Zusammenfassung: &lt;br /&gt;
* haiku ist viel schneller in der Antwort und kostet ein Zehntel. Mit Sonnet war nach 3-4 Std Arbeit mein Limit erreicht und ich durfte Stunden Pause machen. Mit Haiku kann man durcharbeiten. Aber ich brauche auch mindestens doppelt so viel Zeit um haiku anzuleiten und seine Fehler wieder auszubügeln.&lt;br /&gt;
&lt;br /&gt;
== Was kann eine lokale KI (z.B. ollama) ==&lt;br /&gt;
&lt;br /&gt;
Erste Versuche sind eher ernüchternd. Ohne Zugriff auf lokale Quellen, mit rein antrainiertem Wissen sind die Modelle vermutlich zu klein. Hier eine Konversation mit gemma3:8b-it-qat (8 Mrd, quantifiziert) auf einem Rechner ohne GPU.&lt;br /&gt;
Die Antwortzeiten sind natürlich schlecht, aber mit einer GPU u.U. brauchbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig: wir sind selbst noch Anfänger und keine [https://en.wikipedia.org/wiki/Susan_Calvin KI Psychologen].&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
 install ollama&lt;br /&gt;
 ollama pull gemma3:8b-it-qat ;; gemma3:8b / gemma3:12b usw.&lt;br /&gt;
 ollama run gemma3:8b-it-qat&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 1 ===&lt;br /&gt;
Hinweise: Wichtig, sonst labert Sie das Modell voll!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; respond short and concise&lt;br /&gt;
 Understood&lt;br /&gt;
&lt;br /&gt;
Hinweise: Smalltalk/X wissen hat er nicht, aber VW und Pharo sind ähnlich genug.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are an expert in smalltalk programming, especially in Smalltalk/X, visualworks and Squeak.&lt;br /&gt;
 &lt;br /&gt;
 You have come to the right place I have a considerable depth of knowledge regarding Smalltalk...&lt;br /&gt;
Angeber- wir werden sehen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what does the smalltalk expression &amp;quot;self at:4 put:&#039;bla&#039; &amp;quot; mean&lt;br /&gt;
 &lt;br /&gt;
 Sets the character &#039;b&#039; at index 4 of `self` (assuming `self` is a string).&lt;br /&gt;
Falsche Antwort; Smalltalk verwendet 1-basierte Indices, und &#039;bla&#039; ist ein String&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to compute the area of a circle given radius&lt;br /&gt;
 &lt;br /&gt;
 ```smalltalk&lt;br /&gt;
 | radius area |&lt;br /&gt;
 radius := 5.0.&lt;br /&gt;
 area := radius * radius * PI.&lt;br /&gt;
 ^area&lt;br /&gt;
 ```&lt;br /&gt;
nicht schlecht. &lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to extract a substring&lt;br /&gt;
 &lt;br /&gt;
 `substring:startIndexToEndIndex` (inclusive). E.g., `&amp;quot;hello&amp;quot; substring:2 to:4` yields `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
wieder falsch; 1-basierter index, substring:to: möglicherweise in einem anderen Smalltalk vorhanden. Könnte man durchgehen lassen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; alternative?&lt;br /&gt;
 &lt;br /&gt;
 `copyFrom:to:` (indexes inclusive). `string copyFrom:1 to:3` gives `&amp;quot;ell&amp;quot;`.&lt;br /&gt;
besser, aber immer noch falscher Index&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;hello&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;llo&amp;quot;&lt;br /&gt;
war zu erwarten&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; smalltalk uses 1 based indexing. what is the result&lt;br /&gt;
 &lt;br /&gt;
 Correct. The result of `&#039;hello&#039; copyFrom:2 to:4` is `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
soso. Er sieht ein, dass ich korrigiert habe - dann aber dickköpfig.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; in smalltalk the first index is 1 the last is the collection&#039;s size. Not as in Python or C.&lt;br /&gt;
 &lt;br /&gt;
 Precisely. 1-based indexing is core to Smalltalk.&lt;br /&gt;
aha, er könnte es wissen; es fehlt ihm aber offensichtlich an Abstraktionsvermögen. Versuchen wir es mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 You are absolutely right! My apologies. `copyFrom:to:` includes both endpoints, so `&#039;hello&#039; copyFrom:2 to:4` results in `&amp;quot;ell&amp;quot;`. Thanks for the correction. I am still under development and learning nuances like this.&lt;br /&gt;
soso, eine Nuance. Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;bcd&amp;quot;&lt;br /&gt;
na also; geht doch.&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 2 ===&lt;br /&gt;
&lt;br /&gt;
Neuer Versuch; eine neue Session. Gib ihm Grundwissen, das er nicht im Modell hat.&lt;br /&gt;
 /clear&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; answer short an concise&lt;br /&gt;
 Okay.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are expert in smalltalk programming, especially smalltalk/x, visualworks and pharo&lt;br /&gt;
 &lt;br /&gt;
 Acknowledged. I&#039;m ready to leverage my knowledge of Smalltalk (including Smalltalk/X, VisualWorks, and Pharo) to&lt;br /&gt;
assist you. Ask away!&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: because smalltalk is 1-based indexing, the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 Understood. I will keep in mind Smalltalk&#039;s 1-based indexing when answering your questions about string&lt;br /&gt;
manipulation and other operations&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &#039;bcd&#039;&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; given Array #(10 20 30 40) what is the result of array at:3&lt;br /&gt;
 &lt;br /&gt;
 30&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
Man muss den Context also mit Wissen füllen, dann kommt durchaus sinnvolles heraus. Wir sind dran, das zu evaluieren damit möglicherweise sogar eine lokale KI (allerdings mit GPU) hilfreich unterstützen kann.&lt;br /&gt;
&lt;br /&gt;
== Wahl der Modellgrösse ==&lt;br /&gt;
&lt;br /&gt;
Versuche mit gemma3:270m (sehr klein; 270m), gemma3:1b (1 mrd) und gemma3:4b (4 mrd). Alle auf lokalem Rechner ohne GPU.&lt;br /&gt;
Versuch: Übersetzung einer Bausteindokumentation.&lt;br /&gt;
&lt;br /&gt;
Eingabe: translate to German:&lt;br /&gt;
 &amp;quot;show a dialog with an informationstring&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die 270mio und 1mrd Modelle versagen, und kennen das Geschlecht nicht; sie stammeln:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Zeigen Sie eine Dialoge mit einer Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen: &lt;br /&gt;
   &amp;quot;Zeige einen Dialog mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
bzw (1Mrd).&lt;br /&gt;
 &amp;quot;Zeig eine Dialog mit einem Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Gib ein Dialog mit einem Informationen-String aus&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige einen Dialog, der eine Informations-Stränge enthält&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das 4Mrd Modell scheint brauchbar:&lt;br /&gt;
 &amp;quot;Zeige einen Dialog mit einer Informationsnachricht&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Erstelle ein Dialogfenster mit einer Informationsanzeige&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige ein Dialogfeld mit einer Informationen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In jedem Fall darf man der KI nicht &amp;quot;blind&amp;quot; vertrauen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Plugin]]&lt;br /&gt;
[[Kategorie:Erweiterung]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31398</id>
		<title>KI Coding Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31398"/>
		<updated>2026-06-07T10:11:26Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Sitzung 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KI Coding Plugin =&lt;br /&gt;
&lt;br /&gt;
Das KI Coding Plugin bindet einen Large Language Model (LLM) basierten&lt;br /&gt;
KI-Assistenten in den Activity-Editor (Aktivitäten-Code), den&lt;br /&gt;
Compound-Netzwerk-Editor, den Dokumentations-Editor und in den&lt;br /&gt;
ST/X Class Browser ein.  Das Plugin unterstützt zwei Anbieter, die im&lt;br /&gt;
Einstellungsdialog umschaltbar sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anthropic Claude&#039;&#039;&#039; (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)&lt;br /&gt;
* &#039;&#039;&#039;OpenAI ChatGPT&#039;&#039;&#039; (gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o1, o3)&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; (codellama:7b, codellama:13b)&lt;br /&gt;
Je nach gewähltem Anbieter erscheint die Toolbar-Schaltfläche als&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Ask Claude&amp;quot;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;quot;Ask ChatGPT&amp;quot;&#039;&#039;&#039;; das Einstellungs-Tab&lt;br /&gt;
heißt &#039;&#039;&#039;&amp;quot;AI Coding&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten-Editor ==&lt;br /&gt;
&lt;br /&gt;
Im Aktivitäten-Code-Editor erscheint in der Toolbar eine Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit folgenden Aktionen:&lt;br /&gt;
&lt;br /&gt;
* Open KI Window — öffnet das eigenständige Chat-Fenster&lt;br /&gt;
* Explain code — erklärt den Code der aktuellen Aktivität&lt;br /&gt;
* Suggest improvement — schlägt Verbesserungen vor&lt;br /&gt;
* Find bugs — sucht nach Fehlern, Race Conditions, nil-Handling-Problemen&lt;br /&gt;
* Generate doc-comment — generiert eine Aktivitäts-Dokumentation inklusive Pin-Kommentaren und füllt den Documentation-Tab&lt;br /&gt;
* Custom prompt... — freier Prompt; der Aktivitäts-Code wird als Kontext mitgesendet&lt;br /&gt;
* Set model ▸ — Untermenü mit den Modellen des aktiven Anbieters (das aktuell aktive ist mit &#039;&#039;(active)&#039;&#039; markiert)&lt;br /&gt;
* Set provider ▸ — nur sichtbar, wenn API-Schlüssel für mehr als einen Anbieter konfiguriert sind; Untermenü zum Umschalten zwischen Claude und ChatGPT&lt;br /&gt;
&lt;br /&gt;
Code-Vorschläge können mit &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (direkt am jeweiligen&lt;br /&gt;
Code-Block im Chat oder über die obere Apply-Schaltfläche) in den&lt;br /&gt;
Aktivitäts-Body übernommen werden.  Vom KI gelieferte Smalltalk/X&lt;br /&gt;
Hilfsmethoden (Form: &amp;lt;code&amp;gt;Klasse &amp;gt;&amp;gt; selector&amp;lt;/code&amp;gt;) werden nach&lt;br /&gt;
Rückfrage in die genannte Klasse compiliert.&lt;br /&gt;
&lt;br /&gt;
== Compound (Netzwerk) Editor ==&lt;br /&gt;
&lt;br /&gt;
Auf der Toolbar von Compound-Worksheets erscheint dieselbe&lt;br /&gt;
Schaltfläche, beschränkt auf die für Netze sinnvollen Aktionen&lt;br /&gt;
(Open KI Window, Generate doc-comment) — ebenfalls mit den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Dokumentations-Editor ==&lt;br /&gt;
&lt;br /&gt;
Der Dokumentations-Tab der Block-Description (Editor für Test-Cases,&lt;br /&gt;
Test-Plans und Aktivitäten) trägt dieselbe Toolbar-Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit den Einträgen&lt;br /&gt;
&#039;&#039;&#039;Open KI Window&#039;&#039;&#039;, &#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; sowie den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; analysiert den aktuellen Block (Name,&lt;br /&gt;
vorhandene Beschreibung, Eingangs-/Ausgangs-Pins, Sub-Steps eines&lt;br /&gt;
Compound-Netzes, referenzierte Environment-Variablen) und schlägt&lt;br /&gt;
eine vollständige Block- und Pin-Dokumentation vor.&lt;br /&gt;
&lt;br /&gt;
Ist der Block schreibgeschützt (importierte Library, RTL-Lizenz),&lt;br /&gt;
fragt &#039;&#039;&#039;[Apply]&#039;&#039;&#039; nach, ob der Block freigeschaltet und die&lt;br /&gt;
Dokumentation eingetragen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Class Browser (ST/X) ==&lt;br /&gt;
&lt;br /&gt;
Im Class Browser stehen die Aktionen unter dem &#039;&#039;&#039;AI&#039;&#039;&#039;-Untermenü&lt;br /&gt;
sowie im Selektor-Kontextmenü zur Verfügung.  Die Aktionen&lt;br /&gt;
operieren auf der aktuell ausgewählten Methode (Klasse + Selektor +&lt;br /&gt;
Quelltext werden als Kontext mitgesendet).  &#039;&#039;&#039;[Apply]&#039;&#039;&#039; kann das&lt;br /&gt;
Resultat direkt in die Methode der aktiven Klasse einbauen.&lt;br /&gt;
Auch hier sind &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039; als&lt;br /&gt;
Untermenüs verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Chat-Fenster ==&lt;br /&gt;
&lt;br /&gt;
Das eigenständige Chat-Fenster trägt den Titel&lt;br /&gt;
&#039;&#039;&#039;AI Coding [&amp;amp;lt;Produkt&amp;amp;gt; / &amp;amp;lt;Modell&amp;amp;gt;]&#039;&#039;&#039; (z.B.&lt;br /&gt;
&amp;quot;AI Coding [Claude / claude-opus-4-7]&amp;quot;) und zeigt nach jedem Turn&lt;br /&gt;
den Tokenverbrauch und die kumulierten Kosten — sofern Preise für&lt;br /&gt;
das gewählte Modell hinterlegt sind.  Anbieter- und Modellwechsel&lt;br /&gt;
im Einstellungsdialog werden live übernommen.&lt;br /&gt;
&lt;br /&gt;
Das Transkript ist als vertikales Panel von &amp;quot;Karten&amp;quot; aufgebaut:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prosa-Karten&#039;&#039;&#039; enthalten den fließenden Text der Antwort; Zeilen werden auf die Fenster-Breite umgebrochen.&lt;br /&gt;
* &#039;&#039;&#039;Code-Karten&#039;&#039;&#039; (eingerahmt) entstehen aus markdown-Code-Blöcken (&amp;lt;code&amp;gt;```...```&amp;lt;/code&amp;gt;) und sind als &#039;&#039;&#039;Workspace&#039;&#039;&#039; editierbar — das Standard-Smalltalk-Popup-Menü bietet doIt / printIt / inspectIt, ein &amp;lt;code&amp;gt;TestCase&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;simulatedSelf&amp;lt;/code&amp;gt; ist gesetzt, so dass &amp;lt;code&amp;gt;self assert:... equals:...&amp;lt;/code&amp;gt; direkt ausgeführt werden kann.  Lange Blöcke scrollen innerhalb der Karte.  Rechts oben sitzen die Schaltflächen &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (sofern für den Kontext sinnvoll) und &#039;&#039;&#039;[⎘ Copy]&#039;&#039;&#039;; links wird der Sprachtag (smalltalk, python, …) angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Doku-Karten&#039;&#039;&#039; (volle Breite, Prosa) entstehen aus dem speziellen &amp;lt;code&amp;gt;```doc&amp;lt;/code&amp;gt;-Block, den der Dokumentations-Generator anfordert; Inhalt ist die Vorschlags-Dokumentation für Block- und Pin-Beschreibungen.&lt;br /&gt;
&lt;br /&gt;
Scroll-Lock: solange der Anwender bereits am unteren Ende des&lt;br /&gt;
Transkripts steht, folgt die Anzeige neu eintreffenden Karten&lt;br /&gt;
automatisch; nach manuellem Hochscrollen bleibt die Position stehen.&lt;br /&gt;
&lt;br /&gt;
Bilder können als Anhang versendet werden (Screenshot oder&lt;br /&gt;
PNG/JPG-Datei).  Anhänge funktionieren mit beiden Anbietern; bei&lt;br /&gt;
OpenAI nur mit vision-fähigen Modellen (gpt-4o-Familie).&lt;br /&gt;
&lt;br /&gt;
== Einstellungen (AI Coding) ==&lt;br /&gt;
&lt;br /&gt;
Im Einstellungsdialog unter &#039;&#039;&#039;Plugins → AI Coding&#039;&#039;&#039; (bzw. unter&lt;br /&gt;
&#039;&#039;&#039;Tools → AI Coding&#039;&#039;&#039; im Smalltalk-Launcher) werden konfiguriert:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Provider&#039;&#039;&#039; — Anthropic oder OpenAI.  Beim Wechsel werden API-URL und Default-Modell entsprechend angepasst; der gespeicherte API-Schlüssel des jeweiligen Anbieters wird geladen.&lt;br /&gt;
* &#039;&#039;&#039;API Key&#039;&#039;&#039; — Schlüssel des aktuell gewählten Anbieters.  Die Schlüssel werden pro Anbieter getrennt gespeichert (&amp;lt;code&amp;gt;#claudeApiKey_anthropic&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;#claudeApiKey_openai&amp;lt;/code&amp;gt;), so dass zwischen den Anbietern ohne erneute Eingabe gewechselt werden kann.  Das Setzen des Schlüssels erfolgt ausschließlich über diesen Dialog.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039; — ein Modell aus der Liste des aktiven Anbieters oder ein selbst eingegebener Modellname.  Kann auch direkt über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü in den Editor-Toolbars umgeschaltet werden.&lt;br /&gt;
* &#039;&#039;&#039;Max output tokens&#039;&#039;&#039; — maximale Antwortlänge.&lt;br /&gt;
* &#039;&#039;&#039;API URL&#039;&#039;&#039; — nur zu ändern für eigene Proxies / Gateways.  Standard: &amp;lt;code&amp;gt;https://api.anthropic.com/v1/messages&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;https://api.openai.com/v1/chat/completions&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API-Schlüssel beschaffen ==&lt;br /&gt;
&lt;br /&gt;
* Anthropic: [https://console.anthropic.com console.anthropic.com], Schlüsselformat &amp;lt;code&amp;gt;sk-ant-...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenAI: [https://platform.openai.com/api-keys platform.openai.com/api-keys], Schlüsselformat &amp;lt;code&amp;gt;sk-...&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sk-proj-...&amp;lt;/code&amp;gt;.  Voraussetzung ist ein aufgeladenes Konto (Mindestbetrag derzeit USD 5).&lt;br /&gt;
&lt;br /&gt;
== Datenschutz / Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Anbieter &#039;&#039;&#039;Anthropic&#039;&#039;&#039; gehen die Anfragen direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.anthropic.com&amp;lt;/code&amp;gt;, bei &#039;&#039;&#039;OpenAI&#039;&#039;&#039; direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.openai.com&amp;lt;/code&amp;gt;.  Es gibt keinen eXept-seitigen Proxy oder&lt;br /&gt;
Zwischenspeicher.  Mit dem Aktivitäts-Quelltext bzw. den Methoden-&lt;br /&gt;
Quelltexten werden auch Pin-Beschreibungen, Sub-Step-Namen und&lt;br /&gt;
referenzierte Environment-Variablen aus dem Block-Description-Modell&lt;br /&gt;
als Kontext versendet.&lt;br /&gt;
&lt;br /&gt;
Bei Benutzung von Anthropic API-Tokens - wie hier der Fall - werden laut Anthropic die Daten nicht zum Training des KI-Modells genutzt ([https://privacy.claude.com/de/articles/7996868-werden-meine-daten-fur-das-modelltraining-verwendet Anthropic Erkärung dazu]). Für die Wahrheit dieser Aussage könne wir nicht garantieren und haften.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sicher sein wollen, daß keine Information Ihr Haus verlässt empfehlen wir eine eigenem geschlossene in-house KI Umgebung, wie sie bei einigen unserer Kunden bereits existiert. Sie dürfen dann selbstverständlich nur die URLs dieser Umgebung konfigurieren. Expecco kommuniziert ausschließlich mit der von Ihnen eingegebenen KI.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mehrere Konversationen&#039;&#039;&#039;: der Chat ist ein Singleton — eine neue Anfrage über ein Browser-/Editor-Menü startet jedesmal eine &#039;&#039;&#039;neue&#039;&#039;&#039; Konversation. Folge-Fragen (Klärung, Vertiefung) gehen über das Eingabefeld in derselben Konversation.&lt;br /&gt;
* &#039;&#039;&#039;Vorsicht:&#039;&#039;&#039; Die Größe der übertragenen Daten (auch die aus dem Chatfenster) geht in die Kostenberechnung ein. Deshalb immer eine neue Konversation starten, wenn es um ein neues Thema geht.&lt;br /&gt;
* &#039;&#039;&#039;Modell wechseln&#039;&#039;&#039;: Für schnelle Routine-Antworten Sonnet, für schwierige Refactorings Opus. Über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü direkt aus der Toolbar oder über die Settings.&lt;br /&gt;
* &#039;&#039;&#039;Anbieter wechseln&#039;&#039;&#039;: Sind Schlüssel für beide Anbieter konfiguriert, schaltet das &#039;&#039;&#039;Set provider&#039;&#039;&#039;-Untermenü ohne Umweg über den Settings-Dialog um.&lt;br /&gt;
* &#039;&#039;&#039;Code direkt ausführen&#039;&#039;&#039;: In Code-Karten kann markierter Smalltalk-Code per doIt / printIt / inspectIt direkt evaluiert werden — praktisch z.B. um vom Modell vorgeschlagene SUnit-Asserts gleich auszuprobieren, ohne den Code erst in einen Workspace zu kopieren.&lt;br /&gt;
* &#039;&#039;&#039;Custom prompt&#039;&#039;&#039; eignet sich gut für „warum macht Methode X es so und nicht so?&amp;quot; oder „schreib mir einen ParameterizedTest dazu mit folgenden Daten: …&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tipps für die Arbeit mit claudeCode ==&lt;br /&gt;
Wenn Sie claudeCode verwenden, stehen ihnen noch weit mehr Funktionen zur Verfügung: sie können zum Beispiel im claudeCode Terminal eingeben: &lt;br /&gt;
* &amp;quot;mach mir eine neue Suite in einem neuen Fenster&amp;quot;,&lt;br /&gt;
* &amp;quot;Mache eine Aktion zur Berechnung des Umfangs eines Kreises bei gegebenen Radius&amp;quot;, &lt;br /&gt;
* &amp;quot;Erstelle eine neue suite mit einem Testfall der folgendes macht: &lt;br /&gt;
** 1) webbrowser auf &amp;quot;www.exept.de&amp;quot; öffnen. &lt;br /&gt;
** 2) auf das logo oben links klicken. &lt;br /&gt;
** 3) webbrowser schliessen.&lt;br /&gt;
* welche Funktionalität ist in xxx.ets&lt;br /&gt;
&lt;br /&gt;
Claude wurde von uns in die Lage versetzt, selbst nach passenden Bibliotheken zu suchen, diese zu importieren, Aktionen zu Generieren und den Testplan anzulegen.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich auch, den Test gleich durchzuführen und das Resultat zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind wir am trainieren, so dass claude z.B. selbst entscheidet ob es besser ist, eine fehlende Aktion als  Diagramm oder als elementare zu definieren. Es ist in der Lage, die Funktionen des unterliegenden Frameworks zu sehen und auch komplexe Aufgaben zu erledigen:&lt;br /&gt;
* &amp;quot;aktion zum Lesen der Jahresumsätze eines Jahres aus der Datenbank&amp;quot;&lt;br /&gt;
* extrahiere aus dem xml Dokument alle budget Einträge und liefere die Summe&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen und Tipps für die Arbeit ===&lt;br /&gt;
&lt;br /&gt;
Sonnet-4 ist gefühlt weit intelligenter als Heiku-4.5,&lt;br /&gt;
aber auch weit teurer. Ihr Budget kann sehr schnell schmelzen mit Sonnet. Insbesondere wenn man auf medium oder high Intelligenzlevel abeitet. Aber Haiku macht auch weit mehr Fehler und man sollte genau hinschauen was er so generiert. Gefühlt war Sonnet selbst im low level besser als Haiku. Aber der Preis...&lt;br /&gt;
&lt;br /&gt;
Folgende konkrete Tipps aus unseren ersten Erfahrungen, diese Liste wird aktualisiert, und kann auch basieren auf unserer eigenen Dummheit. Ist also u.U.mit Vorsicht zu geniessen.&lt;br /&gt;
&lt;br /&gt;
* geben Sie Haiku Hinweise, z.B. schau mal dort, oder nimm das als Beispiel. Sonnet findet selbst viel besser Lösungen.&lt;br /&gt;
* kurze Anweisungen, je konkreter desto günstiger.&lt;br /&gt;
* haiku ist weit &amp;quot;fauler&amp;quot;. Z.B hat sonnet automatisch eine Dokumentation bei neuen Aktionen angelegt, und diese auch aktualisiert. Haiku hingegen musste man explizit eine Regel dazu anlegen (z.B. mit &amp;quot;wenn du eine aktion anlegst oder änderst, aktualisiere die dokumentation&amp;quot;)&lt;br /&gt;
* heiku ist dümmer. Regeln die von sonnet angelegt wurden, können von haiku u.U. nicht befolgt werden, weil sonnet weit mehr generalisieren kann.&lt;br /&gt;
* sagen sie beiden sie sollten wenn sie ein Problem haben,  nicht lange selbst suchen. sondern nachfragen ob man ihnen einen Tipp geben kann. Wenn Sie das nicht tun, kann es sein dass Sonnet auch eine viertel Stunde nachdenkt und die Dollars schmelzen wie Eis in der Sonne&amp;lt;br&amp;gt;(ist mir passiert, als ein Socket Problem in der Kommunikation auftrat, und er nicht erkannte, das die Antworten von mcp falsch waren, es hat dann selbst alle möglichen Wege gesucht, eine Nachricht abzusetzen, incl. der Erstellung diverser Shell, curl und Python Scripte... obgleich es eigentlich ein Interface dafür gab, das aber einen Fehler hatte).&lt;br /&gt;
* schränken Sie das Modell in seinen Möglichkeiten ein, z.B. sagen sie &amp;quot;editiere nicht die files sondern verwende dazu ein tool&amp;quot;, oder &amp;quot;eine expecco aktion und sag mir vorher welche du nimmst&amp;quot;. Sonst kann es passieren dass es anfängt ihre ets zu entpacken um darin nach strings zu suchen, obgleich es das eigentlich einfacher über das interface machen kann (dieses konkrete Problem wird nicht mehr auftreten aber Sie sehen den Punkt). Da war Sonnet weit intelligenter hat aber auch länger nachgedacht. &lt;br /&gt;
* wenn sie feststellen, dass es einen Fehler macht, sagen sie (wörtlich) &amp;quot;remember: mach dies nicht, oder um das zu machen tu das.&amp;quot;&lt;br /&gt;
* sie können diese Erinnerungen sowohl in ihrem UserProfile (also im lokalen Filesystem) als auch in ihren expecco Präferenzen halten. Sagen Sie dazu &amp;quot;remember this in in my expecco memory&amp;quot; oder &amp;quot;remember (in my user memory): bla bla&amp;quot;. Erinnerungen kann man auch löschen &amp;quot;forget to ...&amp;quot;. Zu Beginn der nächsten session sagen sie &amp;quot;read your expecco memory&amp;quot;.&lt;br /&gt;
* wechseln sie das Modell oder den level, je nach Komplexität der Aufgabe. Aber bedenken Sie dass Wissen von Session zu Session verloren geht, wenn es nicht erinnert wird. Technisch sind Erinnerungen nichts anderes als das Lesen einer Liste der vormaligen remember Anweisungen. Kosten also auch Tokens. Sie könnten also die Erinnerunge auch einfach neu eintippen ;-)&lt;br /&gt;
* auch wenn es so scheint: das &amp;quot;Ding&amp;quot; ist kein Mensch; lassen sie &amp;quot;bitte, danke, oder Begründungen - es sei denn sie dienen der Entscheidung - weg. Tatsächlich erhöhen sie  den Tokenverbrauch u.U.&lt;br /&gt;
&lt;br /&gt;
Subjektive Zusammenfassung: &lt;br /&gt;
* haiku ist viel schneller in der Antwort und kostet ein Zehntel. Mit Sonnet war nach 3-4 Std Arbeit mein Limit erreicht und ich durfte Stunden Pause machen. Mit Haiku kann man durcharbeiten. Aber ich brauche auch mindestens doppelt so viel Zeit um haiku anzuleiten und seine Fehler wieder auszubügeln.&lt;br /&gt;
&lt;br /&gt;
== Was kann eine lokale KI (z.B. ollama) ==&lt;br /&gt;
&lt;br /&gt;
Erste Versuche sind eher ernüchternd. Ohne Zugriff auf lokale Quellen, mit rein antrainiertem Wissen sind die Modelle vermutlich zu klein. Hier eine Konversation mit gemma3:8b-it-qat (8 Mrd, quantifiziert) auf einem Rechner ohne GPU.&lt;br /&gt;
Die Antwortzeiten sind natürlich schlecht, aber mit einer GPU u.U. brauchbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig: wir sind selbst noch Anfänger und keine [https://en.wikipedia.org/wiki/Susan_Calvin KI Psychologen].&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
 install ollama&lt;br /&gt;
 ollama pull gemma3:8b-it-qat ;; gemma3:8b / gemma3:12b usw.&lt;br /&gt;
 ollama run gemma3:8b-it-qat&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 1 ===&lt;br /&gt;
Hinweise: Wichtig, sonst labert Sie das Modell voll!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; respond short and concise&lt;br /&gt;
 Understood&lt;br /&gt;
&lt;br /&gt;
Hinweise: Smalltalk/X wissen hat er nicht, aber VW und Pharo sind ähnlich genug.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are an expert in smalltalk programming, especially in Smalltalk/X, visualworks and Squeak.&lt;br /&gt;
 &lt;br /&gt;
 You have come to the right place I have a considerable depth of knowledge regarding Smalltalk...&lt;br /&gt;
Angeber- wir werden sehen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what does the smalltalk expression &amp;quot;self at:4 put:&#039;bla&#039; &amp;quot; mean&lt;br /&gt;
 &lt;br /&gt;
 Sets the character &#039;b&#039; at index 4 of `self` (assuming `self` is a string).&lt;br /&gt;
Falsche Antwort; Smalltalk verwendet 1-basierte Indices, und &#039;bla&#039; ist ein String&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to compute the area of a circle given radius&lt;br /&gt;
 &lt;br /&gt;
 ```smalltalk&lt;br /&gt;
 | radius area |&lt;br /&gt;
 radius := 5.0.&lt;br /&gt;
 area := radius * radius * PI.&lt;br /&gt;
 ^area&lt;br /&gt;
 ```&lt;br /&gt;
nicht schlecht. &lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to extract a substring&lt;br /&gt;
 &lt;br /&gt;
 `substring:startIndexToEndIndex` (inclusive). E.g., `&amp;quot;hello&amp;quot; substring:2 to:4` yields `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
wieder falsch; 1-basierter index, substring:to: möglicherweise in einem anderen Smalltalk vorhanden. Könnte man durchgehen lassen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; alternative?&lt;br /&gt;
 &lt;br /&gt;
 `copyFrom:to:` (indexes inclusive). `string copyFrom:1 to:3` gives `&amp;quot;ell&amp;quot;`.&lt;br /&gt;
besser, aber immer noch falscher Index&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;hello&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;llo&amp;quot;&lt;br /&gt;
war zu erwarten&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; smalltalk uses 1 based indexing. what is the result&lt;br /&gt;
 &lt;br /&gt;
 Correct. The result of `&#039;hello&#039; copyFrom:2 to:4` is `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
soso. Er sieht ein, dass ich korrigiert habe - dann aber dickköpfig.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; in smalltalk the first index is 1 the last is the collection&#039;s size. Not as in Python or C.&lt;br /&gt;
 &lt;br /&gt;
 Precisely. 1-based indexing is core to Smalltalk.&lt;br /&gt;
aha, er könnte es wissen; es fehlt ihm aber offensichtlich an Abstraktionsvermögen. Versuchen wir es mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 You are absolutely right! My apologies. `copyFrom:to:` includes both endpoints, so `&#039;hello&#039; copyFrom:2 to:4` results in `&amp;quot;ell&amp;quot;`. Thanks for the correction. I am still under development and learning nuances like this.&lt;br /&gt;
soso, eine Nuance. Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;bcd&amp;quot;&lt;br /&gt;
na also; geht doch.&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 2 ===&lt;br /&gt;
&lt;br /&gt;
Neuer Versuch; eine neue Session. Gib ihm Grundwissen, das er nicht im Modell hat.&lt;br /&gt;
 /clear&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; answer short an concise&lt;br /&gt;
 Okay.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are expert in smalltalk programming, especially smalltalk/x, visualworks and pharo&lt;br /&gt;
 &lt;br /&gt;
 Acknowledged. I&#039;m ready to leverage my knowledge of Smalltalk (including Smalltalk/X, VisualWorks, and Pharo) to&lt;br /&gt;
assist you. Ask away!&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: because smalltalk is 1-based indexing, the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 Understood. I will keep in mind Smalltalk&#039;s 1-based indexing when answering your questions about string&lt;br /&gt;
manipulation and other operations&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &#039;bcd&#039;&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; given Array #(10 20 30 40) what is the result of array at:3&lt;br /&gt;
 &lt;br /&gt;
 30&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
Man muss den Context also mit Wissen füllen, dann kommt durchaus sinnvolles heraus. Wir sind dran, das zu evaluieren damit möglicherweise sogar eine lokale KI (allerdings mit GPU) hilfreich unterstützen kann.&lt;br /&gt;
&lt;br /&gt;
== Wahl der Modellgrösse ==&lt;br /&gt;
&lt;br /&gt;
Versuche mit gemma3:270m (sehr klein; 270m), gemma3:1b (1 mrd) und gemma3:4b (4 mrd). Alle auf lokalem Rechner ohne GPU.&lt;br /&gt;
Versuch: Übersetzung einer Bausteindokumentation.&lt;br /&gt;
&lt;br /&gt;
Eingabe: translate to German:&lt;br /&gt;
 &amp;quot;show a dialog with an informationstring&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Die 270mio und 1mrd Modelle versagen, und kennen das Geschlecht nicht; sie stammeln:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Zeigen Sie eine Dialoge mit einer Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen: &lt;br /&gt;
   &amp;quot;Zeige einen Dialog mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
   &amp;quot;Zeige eine Dialoge mit einer Informationsstring.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
bzw (1Mrd).&lt;br /&gt;
 &amp;quot;Zeig eine Dialog mit einem Informationsstring&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Gib ein Dialog mit einem Informationen-String aus&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige einen Dialog, der eine Informations-Stränge enthält&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das 4Mrd Modell scheint brauchbar:&lt;br /&gt;
 &amp;quot;Zeige einen Dialog mit einer Informationsnachricht&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Alternativen:&lt;br /&gt;
 &amp;quot;Erstelle ein Dialogfenster mit einer Informationsanzeige&amp;quot;&lt;br /&gt;
 &amp;quot;Zeige ein Dialogfeld mit einer Informationen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In jedem Fall darf man der KI nicht &amp;quot;blind&amp;quot; vertrauen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Plugin]]&lt;br /&gt;
[[Kategorie:Erweiterung]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31397</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31397"/>
		<updated>2026-06-07T07:15:16Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Smalltalk Philosophy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
A very short summary and introduction to the fundamental principles underlying the Smalltalk language.&lt;br /&gt;
&lt;br /&gt;
* Everything is an &#039;&#039;&#039;Object&#039;&#039;&#039;&amp;lt;br&amp;gt;this includes the most basic &#039;&#039;things&#039;&#039; like numbers, strings and characters, up to complex objects like windows, editors, compilers, applications etc.&lt;br /&gt;
 &lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&amp;lt;br&amp;gt;(in other languages this is also known as &#039;&#039;virtual function call&#039;&#039;, but this term is not used in Smalltalk)&lt;br /&gt;
&lt;br /&gt;
* A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&amp;lt;br&amp;gt;In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot; and &amp;quot;doSomething&amp;quot; is called the &amp;quot;&#039;&#039;message selector&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith:arg&amp;lt;/code&amp;gt;&amp;quot;&amp;lt;br&amp;gt;or multiple arguments as in &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith:arg1 and:arg2&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In these examples, the selectors are &amp;quot;doSomethingWith:&amp;quot; and &amp;quot;doSomethingWith:and:&amp;quot; respectively&amp;lt;br&amp;gt;(i.e. the concatenation of the so called &#039;&#039;keywords&#039;&#039;).&amp;lt;br&amp;gt;They are two different messages with different selectors.&amp;lt;br&amp;gt;In contrast to most other languages, this is &#039;&#039;&#039;not&#039;&#039;&#039; the same message with different number of arguments, but two completely different messages).&lt;br /&gt;
&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; sends the message &amp;quot;clear&amp;quot; to the Transcript object; a unary message,&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show:&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument; a keyword message&lt;br /&gt;
&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3+4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc,def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation).&amp;lt;br&amp;gt;You can place whitespace anywhere between selectors, keywords and arguemnts (eg. &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;3+4&amp;quot;&amp;lt;/code&amp;gt; are the same).&lt;br /&gt;
&lt;br /&gt;
* An object may respond (or &amp;quot;&#039;&#039;answer&#039;&#039;&amp;quot;) by returning a result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
&lt;br /&gt;
* binary messages have no meaning to the compiler; they all have equal precedence and are evaluated from left to right.&lt;br /&gt;
: Admitted, this makes arithmetic a little strange initially;&amp;lt;br&amp;gt;you&#039;ll need parentheses as there is not precedence of eg. * over +.&amp;lt;br&amp;gt;The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
&lt;br /&gt;
* Everything in this world is an object;&amp;lt;br&amp;gt;from low level things like booleans, true, false, integer numbers, floating point numbers characters etc. to the most complex objects.&lt;br /&gt;
: Objects can refer to (i.e. hold references) to other objects. Technically, all such references are via pointers. There is no way to directly embed an object into another object, except by reference.&lt;br /&gt;
&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are mostly message sends), each separated by a full stop (as in english).&lt;br /&gt;
: Inside a method, the receiver object (the object which got the message and is now executing the method) is called the &#039;&#039;receiver&#039;&#039; and refered to by the reserved word &amp;quot;&amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or implement utility functionality. There are also class messages to create new classes.&lt;br /&gt;
&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
: Inside a method, the special reserved word &amp;quot;&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt;&amp;quot; also refers to the current receiver, but message sends will ignore any method implemented in the methods class, but instead look for inherited (superclass) methods. &lt;br /&gt;
&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (&amp;lt;code&amp;gt;ifTrue:&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;ifFalse:&amp;lt;/code&amp;gt;) or blocks (&amp;lt;code&amp;gt;whileTrue:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* Blocks are objects, which wrap a piece of code.&amp;lt;br&amp;gt;Other languages know them as &#039;&#039;anonymous functions&#039;&#039;, &#039;&#039;lambdas&#039;&#039; or &#039;&#039;closures&#039;&#039;.&amp;lt;&lt;br /&gt;
: But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets,&amp;lt;br&amp;gt;as in:&amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: Blocks are real objects - they can be passed as argument in a message send;&amp;lt;br&amp;gt;for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: they can be stored in variables and passed around just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;,&lt;br /&gt;
: and they can be returned from a method (&#039;&#039;answer from a message&#039;&#039;) .&lt;br /&gt;
&lt;br /&gt;
* a small language and a big library&amp;lt;br&amp;gt;the syntax of Smalltalk is tiny and learned in minutes. The library (i.e. the classes you get) is big, flexible and extendable. The IDE is really an &amp;quot;&#039;&#039;integrated environment&#039;&#039;&amp;quot; as it is both completely implemented in Smalltalk, part of the running system (not outside), immediately updating the running system.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17f&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10f&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;strike&amp;gt;&#039;&#039;this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&#039;&#039;&amp;lt;/strike&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE extended; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(x86/x86_64: 80bit; Sparc: 128 bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;(IEEE quad; roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17Q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10Q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Octuple floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QO&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits by default, but any precision possible (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QL&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(-3/2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;the number after the s specifies the number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Complex&lt;br /&gt;
| &amp;lt;code&amp;gt;(1.5 + 3i)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;2i&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(3.0q + 5.0qi&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;Raw Strings&amp;quot;)&amp;lt;br&amp;gt;But see below...&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common C-escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expanded expression strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Summary of Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
* &amp;quot;/&amp;lt;br&amp;gt;End of line comment&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;lt;X&amp;lt;br&amp;gt; ... &amp;lt;br&amp;gt;X&amp;lt;br&amp;gt;token delimited comment;&amp;lt;br&amp;gt;X can be any word and a line starting with X ends the comment&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31396</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31396"/>
		<updated>2026-06-07T07:10:46Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Smalltalk Philosophy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* Everything is an &#039;&#039;&#039;Object&#039;&#039;&#039;&amp;lt;br&amp;gt;this includes the most basic &#039;&#039;things&#039;&#039; like numbers, strings and characters, up to complex objects like windows, editors, compilers, applications etc.&lt;br /&gt;
 &lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&amp;lt;br&amp;gt;(in other languages this is also known as &#039;&#039;virtual function call&#039;&#039;, but this term is not used in Smalltalk)&lt;br /&gt;
&lt;br /&gt;
* A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&amp;lt;br&amp;gt;In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot; and &amp;quot;doSomething&amp;quot; is called the &amp;quot;&#039;&#039;message selector&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith:arg&amp;lt;/code&amp;gt;&amp;quot;&amp;lt;br&amp;gt;or multiple arguments as in &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith:arg1 and:arg2&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In these examples, the selectors are &amp;quot;doSomethingWith:&amp;quot; and &amp;quot;doSomethingWith:and:&amp;quot; respectively&amp;lt;br&amp;gt;(i.e. the concatenation of the so called &#039;&#039;keywords&#039;&#039;).&amp;lt;br&amp;gt;They are two different messages with different selectors.&amp;lt;br&amp;gt;In contrast to most other languages, this is &#039;&#039;&#039;not&#039;&#039;&#039; the same message with different number of arguments, but two completely different messages).&lt;br /&gt;
&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; sends the message &amp;quot;clear&amp;quot; to the Transcript object; a unary message,&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show:&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument; a keyword message&lt;br /&gt;
&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3+4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc,def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation).&amp;lt;br&amp;gt;You can place whitespace anywhere between selectors, keywords and arguemnts (eg. &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;3+4&amp;quot;&amp;lt;/code&amp;gt; are the same).&lt;br /&gt;
&lt;br /&gt;
* An object may respond (or &amp;quot;&#039;&#039;answer&#039;&#039;&amp;quot;) by returning a result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
&lt;br /&gt;
* binary messages have no meaning to the compiler; they all have equal precedence and are evaluated from left to right.&lt;br /&gt;
: Admitted, this makes arithmetic a little strange initially;&amp;lt;br&amp;gt;you&#039;ll need parentheses as there is not precedence of eg. * over +.&amp;lt;br&amp;gt;The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
&lt;br /&gt;
* Everything in this world is an object;&amp;lt;br&amp;gt;from low level things like booleans, true, false, integer numbers, floating point numbers characters etc. to the most complex objects.&lt;br /&gt;
: Objects can refer to (i.e. hold references) to other objects. Technically, all such references are via pointers. There is no way to directly embed an object into another object, except by reference.&lt;br /&gt;
&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are mostly message sends), each separated by a full stop (as in english).&lt;br /&gt;
: Inside a method, the receiver object (the object which got the message and is now executing the method) is called the &#039;&#039;receiver&#039;&#039; and refered to by the reserved word &amp;quot;&amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or implement utility functionality. There are also class messages to create new classes.&lt;br /&gt;
&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
: Inside a method, the special reserved word &amp;quot;&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt;&amp;quot; also refers to the current receiver, but message sends will ignore any method implemented in the methods class, but instead look for inherited (superclass) methods. &lt;br /&gt;
&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (&amp;lt;code&amp;gt;ifTrue:&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;ifFalse:&amp;lt;/code&amp;gt;) or blocks (&amp;lt;code&amp;gt;whileTrue:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* Blocks are objects, which wrap a piece of code.&amp;lt;br&amp;gt;Other languages know them as &#039;&#039;anonymous functions&#039;&#039;, &#039;&#039;lambdas&#039;&#039; or &#039;&#039;closures&#039;&#039;.&amp;lt;&lt;br /&gt;
: But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets,&amp;lt;br&amp;gt;as in:&amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: Blocks are real objects - they can be passed as argument in a message send;&amp;lt;br&amp;gt;for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: they can be stored in variables and passed around just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;,&lt;br /&gt;
: and they can be returned from a method (&#039;&#039;answer from a message&#039;&#039;) .&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17f&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10f&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;strike&amp;gt;&#039;&#039;this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&#039;&#039;&amp;lt;/strike&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE extended; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(x86/x86_64: 80bit; Sparc: 128 bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;(IEEE quad; roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17Q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10Q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Octuple floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QO&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits by default, but any precision possible (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QL&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(-3/2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;the number after the s specifies the number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Complex&lt;br /&gt;
| &amp;lt;code&amp;gt;(1.5 + 3i)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;2i&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(3.0q + 5.0qi&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;Raw Strings&amp;quot;)&amp;lt;br&amp;gt;But see below...&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common C-escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expanded expression strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Summary of Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
* &amp;quot;/&amp;lt;br&amp;gt;End of line comment&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;lt;X&amp;lt;br&amp;gt; ... &amp;lt;br&amp;gt;X&amp;lt;br&amp;gt;token delimited comment;&amp;lt;br&amp;gt;X can be any word and a line starting with X ends the comment&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31395</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31395"/>
		<updated>2026-06-07T06:25:36Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Numbers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17f&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10f&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;strike&amp;gt;&#039;&#039;this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&#039;&#039;&amp;lt;/strike&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE extended; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(x86/x86_64: 80bit; Sparc: 128 bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;(IEEE quad; roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17Q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10Q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Octuple floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QO&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits by default, but any precision possible (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QL&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;(-3/2)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;the number after the s specifies the number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Complex&lt;br /&gt;
| &amp;lt;code&amp;gt;(1.5 + 3i)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;2i&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(3.0q + 5.0qi&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;Raw Strings&amp;quot;)&amp;lt;br&amp;gt;But see below...&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common C-escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expanded expression strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Summary of Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
* &amp;quot;/&amp;lt;br&amp;gt;End of line comment&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;lt;X&amp;lt;br&amp;gt; ... &amp;lt;br&amp;gt;X&amp;lt;br&amp;gt;token delimited comment;&amp;lt;br&amp;gt;X can be any word and a line starting with X ends the comment&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31394</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31394"/>
		<updated>2026-06-07T06:22:47Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Numbers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17f&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10f&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;strike&amp;gt;&#039;&#039;this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&#039;&#039;&amp;lt;/strike&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE extended; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(x86/x86_64: 80bit; Sparc: 128 bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;(IEEE quad; roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17Q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10Q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Octuple floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QO&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits by default, but any precision possible (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QL&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;the number after the s specifies the number of digits&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;Raw Strings&amp;quot;)&amp;lt;br&amp;gt;But see below...&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common C-escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expanded expression strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Summary of Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
* &amp;quot;/&amp;lt;br&amp;gt;End of line comment&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;lt;X&amp;lt;br&amp;gt; ... &amp;lt;br&amp;gt;X&amp;lt;br&amp;gt;token delimited comment;&amp;lt;br&amp;gt;X can be any word and a line starting with X ends the comment&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31393</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31393"/>
		<updated>2026-06-07T06:22:05Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17f&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10f&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;strike&amp;gt;&#039;&#039;this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&#039;&#039;&amp;lt;/strike&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE extended; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(x86/x86_64: 80bit; Sparc: 128 bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;(IEEE quad; roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17Q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10Q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Octuple floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QO&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits by default, but any precision possible (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QL&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;Raw Strings&amp;quot;)&amp;lt;br&amp;gt;But see below...&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common C-escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expanded expression strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Summary of Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
* &amp;quot;/&amp;lt;br&amp;gt;End of line comment&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;lt;X&amp;lt;br&amp;gt; ... &amp;lt;br&amp;gt;X&amp;lt;br&amp;gt;token delimited comment;&amp;lt;br&amp;gt;X can be any word and a line starting with X ends the comment&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31392</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31392"/>
		<updated>2026-06-07T06:20:38Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Smalltalk/X Language Extensions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17f&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10f&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;strike&amp;gt;&#039;&#039;this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&#039;&#039;&amp;lt;/strike&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE extended; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(x86/x86_64: 80bit; Sparc: 128 bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;(IEEE quad; roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17Q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10Q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Octuple floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QO&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits by default, but any precision possible (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QL&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;Raw Strings&amp;quot;)&amp;lt;br&amp;gt;But see below...&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common C-escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expanded expression strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Summary of Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
* &amp;quot;/&amp;lt;br&amp;gt;End of line comment&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;lt;X&amp;lt;br&amp;gt; ... &amp;lt;br&amp;gt;X&amp;lt;br&amp;gt;token delimited comment&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31391</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31391"/>
		<updated>2026-06-07T06:18:25Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Characters and Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17f&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10f&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;strike&amp;gt;&#039;&#039;this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&#039;&#039;&amp;lt;/strike&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE extended; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(x86/x86_64: 80bit; Sparc: 128 bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;(IEEE quad; roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17Q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10Q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Octuple floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QO&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits by default, but any precision possible (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QL&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;Raw Strings&amp;quot;)&amp;lt;br&amp;gt;But see below...&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common C-escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expanded expression strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31390</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31390"/>
		<updated>2026-06-07T06:15:35Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Numbers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17f&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10f&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;strike&amp;gt;&#039;&#039;this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&#039;&#039;&amp;lt;/strike&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE extended; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(x86/x86_64: 80bit; Sparc: 128 bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;(IEEE quad; roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17Q&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10Q&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Octuple floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QO&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits by default, but any precision possible (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234e17QL&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6e-10QL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; &amp;lt;strike&amp;gt;this is not yet officially released.&amp;lt;/strike&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;&#039;&#039;by name&#039;&#039;&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;&#039;&#039;Raw Strings&#039;&#039;&amp;quot;)&amp;lt;br&amp;gt;But see below... &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| supports the common escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| expanded strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31389</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31389"/>
		<updated>2026-06-07T06:06:56Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Characters and Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&#039;&#039;&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234f17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6f-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE quad; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(on x86/x86_64: only 80bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234Q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6Q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234QL17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6QL-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;&#039;&#039;by name&#039;&#039;&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;&#039;&#039;Raw Strings&#039;&#039;&amp;quot;)&amp;lt;br&amp;gt;But see below... &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| supports the common escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| expanded strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(national language translated with embedded expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31388</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31388"/>
		<updated>2026-06-07T06:05:48Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Characters and Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&#039;&#039;&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234f17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6f-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE quad; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(on x86/x86_64: only 80bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234Q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6Q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234QL17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6QL-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| Smalltalk does not support any escape sequence&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;&#039;&#039;by name&#039;&#039;&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| traditionally, Smalltalk does not support any escape sequence inside&amp;lt;br&amp;gt;(i.e. they are what Python calls &amp;quot;&#039;&#039;Raw Strings&#039;&#039;&amp;quot;)&amp;lt;br&amp;gt;But see below... &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| supports the common escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot;, &amp;quot;\uXXXX&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(With Embedded Expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| expanded strings &amp;lt;br&amp;gt;expressions in braces are evaluated at runtime and sliced into the string (also a C-string). Similar to python&#039;s f-strings.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(Language translated with Embedded Expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| international strings&amp;lt;br&amp;gt;like above, but the string is also possibly translated to a national language&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#+&amp;lt;/code&amp;gt;&lt;br /&gt;
| symbols are interned strings; two symbols with the same characters are guaranteed to be the identical object (not just equal)&amp;lt;br&amp;gt;without quotes, if only alphaNumeric characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31387</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31387"/>
		<updated>2026-06-07T05:47:20Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Characters and Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&#039;&#039;&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234f17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6f-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE quad; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(on x86/x86_64: only 80bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234Q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6Q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234QL17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6QL-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence&#039;&#039;&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&#039;&#039;&amp;lt;br&amp;gt;(I.e. they are what Python calls &#039;&#039;Raw Strings&#039;&#039;)&amp;lt;br&amp;gt;But see below... &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot; &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(With Embedded Expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expressions in braces are evaluated at runtime and sliced into the string (also a C-string)&#039;&#039;. Similar to python&#039;s f-strings.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(Language translated with Embedded Expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&lt;br /&gt;
| without quotes, if only alphaNumeric characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31386</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31386"/>
		<updated>2026-06-07T05:45:26Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Float Literals */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&#039;&#039;&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234f17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6f-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE quad; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(on x86/x86_64: only 80bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234Q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6Q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234QL17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6QL-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence&#039;&#039;&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&#039;&#039;&amp;lt;br&amp;gt;(I.e. they are what Python calls &#039;&#039;Raw Strings&#039;&#039;)&amp;lt;br&amp;gt;But see below... &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot; &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(With Embedded Expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expressions in braces are evaluated at runtime and sliced into the string (also a C-string)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(Language translated with Embedded Expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&lt;br /&gt;
| without quotes, if only alphaNumeric characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* &amp;lt;f&amp;gt;q, &amp;lt;f&amp;gt;Q, etc.&amp;lt;br&amp;gt;Float literal type suffix (q, Q, QD, QL, QO)&amp;lt;br&amp;gt;For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31385</id>
		<title>Smalltalk Syntax Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Smalltalk_Syntax_Cheat_Sheet&amp;diff=31385"/>
		<updated>2026-06-07T05:44:19Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Standard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A short, one page summary of what beginners need to know about Smalltalk/X, its syntax and most useful code fragments.&amp;lt;br&amp;gt;As usual, this is only a tiny fraction of what is really awailable, and you should use the builtin class browser to find many more useful functions in the system.&lt;br /&gt;
&lt;br /&gt;
This page was extracted from the &amp;quot;Smalltalk/X Programmers guide - Smalltalk/X Cheat Sheet&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;Smalltalk/X language extensions (w.r.t. other Smalltalk implementations) are marked with &#039;&#039;&#039;(*)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Philosophy ==&lt;br /&gt;
&lt;br /&gt;
* The world consists of objects which &#039;&#039;&#039;communicate by sending messages&#039;&#039;&#039;.&lt;br /&gt;
: A message looks like an english sentence, and might look like &amp;quot;&amp;lt;code&amp;gt;heyYou doSomething&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: In this example, the &amp;quot;heyYou&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
: You may pass additional parameter objects (arguments) as in: &amp;quot;&amp;lt;code&amp;gt;heyYou doSomethingWith: arg&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: or multiple arguments as in &amp;lt;code&amp;gt;&amp;quot;heyYou doSomethingWith: arg1 and: arg2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
: In these examples, the &amp;quot;&amp;lt;code&amp;gt;heyYou&amp;lt;/code&amp;gt;&amp;quot; is called the &amp;quot;&#039;&#039;receiver of the message&#039;&#039;&amp;quot;&lt;br /&gt;
* Messages without argument are called &amp;quot;&#039;&#039;unary messages&#039;&#039;&amp;quot;; those with arguments are called &amp;quot;&#039;&#039;keyword messages&#039;&#039;&amp;quot;&lt;br /&gt;
: For example &amp;quot;&amp;lt;code&amp;gt;Transcript clear&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;clear&amp;quot; to the Transcript object),&lt;br /&gt;
: and &amp;quot;&amp;lt;code&amp;gt;Transcript show: &#039;hello&#039;&amp;lt;/code&amp;gt;&amp;quot; (sends the message &amp;quot;show:&amp;quot; to the Transcript, passing a string argument),&lt;br /&gt;
* To allow for arithmetic operations, any non-letter character (except for a few) are treated like a message name and written between the receiver and the one and only argument. These are called &amp;quot;&#039;&#039;binary messages&#039;&#039;&amp;quot;.&lt;br /&gt;
: For example: &amp;lt;code&amp;gt;&amp;quot;3 + 4&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;abc , def&amp;quot;&amp;lt;/code&amp;gt; (yes, the comma is an operator; it does string concatenation)&lt;br /&gt;
* The object my respond (or &amp;quot;answer&amp;quot;) by returning some result object. In the above example, &amp;quot;&amp;lt;code&amp;gt;3+4&amp;lt;/code&amp;gt;&amp;quot; would answer &amp;quot;7&amp;quot;, and &amp;quot;&amp;lt;code&amp;gt;&#039;hello&#039; , &#039;world&#039;&amp;lt;/code&amp;gt;&amp;quot; would answer &#039;helloworld&#039;&lt;br /&gt;
* binary messages have no meaning to the compiler; they are all equal and simply evaluated from left to right.&lt;br /&gt;
: admitted, this makes arithmetic a little strange initially; you&#039;ll need parentheses as the is not precidence of eg. * over +. The expression &amp;quot;3 + 4 * 5&amp;quot; will be evaluated left to right and answer 35.&lt;br /&gt;
* Everything in this world is an object; &lt;br /&gt;
: from low level things like booleans, true, false, integer numbers, floating point numbers characters etc.&lt;br /&gt;
: there are containers, which can hold on other objects. Technically, all such references are via pointers.&lt;br /&gt;
: there are also very complex objects and structures which implement windows, the user interface, communication interfaces, debuggers and even compilers which allow for code to be defined and installed on the fly.&lt;br /&gt;
* Every object is associated to a class. Classes define the behavior of their instances. I.e. they define how they respond to messages. The response is implemented by a so called &#039;&#039;method&#039;&#039;. That is a piece of code which is executed when a message comes in. A method consist of a number of statements (which are message sends), each separated by a full stop (as in english).&lt;br /&gt;
* Classes are themself objects, which respond to messages. Typically class messages would answer new instances, constants or utility functionality. There are also class messages to create new classes.&lt;br /&gt;
* Class can inherit common functionality (i.e. method implementations) from a superclass. Thus creating a hierarchy of classes. Typical hierarchies are the Number hierarchy, Collections, Streams and UI Widgets.&lt;br /&gt;
* In Smalltalk, every behavior is defined by corresponding message implementations. This includes control features (i.e. if-then-else, loops and exception handling). All of them are implemented as messages being sent to booleans (ifTrue:/ifFalse:) or blocks (whileTrue:)&lt;br /&gt;
* Blocks are special objects, which wrap a piece of code. Other languages know them as anonymous functions or lambdas or closures. But the Smalltalk syntax makes them super easy to use: just write a number of expressions inside square brackets, as in &amp;quot;&amp;lt;code&amp;gt;[ Transcript show: 10 factorial ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
: blocks can be passed as argument with a message send; for example to a boolean: &amp;quot;&amp;lt;code&amp;gt;aBoolean ifTrue: [ Transcript show: &#039;yes&#039; ]&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
: blocks can be stored in variables and passed arounf just like any other object&lt;br /&gt;
: blocks can receive messages, especially loop messages: &amp;quot;&amp;lt;code&amp;gt;[ a &amp;lt; 10] whileTrue:[ Transcript showCR: a. a := a + 1 ]&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Regular comment &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot; this is a comment &amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;any text between double quotes&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| EOL-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;/ this is an End-of-Line comment&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text from quote-slash to line end&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| Token-Comment (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;amp;lt;&amp;amp;lt;END&amp;lt;br&amp;gt;a multiline token-comment up to&amp;lt;br&amp;gt;a line starting with &#039;END&#039;&amp;lt;br&amp;gt;more commented stuff here&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;comment ends here&amp;lt;br&amp;gt;END&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;text up to line beginning with whatever token came&amp;lt;br&amp;gt;after the initial &amp;quot;&amp;lt;&amp;lt;&amp;quot; &#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Literal Constants ====&lt;br /&gt;
&lt;br /&gt;
===== Numbers =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Integers&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;12345&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/code&amp;gt;-12345&amp;lt;code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Large integers&lt;br /&gt;
| &amp;lt;code&amp;gt;1234567890123456789012345&amp;lt;/code&amp;gt;…&lt;br /&gt;
| &#039;&#039;arbitrary number of digits&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(Smalltalk style)&lt;br /&gt;
| &amp;lt;code&amp;gt;16rAFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r010101&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8r0777&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3r012012&amp;lt;/code&amp;gt;,&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;16r-AFFE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2r-010101&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;prepend the radix (base)&amp;lt;br&amp;gt;any radix from 2..36 is possible (i.e. 3r222 is a ternary number)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Integers with radix&amp;lt;br&amp;gt;(C style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFEED&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-0xBEAF&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;0b11011&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-0b1100&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;C/Java/JavaScript style: prepend radix indicator (&#039;x&#039;, &#039;b&#039;, &#039;o&#039;)&amp;lt;br&amp;gt;One of hex, binary and octal&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Floats&amp;lt;br&amp;gt;(IEEE double; roughly 17 digits)&lt;br /&gt;
| 12.456&amp;lt;br&amp;gt;1.234e17&amp;lt;br&amp;gt;-6.9&amp;lt;br&amp;gt;-6e-10&amp;lt;br&amp;gt;Float pi&amp;lt;br&amp;gt;Float e&lt;br /&gt;
| &#039;&#039;called &amp;quot;Float&amp;quot;, but actually hold double precision&#039;&#039;&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Short floats&amp;lt;br&amp;gt;(IEEE single; roughly 8 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234f17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6f-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| this is controlled by a ParserFlag (singlePrecisionFloatF), which is currently defaulted to false. Thus, by default, double precision floats are created with the &#039;f&#039; exponent character.&lt;br /&gt;
|-&lt;br /&gt;
| Long floats&amp;lt;br&amp;gt;(IEEE quad; roughly 20 digits) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;actual precision depends on the underlying CPU&amp;lt;br&amp;gt;(on x86/x86_64: only 80bit)&lt;br /&gt;
|-&lt;br /&gt;
| Quad floats;&amp;lt;br&amp;gt;roughly 34 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234Q17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6Q-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Large floats;&amp;lt;br&amp;gt;roughly 60 digits (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;1.234QL17&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;-6QL-10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;computed in software; therefore slower; this is not yet officially released. &lt;br /&gt;
|-&lt;br /&gt;
| Fractions&lt;br /&gt;
| &amp;lt;code&amp;gt;(1/3)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(17/2)&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ScaledDecimals&lt;br /&gt;
| &amp;lt;code&amp;gt;1234.53s2&amp;lt;/code&amp;gt;&lt;br /&gt;
| the number after the s specifies the number of digits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Characters and Strings =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Characters&lt;br /&gt;
| &amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character space&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character nl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Also: &amp;quot;&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;tab&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;code&amp;gt;bell&amp;lt;/code&amp;gt;&amp;quot;...&amp;lt;br&amp;gt;Or:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Character codePoint:n&amp;lt;/code&amp;gt; &lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence&#039;&#039;&amp;lt;br&amp;gt;Common constants can be referred to &amp;quot;by name&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| Strings&lt;br /&gt;
| &amp;lt;code&amp;gt;&#039;hello&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;traditionally, Smalltalk does not support any escape sequence inside&#039;&#039;&amp;lt;br&amp;gt;(I.e. they are what Python calls &#039;&#039;Raw Strings&#039;&#039;)&amp;lt;br&amp;gt;But see below... &lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(C Style) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;c&#039;hello\nworld&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;supports the common escape sequences, such as &amp;quot;\n&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;\xHH&amp;quot; &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(With Embedded Expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;expressions in braces are evaluated at runtime and sliced into the string (also a C-string)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Strings&amp;lt;br&amp;gt;(Language translated with Embedded Expressios) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;i&#039;hello&amp;amp;nbsp;{OperatingSystem&amp;amp;nbsp;getLoginName}&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| &#039;&#039;like above, but the string is also possibly translated to a national language&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Symbols&lt;br /&gt;
| &amp;lt;code&amp;gt;#&#039;hello&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;#foo&amp;lt;/code&amp;gt;&lt;br /&gt;
| without quotes, if only alphaNumeric characters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Arrays and Objects =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Arrays&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;#( &amp;lt;i&amp;gt;el1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;el2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;elN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| each element is a literal constant&lt;br /&gt;
|-&lt;br /&gt;
| Byte Arrays&lt;br /&gt;
| &amp;lt;code&amp;gt;#[ &amp;lt;i&amp;gt;b1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;b2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;bN&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| each byte-element an integer constant in 0..255&lt;br /&gt;
|-&lt;br /&gt;
| Special Number Arrays (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#XX( &amp;lt;i&amp;gt;v1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;v2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;vN&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
| XX: is one of&amp;lt;br&amp;gt;&amp;amp;nbsp;&#039;u8&#039;, &#039;s8&#039;, &#039;u16&#039;, &#039;s16&#039;, &#039;u32&#039;, &#039;s32&#039;, &#039;u64&#039;, &#039;s64&#039;, &#039;f32&#039;, &#039;f64&#039;&amp;lt;br&amp;gt;&amp;amp;nbsp;and each element being an integer or float constant&lt;br /&gt;
|-&lt;br /&gt;
| Immediate Inline Objects (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;#{ foo: &amp;lt;i&amp;gt;fooValue&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barValue&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
| fooValue and barValue: are constants&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Lambda Blocks (Closures) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Without argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ expr1 . expr2 ... exprN ]&amp;lt;/code&amp;gt;&lt;br /&gt;
| multiple expressions sep&#039;d by period.&amp;lt;br&amp;gt;When evaluated, the value is the value&amp;lt;br&amp;gt;from the last expression, exprN&lt;br /&gt;
|-&lt;br /&gt;
| One argument&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :arg &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Multiple arguments&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 :a2 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;expr1 . expr2 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Local Variables inside a block&lt;br /&gt;
| &amp;lt;code&amp;gt;[ :a1 ... :aN &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;#124;local1 local2 &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; expr1 ... exprN&amp;lt;br&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Expressions ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Unary Expression&amp;lt;br&amp;gt;(without argument)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageName&amp;lt;/code&amp;gt;&lt;br /&gt;
|receiver is itself either a constant, a lambda-block, a unary expression&amp;lt;br&amp;gt;or a parenthesized expression&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(1 arg)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; messageNamePart:&amp;lt;i&amp;gt;argExpression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|whitespace between the colon and the argExpression is optional.&lt;br /&gt;
|-&lt;br /&gt;
| Keyword Expression&amp;lt;br&amp;gt;(any number of args)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart1:&amp;lt;i&amp;gt;argExpression1&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePart2:&amp;lt;i&amp;gt;argExpression2&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;messageNamePartN:&amp;lt;i&amp;gt;argExpressionN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Binary Expression&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;binOP&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;arg&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|with binOP being any combination of special characters:&amp;lt;br&amp;gt;* , + , - , % , &amp;amp; , / , \ , &amp;amp;#124; , = , &amp;amp;lt; , &amp;amp;gt; , ?  and ,&lt;br /&gt;
&amp;lt;br&amp;gt;I.e. &amp;quot;&amp;lt;code&amp;gt;foo ==&amp;gt; 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;==&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
&amp;lt;br&amp;gt;And &amp;quot;&amp;lt;code&amp;gt;foo ? 123&amp;lt;/code&amp;gt;&amp;quot; is the binary message &amp;quot;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&amp;quot; sent to &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt; as argument.&lt;br /&gt;
|-&lt;br /&gt;
| Cascade Expression&amp;lt;br&amp;gt;(multiple messages to the same receiver)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;receiver&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message1&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;message2&amp;lt;/i&amp;gt; ;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;messageN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
|the receiver expression is evaluated,&amp;lt;br&amp;gt;then multiple messages (separated by &amp;quot;;&amp;quot;) are sent to this receiver.&lt;br /&gt;
|-&lt;br /&gt;
| Parentheses for grouping&lt;br /&gt;
| &amp;lt;code&amp;gt;( &amp;lt;i&amp;gt;any expression&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assignment&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;variable&amp;lt;/i&amp;gt; := &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|can be used as expression.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Array (Brace Construct) (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ &amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... . &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|instantiates a new Array object with elements from the expressions.&lt;br /&gt;
|-&lt;br /&gt;
| Computed Inline Object (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;{ foo: &amp;lt;i&amp;gt;fooExpr&amp;lt;/i&amp;gt; . bar: &amp;lt;i&amp;gt;barExpr&amp;lt;/i&amp;gt; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|fooExpr and barExpr: expressions&lt;br /&gt;
|-&lt;br /&gt;
| Inline string expressions (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;e&#039;p1{e1}p2{e2}...pN{eN}pM&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(&#039;p1%1p2%2...pN%NpM&#039; bindWith:e1 with:e2 ... with:eN)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where each pI is a string with possible C-escapes&amp;lt;br&amp;gt;and each eI is a Smalltalk expression&lt;br /&gt;
|-&lt;br /&gt;
| Array Indexing (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;coll[idx]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;coll[idx1][idx2][idx3]&amp;lt;/code&amp;gt;&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(coll at:idx)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where coll must be an indexable collection,&amp;lt;br&amp;gt;and idx of compatible index type.&amp;lt;br&amp;gt;I.e. integer for array-like collections, hash-key for dictionaries, etc.&amp;lt;br&amp;gt;Up to 4 dimensions are (currently supported)&lt;br /&gt;
|-&lt;br /&gt;
| Collection instantiation (*)&lt;br /&gt;
| &amp;lt;code&amp;gt;someClass[sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;someClass[sz][sz]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; ...&lt;br /&gt;
|syntactic sugar for:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;(someClass new:sz)&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;where someClass must be a collection class&amp;lt;br&amp;gt;I.e. Array[10] creates an empty array with 10 slots.&amp;lt;br&amp;gt;1, 2, 3 and 4 dimensions are supported&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Remaining Syntax ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Local variables (in block or method)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#124; &amp;lt;i&amp;gt;var1&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;var2&amp;lt;/i&amp;gt; ... &amp;lt;i&amp;gt;varN&amp;lt;/i&amp;gt; &amp;amp;#124;&amp;lt;/code&amp;gt;&lt;br /&gt;
|variable declarations must be at the beginning, before any expression.&lt;br /&gt;
|-&lt;br /&gt;
| Separating multiple expressions (sequence)&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; . &amp;lt;i&amp;gt;expr2&amp;lt;/i&amp;gt; . ... &amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|expressions (statements) are separated by fullstop (period) characters.&amp;lt;br&amp;gt;The last expression may or may not be followed by a fullstop;&amp;lt;br&amp;gt;if there is one, this is treated like a followup empty statement.&lt;br /&gt;
|-&lt;br /&gt;
| Return from method&lt;br /&gt;
| &amp;lt;code&amp;gt;^ &amp;lt;i&amp;gt;expression&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|returns from the enclosing method (also if inside a block-closure)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown (Common) Messages ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Conditional Execution&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ifTrue:[ ... ] ifFalse:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|variations without true-part, without false part&amp;lt;br&amp;gt;and with the order reversed are available.&lt;br /&gt;
|-&lt;br /&gt;
| While-Loop&amp;lt;br&amp;gt;(test at top)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ] whileTrue:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the receiver being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;whileFalse:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| Do-Loop&amp;lt;br&amp;gt;(test at bottom)&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] doWhile:[ &amp;lt;i&amp;gt;boolExpr1&amp;lt;/i&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|notice the test being a block.&amp;lt;br&amp;gt;A &amp;lt;code&amp;gt;doUntil:&amp;lt;/code&amp;gt; variant is also available.&lt;br /&gt;
|-&lt;br /&gt;
| For-Loop&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt; to:&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;iterVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (lambda) for each value in &amp;lt;i&amp;gt;start&amp;lt;/i&amp;gt;..&amp;lt;i&amp;gt;stop&amp;lt;/i&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Enumerating Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;i&amp;gt;collection&amp;lt;/i&amp;gt; do:[:&amp;lt;i&amp;gt;elementVar&amp;lt;/i&amp;gt; &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the block (i.e. lambda) for each element in the collection.&lt;br /&gt;
|-&lt;br /&gt;
| Evaluating a Lambda Block&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;without arguments:&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;with arguments:&lt;br /&gt;
| &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value&amp;lt;/code&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;aBlock&amp;lt;/i&amp;gt; value:&amp;lt;i&amp;gt;expr1&amp;lt;/i&amp;gt; ... value:&amp;lt;i&amp;gt;exprN&amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|the number of arguments must match the number expected by the lambda&amp;lt;br&amp;gt;(although varArg lambdas are also available)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ] on:Error do:[:ex &amp;amp;#124; ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|evaluates the first block;&amp;lt;br&amp;gt;if an error is encountered, evaluate the handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Special &#039;Control Structures&#039; ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ] fork&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Creating, configuring and starting another Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p := [ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;newProcess;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;name:&#039;my worker&#039;;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;priority:5;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;resume&amp;lt;/code&amp;gt;&lt;br /&gt;
|the code inside the block will execute in a separate thread&lt;br /&gt;
|-&lt;br /&gt;
| Terminating a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p terminate&amp;lt;/code&amp;gt;&lt;br /&gt;
|with p referring to the thread as created by newProcess or fork&lt;br /&gt;
|-&lt;br /&gt;
| Interrupting a Thread&lt;br /&gt;
| &amp;lt;code&amp;gt;p interruptWith:[ ... ]&amp;lt;/code&amp;gt;&lt;br /&gt;
|interrupt the thread and let it execute the given code (in its interrupt seervice)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the handler will get an exception argument (ex), which contains additional information, and can be told how to deal with the error&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - proceeding&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex proceed&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|proceed, as if the error did not happen&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - restarting&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex restart&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|restart the code from the beginning (usually after the handler did some cleanup, such as lazy loading a missing file...)&lt;br /&gt;
|-&lt;br /&gt;
| Exception Handling - printing&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;on:Error do:[:ex &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ex description&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|contains a human readable description of the error&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ensure:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ensure block will be evaluated in any case&lt;br /&gt;
|-&lt;br /&gt;
| Ensure/Unwind Protect&lt;br /&gt;
| &amp;lt;code&amp;gt;[ ... ]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;ifCurtailed:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|the ifCurtailed block will be evaluated only on a non-regular exit&amp;lt;br&amp;gt;(i.e. when an exception was raised, or the operation was aborted or the thread terminated) &lt;br /&gt;
|-&lt;br /&gt;
| Early exit from Loops&lt;br /&gt;
| &amp;lt;code&amp;gt;[:exit &amp;amp;#124;&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;code with loop&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;exit value&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;] valueWithExit&amp;lt;/code&amp;gt;&lt;br /&gt;
|the block will be left, when exit is evaluated. Often used as argument of ifTrue:, as in&amp;lt;br&amp;gt;cond ifTrue: exit &lt;br /&gt;
|-&lt;br /&gt;
| Queries&lt;br /&gt;
| &amp;lt;code&amp;gt;Query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;answer:something&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Query query&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide answers way down to whoever is interested.&amp;lt;br&amp;gt;Queries answer nil if no one is there to answer.&amp;lt;br&amp;gt;Queries are usually more specifically used as subclasses of Query &lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| &amp;lt;code&amp;gt;Notification&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;handle:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;do:[&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Notification notify:someArg&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;...&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|to provide information way up to whoever is interested&amp;lt;br&amp;gt;Notifications are usually more specifically used as subclasses of Notification &lt;br /&gt;
|-&lt;br /&gt;
| Observers 1&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChange:#bla evaluate:[...].&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed:#bla&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with generic block to evaluate &lt;br /&gt;
|-&lt;br /&gt;
| Observers 2&lt;br /&gt;
| &amp;lt;code&amp;gt;foo onChangeSend:#xyz to:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with message send &lt;br /&gt;
|-&lt;br /&gt;
| Observers 3&lt;br /&gt;
| &amp;lt;code&amp;gt;foo addDependent:someone.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;foo changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|observer with send to update method of target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Queries and Notifications can be seen as observers within the calling hierarchy (i.e. information flows up or down the calling hierarchy), whereas the dependency and anChange mechanisms are independent of the control flow (even between different threads)&lt;br /&gt;
&lt;br /&gt;
==== Synchronization and Timers ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Timed Delay&lt;br /&gt;
| &amp;lt;code&amp;gt;Delay waitForSeconds:n&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Delay waitUntil:(Timestamp now + 10 seconds)&amp;lt;/code&amp;gt;&lt;br /&gt;
|self explaining&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Sempaphore wait with timeout&lt;br /&gt;
| &amp;lt;code&amp;gt;s := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s waitWithTimeout:(5 seconds).&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|obviously, the signalling must be evaluated by another thread&lt;br /&gt;
|-&lt;br /&gt;
| Multi Sempaphore wait&lt;br /&gt;
| &amp;lt;code&amp;gt;s1 := Semaphore new.&amp;lt;br&amp;gt;s2 := Semaphore new.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;which := (s1 , s2) wait.&amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;s2 signal&amp;lt;/code&amp;gt;&lt;br /&gt;
|wait for any of multiple semaphores&lt;br /&gt;
|-&lt;br /&gt;
| Synchronized Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;a := OrderedCollection new asSharedCollection&amp;lt;/code&amp;gt;&lt;br /&gt;
|will wrap the collection so that add/remove operations are atomic&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Wellknown Globals ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Logging and Messaging&lt;br /&gt;
| &amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt; - the console window&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdout&amp;lt;/code&amp;gt; - standard output&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stderr&amp;lt;/code&amp;gt; - standard error&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Stdin&amp;lt;/code&amp;gt; - standard input&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;Logger&amp;lt;/code&amp;gt; - redefinable logger (defaults to standard error)&lt;br /&gt;
|-&lt;br /&gt;
| Common Useful Dialogs&lt;br /&gt;
| &amp;lt;code&amp;gt;Dialog&amp;lt;/code&amp;gt; - provides many useful utility functions for standard dialogs&amp;lt;br&amp;gt;eg.&amp;lt;code&amp;gt;&amp;lt;br&amp;gt; Dialog warn:&#039;message&#039;&amp;lt;br&amp;gt; Dialog confirm:&#039;question&#039;&amp;lt;br&amp;gt; Dialog request:&#039;question&#039;&amp;lt;br&amp;gt; Dialog requestFilename:&#039;question&#039;&amp;lt;br&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Most Wellknown Classes ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Numbers&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Number Number]&amp;lt;/code&amp;gt;(abstract superclass)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Integer Integer]&amp;lt;/code&amp;gt;(integral numbers)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Float Float]&amp;lt;/code&amp;gt;(inexact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Fraction Fraction]&amp;lt;/code&amp;gt;(exact)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Complex Complex]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Collections&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Array Array]&amp;lt;/code&amp;gt; (fixed size array)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OrderedCollection OrderedCollection]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,List List]&amp;lt;/code&amp;gt; (variable size)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SortedCollection SortedCollection]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Set Set]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Bag Bag]&amp;lt;/code&amp;gt; (unordered)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Dictionary Dictionary]&amp;lt;/code&amp;gt; (mapped collections)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BinaryTree BinaryTree]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,AVLTree AVLTree]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,SharedQueue SharedQueue]&amp;lt;/code&amp;gt; (shared, synchronized)&amp;lt;br&amp;gt;many more...&lt;br /&gt;
|-&lt;br /&gt;
| Process Handling&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Process Process]&amp;lt;/code&amp;gt; (lightweight thread)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OSProcess OSProcess]&amp;lt;/code&amp;gt; (heavyweight OS process)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Semaphore Semaphore]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,RecursionLock RecursionLock]&amp;lt;/code&amp;gt; (synchronization)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Monitor Monitor]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,BoltLock BoltLock]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Delay Delay]&amp;lt;/code&amp;gt; (time delays)&lt;br /&gt;
|-&lt;br /&gt;
| Files &amp;amp; Streams&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Filename Filename]&amp;lt;/code&amp;gt; (file naming, directory access, mime type)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Stream Stream]&amp;lt;/code&amp;gt; (basic stream framework)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ReadStream ReadStream]&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;WriteStream&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,EncodedStream EncodedStream]&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ExternalStream ExternalStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,FileStream FileStream]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Socket Socket]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,PipeStream PipeStream]&amp;lt;/code&amp;gt; (OS-cmd streams)&lt;br /&gt;
|-&lt;br /&gt;
| Low Level Access&lt;br /&gt;
| &amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,OperatingSystem OperatingSystem]&amp;lt;/code&amp;gt; (OS API calls)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,Smalltalk Smalltalk]&amp;lt;/code&amp;gt;(startup, shutdown and globals)&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;[http://live.exept.de/ClassDoc/classDocOf:,ObjectMemory ObjectMemory]&amp;lt;/code&amp;gt;(VM access)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1&lt;br /&gt;
     |v1 v2|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     v2 := v1 sqrt.&lt;br /&gt;
     Transcript showCR: &#039;the root of the answer to all questions is: %1&#039; with: v2.&lt;br /&gt;
&lt;br /&gt;
using expanded strings, this can be written as:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod1_alternative&lt;br /&gt;
     |v1|&lt;br /&gt;
 &lt;br /&gt;
     v1 := 42.&lt;br /&gt;
     Transcript showCR: e&#039;the root of the answer to all questions is: {v1 sqrt}&#039;.&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod2&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr do:[:el |&lt;br /&gt;
         Transcript showCR: el&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
enumerating elements of an array with additional index:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod3&lt;br /&gt;
     |arr|&lt;br /&gt;
 &lt;br /&gt;
     arr := #( 1 2.0 &#039;three&#039; (4 4 4 4) ).&lt;br /&gt;
     arr doWithIndex:[:el :idx |&lt;br /&gt;
         Transcript showCR: e&#039;array element at {idx} is {el} and its class is {el class name}\n&#039;&lt;br /&gt;
     ]&lt;br /&gt;
&lt;br /&gt;
dialogs, string-to-number conversion, error handling:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s1 nr1 s2 nr2 rslt|&lt;br /&gt;
 &lt;br /&gt;
     s1 := Dialog request:&#039;Enter the first number&#039; initialAnswer:1.&lt;br /&gt;
     s1 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
     s2 := Dialog request:&#039;Enter the second number&#039; initialAnswer:2.&lt;br /&gt;
     s2 isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr1 := Number readFrom:s1 onError:[^ self].&lt;br /&gt;
     nr2 := Number readFrom:s2 onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ save division&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr1 / nr2&lt;br /&gt;
     ] on: Error do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;Error encountered: {ex description}\nProceed with zero?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         ex proceedWith:0&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
dialogs, error handling and complex square root:&lt;br /&gt;
&lt;br /&gt;
 exampleMethod4&lt;br /&gt;
     |s nr rslt|&lt;br /&gt;
 &lt;br /&gt;
     s := Dialog request:&#039;Enter a number (may be negative)&#039; initialAnswer:2.&lt;br /&gt;
     s isNil ifTrue:[ ^ self ].   &amp;quot;/ cancelled - return from method&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ convert; on error return from method&lt;br /&gt;
     nr := Number readFrom:s onError:[^ self].&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;/ square root; catch imaginary result&lt;br /&gt;
     [&lt;br /&gt;
         rslt := nr sqrt&lt;br /&gt;
     ] on: ImaginaryResultError do:[:ex |&lt;br /&gt;
         (Dialog confirm: e&#039;No solution in R; want to see the complex result?&#039;)&lt;br /&gt;
             ifFalse:[^ self]. &amp;quot;/ no; return from method&lt;br /&gt;
         rslt := Number trapImaginary:[ nr sqrt ].&lt;br /&gt;
         &amp;quot;/ rslt is now a complex number&lt;br /&gt;
     ].&lt;br /&gt;
 &lt;br /&gt;
     Dialog information: e&#039;the result is {rslt}&#039;&lt;br /&gt;
&lt;br /&gt;
== Standard ==&lt;br /&gt;
The ANSI Smalltalk standard was approved on May 19, 1998. The official name of the document is ANSI INCITS 319-1998 (R2002). You can order a copy of the final standard&lt;br /&gt;
from here: [http://www.techstreet.com/cgi-bin/detail?product_id=56122]&lt;br /&gt;
or here [http://webstore.ansi.org/ansidocstore/product.asp?sku=ANSI+INCITS+319%2D1998+%28R2002%29]. The name of the document is &amp;quot;American National Standard for Information Systems - Programming Languages - Smalltalk&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can also download the final draft revision for free: standard_v1_9-indexed.pdf and at [https://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf].&lt;br /&gt;
&lt;br /&gt;
The final draft is identical to the official standard except that the draft also has a rationale included (and thus, the draft is arguably more useful than the official standard).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Protocol from ANSI Meeting: [http://www.netjam.org/smalltalk/faq/ANSI-meeting.html]&lt;br /&gt;
&lt;br /&gt;
== Common Language Extensions ==&lt;br /&gt;
These are also found in other Smalltalk dialects (eg. [[Glossary#VW|VW]] or [[Glossary#Squeak|Squeak]])&lt;br /&gt;
&lt;br /&gt;
* { expr1 . expr2 . ... }&amp;lt;br&amp;gt;Brace Array Construction&amp;lt;br&amp;gt;Each expression is evaluated (left to right), and an Array with the results is created at execution time.&amp;lt;br&amp;gt;Notice that separating full stops are required, as opposed to constant literal arrays, where elements are separated by spaces. The generated Array is mutable (can be modified), whereas a constant array is not.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X Language Extensions ==&lt;br /&gt;
&lt;br /&gt;
These are ST/X specific, and not (as of 2026) implemented in other Smalltalk systems.&lt;br /&gt;
&lt;br /&gt;
=== String Literals ===&lt;br /&gt;
* c&#039;...&#039;&amp;lt;br&amp;gt;&#039;&#039;c-strings&#039;&#039;&amp;lt;br&amp;gt;C-like escapes (\n, \t, \xNN, \uNNNN) inside the string are expanded.&lt;br /&gt;
&lt;br /&gt;
* e&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;e-strings&#039;&#039; (expanded epression strings)&amp;lt;br&amp;gt;In addition to C-escapes, embedded expressions are evaluated and their printString is sliced in. Technically, it is converted to &#039; ... %1 ...&#039; and then expanded using standard String methods.&lt;br /&gt;
&lt;br /&gt;
* i&#039; ... {expr} ...&#039;&amp;lt;br&amp;gt;&#039;&#039;i-strings&#039;&#039; (international strings)&amp;lt;br&amp;gt; similar to e-strings, but the converted string (&#039;... %1 ...&#039;) is translated to a national string (via the *.rs file) and then expanded. Allows for different word ordering.&lt;br /&gt;
&lt;br /&gt;
=== Integer Literals ===&lt;br /&gt;
* 0xNNNN, 0oNNNN, 0bNNNN&amp;lt;br&amp;gt;C-style hex, octal and binary integers.&amp;lt;br&amp;gt;With arbitrary precision&lt;br /&gt;
&lt;br /&gt;
=== Float Literals ===&lt;br /&gt;
* Nq, NQ, etc.&amp;lt;br&amp;gt;Float literal type suffix&amp;lt;br&amp;gt;(q, Q, QD, QL, QO)- For a complete list and spec., see the Number documentation.&lt;br /&gt;
&lt;br /&gt;
=== Compact Number Arrays ===&lt;br /&gt;
* #u1, #u8, #u16, #u32, #u64&amp;lt;br&amp;gt;#i8, #i16, #i32, #i64&amp;lt;br&amp;gt;#f16, #bf16, #f32, #f64&amp;lt;br&amp;gt;Will generate dense packed vectors (similar to byteArray); format is #X(n1 n2 ... )&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Common_Keyboard_Shortcuts/en&amp;diff=31384</id>
		<title>Common Keyboard Shortcuts/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Common_Keyboard_Shortcuts/en&amp;diff=31384"/>
		<updated>2026-06-06T10:31:47Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Customizing Keyboard Shortcuts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In general, keyboard shortcuts perform functions which are also available on popup menus of the individual UI components, and these popup menu are usually context/selection menus. This means, that they typically offer operations on the current selected element within that view. In contrast to eg. Mac OSX, the keyboard shortcuts are context sensitive, and depend on the current focus window. This means that the same shortcut may perform different operations depending on which component has the keyboard focus.&lt;br /&gt;
&lt;br /&gt;
All editing functions can be undone via the &amp;quot;&#039;&#039;Undo&#039;&#039;&amp;quot; (&amp;lt;kbd&amp;gt;Ctrl-z&amp;lt;/kbd&amp;gt;) menu function, in case you pressed the wrong key or inside another component.&lt;br /&gt;
&lt;br /&gt;
Notice that the &amp;lt;kbd&amp;gt;Alt&amp;lt;/kbd&amp;gt; key is labelled &amp;lt;kbd&amp;gt;Cmd&amp;lt;/kbd&amp;gt; on some keyboards (and also inside the &amp;lt;code&amp;gt;&amp;quot;keyboard.rc&amp;quot;&amp;lt;/code&amp;gt; file and the settings dialog.&lt;br /&gt;
&lt;br /&gt;
=== Navigating ===&lt;br /&gt;
&lt;br /&gt;
Cursor keys navigate character-wise or word-wise (if &amp;lt;kbd&amp;gt;CTRL&amp;lt;/kbd&amp;gt; is pressed)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-CursorRight&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Next Word&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Moves the cursor to the next word.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-CursorLeft&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Previous Word&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Moves the cursor to the previous word.&lt;br /&gt;
&lt;br /&gt;
=== Selecting ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-w&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Select Next Word&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Shift-CursorKey&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Expand the Selection&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== General Editing ===&lt;br /&gt;
&lt;br /&gt;
These shortcuts usually work in any view (i.e. project tree view, diagram- and text editors).&lt;br /&gt;
Specific operations are found below.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-c&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Copy&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;Copies the selection into the clipboard. The object to be copied depends on the context and selection:&amp;lt;br&amp;gt;- in a text editor, the text-selection is copied.&amp;lt;br&amp;gt;- in the diagram editor, the selected element(s) are copied&amp;lt;br&amp;gt;- in the navigation tree, the selected tree items are copied.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-v&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Paste&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Pastes the clipboard object. This is not always possible, and sometimes simply ignored (for example, if a tree-item is copied and tried to be pasted into a text editor).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-x&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Cut&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes the selection and puts it into the clipboard (for later pasting)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Del&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Delete&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes but does NOT put the deleted object into the clipboard.&amp;lt;br&amp;gt;In a text editor, the selected text is deleted, or if nothing is selected, the next character (after the cursor) is deleted. With &amp;lt;kbd&amp;gt;CTRL&amp;lt;/KBD&amp;gt;, the next word is deleted.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Backspace&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Delete&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes but does NOT put the deleted object into the clipboard.&amp;lt;br&amp;gt;In a text editor, the selected text is deleted, or if nothing is selected, the previous character (before the cursor) is deleted. With &amp;lt;kbd&amp;gt;CTRL&amp;lt;/KBD&amp;gt;, the previous word is deleted.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-z&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undo&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Undoes the last operation. This is a multi-undo. This is the same function as performed by the undo toolbar menu button. This button shows a tooltip, which describes what would be undone if pressed. If you are uncertain, what would be undone, place the mouse over this toolbar button (without pressing) and read the tooltip. Undo for complex operations (tree manipulations, imports etc. are performed via a toolbar button, which shows the kind of operation to be undone in its tooltip).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-y&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Redo&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Undoes the last undo operation. Currently, this works only in text editor windows (i.e. be careful in the diagram editor).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-f&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Find&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Opens a dialog to enter a search string and various options for search (pattern-matching search, wrap at end, etc.). In a text editor, a replace string can be entered for search and replace.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F2&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Rename&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the tree or diagram editor, lets you rename the selected element.&amp;lt;br&amp;gt;In a code editor, it renames a variable.&lt;br /&gt;
&lt;br /&gt;
=== Tree/List Organisation ===&lt;br /&gt;
&lt;br /&gt;
The tree interprets certain shortcuts differently than other views.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2193;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorDown) - &amp;quot;&#039;&#039;Move Down&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item(s) down in the navigation tree or a testplan&#039;s list of test cases. In a diagram editor, if a step&#039;s pin is selected in the diagram editor, this is moved towards the bottom.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2191;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorUp) - &amp;quot;&#039;&#039;Move Up&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item up in the navigation tree or a testplan&#039;s list of test cases. In a diagram editor, if a step&#039;s pin is selected in the diagram editor, this is moved towards the top.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2190;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorLeft) - &amp;quot;&#039;&#039;Move Out&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the navigation tree, this moves the selected item out of its containing (parent) item and places it below the parent in the list.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2192;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorRight) - &amp;quot;&#039;&#039;Move In&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the navigation tree, this moves the selected item into the tree item right above it. I.e. it makes it a child element of the other item.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-&amp;amp;#x2193;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-CursorDown) - &amp;quot;&#039;&#039;Move to Bottom&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item(s) down in the navigation tree to the end of the children list.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-&amp;amp;#x2191;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-CursorUp] - &amp;quot;&#039;&#039;Move to Top&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item up in the navigation tree to the beginning of the children list.&lt;br /&gt;
&lt;br /&gt;
=== Element Creation (Diagram Editor) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-n&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New Step&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor: opens a dialog to create a new step. The dialog lets you choose the action which is to be instantiated. If a pin is selected, the dialog filters are preset to only show action blocks with correspondingly typed pins.&amp;lt;br&amp;gt;In the scheme editor: adds a new input or output pin, depending on the currently selected pin&#039;s type.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-r&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Replace&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor, this opens a dialog to choose another action which is to replace the selected action.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-g&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Graphic&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor, this opens a dialog to choose an image which is added as annotation (useful to mark areas of the diagram as &amp;quot;Under Construction&amp;quot; or &amp;quot;Attention Here&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-i&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New InputPin&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;In the scheme editor, this adds a new input pin - same as clicking on the &amp;quot;&#039;&#039;Add Input Pin&#039;&#039;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-o&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New OutputPin&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;In the scheme editor, this adds a new output pin - same as clicking on the &amp;quot;&#039;&#039;Add Output Pin&#039;&#039;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
More editing functions are found in every text editor&#039;s, lists or diagram&#039;s right-button menu; some of which do have keyboard shortcuts.&lt;br /&gt;
&lt;br /&gt;
=== Code Editor ===&lt;br /&gt;
&lt;br /&gt;
For a full list, see [[Code_Editor/en#Editor_Functions_and_Keyboard_Shortcuts|&amp;quot;Editor Functions and Keyboard Shortcuts&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-g&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Goto Line&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In text editors: to position the cursor to an entered line number. If the entered number has a sign (+/-), the positioning is relative to the current line. In a diagram editor, a graphic annotation is inserted (see below)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-f&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Forward Search&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Searches for the next occurrence of the previous search string.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-b&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Backward Search&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Searches for the previous occurrence of the previous search string.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Again&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Repeats the last cut or replace operation in a text editor. For example, to replace a string by another string, first select it, type in the new word, then press &amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt; to search for the next occurrence and replace again. If the previous operation was a &amp;quot;cut&amp;quot; or &amp;quot;delete&amp;quot;, then &amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt; searches for the next occurrence and deletes that again.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F4&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Comment&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In an elementary code editor, comments the selection or the current cursor line&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F5&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Uncomment&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In an elementary code editor, uncomments the selection or the current cursor line&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F6&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Toggle Case&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;toggles the selection between titlecase, uppercase and lowercase (press multiple times)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F9&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undent by 4&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;remove the left 4 spaces of the selected line range, or the cursor line (if no lines are seleted).&amp;lt;br&amp;gt;Undent is also possible by selecting a number of lines and pressing &amp;lt;kbd&amp;gt;Shift-Tab&amp;lt;/kbd&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F10&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Indent by 4&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;add 4 spaces to the left of the selected line range, or the cursor line.&amp;lt;br&amp;gt;Indent is also possible by selecting a number of lines and pressing &amp;lt;kbd&amp;gt;Tab&amp;lt;/kbd&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F11&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undent by 1&#039;&#039;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F12&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Indent by 1&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-d;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;DoIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This works in code editors for Smalltalk or the builtin JavaScript actions. It takes the currently selected piece of text and immediately executes it as a program. The result is silently discarded (see below for more).&amp;lt;br&amp;gt;If no text is currently selected, the current cursor line is taken as input.&amp;lt;br&amp;gt;See the &amp;quot;[[Smalltalk Syntax Cheat Sheet]]&amp;quot; for a short syntax summary.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-p;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;PrintIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but the result is pasted after the selection. As an example, in a code editor, type &amp;quot;&amp;lt;code&amp;gt;45 degrees sin&amp;lt;/code&amp;gt;&amp;quot; (without the double quotes), select it, and press &amp;lt;kbd&amp;gt;PrintIt&amp;lt;/kbd&amp;gt;. The result will be pasted after the selection. This also works in a workspace/notepad window.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-q;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;InspectIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but an inspector window is opened on the result.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-B;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (Ctrl-Shift-B) - &amp;quot;&#039;&#039;BrowseIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but a class browser is opened on the result&#039;s class, showing all operations (methods) which are implemented by this object.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-I;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (Ctrl-Shift-I) - &amp;quot;&#039;&#039;Implementors&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Extracts a Smalltalk message name (i.e. the name of an operation) and opens a browser on all methods in the system which implement that message.&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-+&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-plus) - &amp;quot;&#039;&#039;Zoom In&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Text in the current focus view is shown in a larger font; diagrams are magnified&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl--&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-minus) - &amp;quot;&#039;&#039;Zoom Out&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Text in the current focus view is shown in a smaller font; diagrams are shrunk&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-+&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-plus) - &amp;quot;&#039;&#039;Zoom In All&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Zoom-In all components of the expecco window&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift--&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-minus) - &amp;quot;&#039;&#039;Zoom Out All&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Zoom-Out all components of the expecco window.&lt;br /&gt;
&lt;br /&gt;
=== Customizing Keyboard Shortcuts ===&lt;br /&gt;
&lt;br /&gt;
When expecco starts, it looks for a file named &amp;quot;&amp;lt;code&amp;gt;keyboard.rc&amp;lt;/code&amp;gt;&amp;quot; in the &amp;quot;&amp;lt;code&amp;gt;bin&amp;lt;/code&amp;gt;&amp;quot; folder (where the expecco executable is installed). All keyboard shortcuts are defined in this script file by associating symbolic operations (like &amp;quot;&#039;&#039;Accept&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;FindNext&#039;&#039;&amp;quot; to real key combinations like &amp;quot;&amp;lt;kbd&amp;gt;Ctrls&amp;lt;/kbd&amp;gt;&amp;quot; or &amp;quot;&amp;lt;kbd&amp;gt;Cmdf&amp;lt;/kbd&amp;gt;&amp;quot;. Case matters, so &amp;quot;&amp;lt;kbd&amp;gt;Ctrlt&amp;lt;/kbd&amp;gt;&amp;quot; and &amp;quot;&amp;lt;kbd&amp;gt;CtrlT&amp;lt;/kbd&amp;gt;&amp;quot; define unshifted and shifted &amp;lt;kbd&amp;gt;CTRL+t&amp;lt;/kbd&amp;gt; combinations.&lt;br /&gt;
&amp;lt;br&amp;gt;To customize the keyboard shortcuts, take the code there as a guide.&lt;br /&gt;
&lt;br /&gt;
These definitions are the default settings; however, individual users may as well change or add personal preferences&lt;br /&gt;
via the &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;rarr; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;rarr; &amp;quot;&#039;&#039;Keyboard&#039;&#039;&amp;quot; dialog.&lt;br /&gt;
&lt;br /&gt;
If you see grey symbolic shortcuts in a popup or pulldown menu, these are non-associated functions, for which no such association was present in the keyboard map.&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Common_Keyboard_Shortcuts/en&amp;diff=31383</id>
		<title>Common Keyboard Shortcuts/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Common_Keyboard_Shortcuts/en&amp;diff=31383"/>
		<updated>2026-06-06T10:31:19Z</updated>

		<summary type="html">&lt;p&gt;Cg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In general, keyboard shortcuts perform functions which are also available on popup menus of the individual UI components, and these popup menu are usually context/selection menus. This means, that they typically offer operations on the current selected element within that view. In contrast to eg. Mac OSX, the keyboard shortcuts are context sensitive, and depend on the current focus window. This means that the same shortcut may perform different operations depending on which component has the keyboard focus.&lt;br /&gt;
&lt;br /&gt;
All editing functions can be undone via the &amp;quot;&#039;&#039;Undo&#039;&#039;&amp;quot; (&amp;lt;kbd&amp;gt;Ctrl-z&amp;lt;/kbd&amp;gt;) menu function, in case you pressed the wrong key or inside another component.&lt;br /&gt;
&lt;br /&gt;
Notice that the &amp;lt;kbd&amp;gt;Alt&amp;lt;/kbd&amp;gt; key is labelled &amp;lt;kbd&amp;gt;Cmd&amp;lt;/kbd&amp;gt; on some keyboards (and also inside the &amp;lt;code&amp;gt;&amp;quot;keyboard.rc&amp;quot;&amp;lt;/code&amp;gt; file and the settings dialog.&lt;br /&gt;
&lt;br /&gt;
=== Navigating ===&lt;br /&gt;
&lt;br /&gt;
Cursor keys navigate character-wise or word-wise (if &amp;lt;kbd&amp;gt;CTRL&amp;lt;/kbd&amp;gt; is pressed)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-CursorRight&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Next Word&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Moves the cursor to the next word.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-CursorLeft&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Previous Word&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Moves the cursor to the previous word.&lt;br /&gt;
&lt;br /&gt;
=== Selecting ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-w&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Select Next Word&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Shift-CursorKey&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Expand the Selection&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== General Editing ===&lt;br /&gt;
&lt;br /&gt;
These shortcuts usually work in any view (i.e. project tree view, diagram- and text editors).&lt;br /&gt;
Specific operations are found below.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-c&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Copy&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;Copies the selection into the clipboard. The object to be copied depends on the context and selection:&amp;lt;br&amp;gt;- in a text editor, the text-selection is copied.&amp;lt;br&amp;gt;- in the diagram editor, the selected element(s) are copied&amp;lt;br&amp;gt;- in the navigation tree, the selected tree items are copied.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-v&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Paste&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Pastes the clipboard object. This is not always possible, and sometimes simply ignored (for example, if a tree-item is copied and tried to be pasted into a text editor).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-x&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Cut&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes the selection and puts it into the clipboard (for later pasting)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Del&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Delete&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes but does NOT put the deleted object into the clipboard.&amp;lt;br&amp;gt;In a text editor, the selected text is deleted, or if nothing is selected, the next character (after the cursor) is deleted. With &amp;lt;kbd&amp;gt;CTRL&amp;lt;/KBD&amp;gt;, the next word is deleted.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Backspace&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Delete&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes but does NOT put the deleted object into the clipboard.&amp;lt;br&amp;gt;In a text editor, the selected text is deleted, or if nothing is selected, the previous character (before the cursor) is deleted. With &amp;lt;kbd&amp;gt;CTRL&amp;lt;/KBD&amp;gt;, the previous word is deleted.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-z&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undo&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Undoes the last operation. This is a multi-undo. This is the same function as performed by the undo toolbar menu button. This button shows a tooltip, which describes what would be undone if pressed. If you are uncertain, what would be undone, place the mouse over this toolbar button (without pressing) and read the tooltip. Undo for complex operations (tree manipulations, imports etc. are performed via a toolbar button, which shows the kind of operation to be undone in its tooltip).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-y&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Redo&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Undoes the last undo operation. Currently, this works only in text editor windows (i.e. be careful in the diagram editor).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-f&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Find&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Opens a dialog to enter a search string and various options for search (pattern-matching search, wrap at end, etc.). In a text editor, a replace string can be entered for search and replace.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F2&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Rename&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the tree or diagram editor, lets you rename the selected element.&amp;lt;br&amp;gt;In a code editor, it renames a variable.&lt;br /&gt;
&lt;br /&gt;
=== Tree/List Organisation ===&lt;br /&gt;
&lt;br /&gt;
The tree interprets certain shortcuts differently than other views.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2193;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorDown) - &amp;quot;&#039;&#039;Move Down&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item(s) down in the navigation tree or a testplan&#039;s list of test cases. In a diagram editor, if a step&#039;s pin is selected in the diagram editor, this is moved towards the bottom.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2191;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorUp) - &amp;quot;&#039;&#039;Move Up&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item up in the navigation tree or a testplan&#039;s list of test cases. In a diagram editor, if a step&#039;s pin is selected in the diagram editor, this is moved towards the top.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2190;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorLeft) - &amp;quot;&#039;&#039;Move Out&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the navigation tree, this moves the selected item out of its containing (parent) item and places it below the parent in the list.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2192;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorRight) - &amp;quot;&#039;&#039;Move In&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the navigation tree, this moves the selected item into the tree item right above it. I.e. it makes it a child element of the other item.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-&amp;amp;#x2193;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-CursorDown) - &amp;quot;&#039;&#039;Move to Bottom&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item(s) down in the navigation tree to the end of the children list.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-&amp;amp;#x2191;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-CursorUp] - &amp;quot;&#039;&#039;Move to Top&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item up in the navigation tree to the beginning of the children list.&lt;br /&gt;
&lt;br /&gt;
=== Element Creation (Diagram Editor) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-n&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New Step&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor: opens a dialog to create a new step. The dialog lets you choose the action which is to be instantiated. If a pin is selected, the dialog filters are preset to only show action blocks with correspondingly typed pins.&amp;lt;br&amp;gt;In the scheme editor: adds a new input or output pin, depending on the currently selected pin&#039;s type.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-r&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Replace&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor, this opens a dialog to choose another action which is to replace the selected action.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-g&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Graphic&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor, this opens a dialog to choose an image which is added as annotation (useful to mark areas of the diagram as &amp;quot;Under Construction&amp;quot; or &amp;quot;Attention Here&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-i&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New InputPin&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;In the scheme editor, this adds a new input pin - same as clicking on the &amp;quot;&#039;&#039;Add Input Pin&#039;&#039;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-o&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New OutputPin&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;In the scheme editor, this adds a new output pin - same as clicking on the &amp;quot;&#039;&#039;Add Output Pin&#039;&#039;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
More editing functions are found in every text editor&#039;s, lists or diagram&#039;s right-button menu; some of which do have keyboard shortcuts.&lt;br /&gt;
&lt;br /&gt;
=== Code Editor ===&lt;br /&gt;
&lt;br /&gt;
For a full list, see [[Code_Editor/en#Editor_Functions_and_Keyboard_Shortcuts|&amp;quot;Editor Functions and Keyboard Shortcuts&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-g&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Goto Line&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In text editors: to position the cursor to an entered line number. If the entered number has a sign (+/-), the positioning is relative to the current line. In a diagram editor, a graphic annotation is inserted (see below)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-f&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Forward Search&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Searches for the next occurrence of the previous search string.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-b&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Backward Search&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Searches for the previous occurrence of the previous search string.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Again&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Repeats the last cut or replace operation in a text editor. For example, to replace a string by another string, first select it, type in the new word, then press &amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt; to search for the next occurrence and replace again. If the previous operation was a &amp;quot;cut&amp;quot; or &amp;quot;delete&amp;quot;, then &amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt; searches for the next occurrence and deletes that again.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F4&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Comment&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In an elementary code editor, comments the selection or the current cursor line&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F5&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Uncomment&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In an elementary code editor, uncomments the selection or the current cursor line&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F6&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Toggle Case&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;toggles the selection between titlecase, uppercase and lowercase (press multiple times)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F9&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undent by 4&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;remove the left 4 spaces of the selected line range, or the cursor line (if no lines are seleted).&amp;lt;br&amp;gt;Undent is also possible by selecting a number of lines and pressing &amp;lt;kbd&amp;gt;Shift-Tab&amp;lt;/kbd&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F10&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Indent by 4&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;add 4 spaces to the left of the selected line range, or the cursor line.&amp;lt;br&amp;gt;Indent is also possible by selecting a number of lines and pressing &amp;lt;kbd&amp;gt;Tab&amp;lt;/kbd&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F11&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undent by 1&#039;&#039;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F12&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Indent by 1&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-d;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;DoIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This works in code editors for Smalltalk or the builtin JavaScript actions. It takes the currently selected piece of text and immediately executes it as a program. The result is silently discarded (see below for more).&amp;lt;br&amp;gt;If no text is currently selected, the current cursor line is taken as input.&amp;lt;br&amp;gt;See the &amp;quot;[[Smalltalk Syntax Cheat Sheet]]&amp;quot; for a short syntax summary.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-p;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;PrintIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but the result is pasted after the selection. As an example, in a code editor, type &amp;quot;&amp;lt;code&amp;gt;45 degrees sin&amp;lt;/code&amp;gt;&amp;quot; (without the double quotes), select it, and press &amp;lt;kbd&amp;gt;PrintIt&amp;lt;/kbd&amp;gt;. The result will be pasted after the selection. This also works in a workspace/notepad window.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-q;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;InspectIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but an inspector window is opened on the result.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-B;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (Ctrl-Shift-B) - &amp;quot;&#039;&#039;BrowseIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but a class browser is opened on the result&#039;s class, showing all operations (methods) which are implemented by this object.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-I;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (Ctrl-Shift-I) - &amp;quot;&#039;&#039;Implementors&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Extracts a Smalltalk message name (i.e. the name of an operation) and opens a browser on all methods in the system which implement that message.&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-+&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-plus) - &amp;quot;&#039;&#039;Zoom In&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Text in the current focus view is shown in a larger font; diagrams are magnified&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl--&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-minus) - &amp;quot;&#039;&#039;Zoom Out&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Text in the current focus view is shown in a smaller font; diagrams are shrunk&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-+&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-plus) - &amp;quot;&#039;&#039;Zoom In All&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Zoom-In all components of the expecco window&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift--&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-minus) - &amp;quot;&#039;&#039;Zoom Out All&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Zoom-Out all components of the expecco window.&lt;br /&gt;
&lt;br /&gt;
=== Customizing Keyboard Shortcuts ===&lt;br /&gt;
&lt;br /&gt;
When expecco starts, it looks for a file named &amp;quot;&amp;lt;code&amp;gt;keyboard.rc&amp;lt;/code&amp;gt;&amp;quot; in the &amp;quot;&amp;lt;code&amp;gt;bin&amp;lt;/code&amp;gt;&amp;quot; folder (where the expecco executable is installed). All keyboard shortcuts are defined in this script file by associating symbolic operations (like &amp;quot;&#039;&#039;Accept&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;FindNext&#039;&#039;&amp;quot; to real key combinations like &amp;quot;&amp;lt;kbd&amp;gt;Ctrls&amp;lt;/kbd&amp;gt;&amp;quot; or &amp;quot;&amp;lt;kbd&amp;gt;Cmdf&amp;lt;/kbd&amp;gt;&amp;quot;. Case matters, so &amp;quot;&amp;lt;kbd&amp;gt;Ctrlt&amp;lt;/kbd&amp;gt;&amp;quot; and &amp;quot;&amp;lt;kbd&amp;gt;CtrlT&amp;lt;/kbd&amp;gt;&amp;quot; define unshifted and shifted &amp;lt;kbd&amp;gt;CTRL+t&amp;lt;kbd&amp;gt; combinations.&lt;br /&gt;
&amp;lt;br&amp;gt;To customize the keyboard shortcuts, take the code there as a guide.&lt;br /&gt;
&lt;br /&gt;
These definitions are the default settings; however, individual users may as well change or add personal preferences&lt;br /&gt;
via the &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;rarr; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;rarr; &amp;quot;&#039;&#039;Keyboard&#039;&#039;&amp;quot; dialog.&lt;br /&gt;
&lt;br /&gt;
If you see grey symbolic shortcuts in a popup or pulldown menu, these are non-associated functions, for which no such association was present in the keyboard map.&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Common_Keyboard_Shortcuts/en&amp;diff=31382</id>
		<title>Common Keyboard Shortcuts/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Common_Keyboard_Shortcuts/en&amp;diff=31382"/>
		<updated>2026-06-06T10:28:48Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Customizing Keyboard Shortcuts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In general, keyboard shortcuts perform functions which are also available on popup menus of the individual UI components, and these popup menu are usually context/selection menus. This means, that they typically offer operations on the current selected element within that view. In contrast to eg. Mac OSX, the keyboard shortcuts are context sensitive, and depend on the current focus window. This means that the same shortcut may perform different operations depending on which component has the keyboard focus.&lt;br /&gt;
&lt;br /&gt;
All editing functions can be undone via the &amp;quot;&#039;&#039;Undo&#039;&#039;&amp;quot; (&amp;lt;kbd&amp;gt;Ctrl-z&amp;lt;/kbd&amp;gt;) menu function, in case you pressed the wrong key or inside another component.&lt;br /&gt;
&lt;br /&gt;
Notice that the &amp;lt;kbd&amp;gt;Alt&amp;lt;/kbd&amp;gt; key is labelled &amp;lt;kbd&amp;gt;Cmd&amp;lt;/kbd&amp;gt; on some keyboards (and also inside the &amp;lt;code&amp;gt;&amp;quot;keyboard.rc&amp;quot;&amp;lt;/code&amp;gt; file and the settings dialog.&lt;br /&gt;
&lt;br /&gt;
=== Navigating ===&lt;br /&gt;
&lt;br /&gt;
Cursor keys navigate character-wise or word-wise (if &amp;lt;kbd&amp;gt;CTRL&amp;lt;/kbd&amp;gt; is pressed)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-CursorRight&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Next Word&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Moves the cursor to the next word.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-CursorLeft&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Previous Word&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Moves the cursor to the previous word.&lt;br /&gt;
&lt;br /&gt;
=== Selecting ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-w&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Select Next Word&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Shift-CursorKey&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Expand the Selection&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== General Editing ===&lt;br /&gt;
&lt;br /&gt;
These shortcuts usually work in any view (i.e. project tree view, diagram- and text editors).&lt;br /&gt;
Specific operations are found below.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-c&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Copy&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;Copies the selection into the clipboard. The object to be copied depends on the context and selection:&amp;lt;br&amp;gt;- in a text editor, the text-selection is copied.&amp;lt;br&amp;gt;- in the diagram editor, the selected element(s) are copied&amp;lt;br&amp;gt;- in the navigation tree, the selected tree items are copied.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-v&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Paste&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Pastes the clipboard object. This is not always possible, and sometimes simply ignored (for example, if a tree-item is copied and tried to be pasted into a text editor).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-x&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Cut&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes the selection and puts it into the clipboard (for later pasting)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Del&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Delete&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes but does NOT put the deleted object into the clipboard.&amp;lt;br&amp;gt;In a text editor, the selected text is deleted, or if nothing is selected, the next character (after the cursor) is deleted. With &amp;lt;kbd&amp;gt;CTRL&amp;lt;/KBD&amp;gt;, the next word is deleted.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Backspace&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Delete&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Deletes but does NOT put the deleted object into the clipboard.&amp;lt;br&amp;gt;In a text editor, the selected text is deleted, or if nothing is selected, the previous character (before the cursor) is deleted. With &amp;lt;kbd&amp;gt;CTRL&amp;lt;/KBD&amp;gt;, the previous word is deleted.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-z&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undo&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Undoes the last operation. This is a multi-undo. This is the same function as performed by the undo toolbar menu button. This button shows a tooltip, which describes what would be undone if pressed. If you are uncertain, what would be undone, place the mouse over this toolbar button (without pressing) and read the tooltip. Undo for complex operations (tree manipulations, imports etc. are performed via a toolbar button, which shows the kind of operation to be undone in its tooltip).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-y&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Redo&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Undoes the last undo operation. Currently, this works only in text editor windows (i.e. be careful in the diagram editor).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-f&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Find&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Opens a dialog to enter a search string and various options for search (pattern-matching search, wrap at end, etc.). In a text editor, a replace string can be entered for search and replace.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F2&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Rename&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the tree or diagram editor, lets you rename the selected element.&amp;lt;br&amp;gt;In a code editor, it renames a variable.&lt;br /&gt;
&lt;br /&gt;
=== Tree/List Organisation ===&lt;br /&gt;
&lt;br /&gt;
The tree interprets certain shortcuts differently than other views.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2193;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorDown) - &amp;quot;&#039;&#039;Move Down&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item(s) down in the navigation tree or a testplan&#039;s list of test cases. In a diagram editor, if a step&#039;s pin is selected in the diagram editor, this is moved towards the bottom.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2191;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorUp) - &amp;quot;&#039;&#039;Move Up&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item up in the navigation tree or a testplan&#039;s list of test cases. In a diagram editor, if a step&#039;s pin is selected in the diagram editor, this is moved towards the top.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2190;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorLeft) - &amp;quot;&#039;&#039;Move Out&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the navigation tree, this moves the selected item out of its containing (parent) item and places it below the parent in the list.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-&amp;amp;#x2192;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-CursorRight) - &amp;quot;&#039;&#039;Move In&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the navigation tree, this moves the selected item into the tree item right above it. I.e. it makes it a child element of the other item.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-&amp;amp;#x2193;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-CursorDown) - &amp;quot;&#039;&#039;Move to Bottom&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item(s) down in the navigation tree to the end of the children list.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-&amp;amp;#x2191;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-CursorUp] - &amp;quot;&#039;&#039;Move to Top&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This moves the selected item up in the navigation tree to the beginning of the children list.&lt;br /&gt;
&lt;br /&gt;
=== Element Creation (Diagram Editor) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-n&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New Step&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor: opens a dialog to create a new step. The dialog lets you choose the action which is to be instantiated. If a pin is selected, the dialog filters are preset to only show action blocks with correspondingly typed pins.&amp;lt;br&amp;gt;In the scheme editor: adds a new input or output pin, depending on the currently selected pin&#039;s type.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-r&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Replace&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor, this opens a dialog to choose another action which is to replace the selected action.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-g&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Graphic&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In the diagram editor, this opens a dialog to choose an image which is added as annotation (useful to mark areas of the diagram as &amp;quot;Under Construction&amp;quot; or &amp;quot;Attention Here&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-i&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New InputPin&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;In the scheme editor, this adds a new input pin - same as clicking on the &amp;quot;&#039;&#039;Add Input Pin&#039;&#039;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-o&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;New OutputPin&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;In the scheme editor, this adds a new output pin - same as clicking on the &amp;quot;&#039;&#039;Add Output Pin&#039;&#039;&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
More editing functions are found in every text editor&#039;s, lists or diagram&#039;s right-button menu; some of which do have keyboard shortcuts.&lt;br /&gt;
&lt;br /&gt;
=== Code Editor ===&lt;br /&gt;
&lt;br /&gt;
For a full list, see [[Code_Editor/en#Editor_Functions_and_Keyboard_Shortcuts|&amp;quot;Editor Functions and Keyboard Shortcuts&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Ctrl-g&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Goto Line&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In text editors: to position the cursor to an entered line number. If the entered number has a sign (+/-), the positioning is relative to the current line. In a diagram editor, a graphic annotation is inserted (see below)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-f&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Forward Search&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Searches for the next occurrence of the previous search string.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;Alt-b&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Backward Search&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Searches for the previous occurrence of the previous search string.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Again&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Repeats the last cut or replace operation in a text editor. For example, to replace a string by another string, first select it, type in the new word, then press &amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt; to search for the next occurrence and replace again. If the previous operation was a &amp;quot;cut&amp;quot; or &amp;quot;delete&amp;quot;, then &amp;lt;kbd&amp;gt;F8&amp;lt;/kbd&amp;gt; searches for the next occurrence and deletes that again.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F4&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Comment&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In an elementary code editor, comments the selection or the current cursor line&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F5&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Uncomment&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;In an elementary code editor, uncomments the selection or the current cursor line&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F6&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Toggle Case&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;toggles the selection between titlecase, uppercase and lowercase (press multiple times)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F9&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undent by 4&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;remove the left 4 spaces of the selected line range, or the cursor line (if no lines are seleted).&amp;lt;br&amp;gt;Undent is also possible by selecting a number of lines and pressing &amp;lt;kbd&amp;gt;Shift-Tab&amp;lt;/kbd&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F10&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Indent by 4&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;add 4 spaces to the left of the selected line range, or the cursor line.&amp;lt;br&amp;gt;Indent is also possible by selecting a number of lines and pressing &amp;lt;kbd&amp;gt;Tab&amp;lt;/kbd&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F11&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Undent by 1&#039;&#039;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;span style=&amp;quot;box-shadow: 1px 1px 2px rgba(0,0,0,0.3);&amp;quot;&amp;gt;&amp;lt;kbd&amp;gt;F12&amp;lt;/kbd&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;Indent by 1&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-d;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;DoIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;This works in code editors for Smalltalk or the builtin JavaScript actions. It takes the currently selected piece of text and immediately executes it as a program. The result is silently discarded (see below for more).&amp;lt;br&amp;gt;If no text is currently selected, the current cursor line is taken as input.&amp;lt;br&amp;gt;See the &amp;quot;[[Smalltalk Syntax Cheat Sheet]]&amp;quot; for a short syntax summary.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-p;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;PrintIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but the result is pasted after the selection. As an example, in a code editor, type &amp;quot;&amp;lt;code&amp;gt;45 degrees sin&amp;lt;/code&amp;gt;&amp;quot; (without the double quotes), select it, and press &amp;lt;kbd&amp;gt;PrintIt&amp;lt;/kbd&amp;gt;. The result will be pasted after the selection. This also works in a workspace/notepad window.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-q;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; - &amp;quot;&#039;&#039;InspectIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but an inspector window is opened on the result.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-B;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (Ctrl-Shift-B) - &amp;quot;&#039;&#039;BrowseIt&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Simular to the above, but a class browser is opened on the result&#039;s class, showing all operations (methods) which are implemented by this object.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-I;&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (Ctrl-Shift-I) - &amp;quot;&#039;&#039;Implementors&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Extracts a Smalltalk message name (i.e. the name of an operation) and opens a browser on all methods in the system which implement that message.&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-+&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-plus) - &amp;quot;&#039;&#039;Zoom In&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Text in the current focus view is shown in a larger font; diagrams are magnified&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl--&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-minus) - &amp;quot;&#039;&#039;Zoom Out&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Text in the current focus view is shown in a smaller font; diagrams are shrunk&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift-+&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-plus) - &amp;quot;&#039;&#039;Zoom In All&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Zoom-In all components of the expecco window&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;kbd&amp;gt;Ctrl-Shift--&amp;lt;/kbd&amp;gt;&#039;&#039;&#039; (= Ctrl-Shift-minus) - &amp;quot;&#039;&#039;Zoom Out All&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;Zoom-Out all components of the expecco window.&lt;br /&gt;
&lt;br /&gt;
=== Customizing Keyboard Shortcuts ===&lt;br /&gt;
&lt;br /&gt;
When expecco starts, it looks for a file named &amp;quot;&amp;lt;code&amp;gt;keyboard.rc&amp;lt;/code&amp;gt;&amp;quot; in the &amp;quot;&amp;lt;code&amp;gt;bin&amp;lt;/code&amp;gt;&amp;quot; folder (where the expecco executable is installed). All keyboard shortcuts are defined in this script file by associating symbolic operations (like &amp;quot;&#039;&#039;Accept&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;FindNext&#039;&#039;&amp;quot; to real key combinations like &amp;quot;&amp;lt;code&amp;gt;Ctrls&amp;lt;/code&amp;gt;&amp;quot; or &amp;quot;&amp;lt;code&amp;gt;Cmdf&amp;lt;/code&amp;gt;&amp;quot;. Case matters, so &amp;quot;&amp;lt;code&amp;gt;Ctrlt&amp;lt;/code&amp;gt;&amp;quot; and &amp;quot;&amp;lt;code&amp;gt;CtrlT&amp;lt;/code&amp;gt;&amp;quot; define unshifted and shifted CTRL+t combinations.&lt;br /&gt;
&amp;lt;br&amp;gt;To customize the keyboard shortcuts, take the code there as a guide.&lt;br /&gt;
&lt;br /&gt;
These definitions are the default settings; however, individual users may as well change or add personal preferences&lt;br /&gt;
via the &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;rarr; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;rarr; &amp;quot;&#039;&#039;Keyboard&#039;&#039;&amp;quot; dialog.&lt;br /&gt;
&lt;br /&gt;
If you see grey symbolic shortcuts in a popup or pulldown menu, these are non-associated functions, for which no such association was present in the keyboard map.&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31381</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31381"/>
		<updated>2026-06-06T08:45:19Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* VisualWorks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints, debugging with single stepping and object inspectors.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another. Any input/output must be either through files or encoded/decoded and passed via stdin/stdout.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualAge ==&lt;br /&gt;
[https://en.wkipedia.org/wiki/VisualAge VisualAge] (&amp;quot;&#039;&#039;VA Smalltalk&#039;&#039;&amp;quot;) is the brand name of a [https://en.wkipedia.org/wiki/Smalltalk Smalltalk] language implementation (&amp;quot;&#039;&#039;dialect&#039;&#039;&amp;quot;) and environment originally developed by OTI, then taken over by IBM (aka &amp;quot;&#039;&#039;IBM Smalltalk&#039;&#039;&amp;quot;) and now Instantiations Inc.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
[https://en.wkipedia.org/wiki/VisualWorks VisualWorks] (or &amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot; / &amp;quot;&#039;&#039;VW-Smalltalk&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment (&amp;quot;&#039;&#039;dialect&#039;&#039;&amp;quot;) from ParcPlace Systems, now Cincom, a US based company. VisualWorks is an ANSI compatible [https://en.wkipedia.org/wiki/Smalltalk Smalltalk], and a direct descendent of the original Smalltalk80 system from Xerox Parc. It shares many APIs with Smalltalk/X, and VisualWorks documentation is mostly also valid for ST/X (differences are in the namespace notation and ST/X language extensions).&amp;lt;br&amp;gt;Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco via an extension plugin.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31380</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31380"/>
		<updated>2026-06-06T08:44:34Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* VisualWorks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints, debugging with single stepping and object inspectors.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another. Any input/output must be either through files or encoded/decoded and passed via stdin/stdout.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualAge ==&lt;br /&gt;
[https://en.wkipedia.org/wiki/VisualAge VisualAge] (&amp;quot;&#039;&#039;VA Smalltalk&#039;&#039;&amp;quot;) is the brand name of a [https://en.wkipedia.org/wiki/Smalltalk Smalltalk] language implementation (&amp;quot;&#039;&#039;dialect&#039;&#039;&amp;quot;) and environment originally developed by OTI, then taken over by IBM (aka &amp;quot;&#039;&#039;IBM Smalltalk&#039;&#039;&amp;quot;) and now Instantiations Inc.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
[https://en.wkipedia.org/wiki/VisualWorks VisualWorks] (or &amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot; / &amp;quot;&#039;&#039;VW-Smalltalk&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment (&amp;quot;&#039;&#039;dialect&#039;&#039;&amp;quot;) from ParcPlace Systems, now Cincom, a US based company. VisualWorks is an ANSI compatible [https://en.wkipedia.org/wiki/Smalltalk Smalltalk], is a direct descendent of the original Smalltalk80 system from Xerox Parc. It shares many APIs with Smalltalk/X, and VisualWorks documentation is mostly also valid for ST/X (differences are in the namespace notation and ST/X language extensions).&amp;lt;br&amp;gt;Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco via an extension plugin.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31379</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31379"/>
		<updated>2026-06-06T08:37:40Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* VisualAge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints, debugging with single stepping and object inspectors.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another. Any input/output must be either through files or encoded/decoded and passed via stdin/stdout.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualAge ==&lt;br /&gt;
[https://en.wkipedia.org/wiki/VisualAge VisualAge] (&amp;quot;&#039;&#039;VA Smalltalk&#039;&#039;&amp;quot;) is the brand name of a [https://en.wkipedia.org/wiki/Smalltalk Smalltalk] language implementation (&amp;quot;&#039;&#039;dialect&#039;&#039;&amp;quot;) and environment originally developed by OTI, then taken over by IBM (aka &amp;quot;&#039;&#039;IBM Smalltalk&#039;&#039;&amp;quot;) and now Instantiations Inc.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks [https://en.wkipedia.org/wiki/VisualWorks] (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment (&amp;quot;&#039;&#039;dialect&#039;&#039;&amp;quot;) from Cincom, a US based company. VisualWorks is an ANSI compatible [https://en.wkipedia.org/wiki/Smalltalk Smalltalk], sharing many of its APIs with Smalltalk/X, and VisualWorks documentation is mostly also valid for ST/X (differences are in the namespace notation and ST/X language extensions).&amp;lt;br&amp;gt;Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco via an extension plugin.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31378</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31378"/>
		<updated>2026-06-06T08:36:06Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* VisualWorks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints, debugging with single stepping and object inspectors.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another. Any input/output must be either through files or encoded/decoded and passed via stdin/stdout.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualAge ==&lt;br /&gt;
[https://en.wkipedia.org/wiki/VisualAge VisualAge] (&amp;quot;&#039;&#039;VA Smalltalk&#039;&#039;&amp;quot;) is the brand name of a [https://en.wkipedia.org/wiki/Smalltalk Smalltalk] language implementation and environment originally develloped by OTI, then taken over by IBM and now Instantiations.&lt;br /&gt;
 &lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks [https://en.wkipedia.org/wiki/VisualWorks] (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment (&amp;quot;&#039;&#039;dialect&#039;&#039;&amp;quot;) from Cincom, a US based company. VisualWorks is an ANSI compatible [https://en.wkipedia.org/wiki/Smalltalk Smalltalk], sharing many of its APIs with Smalltalk/X, and VisualWorks documentation is mostly also valid for ST/X (differences are in the namespace notation and ST/X language extensions).&amp;lt;br&amp;gt;Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco via an extension plugin.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31377</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31377"/>
		<updated>2026-06-06T08:18:32Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* VisualWorks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints, debugging with single stepping and object inspectors.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another. Any input/output must be either through files or encoded/decoded and passed via stdin/stdout.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment (&amp;quot;&#039;&#039;dialect&#039;&#039;&amp;quot;) from Cincom, a US based company. VisualWorks is an ANSI compatible Smalltalk, sharing many of its APIs with Smalltalk/X, and VisualWorks documentation is mostly also valid for ST/X (differences are in the namespace notation and ST/X language extensions).&amp;lt;br&amp;gt;Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco via an extension plugin.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31376</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31376"/>
		<updated>2026-06-06T08:11:50Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Node Elementary Action Block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints, debugging with single stepping and object inspectors.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another. Any input/output must be either through files or encoded/decoded and passed via stdin/stdout.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31375</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31375"/>
		<updated>2026-06-06T08:10:11Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Script Actions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another. Any input/output must be either through files or encoded/decoded and passed via stdin/stdout.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31374</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31374"/>
		<updated>2026-06-06T08:06:18Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Stdout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31373</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31373"/>
		<updated>2026-06-06T08:05:48Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Stderr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. Every well behaving program will send error messages to stderr and regular output to stdout, making it possible to divert these to different destinations. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31372</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31372"/>
		<updated>2026-06-06T08:01:36Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Tag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite.&amp;lt;br&amp;gt;In addition to support searching and grouping, additional other behavior can be controlled by tags.&amp;lt;br&amp;gt;For example, you can define an icon or color to be shown in the left project tree if the item has a particular tag.&amp;lt;br&amp;gt;You can also use tags to control the execution, for filtering log entries or to control the generation of logs.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31371</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31371"/>
		<updated>2026-06-06T07:57:46Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Tagged Value */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values &amp;lt;sup&amp;gt;(*)&amp;lt;/sup&amp;gt;. They can be created when suites are imported from an external tool, stored with the suite and passed back transparently to the tool, supporting round trip import/export without loosing information which expecco does not need. Tagged values can be attached to every element in the project tree or a diagram (i.e. actions, types, steps, pins etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;sup&amp;gt;*)&amp;lt;/sup&amp;gt; this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31370</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31370"/>
		<updated>2026-06-06T07:54:16Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Syntactic Sugar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;&amp;lt;code&amp;gt;{ expr1 . expr2 . ... exprN }&amp;lt;/code&amp;gt;&amp;quot; or the expanded expression string &amp;quot;&amp;lt;code&amp;gt; e&#039;...{expr}..&#039;&amp;lt;/code&amp;gt;&amp;quot; are syntactic sugar for Array-instantiation &amp;quot;&amp;lt;code&amp;gt;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;lt;/code&amp;gt;&amp;quot; or a call to the string expansion method.&amp;lt;br&amp;gt;Btw: you don&#039;t have to understand this, to use expecco.&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31369</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31369"/>
		<updated>2026-06-06T07:49:54Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* ST/X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;. See above.&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31368</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31368"/>
		<updated>2026-06-06T07:49:20Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Smalltalk/X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;&#039;&#039;just-in-time&#039;&#039;&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;&#039;&#039;ahead-of-time&#039;&#039;&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup/&#039;&#039;warmup&#039;&#039; time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31367</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31367"/>
		<updated>2026-06-06T07:47:57Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Smalltalk/X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;just-in-time&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;ahead-of-time&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup time) and gives more deterministic function call times. Both present in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31366</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31366"/>
		<updated>2026-06-06T07:47:03Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Smalltalk/X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support.&amp;lt;br&amp;gt;&amp;quot;just-in-time&amp;quot; means that code which is added dynamically at execution time will be compiled to machine code when that code is called for the first time; &amp;quot;ahead-of-time&amp;quot; means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called.&amp;lt;br&amp;gt;Ahead of time compilation avoids the pause times (reduces the startup time) and gives more deterministic function call times. Both being seen in pure just-in-time compiled systems.&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, any API, feature or mechanism present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31365</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31365"/>
		<updated>2026-06-06T07:39:08Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Shell/Batch Script Elementary Block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== SFTP (Secure File Transfer) ==&lt;br /&gt;
A mechanism to transfer files via an encrypted and authenticated channel to another machine. Expecco includes a pure Smalltalk implementation which does not depend on any tools provided by the operating system (but of course, these could also be used).&amp;lt;br&amp;gt; See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support (ahead-of-time means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called).&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, APIS, features or mechanisms present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31364</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31364"/>
		<updated>2026-06-06T07:36:08Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* SSH (Secure Shell) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support (ahead-of-time means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called).&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, APIS, features or mechanisms present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&amp;lt;br&amp;gt;See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31363</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31363"/>
		<updated>2026-06-06T07:35:30Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* SSL (Secure Socket Layer) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support (ahead-of-time means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called).&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, APIS, features or mechanisms present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system. See &amp;quot;[[Remote_Access/en|Remote Access]]&amp;quot; documentation.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31362</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31362"/>
		<updated>2026-06-06T07:29:30Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* SSL (Secure Socket Layer) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support (ahead-of-time means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called).&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, APIS, features or mechanisms present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSH (Secure Shell) ==&lt;br /&gt;
Remote access to another machine via an encrypted communiation channel (Secure Socket).&lt;br /&gt;
Typically used to login to a remote machine or to interact with a remote command line interpreter.&lt;br /&gt;
Expecco includes a pure Smalltalk implementation which does not depend on any extra features to be installed (but of course, you can  also use any tools provided by the operating system).&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows and does not need any extra features provided by the operating system.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31361</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31361"/>
		<updated>2026-06-06T07:25:34Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Pin - Triggering Pin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Project ==&lt;br /&gt;
This term is also occasionally used to refer to a test suite within this documentation and also appears in user interface.&amp;lt;br&amp;gt;The reason is that expecco can also be used for pure automation purposes which are not specific tests. You can think of a test seuite being a project doing tests. Technically they are the same: a number of items packed together into a .ets file.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support (ahead-of-time means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called).&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, APIS, features or mechanisms present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31360</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31360"/>
		<updated>2026-06-06T07:20:48Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Smalltalk/X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support (ahead-of-time means that dlls with compiled machine code can be built, and Smalltalk code is already compiled to machine code when the application starts, as opposed to being dynamically compiled when first called).&amp;lt;br&amp;gt;ST/X is the base on which expecco and expeccoALM / AIDYMO are built.&lt;br /&gt;
&amp;lt;br&amp;gt;Because if this, APIS, features or mechanisms present in ST/X will also be in expecco and may be called from elementary Smalltalk code.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31359</id>
		<title>Glossary/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Glossary/en&amp;diff=31359"/>
		<updated>2026-06-06T07:16:16Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Stderr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Action, Step and Activity ==&lt;br /&gt;
In expecco, an &amp;quot;&#039;&#039;Action Block&#039;&#039;&amp;quot; (or &amp;quot;&#039;&#039;Action&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Block&#039;&#039;&amp;quot; for short) refers to the definition of how an action is done. It is therefore also called occasionally &amp;quot;&#039;&#039;Action Definition&#039;&#039;&amp;quot;. In the application, action definitions are found in a tree like organization at the left of the window.&lt;br /&gt;
Actions can be specified in multiple ways:&lt;br /&gt;
* as an activity diagram, with interconnected steps&lt;br /&gt;
* as a list of sequentially executed steps (either as keyword list action or in a test plan)&lt;br /&gt;
* as a piece of code in a programming language&lt;br /&gt;
* as a remote procedure call (service call)&lt;br /&gt;
&lt;br /&gt;
Actions with an activity diagram are called &amp;quot;&#039;&#039;Compound Actions&#039;&#039;&amp;quot;, and their elements are called &amp;quot;&#039;&#039;Steps&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Actions with a sequence list are called &amp;quot;&#039;&#039;Keyword Actions&#039;&#039;&amp;quot;. Test plans are also a kind of sequence list, but provide additional control for execution (looping, skipping, selecting etc.). Although their elements are also technically steps, they are typically named &amp;quot;Test Steps&amp;quot;, &amp;quot;Test Cases&amp;quot; or &amp;quot;Test Plan Items&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;All other actions are called &amp;quot;&#039;Elementary Actions&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A step is an action being placed (instantiated) in either an activity diagram or a sequence list. &lt;br /&gt;
Notice that the same action can be placed into multiple other compound actions, keyword actions or test plans. Thus, an action definition can be resused (possibly with different parameters) in multiple places.&lt;br /&gt;
&lt;br /&gt;
When a step receives its required input values, it starts executing. For this, a so called &amp;quot;&#039;&#039;Activity&#039;&#039;&amp;quot; is created, which executes the step&#039;s action. Conceptionally, a thread (lightweight process) is created, which executes the step&#039;s action with the given parameters &amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;. Also notice, that multiple activities can be active in parallel, even executing the same step at the same time.&lt;br /&gt;
&lt;br /&gt;
Notice that in the literature, the meaning of &amp;quot;Action&amp;quot;, &amp;quot;Step&amp;quot; and &amp;quot;Activity&amp;quot; is often unclear, and the exact definition is often unclear.&lt;br /&gt;
&lt;br /&gt;
See also: [[Tree Elements/en#Action_Blocks|Action Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
1) technically a thread pool is used, and a free one is chosen to execute it.&lt;br /&gt;
&lt;br /&gt;
== Activity Log ==&lt;br /&gt;
Whenever expecco executes some action (block), all of its input and output values are recorded in an activity log.&lt;br /&gt;
In addition, explicit and implicit log-messages may be generated (implicit by the execution engine, explicit by calls to &amp;quot;logInfo&amp;quot;, &amp;quot;logWarning&amp;quot; etc. or action steps). In addition, the start- and execution times are recorded.&lt;br /&gt;
&lt;br /&gt;
== AIDYMO==&lt;br /&gt;
Central management system for Automation. Was previously known as expeccoALM.&lt;br /&gt;
&lt;br /&gt;
== Black Box Test ==&lt;br /&gt;
In a [https://en.wikipedia.org/wiki/Black-box_testing &amp;quot;&#039;&#039;Black Box Test&#039;&#039;&amp;quot;], the test-machine and test-application are completely separated from the System Under Test (SUT). No knowledge about the internals (data structures, object model etc.) of the SUT is known when testing. The test only operates against official external interfaces, such as input/output, data and configuration files, command line interfaces, GUI interfaces or communication protocols.&lt;br /&gt;
&lt;br /&gt;
The opposite being a [[#White Box Test|&amp;quot;White Box Test&amp;quot;]], which executes inside the SUT and has full access to all internal details (i.e. functions, data objects etc.).&lt;br /&gt;
&lt;br /&gt;
Expecco supports both, &amp;quot;Black Box&amp;quot; by various libraries which provide interfaces to commonly used external interfaces, and &amp;quot;White Box&amp;quot; via code injection mechanisms, such as &amp;quot;Groovy&amp;quot;, &amp;quot;Python&amp;quot; or &amp;quot;VisualBasic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mixed mode testing is called [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot; (wikipedia)].&lt;br /&gt;
&amp;lt;br&amp;gt;See also: [[#White Box Test|White Box Test]], [[#Gray Box Test|Gray Box Test]]&lt;br /&gt;
&lt;br /&gt;
== Bridged Actions ==&lt;br /&gt;
&lt;br /&gt;
Expecco uses &amp;quot;&#039;&#039;bridges&#039;&#039;&amp;quot; to implement action blocks written in different programming languages.&lt;br /&gt;
A bridge has two sides, one inside expecco, another inside the external scripting language interpreter, which typically communicate via a socket interprocess communication mechanism.&lt;br /&gt;
Whenever a bridged action block is to be executed, expecco packs the arguments and additional call information into a message and sends it over to the other bridge side. There, the function&#039;s code is executed and a result returned as message back to expecco. &lt;br /&gt;
&lt;br /&gt;
The bridge remains alive, as long as expecco is alive, or the bridge connection is closed explicitly (by the testsuite or via a menu function). &lt;br /&gt;
&lt;br /&gt;
All bridges support code injection, which means that action blocks can be edited inside expecco and are forwarded and installed automatically, when first called. This makes the handling of bridged actions almost transparent and identical to the way in which internal actions (Smalltalk and JavaScript) are handled. For some languages, expecco even includes a debugger with breakpoint-, single step and data inspection features.&lt;br /&gt;
Currently, bridges are provided for Java/Groovy, Node.js, DotNET/CLR, Python, remote Smalltalk and C/C++.&lt;br /&gt;
&lt;br /&gt;
== [[CompoundBlock Element|Compound Action Block]] ==&lt;br /&gt;
An action block which is defined by an activity diagram. Its execution semantics are defined by a network of interconnected steps. These themselves can be compound- or elementary steps.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Compound Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is a compound action block. When triggered, such a step will execute another activity diagram.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[CompoundBlock Element/en|Compound Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csf&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Connection Settings Files&#039;&#039;&amp;quot; are used by the [[Mobile Testing Plugin/en|Mobile Testing]] and [[Selenium WebDriver Plugin/en|Selenium WebDriver]] interfaces. The file is a text file contain lines with key-value pairs in the format:&lt;br /&gt;
 key: value&lt;br /&gt;
each pair specifies an attribute or required capability of the connection.&lt;br /&gt;
Typically, these are generated via the [[Expecco GUI Tests Extension Reference/en|GUI browser&#039;s]] &amp;quot;&#039;&#039;Connection&#039;&#039;&amp;quot; dialog and kept as attachments inside the suite.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.csv&amp;quot; File ==&lt;br /&gt;
&amp;quot;&#039;&#039;Comma Separated Values Files&#039;&#039;&amp;quot; are files as generated by Excel and other Spreadsheet programs, by databases and many other record-oriented programs for data interchange. These files represent data records as textual (i.e. human readable) text lines, where the columns (fields) are usually separated by commas (although often semicolon is used as field separator). The very first line of a &amp;quot;csv&amp;quot; file contains the column names.&lt;br /&gt;
Expecco can read and write &amp;quot;csv&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a CSV file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Dead Key ==&lt;br /&gt;
Prefix key used to enter diacritic characters (eg. Umlaut and accents). If enabled, the keyboard characters &amp;lt;&amp;quot;&amp;gt;, &amp;lt;&#039;&amp;gt;, &amp;lt;^&amp;gt; and &amp;lt;`&amp;gt; will be &#039;&#039;dead&#039;&#039; until a followup character is typed. Then a new character is composed (eg. &amp;lt;ä&amp;gt; from &amp;lt;&amp;quot;&amp;gt; and &amp;lt;a&amp;gt;).&lt;br /&gt;
If followed by a space or the dead key, the dead key is entered. If the combination is invalid, two characters will be entered. &amp;lt;br&amp;gt;Thus, to enter the dead key character alone, press a space as second character (or press the dead key twice). &lt;br /&gt;
&amp;lt;P&amp;gt;Because dead key processing can be inconvenient when entering program source code, they are disabled by default. This default can be changed in the settings dialog under &amp;quot;&#039;&#039;Look and Feel&#039;&#039;&amp;quot; - &amp;quot;&#039;&#039;Keyboard Settings&#039;&#039;&amp;quot;. In addition, edit text windows provide a popup menu entry to enable/disable deadkey processing as a per editor. See also [https://en.wikipedia.org/wiki/Dead_key wikipedia].&lt;br /&gt;
&lt;br /&gt;
== DLL (Dynamic Link Library) ==&lt;br /&gt;
Are dynamically loadable programs or libraries. In the Unix world, these are typically called &amp;quot;shared objects&amp;quot;.&lt;br /&gt;
Expecco can call into such libraries using elementary DLL-call blocks. These should be used to call driver or utility functions inside a dll, especially if you do not have access to the function&#039;s source code or header definition files.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
See more in [[ElementaryBlock_Element/en#DLL-Calls | Elementary Blocks - DLL Calls]].&lt;br /&gt;
&lt;br /&gt;
== DUT (Device Under Test) ==&lt;br /&gt;
See [[#SUT_.28System_Under_Test.29 | System Under Test]] in this document.&lt;br /&gt;
&lt;br /&gt;
== [[ElementaryBlock Element|Elementary Block]] ==&lt;br /&gt;
An non-compound action block. I.e. any action which is not defined by an activity diagram or keyword list, but either builtin (well known to expecco), a call to an external function or application, or defined programmatically as a piece of textual program code in one of the supported programming languages.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== [[DiagramElements-Step|Elementary Step]] ==&lt;br /&gt;
A step inside an activity diagram, whose action definition is an elementary block. When triggered, such a step will execute either a builtin function, an existing function inside a DLL, another program or a piece of code written in one of the programming languages supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Environment ==&lt;br /&gt;
Variables are bundled together in so called &#039;&#039;Environments&#039;&#039;, which are technically collections of key-value pairs (Dictionary/HashTable). Environments can be attached to individual compound actions, to individual testcases, to a testplan and are also attached to the suite. There are also temporary environments attached to the current execution, the current browser window and the current expecco session.&lt;br /&gt;
&lt;br /&gt;
During execution, environments are linked to form a parent-child hierarchy, and variables are fetched along this hierarchy. Thus, variables declared at the block level may shadow variables at the testplan-level, which may shadow variables declared in the current testsuite.&lt;br /&gt;
&amp;lt;br&amp;gt;Typically, the top-level suite&#039;s environment (so called &amp;quot;&#039;&#039;ProjectEnvironment&#039;&#039;&amp;quot;) is used most of the time.&lt;br /&gt;
&lt;br /&gt;
It should be noted, that command line shell variables are also held in a so called &amp;quot;environment&amp;quot;. In this Wiki, this will be named &amp;quot;shell environment&amp;quot; to avoid confusion. However, it should be noted, that the expecco top-level environment will allow for the shell environment to be referenced (as &amp;quot;$(xxx)&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Environment Freeze Value ==&lt;br /&gt;
A variable attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a value from an environment variable.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.elf&amp;quot; File ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; stands for &amp;quot;&#039;&#039;Expecco Log File&#039;&#039;&amp;quot; and is the native format in which result files are written. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files contain all of the execution, trace and data-flow information and the original suite as executed. &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot;-files can be reloaded at any time into the expecco UI, values of that run be inspected and it is even possible to reexecute the original test. Also, any of the other reports can be regenerated, possibly with different report options (i.e. detail). Technically, &amp;quot;&amp;lt;code&amp;gt;elf&amp;lt;/code&amp;gt;&amp;quot; files are zip-containers containing traces, logs and the original test suite in XML-format, and any attachments (screen shots, measurement data etc.) in whatever format they were written (images usually as PNG). They can be read and processed by third party tools (i.e. unzipped, and then processed with an XSL/XSLT ruleset to generate custom reports or to transport the result to any other XML-capable QM system).&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.ets&amp;quot; File ==&lt;br /&gt;
&amp;quot;&amp;lt;code&amp;gt;ets&amp;lt;/code&amp;gt;&amp;quot; stands for [[#TestSuite Element |&amp;quot;&#039;&#039;Expecco Test Suite&#039;&#039;&amp;quot;]]. These are technically zip-containers, containing the test suite in XML-format and any attachments in whatever format they where imported or generated. In addition, an index (manifest) is present, which allows for fast access to certain information without a need to read the whole zip archive. Also, signatures ensure that the manifest and remaining contents are in sync. Therefore, &amp;quot;&amp;lt;code&amp;gt;.ets&amp;lt;/code&amp;gt;&amp;quot; files should not be manipulated manually, as the consistency of the suite may be harmed.&lt;br /&gt;
&lt;br /&gt;
== expecco ==&lt;br /&gt;
Does the name &amp;quot;expecco&amp;quot; mean anything?&lt;br /&gt;
No, but it is a pun on the latin word &amp;quot;peccare&amp;quot;/&amp;quot;peccō&amp;quot; which means &amp;quot;to make a mistake&amp;quot;, &amp;quot;an error&amp;quot; or &amp;quot;to sin&amp;quot;. So ex-pecco is our answer to get rid of those.&lt;br /&gt;
&lt;br /&gt;
== FMI (Functional Mockup Interface) ==&lt;br /&gt;
see FMU below&lt;br /&gt;
&lt;br /&gt;
== FMU (Functional Mockup Units) ==&lt;br /&gt;
Functional Mockup Units are packaged simulation components, typically written in C (but not required to be), which can be loaded into a simulation framework. FMUs implement a standardized interface (FMI V2.0 / FMI V3.0) and are popular in areas of factory automation, automotive and robotics (see fmi-standard.org https://fmi-standard.org). Starting with release 23, Expecco supports loading, executing and interacting with FMU running both on the local or a remote host.&lt;br /&gt;
&lt;br /&gt;
== Freeze Value ==&lt;br /&gt;
A fix (static) value attached to an action step&#039;s input pin. Instead of being provided via a connection from another output pin, this provides a constant value to an action step&#039;s input.&lt;br /&gt;
Notice that starting with expecco release 19.2, variable references can be embedded inside a String-Freeze-Value using the &amp;quot;&amp;lt;code&amp;gt;$(xxx)&amp;lt;/code&amp;gt;&amp;quot; notation, where &amp;quot;&#039;&#039;xxx&#039;&#039;&amp;quot; is the name of a variable or input pin of the enclosing compound action. See also [[#Environment Freeze Value | Environment Freeze Value]] in this document.&lt;br /&gt;
&lt;br /&gt;
== FTP (File Transfer Protocol) ==&lt;br /&gt;
A [https://datatracker.ietf.org/doc/html/rfc959 standardized protocol] to transfer files between machines. &lt;br /&gt;
&lt;br /&gt;
== Functional ID (FID) ==&lt;br /&gt;
A UUID attached to every action block inside expecco. This identifier is assigned once and never changed again. Inside expecco, actions are referred to via their FID or Version ID, independent of their name. Actions with the same FID are considered to be (possibly different versions) of the same action.&lt;br /&gt;
&lt;br /&gt;
== Gray Box Test ==&lt;br /&gt;
Some knowledge about internal interfaces of the System Under Test are known. For example, data structures or function entries inside the SUT are exploited and used. The categorization of a test as white- or gray box test is vague - there is often no clear line of separation between them.&lt;br /&gt;
&amp;lt;br&amp;gt;See also [[#Black Box Test|Black Box Test]], [[#White Box Test|White Box Test]], [https://en.wikipedia.org/wiki/Gray_box_testing &amp;quot;Gray Box Testing&amp;quot;] in Wikipedia.&lt;br /&gt;
&lt;br /&gt;
== Groovy ==&lt;br /&gt;
A language interpreter which runs on top of a Java Virtual Machine (JVM), with a syntax very similar and almost compatible to Java. Used in expecco to call into Java interfaces or define required callback and listener classes, in case the SUT or the interface to the SUT require those.&lt;br /&gt;
&lt;br /&gt;
Groovy code is compiled to bytecode inside the JVM, which is further Just-in-Time compiled to fast machine code within the target JVM. Thus, it can interface to any Java code (from jar or class files) and it executes at full Java speed.&lt;br /&gt;
&lt;br /&gt;
Expecco allows for Groovy code to be executed both on the local machine (the one on which expecco itself is running) and on remote machines which are reachable via a TCP/IP connection. Multiple of these connections are possible and handled simultaneously in parallel, making it possible to interact with many hosts in a distributed system or when testing both ends of a communication protocol.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== Groovy Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Groovy language. The block&#039;s code will be executed by a Groovy interpreter on a Java Virtual Machine (JVM). The JVM may run either on the local or on a remote machine. Expecco uses code injection techniques to implant the code into the SUT dynamically at run time. Except for sealed systems, it is normally not required to specially instrument or otherwise recompile the code in the SUT.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;java&amp;quot; from the official website (due to legal reasons, we cannot provide a java interpreter with the expecco installer). &lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Groovy Elementary Blocks|&amp;quot;Groovy Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elemens&#039;&#039;]] documentation.&lt;br /&gt;
== GUI (Graphical User Interface) ==&lt;br /&gt;
GUI tests and GUI automation refers to processes which control an/or verify an application which has a graphical user interface, such as a Windows, XWindow, Java, JavaSwing, JavaFX, VNC, QT etc. interface. This also includes mobile devices such as iPhone (IOS) and Android devices. &lt;br /&gt;
&lt;br /&gt;
== GUID (Global Unique Identifier) ==&lt;br /&gt;
A synonym for [[#UUID (Universal Unique Identifier) | UUID]].&lt;br /&gt;
&lt;br /&gt;
== Inconclusive State / Test Outcome ==&lt;br /&gt;
See [[#Verdict| &amp;quot;Verdict&amp;quot;]] in this document.&lt;br /&gt;
== IPC ==&lt;br /&gt;
Short for interprocess communication. Typically a socket, pipe or shared memory.&lt;br /&gt;
&lt;br /&gt;
== IronPython Elementary Action Block ==&lt;br /&gt;
Bridged IronPython actions are supported by expecco. IronPython is a python interpreter which runs inside a DOTNET CLR (Common Language Runtime) environment, and has therefore full access to any .NET framework/assembly. It can be used if .NET interfaces are needed, both under native Windows and under Mono (linux/unix/osx).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;IronPython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== JavaScript Elementary Action Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in a JavaScript like language. The block&#039;s code will be executed inside expecco itself (as opposed to Node-Action-Blocks, which are executed by an external interpreter).&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#JavaScript Elementary Blocks|&amp;quot;JavaScript Elementary Blocks&amp;quot;]] in the &#039;&#039;Expecco API Document&#039;&#039; and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements|&#039;&#039;Tree Elements&#039;&#039;]] documentation.&lt;br /&gt;
&lt;br /&gt;
== JSON ==&lt;br /&gt;
JSON is a common format to exchange structured data, which originated in JavaScript but is now very common and supported by many applications and in almost any programming language. JSON can represent simple (non recursive) objects as textual (i.e. human readable) text, organized as a nested object hierarchy with key-value associations.&lt;br /&gt;
Expecco can read and write JSON both via calls from elementary code and by use of actions from the standard library.&lt;br /&gt;
&amp;lt;br&amp;gt;Because JSON is often used in many other apps, expecco also provides the JSON representation in its data inspector, for easy copy-paste.&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;.json&amp;quot; File ==&lt;br /&gt;
A file containing JSON encoded data. Often used for configuration data.&lt;br /&gt;
&amp;lt;br&amp;gt;Expecco can read and write &amp;quot;json&amp;quot; files, eg. for parameter sets or via action blocks. It is also possible to give a JSON file to the command line, to preset top-level environment variables from it.&lt;br /&gt;
&lt;br /&gt;
== Jython Elementary Action Block ==&lt;br /&gt;
Bridged Jython actions are supported by expecco. Jython is a python interpreter which runs inside a JVM (Java Virtual Machine), and has therefore full access to any Java framework. It can be used as an alternative to Groovy, if Java interfaces are needed.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;jython&amp;quot; from the official website.&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Node Elementary Action Block ==&lt;br /&gt;
Node.js (or &amp;quot;&#039;&#039;NodeJS&#039;&#039;&amp;quot; or simply &amp;quot;&#039;&#039;Node&#039;&#039;&amp;quot;) is a language interpreter for JavaScript, which is used in cloud computing, Alexa, IOT and other internet applications. Node is rapidly gaining interest and many packages are already available, covering a wide range of protocols, file formats and interfaces. Both bridged and scripted Node.js actions are supported, and expecco includes good support for bridged Node.js action blocks, including breakpoints and debugging with single stepping.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;node&amp;quot; and &amp;quot;npm&amp;quot; from the official website: [https://nodejs.org/en/download/ https://nodejs.org/en/download].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco API/en#Node.js_.28Bridged.29_Elementary_Blocks|&amp;quot;NodeJS Elementary Blocks&amp;quot;]] in the Expecco API document and [[ElementaryBlock Element/en|Elementary Block]] in the [[Tree Elements]] documentation.&lt;br /&gt;
&lt;br /&gt;
== OCR (Optical Character Recognition) ==&lt;br /&gt;
Algorithm which (tries to) extract text from a bitmap image. Expecco can use OCR to extract data from screen- and other images,&lt;br /&gt;
and also to automate screen interaction if no higher level UI-interface can be used (see GUI Browser). &lt;br /&gt;
Both commercial and free OCR frameworks can be used and configured. &lt;br /&gt;
Currently a good choice is the free tesseract OCR framework (see [[Installing_additional_Frameworks/en#OCR_.28Optical_Character_Recognition.29 |Installation notes]] and [[Settings_ExternalToolsSettings/en#External_OCR_Tools_Settings | Configuration notes]].&lt;br /&gt;
&lt;br /&gt;
== OPC-UA (Open Platform Communications Unified Architecture) ==&lt;br /&gt;
Is an industry standard for communication in factory automation and machine control. &lt;br /&gt;
See [https://opcfoundation.org/about/opc-technologies/opc-ua https://opcfoundation.org/about/opc-technologies/opc-ua/].&lt;br /&gt;
&lt;br /&gt;
== Pin - Consuming Pin ==&lt;br /&gt;
An input pin of a step, which does consume its input value when the step starts to execute.&lt;br /&gt;
Technically, this takes the next input value from the queued values pending in the input-basket.&lt;br /&gt;
Consuming pins are used when an input pin gets its value from another step&#039;s output pin.&lt;br /&gt;
&lt;br /&gt;
== Pin - Mailbox (or Telegram) Pin ==&lt;br /&gt;
An input pin of a step, which is delivered to an activity even when it is already executing. Normal pins take their value from an input basket associated with the input pin, and values which arrive after the start of the activity will be held in the basket (queued) for the next activation.&lt;br /&gt;
In contrast, mailbox pins do not enqueue their incoming values, but instead deliver them immediately to the activity - if it is already running. If the activity is not running, mailbox pins behave like regular unbuffered pins, being triggering or not (but typically, they are triggering).&amp;lt;br&amp;gt;Mailbox baskets are typically used to cancel or break out of a loop, eg. in a service providing action block. I.e. they can be used to implement a cancel-pin function, where internal cleanup actions are still needed.&lt;br /&gt;
&lt;br /&gt;
== Pin - Parameter Pin ==&lt;br /&gt;
An input pin of a step, which does not consume its input value and which does not trigger the step.&lt;br /&gt;
Used for constants and parameters, especially if the step is to be used in a loop.&lt;br /&gt;
&lt;br /&gt;
== Pin - Triggering Pin ==&lt;br /&gt;
An input pin of a step, which triggers the execution of a step.&lt;br /&gt;
A step will only start to execute, when all of its triggering pins have received a value.&lt;br /&gt;
&lt;br /&gt;
== Python Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Python actions are supported by expecco, and also both Python2.x and Python3.x can be used inside the same suite (in addition to Jython and IronPython).&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;python&amp;quot; and &amp;quot;pip&amp;quot; from the official website: [https://www.python.org/downloads https://www.python.org/downloads]. (see also [[Installing_additional_Frameworks/en#Python_Installation|Installing Additional Frameworks]])&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Python_Elementary_Blocks|&amp;quot;Bridged Python Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== R Script Action Block ==&lt;br /&gt;
R is a programming language which emphasizes on statistics, math and graph plotting.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;r&amp;quot; from the official website (see [[Installing_additional_Frameworks/en#R_Installation|Installing Additional Frameworks]]).&lt;br /&gt;
&lt;br /&gt;
== RPC (Remote Procedure Call) ==&lt;br /&gt;
A mechanism by which expecco calls into an external program, such as a Python, NodeJS or C program.&lt;br /&gt;
When a remote procedure call is performed, the name of the operation plus any arguments are packed into a message, transferred to the partner, executed there and finally any results packed again into an answer and transferred back to expecco.&amp;lt;br&amp;gt;Thus there is some overhead and the execution is slower than if directly performed by expecco. Typically a no-operation round trip executes in the order of micro- or even milliseconds, whereas internal operations execute in the order of nano- or microseconds. I.e. roughly 1000 times faster. However, if the actual processing takes long compared to the transmission overhead, or if the partner has exclusive access to some device or software framework, a remote procedure call might be the only mechanism, by which a task can be accomplished.&lt;br /&gt;
&lt;br /&gt;
== REST (Representational State Transfer) ==&lt;br /&gt;
REST is a remote procedure call mechanism based on JSON encoded packages which are typically (but not required to be) transmitted via HTTP. REST was created (probably) out of frustration of SOAP&#039;s complexity.&lt;br /&gt;
&lt;br /&gt;
== Ruby Elementary Action Block ==&lt;br /&gt;
Both bridged and scripted Ruby actions are supported by expecco.&lt;br /&gt;
&amp;lt;br&amp;gt;You have to install &amp;quot;ruby&amp;quot; from the official website [https://rubyinstaller.org/downloads https://rubyinstaller.org/downloads].&lt;br /&gt;
&amp;lt;br&amp;gt;See [[Expecco_API/en#Bridged_Ruby_Elementary_Blocks|&amp;quot;Bridged Ruby Elementary Blocks&amp;quot;]] in the Expecco API document.&lt;br /&gt;
&lt;br /&gt;
== Script Actions ==&lt;br /&gt;
&lt;br /&gt;
Script actions are actions written in one of the supported scripting languages, including Shell, Batch, Powershell, Node.js, Python, Ruby, GnuPlot, R, TCL, Go and others.&lt;br /&gt;
In contrast to &amp;quot;&#039;&#039;bridged actions&#039;&#039;&amp;quot;, these are called as host-commands, where a new interpreter is&lt;br /&gt;
started for every action invokation. This has the advantage, that any existing script can be&lt;br /&gt;
easily used/embedded into a testsuite, but the disadvantage that the action&#039;s execution is somewhat slowed down due to the startup/shutdown times of the external interpreter, and that no state (open files, connections, objects etc.) can be passed from one action to another.&lt;br /&gt;
&lt;br /&gt;
== Shell/Batch Script Elementary Block ==&lt;br /&gt;
An action block which is defined by a shell (or batch) script which is written in a shell command-line-interpreter language. The block&#039;s code will be executed outside expecco, by a script interpreter.&lt;br /&gt;
See [[ElementaryBlock_Element#Shell Script Blocks|&amp;quot;ShellScript Elementary Blocks&amp;quot;]] in the expecco [[ElementaryBlock_Element | elementary block documentation]].&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Programming Language ==&lt;br /&gt;
A pure object oriented language, with sophisticated reflection and meta programming features. See [https://en.wikipedia.org/wiki/Smalltalk Smalltalk in Wikipedia]&lt;br /&gt;
&lt;br /&gt;
== Smalltalk Elementary Block ==&lt;br /&gt;
An action block which is defined by an execute function which is written in the Smalltalk language. The block&#039;s code is usually executed inside expecco itself, but it is also possible to define bridged Smalltalk actions, which execute inside another Smalltalk process (local or remote).&lt;br /&gt;
See [[Expecco_API#Smalltalk_Elementary_Blocks|&amp;quot;Smalltalk Elementary Blocks&amp;quot;]] in the Expecco API Documentation.&lt;br /&gt;
&lt;br /&gt;
== Smalltalk/X ==&lt;br /&gt;
[https://www.smalltalk-x.de Smalltalk/X] (&amp;quot;&#039;&#039;ST/X&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from exept / Claus Gittinger. Smalltalk/X is an ANSI compatible [https://en.wikipedia.org/wiki/Smalltalk Smalltalk] implementation with some extensions and both just-in-time and ahead-of-time compilation support (ahead-of-time means that dlls with compiled machine code can be built). ST/X is the base on which expecco and expeccoALM/AIDYMO are built.&lt;br /&gt;
&lt;br /&gt;
== SOAP (Simple Object Access Protocol) ==&lt;br /&gt;
SOAP is a remote procedure call mechanism based on XML encoded packages which are typically (but not required to be) transmitted via HTTP. The name is a euphemism: SOAP is not (no longer) simple: to be used with ease, a huge XML framework lies underneath, which extracts details for a call from a specification written in WSDL (which is also XML with a complex structure, incl. datatype definitions).&lt;br /&gt;
&lt;br /&gt;
== SSDP (Simple Service Discovery Protocol) ==&lt;br /&gt;
Also known as UPnP, the SSDP protocol announces the availability of services via broadcast UDP packages. See [https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol Wikipedia SSDP].&lt;br /&gt;
&lt;br /&gt;
== SSL (Secure Socket Layer)==&lt;br /&gt;
Encrypted and authenticated communication. Expecco includes a pure Smalltalk implementation which is safe from buffer overflows.&lt;br /&gt;
&lt;br /&gt;
== ST/X==&lt;br /&gt;
Short for &amp;quot;Smalltalk/X&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Stderr ==&lt;br /&gt;
Short for &amp;quot;Standard Error&amp;quot;. This is any program&#039;s standard error output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stderr to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;2:&amp;quot; and colorized in red (to indicate that this is text from stderr, as opposed to stdout). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Stdin ==&lt;br /&gt;
Short for &amp;quot;Standard Input&amp;quot;. This is any program&#039;s standard input stream. If running in a console window, your typed input is available to the program via this stream. If running without a console window, the program will typically detect an End of File (EOF) condition when reading.&lt;br /&gt;
If expecco starts other programs, you have the option of providing input to the program; either on the very lowest programatic level or via an input pin in an action step.&lt;br /&gt;
&lt;br /&gt;
== Stdout ==&lt;br /&gt;
Short for &amp;quot;Standard Output&amp;quot;. This is any program&#039;s standard output stream. If running in a console window, this is typically displayed there. If running without a console window it may be lost or redirected into a logfile.&lt;br /&gt;
If expecco starts other programs, you have the option of redirecting their stdout to the expecco Transcript (which is the expecco console). There, this will be prefixed by &amp;quot;1:&amp;quot; and colorized in blue (to indicate that this is text from stdout, as opposed to stderr). The setting is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Settings&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Execution&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Tracing&#039;&#039;&amp;quot; &amp;amp;#8594; &amp;quot;&#039;&#039;Show Stdout/Stderr in Transcript&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== SUT (System Under Test) ==&lt;br /&gt;
The tested system.&lt;br /&gt;
&lt;br /&gt;
Expecco interacts with this either in a pure [[#Black Box Test | Black Box]] fashion (i.e. only talking to external interfaces), or  [[#Gray Box Test|Gray Box]] or [[#White Box Test|White Box]] fashion (some or a lot of knowledge about internals of the SUT are known).&lt;br /&gt;
&lt;br /&gt;
Technically, Black Box tests interact with the SUT via (more or less official) external interfaces, such as messages, documents, communication interfaces, GUI interaction etc.&lt;br /&gt;
&lt;br /&gt;
White Box tests can access data structures and interfaces internal to the SUT.&lt;br /&gt;
&lt;br /&gt;
In expecco, White Box Tests are done by implanting code into the SUT. Depending on the type of technology and environment used, this code injection (or instrumentation) may be possible dynamically (Java, .NET, Python, Node.js) or has to be done statically by linking expecco-support libraries to the program (C, C++). Static binding is typically required for embedded devices, where the code is stored in non-writable memory. &lt;br /&gt;
&lt;br /&gt;
Some companies (especially if hardware is involved) use the alternative term &amp;quot;DUT&amp;quot; (for &amp;quot;&#039;&#039;Device under Test&#039;&#039;&amp;quot;) instead.&lt;br /&gt;
&lt;br /&gt;
== Syntactic Sugar ==&lt;br /&gt;
A feature of (typically) a programming language, which does not give you more semantic features (aka &amp;quot;&#039;&#039;functionality&#039;&#039;&amp;quot;), but instead exists for the convenience of the user.&amp;lt;br&amp;gt;Typically &amp;quot;&#039;&#039;syntactic sugar&#039;&#039;&amp;quot; designates a feature which is easier to use or shorter to write, but which could also be defined in terms of other features of the language - albeit possibly more clumsy.&amp;lt;br&amp;gt;In expecco, a number of syntactic sugar constructs are available, which could also be described in terms of regular action blocks. For example, the &amp;quot;attachment step&amp;quot;, &amp;quot;shell step&amp;quot; and even &amp;quot;Groovy&amp;quot; steps could be also defined in terms of regular elementary blocks which read a file, start a shell or talk to a JVM respectively.&amp;lt;br&amp;gt;In the Smalltalk programming language, the brace-construct &amp;quot;{ expr1 . expr2 . ... exprN }&amp;quot; is syntactic sugar for Array-instantiation &amp;quot;(Array new:sz) at:1 put:expr1; ... at:n put:exprN; yourself&amp;quot; (btw: you don&#039;t have to understand this, to use expecco).&lt;br /&gt;
&lt;br /&gt;
== Tag ==&lt;br /&gt;
A token (word) attached to an element. Multiple tags can be attached and are used to search, group or otherwise mark tree items, steps and other elements of the test suite. For example, you can define an icon to be shown in the left project tree if the item has a particular tag.&lt;br /&gt;
&lt;br /&gt;
== Tagged Value ==&lt;br /&gt;
A tuple consisting of a token plus value, and an optional type. Similar to tags, these can be attached to an element. Expecco does not use tagged values (*). They are created when suites are imported from some external tools, stored with the suite and passed back transparently to the tool.&lt;br /&gt;
&amp;lt;br&amp;gt;*) this may no longer be true, by the time of reading.&lt;br /&gt;
&lt;br /&gt;
== Testplan Element ==&lt;br /&gt;
A &amp;quot;&#039;&#039;Test Plan&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;Testplan&#039;&#039;&amp;quot; is an item in the project tree, which contains a list of test case items to be executed in sequence. A test plan&#039;s items are called &amp;quot;&#039;&#039;Test Cases&#039;&#039;&amp;quot; and each is implemented by an action (elementary or compound). It is also possible to drag another test plan as item into a test plan, to combine multiple tests plans into master test plans. A suite may therefore contain multiple test plans. When started without user interaction, the test plan(s) to be executed can be chosen via the command line or via a remote service request.&lt;br /&gt;
&lt;br /&gt;
== [[TestSuite Element | Testsuite Element]] ==&lt;br /&gt;
&amp;quot;&#039;&#039;Test suite&#039;&#039;&amp;quot; or occasionally &amp;quot;&#039;&#039;Testsuite&#039;&#039;&amp;quot; is the term used for a packaged test project. It contains a collection of [[Tree_Elements| Tree Elements]] like test plans, blocks and datatypes as well as optional resources, attachments and documentation. &lt;br /&gt;
&lt;br /&gt;
Test suites can be imported into other test suites and can therefore be used as libraries for reuse. When a suite is imported into another suite, all of the imported elements are visible and usable inside the importing suite.&lt;br /&gt;
&lt;br /&gt;
Typically, suites are organized in a hierarchical fashion, and low-level functions (device control and access, protocols, data format handling etc.) are packaged into separate libraries, which are used by higher level component test and support actions, which are then further reused by system-, acceptance or end-to-end test scenarios.&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
The &amp;quot;&#039;&#039;Transcript Window&#039;&#039;&amp;quot; is the expecco console window, which can be opened via &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Transcript&#039;&#039;&amp;quot;. If open, both information messages from expecco and explicit Transcript action messages will appear there. The standard library provides a number of action blocks eg. to send messages and to clear the transcript window. Messages can also be sent to it from elementary code (both internal and bridged).&amp;lt;br&amp;gt;If not open, those messages will be sent to &amp;quot;stderr&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
== UI (User Interface) ==&lt;br /&gt;
Ususally a synonym for GUI (Graphical User Interface)&lt;br /&gt;
&lt;br /&gt;
== UUID (Universal Unique Identifier) ==&lt;br /&gt;
An identifier (aka name) which is generated to be globally unique (with very very high probability, to be precise). These are generated and attached to elements of the suite (actions, types, etc.) to ensure that expecco will always be able to correctly identify if two elements from different suites (and/or different people) represent the same thing or not.&lt;br /&gt;
&amp;lt;br&amp;gt;Technically, they are generated by generating a big number, containing a microsecond timestamp, the network address and a big random number, so that two separately generated UUIDs are very very likely to be different. Internally, expecco uses these IDs to reference other elements, thus being tolerant against name changes, layout changes and structure changes (added pins, for example), etc.&amp;lt;BR&amp;gt;Also, expecco can quickly determine if two objects (suites, actions, steps, runs, etc.) represent the same object or not.&lt;br /&gt;
&lt;br /&gt;
Be aware that expecco treats two projects (as loaded from an ETS file) as two versions of the same project iff they have the same functional ID (but different version IDs). Thus, simply saving a project under a different name does not create a new project, and the two cannot be imported both into another project.&lt;br /&gt;
&lt;br /&gt;
== Verdict ==&lt;br /&gt;
&lt;br /&gt;
The execution&#039;s summary-outcome-status from running a test plan, test case or action. In addition to detail information (traces, data, execution time, log-messages), every execution in expecco will always return one of 4 values as a summary status:&lt;br /&gt;
* &#039;&#039;&#039;PASSED&#039;&#039;&#039; (green)&amp;lt;br&amp;gt;if all went well, and the execution did not encounter any problems&lt;br /&gt;
* &#039;&#039;&#039;FAIL&#039;&#039;&#039; (red)&amp;lt;br&amp;gt;the execution detected an error in the [[#SUT (System Under Test)| System Under Test (SUT)]]. &lt;br /&gt;
:For example, it measured a wrong/unexpected value, detected invalid behavior, invalid protocol behavior etc.&lt;br /&gt;
:Usually, this means that the developer of the tested system is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;ERROR&#039;&#039;&#039; (dark red)&amp;lt;br&amp;gt;the test itself ran into some error. &lt;br /&gt;
:This means that during the test&#039;s execution, an error occurred inside expecco or one of the user-defined action blocks. An ERROR state does not provide information about the SUT&#039;s state; instead, the test has a problem. &lt;br /&gt;
:For example, if a file containing test-data could not be found or a division by zero or an index out of bounds error occurred etc.&lt;br /&gt;
:Usually, this means that the developer of the test is to be informed.&lt;br /&gt;
* &#039;&#039;&#039;INCONCLUSIVE&#039;&#039;&#039; (gray)&amp;lt;br&amp;gt;the test had no chance to perform its testing operation(s). &lt;br /&gt;
:For example, if a machine could not be reached in the network, if it was not powered up or if a resource (operator, measurement device, test-device etc.) was not available, etc. Also, tests or actions which have not been executed (eg. skipped) are marked as inconclusive.&lt;br /&gt;
:Usually, this means that the test manager is to be informed.&lt;br /&gt;
&lt;br /&gt;
The distinction is very useful as it should be kept in mind, that a test-manager/tester has to react differently depending on the reason for a test not resulting in a PASSED state:&lt;br /&gt;
* for a FAIL, (s)he has to inform the developer of the SUT, to fix the problem in the product.&lt;br /&gt;
* for an ERROR, the test-developer/analyst has to be informed to fix the problem in the test-case&lt;br /&gt;
* for INCONCLUSIVE, the test-manager, network administrator or test-lab-manager has to check for the availability of required devices , connections, power supply etc.&lt;br /&gt;
:After that, the test can be rerun without a need to contact either the product-development, nor the test-development team.&lt;br /&gt;
&lt;br /&gt;
Notice, that many test systems/frameworks only provide PASS/NOT PASS information as final verdict. &lt;br /&gt;
&amp;lt;br&amp;gt;If expecco is to be integrated into such a framework, FAIL, ERROR and INCONCLUSIVE will all be treated as NON-PASS (e.g. when running under the control of Jenkins, QC, Polarion etc.)&lt;br /&gt;
&lt;br /&gt;
If expecco is executed under the control of expeccoALM/Aidymo, the responsible person is chosen as per verdict and informed.&lt;br /&gt;
&lt;br /&gt;
== VersionID (VID) ==&lt;br /&gt;
Every item within expecco (action, type, testcase, testplan, the suite itself etc.) has an associated unique identifier, which is guaranteed to be world-wide unique (a so called &amp;quot;&#039;&#039;UUID&#039;&#039;&amp;quot;). This guarantees, that these objects can be uniquely identified, even if renamed, or if the same name is used for an action, type etc. in two different test suites. Thus, two suites can always be merged and suites can always be imported without name conflicts.. expecco will internally always refer to any object by its ID, never by its name. The versionID is updated with every change made to an object. Thus it is guaranteed, that no two different objects have the same ID. And vice versa, that the equality (actually identity) can always be checked via the ID.&lt;br /&gt;
&lt;br /&gt;
== VisualWorks ==&lt;br /&gt;
VisualWorks (&amp;quot;&#039;&#039;VW&#039;&#039;&amp;quot;) is the brand name of a Smalltalk programming language environment from Cincom, a US based company. Starting with expecco 20.2, VisualWorks bridged blocks and VisualWorks GUI tests are supported by expecco.&lt;br /&gt;
&lt;br /&gt;
== White Box Test ==&lt;br /&gt;
Designates a test which executes within the &#039;&#039;System Under Test&#039;&#039; and/or uses or refers to (but also depends on) the internals of the [[#SUT|SUT (System Under Test)]]. The test directly creates or manipulates data objects inside the SUT and/or calls internal functions. Most unit tests are typically implemented as white box tests (but not required to be so).&lt;br /&gt;
&lt;br /&gt;
White Box Tests have both advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
*+ because they know the internals, more of internal details can be tested, and more of existing internal utilities can be used as utility in the test. For example, data definitions, data structures, functions and interfaces etc. can be accessed from the test system. Depending on the type of test and the available frameworks which can be &amp;quot;white-boxed&amp;quot;, this may save a lot of test-development time, because those interfaces need not be reimplemented in the test system.&lt;br /&gt;
&lt;br /&gt;
*- because they know the internals, they are also more reliant on them, and may also suffer from bugs in the internal frameworks. For one, if data structures and internal interfaces change, the white box test usually has to change with it. Whereas external interfaces usually remain more stable - especially if they are based on communication or data format standards. The other downside is that if internal interfaces of the SUT are heavily used, bugs in them are also injected into the test system. This may make some of the bugs invisible and undetectable to the test system. For example, if a communication data structure (say, a message or document format) is always accessed via a white-boxed SUT interface, but never actually tested physically, any bug in that framework will go unnoticed to both the SUT and to the test system. Both the SUT and the test system may see perfect data, while the data sent to the outside world may still be completely bogus.&lt;br /&gt;
&lt;br /&gt;
In a real world test system, you would usually use a combination of whitebox and blackbox tests. The level of insider-knowledge of the whitebox test depends on the type of SUT, the risk analysis and trust in the frameworks being used.&lt;br /&gt;
&lt;br /&gt;
It is common, that modules and components are first tested by the developers using Unit Tests (which are usually White Box Tests) and then passed on to integrators to check the interaction between modules using Black Box Tests.&lt;br /&gt;
But there is no sharp boundary and often a mix of both is needed in practice (aka &amp;quot;Grey Box Tests&amp;quot;).   &lt;br /&gt;
&lt;br /&gt;
See also: [[#Black Box Test|Black Box Test]], [[#Gray Box Test|Gray Box Test]], &lt;br /&gt;
[https://en.wikipedia.org/wiki/White-box_testing &amp;quot;White-box_testing&amp;quot; (wikipedia) ]&lt;br /&gt;
&lt;br /&gt;
== Workspace (or Notepad) ==&lt;br /&gt;
&lt;br /&gt;
This is a [[Tools_Notepad/en | tool]] which is found in &amp;quot;&#039;&#039;Extras&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; &amp;amp;#8594;  &amp;quot;&#039;&#039;Notepad&#039;&#039;&amp;quot;. The name is a bit misleading and this should not be confused with the Windows &amp;quot;Notepad&amp;quot; application (therefore, it is also named &amp;quot;Workspace&amp;quot; in the documentation, although this again may lead to confusion, as &amp;quot;workspace&amp;quot; is often used with a different meaning in other contexts, such as the Eclipse IDE).&lt;br /&gt;
&lt;br /&gt;
In expecco, a &#039;&#039;Workspace&#039;&#039; is a little text editor, which can also evaluate snippets written in either Smalltalk or JavaScript. It also provides a number of bulk string processing operations in its edit menu.&lt;br /&gt;
&lt;br /&gt;
Whenever you have to manipulate text, a workspace is a useful edit-tool to perform such tasks (of course, you can use any other editor, if you prefer so, but startup times of external editors are often much longer, than the time it takes expecco to open its internal tools).&lt;br /&gt;
&lt;br /&gt;
[[Tools_Notepad/en | Workspaces]] and all other editors in expecco (incl. the FileBrowser, Data Inspector and Elementary Action code editors) are all based on a common editor base class and have common behavior. Take a look at the popup menu to see what functionality is provided: beside the usual stuff, it can sort text, by columns, filter lines, transform lines and many more. &lt;br /&gt;
&lt;br /&gt;
Especially useful are the &amp;quot;&#039;&#039;Open FileBrowser&#039;&#039;&amp;quot; and &amp;quot;&#039;&#039;Open URL&#039;&#039;&amp;quot; menu functions (found deeper down in the &amp;quot;&#039;&#039;Tools&#039;&#039;&amp;quot; submenu). Whenever you find a filename or URL in some text, these will quickly open the document for you.&lt;br /&gt;
&lt;br /&gt;
= Abbreviations =&lt;br /&gt;
&lt;br /&gt;
Commonly used abbreviations in this documentation Wiki are:&lt;br /&gt;
&lt;br /&gt;
* ALM - Application Lifecycle Management&lt;br /&gt;
* B2B - Business to Business&lt;br /&gt;
* BD - (Action-) Block Description&lt;br /&gt;
* CB - Compound Block&lt;br /&gt;
* &amp;quot;.csf&amp;quot; - Connection Settings File (file suffix)&lt;br /&gt;
* &amp;quot;.csv&amp;quot; - Comma Separated Values File (file suffix)&lt;br /&gt;
* DCE - Distributed Computing Environment (an RPC mechanism)&lt;br /&gt;
* DLL - Dynamic Link Library (a synonym for &amp;quot;SO&amp;quot; = Shared Object); also a file suffix &amp;quot;.dll&amp;quot;&lt;br /&gt;
* DUT - Device Under Test&lt;br /&gt;
* EB - Elementary Block&lt;br /&gt;
* &amp;quot;.elf&amp;quot; - Expecco Log File (file suffix)&lt;br /&gt;
* &amp;quot;.ets&amp;quot; - Expecco Test Suite (file suffix)&lt;br /&gt;
* FID - Functional ID&lt;br /&gt;
* FTP - File Transfer Protocol (a standard internet protocol)&lt;br /&gt;
* GUI - Graphical User Interface; also sometimes simply &amp;quot;UI&amp;quot;&lt;br /&gt;
* HTTP - Hypertext Transfer Protocol (web page transfer protocol)&lt;br /&gt;
* QM - Quality Management&lt;br /&gt;
* RPC - Remote Procedure Call&lt;br /&gt;
* &amp;quot;.png&amp;quot; - a bitmap image file format (file suffix)&lt;br /&gt;
* SO - Shared Object (a synonym for DLL); also as file suffix &amp;quot;.so&amp;quot;&lt;br /&gt;
* SOAP - Simple Object Access Protocol (a not so simple protocol)&lt;br /&gt;
* SSDP - Simple Service Discovery Protocol&lt;br /&gt;
* SUT - System Under Test&lt;br /&gt;
* UI - User Interface (often actually meaning: Graphical-UI)&lt;br /&gt;
* URL - Unified Resource Locator (typically used with web-Browsers)&lt;br /&gt;
* UUID - Universal Unique Identifier&lt;br /&gt;
* VID - Version ID&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31358</id>
		<title>Remote Access/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31358"/>
		<updated>2026-06-06T07:13:14Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* SSH and SFTP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Remote Access/en|label=English}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote access&#039;&#039;&#039; is the ability to drive a remote computer or&lt;br /&gt;
network from this expecco image — opening shells, running commands,&lt;br /&gt;
moving files, or driving a test target.  Three protocol families are&lt;br /&gt;
supported, listed in current-recommended order:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SSH and SFTP&#039;&#039;&#039; (recommended) — encrypted shell + secure file transfer over an SSH-2 tunnel.  Pure-Smalltalk implementation in &amp;lt;code&amp;gt;exept:libcrypt/ssh&amp;lt;/code&amp;gt;; no external dependency on OpenSSL or libssh.  Use this for anything that touches credentials or sensitive payloads.&lt;br /&gt;
* &#039;&#039;&#039;Local Command Shell&#039;&#039;&#039; — fork + exec on the local machine. Used for local-tool integration and for the local end of a remote workflow that bridges via another protocol.&lt;br /&gt;
* &#039;&#039;&#039;Telnet&#039;&#039;&#039; (legacy) — plain-text terminal session.  No encryption, passwords on the wire in clear.  Use only when the target hardware has no other option.&lt;br /&gt;
&lt;br /&gt;
= SSH and SFTP =&lt;br /&gt;
&lt;br /&gt;
The SSH stack covers the full SSH-2 protocol (RFC 4251–4254,&lt;br /&gt;
RFC 5656, RFC 8709, RFC 8731) plus OpenSSH&#039;s chacha20-poly1305&lt;br /&gt;
transport cipher and the SFTP v3 file-transfer subsystem&lt;br /&gt;
(draft-ietf-secsh-filexfer-02).&amp;lt;br&amp;gt;Two layers:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt;&#039;&#039;&#039; — programmatic SSH access&amp;lt;br&amp;gt;(remote &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, TTY shell, agent forwarding, ProxyJump bastion).&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt;&#039;&#039;&#039; — a &amp;lt;code&amp;gt;Filename&amp;lt;/code&amp;gt; subclass&amp;lt;br&amp;gt;that lets the rest of ST/X treat a remote SFTP path the same way it treats a local file.&lt;br /&gt;
&lt;br /&gt;
The rest of this section is organised user-task-first: what the user&lt;br /&gt;
sees and does, the expecco-library hooks below that, then the&lt;br /&gt;
implementation detail at the end for the curious.&lt;br /&gt;
&lt;br /&gt;
== From the FileBrowserV2 ==&lt;br /&gt;
&lt;br /&gt;
Open the location dropdown and paste an &amp;lt;code&amp;gt;sftp://&amp;lt;/code&amp;gt; URL.&lt;br /&gt;
The browser tab populates as if it were a local path.  Tree&lt;br /&gt;
expansion, column sort (name / size / mtime), preview, and&lt;br /&gt;
double-click-to-open-in-editor all behave normally.  The first&lt;br /&gt;
click on a host takes ~200–500 ms (TCP + KEX + auth); subsequent&lt;br /&gt;
clicks reuse the pooled connection.&lt;br /&gt;
&lt;br /&gt;
URL syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sftp://[user@]host[:port]/remote/path&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
User defaults to the local login name, port to 22, path to&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Refresh&#039;&#039;&#039; button in the toolbar (the round-arrow icon&lt;br /&gt;
between &#039;&#039;Forward&#039;&#039; and &#039;&#039;DirectoryUp&#039;&#039;) re-reads both the&lt;br /&gt;
directory tree and the contents pane on demand.  Works uniformly&lt;br /&gt;
for local and SFTP paths; for SFTP it also flushes the per-file&lt;br /&gt;
STAT cache, so changes made directly on the remote side become&lt;br /&gt;
visible immediately rather than waiting for the 5-second cache TTL&lt;br /&gt;
to expire.&lt;br /&gt;
&lt;br /&gt;
The small arrow next to the Refresh icon opens a dropdown with a&lt;br /&gt;
single checkbox, &#039;&#039;&#039;Automatic Refresh&#039;&#039;&#039;, controlling the&lt;br /&gt;
background polling task that walks every expanded tree item to&lt;br /&gt;
detect external changes.  The default depends on the current root:&lt;br /&gt;
&lt;br /&gt;
* Local filesystem &amp;amp;rarr; &#039;&#039;&#039;on&#039;&#039;&#039; (10-second cycle, matches the long-standing behaviour).&lt;br /&gt;
* SFTP &amp;amp;rarr; &#039;&#039;&#039;off&#039;&#039;&#039;.  Each cycle costs one STAT round-trip per child, which is fine for a handful of local directories but painful over the network.  Click Refresh manually when you need to pick up remote changes.&lt;br /&gt;
&lt;br /&gt;
When you navigate between local and SFTP roots the toggle flips&lt;br /&gt;
automatically &amp;amp;mdash; but only if you haven&#039;t overridden it for&lt;br /&gt;
the previous root.  An explicit user choice is preserved across&lt;br /&gt;
navigations.&lt;br /&gt;
&lt;br /&gt;
The Tools menu offers four browser actions, three of them gated on&lt;br /&gt;
the SSH library being loaded:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Generate SSH Key Pair...&#039;&#039;&#039; — opens the same key-generation dialog described under [[#Generating an SSH key pair]] below.&lt;br /&gt;
* &#039;&#039;&#039;SSH Connect...&#039;&#039;&#039; — opens an interactive VT100 terminal to a remote host.&lt;br /&gt;
* &#039;&#039;&#039;SFTP Connect...&#039;&#039;&#039; — points this browser tab at a remote filesystem via SFTP.&lt;br /&gt;
* &#039;&#039;&#039;Filesystem Info...&#039;&#039;&#039; — shows size, free space and usage of the filesystem holding the currently displayed directory.  Works uniformly for local paths and SFTP paths; for SFTP it requires the server to advertise the &amp;lt;code&amp;gt;statvfs@openssh.com&amp;lt;/code&amp;gt; extension (every modern OpenSSH does).  Sizes are reported in IEC binary units (MiB, GiB, TiB) — the largest unit yielding a value ≥ 1 is chosen, so a TB-scale volume reads as &#039;&#039;X TiB&#039;&#039; rather than &#039;&#039;10240 GiB&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== From expecco actions ==&lt;br /&gt;
&lt;br /&gt;
The Expecco RemoteAccess plugin&lt;br /&gt;
([[Expecco::RemoteAccessImportPlugin]]) exposes the following test&lt;br /&gt;
actions to the expecco action palette:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CmdShell - Open SSH Remote Connection&#039;&#039;&#039; — opens an SSH session via the platform&#039;s &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; binary (PuTTY&#039;s&lt;br /&gt;
&amp;lt;code&amp;gt;plink&amp;lt;/code&amp;gt; on Windows).&lt;br /&gt;
* &#039;&#039;&#039;CmdShell - Open SSH Remote Connection and PublicKey&#039;&#039;&#039; — same but with explicit public-key authentication.&lt;br /&gt;
&lt;br /&gt;
To run these you need a configured keypair (private key on this&lt;br /&gt;
machine, public key in the remote host&#039;s&lt;br /&gt;
&amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt;).  Generate one via the dialog&lt;br /&gt;
below or via &amp;lt;code&amp;gt;ssh-keygen&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The plugin also adds a settings page at &#039;&#039;&#039;Extras → Settings →&lt;br /&gt;
Plugins → Remote Access — SSH Keys&#039;&#039;&#039; carrying a single&lt;br /&gt;
&#039;&#039;&#039;Generate SSH Key Pair...&#039;&#039;&#039; button that opens the same dialog.&lt;br /&gt;
&lt;br /&gt;
== Generating an SSH key pair ==&lt;br /&gt;
&lt;br /&gt;
=== The dialog (FileBrowserV2 / settings page) ===&lt;br /&gt;
&lt;br /&gt;
The dialog asks for all parameters in one form:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Comment&#039;&#039;&#039; — embedded in the generated key (defaults to&lt;br /&gt;
&amp;lt;code&amp;gt;stx@&amp;amp;lt;hostname&amp;amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &#039;&#039;&#039;Storage&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;Save to disk file only&#039;&#039; — writes &amp;lt;code&amp;gt;~/.ssh/id_ed25519_stx&amp;lt;/code&amp;gt; (or wherever) plus a matching &amp;lt;code&amp;gt;.pub&amp;lt;/code&amp;gt; companion.&lt;br /&gt;
** &#039;&#039;Save to disk AND load into ssh-agent&#039;&#039; — writes the file and also hands the key to the running ssh-agent.&lt;br /&gt;
** &#039;&#039;Load into ssh-agent only&#039;&#039; — key lives in agent memory only; gone on agent restart.&lt;br /&gt;
* &#039;&#039;&#039;Private key file&#039;&#039;&#039; — full path; disabled in agent-only mode.&lt;br /&gt;
* &#039;&#039;&#039;Passphrase / Confirm&#039;&#039;&#039; — empty leaves the on-disk file unencrypted (agent-only mode ignores the passphrase, since the OpenSSH agent wire protocol carries only the decrypted key).&lt;br /&gt;
&lt;br /&gt;
On &#039;&#039;&#039;Generate&#039;&#039;&#039;, the public-key line (the same&lt;br /&gt;
&amp;lt;code&amp;gt;ssh-ed25519 AAAA... comment&amp;lt;/code&amp;gt; string ssh-keygen&lt;br /&gt;
emits) is copied to the system clipboard for pasting into the&lt;br /&gt;
remote host&#039;s &amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== From a workspace ===&lt;br /&gt;
&lt;br /&gt;
For headless deployments, sandboxed builds, or scripts,&lt;br /&gt;
&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; exposes a pure-Smalltalk key generator&lt;br /&gt;
that produces output bit-compatible with&lt;br /&gt;
&amp;lt;code&amp;gt;ssh-keygen -t ed25519&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| seed comment priv |&lt;br /&gt;
seed    := SSH::Client generateEd25519Seed.&lt;br /&gt;
comment := &#039;stx@&#039;, OperatingSystem getHostName.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ Save passphrase-encrypted to disk&amp;quot;&lt;br /&gt;
priv := (Filename homeDirectory / &#039;.ssh&#039; / &#039;id_ed25519_stx&#039;) pathName.&lt;br /&gt;
SSH::Client&lt;br /&gt;
    saveOpenSshEd25519Seed:seed&lt;br /&gt;
    toFile:priv&lt;br /&gt;
    comment:comment&lt;br /&gt;
    passphrase:&#039;choose-something-long&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ AND load into the running agent&amp;quot;&lt;br /&gt;
SSH::Client addEd25519SeedToAgent:seed comment:comment.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ Print the public-key line to paste into authorized_keys&amp;quot;&lt;br /&gt;
Transcript showCR:&lt;br /&gt;
    (SSH::Client authorizedKeysLineForEd25519Seed:seed comment:comment).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keys generated this way are interoperable with OpenSSH&#039;s own&lt;br /&gt;
tooling (&amp;lt;code&amp;gt;ssh-keygen -y -f ...&amp;lt;/code&amp;gt; re-derives the public&lt;br /&gt;
key, &amp;lt;code&amp;gt;ssh-keygen -p -f ...&amp;lt;/code&amp;gt; changes the passphrase,&lt;br /&gt;
etc.).&lt;br /&gt;
&lt;br /&gt;
=== Using the shell tools instead ===&lt;br /&gt;
&lt;br /&gt;
The traditional path also works:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519 -C &amp;quot;stx@your.host&amp;quot;&lt;br /&gt;
ssh-copy-id user@remotehost&lt;br /&gt;
ssh-add ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Preparing ssh-agent ==&lt;br /&gt;
&lt;br /&gt;
The agent path is strongly preferred over reading raw keyfiles: it&lt;br /&gt;
keeps encrypted private keys unlocked once per session, and handles&lt;br /&gt;
identities (hardware-token-backed keys, KeePassXC entries) that&lt;br /&gt;
ST/X should never see directly.&lt;br /&gt;
&lt;br /&gt;
ST/X picks the agent path automatically when&lt;br /&gt;
&amp;lt;code&amp;gt;$SSH_AUTH_SOCK&amp;lt;/code&amp;gt; is set in the process environment&lt;br /&gt;
&#039;&#039;&#039;at the time stx is launched&#039;&#039;&#039;.  Setting it later from a&lt;br /&gt;
workspace does not help.&lt;br /&gt;
&lt;br /&gt;
=== Linux / macOS ===&lt;br /&gt;
&lt;br /&gt;
Most desktop distributions launch an agent automatically as part of&lt;br /&gt;
the session (gnome-keyring on GNOME, ssh-agent.service on systemd,&lt;br /&gt;
KWallet on KDE).  Verify in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo $SSH_AUTH_SOCK    # /run/user/1000/keyring/ssh or similar&lt;br /&gt;
ssh-add -l             # lists loaded identities&lt;br /&gt;
ssh-add ~/.ssh/id_ed25519   # load yours if not loaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If no agent runs at all, add this snippet to your shell rc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ~/.bashrc or ~/.zshrc&lt;br /&gt;
if [ -z &amp;quot;$SSH_AUTH_SOCK&amp;quot; ]; then&lt;br /&gt;
    eval &amp;quot;$(ssh-agent -s)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ST/X must be launched from a shell that has seen this rc — a&lt;br /&gt;
desktop launcher started from the file manager does NOT inherit&lt;br /&gt;
the variable.  Wrap the stx start command in a small script under&lt;br /&gt;
&amp;lt;code&amp;gt;~/.local/bin/&amp;lt;/code&amp;gt; that sources the rc first.&lt;br /&gt;
&lt;br /&gt;
The Remote Access settings page (&#039;&#039;&#039;Extras → Settings → Plugins&lt;br /&gt;
→ Remote Access — SSH Keys&#039;&#039;&#039;) shows whether the running image&lt;br /&gt;
sees an agent.&lt;br /&gt;
&lt;br /&gt;
==== Permanent setup via systemd ====&lt;br /&gt;
&lt;br /&gt;
For a truly cross-session agent (survives desktop logouts, comes&lt;br /&gt;
up automatically at next login), enable the per-user systemd&lt;br /&gt;
unit shipped with most distros&#039; &amp;lt;code&amp;gt;openssh-clients&amp;lt;/code&amp;gt;&lt;br /&gt;
package:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl --user enable --now ssh-agent.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then point &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; at the user-service socket&lt;br /&gt;
in your shell rc (this replaces the &amp;lt;code&amp;gt;eval $(ssh-agent -s)&amp;lt;/code&amp;gt;&lt;br /&gt;
snippet above):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export SSH_AUTH_SOCK=&amp;quot;${XDG_RUNTIME_DIR}/ssh-agent.socket&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Auto-loading keys on first use ====&lt;br /&gt;
&lt;br /&gt;
To skip the manual &amp;lt;code&amp;gt;ssh-add&amp;lt;/code&amp;gt; step, let OpenSSH load&lt;br /&gt;
keys into the agent automatically the first time they are needed.&lt;br /&gt;
Add to &amp;lt;code&amp;gt;~/.ssh/config&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host *&lt;br /&gt;
    AddKeysToAgent yes&lt;br /&gt;
    IdentityFile ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first SSH connection then prompts for the key passphrase&lt;br /&gt;
once and hands the unlocked key to the agent; subsequent&lt;br /&gt;
connections use the cached identity without prompting.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Windows 10+ ships native OpenSSH including an agent service.&lt;br /&gt;
One-time setup:&lt;br /&gt;
&lt;br /&gt;
# Open &#039;&#039;&#039;Services&#039;&#039;&#039; (&amp;lt;code&amp;gt;services.msc&amp;lt;/code&amp;gt;) as Administrator.&lt;br /&gt;
# Find &#039;&#039;&#039;OpenSSH Authentication Agent&#039;&#039;&#039;, set Startup Type to &#039;&#039;&#039;Automatic&#039;&#039;&#039;, click &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In PowerShell: &amp;lt;code&amp;gt;ssh-add $HOME\.ssh\id_ed25519&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Verify: &amp;lt;code&amp;gt;ssh-add -l&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Windows OpenSSH agent listens on a named pipe&lt;br /&gt;
(&amp;lt;code&amp;gt;\\.\pipe\openssh-ssh-agent&amp;lt;/code&amp;gt;), not a Unix socket.  ST/X&lt;br /&gt;
supports both transports, but Windows ssh-add does &#039;&#039;&#039;not&#039;&#039;&#039; set&lt;br /&gt;
&amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; for you.  Add it manually:&lt;br /&gt;
&lt;br /&gt;
# Press {{Key|Win}} → type &amp;quot;environment&amp;quot; → &amp;quot;Edit the system environment variables&amp;quot;.&lt;br /&gt;
# &#039;&#039;&#039;Environment Variables&#039;&#039;&#039; → under &#039;&#039;&#039;User variables&#039;&#039;&#039;, &#039;&#039;&#039;New&#039;&#039;&#039;.&lt;br /&gt;
# Name: &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt;&lt;br /&gt;
# Value: &amp;lt;code&amp;gt;\\.\pipe\openssh-ssh-agent&amp;lt;/code&amp;gt;&lt;br /&gt;
# Log out and back in (or restart stx) so the new env propagates.&lt;br /&gt;
&lt;br /&gt;
==== PowerShell quick-setup ====&lt;br /&gt;
&lt;br /&gt;
The same setup from an &#039;&#039;&#039;elevated&#039;&#039;&#039; PowerShell prompt, for&lt;br /&gt;
scripts or unattended provisioning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Start the agent now AND on every reboot (permanent).&lt;br /&gt;
Set-Service -Name ssh-agent -StartupType Automatic&lt;br /&gt;
Start-Service ssh-agent&lt;br /&gt;
&lt;br /&gt;
# Persist SSH_AUTH_SOCK for the user (survives reboots).&lt;br /&gt;
[Environment]::SetEnvironmentVariable(&lt;br /&gt;
    &#039;SSH_AUTH_SOCK&#039;,&lt;br /&gt;
    &#039;\\.\pipe\openssh-ssh-agent&#039;,&lt;br /&gt;
    &#039;User&#039;)&lt;br /&gt;
&lt;br /&gt;
# Load a key (prompts for the passphrase if the file is encrypted).&lt;br /&gt;
ssh-add $HOME\.ssh\id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a one-shot agent start without making it persistent (e.g.&lt;br /&gt;
single-session test), drop the &amp;lt;code&amp;gt;Set-Service&amp;lt;/code&amp;gt; line and&lt;br /&gt;
just run &amp;lt;code&amp;gt;Start-Service ssh-agent&amp;lt;/code&amp;gt;.  The env-var line&lt;br /&gt;
can also be omitted if &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; is only needed&lt;br /&gt;
in the current shell — use &amp;lt;code&amp;gt;$env:SSH_AUTH_SOCK = &#039;...&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
instead for that session-local form.&lt;br /&gt;
&lt;br /&gt;
On stripped-down Windows installs the ssh-agent service may not&lt;br /&gt;
be present.  Add it once via &#039;&#039;&#039;Settings → Apps → Optional&lt;br /&gt;
features → OpenSSH Client&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Alternative agents:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PuTTY pageant&#039;&#039;&#039; — uses its own protocol; NOT supported by ST/X&#039;s SSH::Agent.  Migrate the keys to OpenSSH.&lt;br /&gt;
* &#039;&#039;&#039;Git for Windows ssh-agent&#039;&#039;&#039; — works; point&lt;br /&gt;
&amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; at the socket it publishes.&lt;br /&gt;
* &#039;&#039;&#039;WSL 2&#039;&#039;&#039; — a ST/X inside WSL sees WSL&#039;s Linux agent normally; a ST/X on the Windows side does not.  Bridging needs a helper like &amp;lt;code&amp;gt;npiperelay&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;socat&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Verify in the Remote Access settings page&lt;br /&gt;
(&#039;&#039;&#039;Extras → Settings → Plugins → Remote Access — SSH Keys&#039;&#039;&#039;) —&lt;br /&gt;
the agent indicator there reports whether the running image sees&lt;br /&gt;
the agent.&lt;br /&gt;
&lt;br /&gt;
==== Auto-loading keys on first use ====&lt;br /&gt;
&lt;br /&gt;
Windows OpenSSH does &#039;&#039;&#039;not&#039;&#039;&#039; persist agent-loaded keys across&lt;br /&gt;
agent restarts.  To avoid running &amp;lt;code&amp;gt;ssh-add&amp;lt;/code&amp;gt; manually&lt;br /&gt;
after each reboot, add the same lazy-load configuration to&lt;br /&gt;
&amp;lt;code&amp;gt;%USERPROFILE%\.ssh\config&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host *&lt;br /&gt;
    AddKeysToAgent yes&lt;br /&gt;
    IdentityFile ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenSSH then loads the key into the agent on first use (prompts&lt;br /&gt;
for the passphrase once) and reuses it for the rest of the&lt;br /&gt;
session.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
All tunables are class-side on &amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Accessor !! Default !! What it controls&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#idleEvictionSeconds:&amp;lt;/code&amp;gt; || 240 (4 min) || How long a pooled&lt;br /&gt;
connection sits idle before the next access proactively closes +&lt;br /&gt;
reopens it.  Just under typical sshd&lt;br /&gt;
&amp;lt;code&amp;gt;ClientAliveInterval × ClientAliveCountMax&amp;lt;/code&amp;gt; so we recycle&lt;br /&gt;
before the server TCP-RESETs us.  Pass &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; to restore&lt;br /&gt;
the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#attrsCacheTtlSeconds:&amp;lt;/code&amp;gt; || 5 || Max age (s) of a&lt;br /&gt;
cached STAT before &amp;lt;code&amp;gt;#ensureAttrs&amp;lt;/code&amp;gt; refetches.  Parent&lt;br /&gt;
listDir always re-stamps fresh attrs onto children, so navigating&lt;br /&gt;
an open directory does not pay the TTL.  Set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to&lt;br /&gt;
disable caching.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#closeAllConnections&amp;lt;/code&amp;gt; || (action) || Tears down every&lt;br /&gt;
pooled connection.  Useful after a known-bad network event, before&lt;br /&gt;
a deliberate identity swap, or as part of a clean image shutdown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Diagnostics ==&lt;br /&gt;
&lt;br /&gt;
=== SemaphoreMonitor ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;SemaphoreMonitor&amp;lt;/code&amp;gt; from the Launcher&#039;s &amp;quot;Status&amp;quot;&lt;br /&gt;
sub-menu.  Per-host SFTP mutex appears as&lt;br /&gt;
&amp;lt;code&amp;gt;SFTP/&amp;amp;lt;user@host:port&amp;amp;gt;&amp;lt;/code&amp;gt;; the pool-wide mutex as&lt;br /&gt;
&amp;lt;code&amp;gt;SFTP/pool&amp;lt;/code&amp;gt;.  Right-click a row:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Copy Waiters Stack to Clipboard&#039;&#039;&#039; — dumps the last-owner&#039;s walkback plus each waiter&#039;s, formatted as plain text.  Use when a process is wedged in &amp;lt;code&amp;gt;readWait&amp;lt;/code&amp;gt; inside&lt;br /&gt;
&amp;lt;code&amp;gt;withSftpClientDo:&amp;lt;/code&amp;gt; and you need to see which SFTP&lt;br /&gt;
request it is on.&lt;br /&gt;
* &#039;&#039;&#039;Copy List to Clipboard&#039;&#039;&#039; — the whole table, for an email-this-to-someone diagnosis.&lt;br /&gt;
* &#039;&#039;&#039;Detect Deadlocks&#039;&#039;&#039; — DFS over the wait-for graph, reports cycles.&lt;br /&gt;
&lt;br /&gt;
=== Logger ===&lt;br /&gt;
&lt;br /&gt;
The SSH stack logs interesting events:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; on auto-reconnect after a dead connection.&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; when a pool entry is idle-evicted.&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; when an SSH key file cannot be parsed (e.g. legacy PEM, encrypted-without-agent) — the file is skipped, others tried.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SFTP v3 only.&#039;&#039;&#039;  No SETSTAT (no remote chmod / chown / utime), no SSH_FXP_READLINK exposed (&amp;lt;code&amp;gt;#isSymbolicLink&amp;lt;/code&amp;gt; always&lt;br /&gt;
&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#linkInfo&amp;lt;/code&amp;gt; returns the regular&lt;br /&gt;
stat info).  Several SFTPv5+ niceties are nevertheless picked up&lt;br /&gt;
via OpenSSH SSH_FXP_EXTENDED requests — see&lt;br /&gt;
[[#OpenSSH SFTP extensions]] below.&lt;br /&gt;
* &#039;&#039;&#039;Per-host serialisation.&#039;&#039;&#039;  Two concurrent operations on the same host queue through the host mutex.  See [[#Future work]].&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;#renameTo:&amp;lt;/code&amp;gt; fallback has a TOCTOU window.&#039;&#039;&#039;  On servers that advertise &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; (every modern OpenSSH does), overwrite is atomic; on the rare server that does not, the receiver is emulated as delete-then-rename and another process can race in between.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;#isNonEmptyDirectory&amp;lt;/code&amp;gt; is heuristic.&#039;&#039;&#039;  Always returns &amp;lt;code&amp;gt;#isDirectory&amp;lt;/code&amp;gt; (the accurate answer would cost three round-trips per directory icon, which made the original tree expansion unbearably slow).&lt;br /&gt;
&lt;br /&gt;
== Implementation details ==&lt;br /&gt;
&lt;br /&gt;
For readers wanting the architecture.  Five classes, top-down:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Class !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt; || Filename subclass; the public&lt;br /&gt;
API.  Maps &amp;lt;code&amp;gt;sftp://...&amp;lt;/code&amp;gt; URLs to remote files; exposes&lt;br /&gt;
&amp;lt;code&amp;gt;directoryContents&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readingFileDo:&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;renameTo:&amp;lt;/code&amp;gt; etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::SftpClient&amp;lt;/code&amp;gt; || SFTP-v3 protocol&lt;br /&gt;
(request/response codec, listDir, stat, open, read, write, mkdir).&lt;br /&gt;
Driven by SftpFilename.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Channel&amp;lt;/code&amp;gt; || SSH channel multiplexer&lt;br /&gt;
(CHANNEL_OPEN, DATA, EOF, CLOSE, WINDOW_ADJUST).  One logical&lt;br /&gt;
session per Channel instance.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; || High-level SSH client: opens the&lt;br /&gt;
transport, runs KEX, host-key check, userauth, then dispenses&lt;br /&gt;
Channels.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Transport&amp;lt;/code&amp;gt; || Wire layer.  Banner + KEXINIT&lt;br /&gt;
exchange, ChaCha20-Poly1305 packet framing, sendSeq / recvSeq,&lt;br /&gt;
heartbeat, SSH_MSG_DISCONNECT.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OpenSSH SFTP extensions ===&lt;br /&gt;
&lt;br /&gt;
SFTP v3 (RFC draft-ietf-secsh-filexfer-02) is intentionally minimal.&lt;br /&gt;
OpenSSH ships an open-ended extension mechanism: the server lists&lt;br /&gt;
extension names it understands in its &amp;lt;code&amp;gt;SSH_FXP_VERSION&amp;lt;/code&amp;gt;&lt;br /&gt;
reply, and the client invokes them via&lt;br /&gt;
&amp;lt;code&amp;gt;SSH_FXP_EXTENDED(200)&amp;lt;/code&amp;gt; packets carrying the extension&lt;br /&gt;
name as the first string.  Each extension is feature-detected via&lt;br /&gt;
&amp;lt;code&amp;gt;SSH::SftpClient&amp;amp;gt;&amp;amp;gt;supportsExtension:&amp;lt;/code&amp;gt;; callers fall&lt;br /&gt;
back when the server doesn&#039;t advertise it.&lt;br /&gt;
&lt;br /&gt;
The stack uses four of the OpenSSH extensions today:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; — atomic rename-with-overwrite.  Picked up automatically by&lt;br /&gt;
&amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;renameTo:&amp;lt;/code&amp;gt;; the delete-then-rename&lt;br /&gt;
fallback only fires on servers that lack it.&lt;br /&gt;
* &amp;lt;code&amp;gt;hardlink@openssh.com&amp;lt;/code&amp;gt; — create a POSIX hard link. Exposed as &amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;createHardLinkAs:&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;statvfs@openssh.com&amp;lt;/code&amp;gt; — POSIX&lt;br /&gt;
&amp;lt;code&amp;gt;statvfs(3)&amp;lt;/code&amp;gt;-shape filesystem stats.  Exposed as&lt;br /&gt;
&amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;fileSystemInfo&amp;lt;/code&amp;gt;; the result is&lt;br /&gt;
shape-compatible with &amp;lt;code&amp;gt;OperatingSystem getDiskInfoOf:&amp;lt;/code&amp;gt;&lt;br /&gt;
so callers can treat local and remote uniformly.  Drives the&lt;br /&gt;
&#039;&#039;&#039;Tools &amp;amp;rarr; Filesystem Info...&#039;&#039;&#039; menu entry described at the&lt;br /&gt;
top of this page.&lt;br /&gt;
* &amp;lt;code&amp;gt;fsync@openssh.com&amp;lt;/code&amp;gt; — flush server-side write buffer to disk on an open handle.  Available on the low-level&lt;br /&gt;
&amp;lt;code&amp;gt;SftpClient&amp;amp;gt;&amp;amp;gt;fsyncHandle:&amp;lt;/code&amp;gt;; not yet plumbed&lt;br /&gt;
into a Filename-level &amp;quot;durable write&amp;quot; API.&lt;br /&gt;
&lt;br /&gt;
The remaining OpenSSH extensions&lt;br /&gt;
(&amp;lt;code&amp;gt;lsetstat@openssh.com&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fstatvfs@openssh.com&amp;lt;/code&amp;gt;)&lt;br /&gt;
are recognised in the advertised-extensions list but not wrapped at&lt;br /&gt;
Filename level — there&#039;s no Filename-side caller for them yet.&lt;br /&gt;
&lt;br /&gt;
=== Connection pooling ===&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;SftpFilename&amp;lt;/code&amp;gt; instance pointing at the same&lt;br /&gt;
&amp;lt;code&amp;gt;user@host:port&amp;lt;/code&amp;gt; triple shares one&lt;br /&gt;
&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; plus one &amp;lt;code&amp;gt;SSH::SftpClient&amp;lt;/code&amp;gt;.&lt;br /&gt;
Pool is class-side, guarded by a single&lt;br /&gt;
&amp;lt;code&amp;gt;ConnectionPoolMutex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lazy bring-up&#039;&#039;&#039; — TCP + KEX + userauth + SFTP INIT happens on the first SFTP operation, not on &amp;lt;code&amp;gt;forUrl:&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Per-host serialisation&#039;&#039;&#039; — SFTP requests on a given host are serialised through a &amp;lt;code&amp;gt;RecursionLock&amp;lt;/code&amp;gt; named&lt;br /&gt;
&amp;lt;code&amp;gt;SFTP/&amp;amp;lt;user@host:port&amp;amp;gt;&amp;lt;/code&amp;gt; (visible in&lt;br /&gt;
SemaphoreMonitor).&lt;br /&gt;
* &#039;&#039;&#039;Idle eviction&#039;&#039;&#039; — unused for longer than&lt;br /&gt;
&amp;lt;code&amp;gt;idleEvictionSeconds&amp;lt;/code&amp;gt;, the entry is proactively&lt;br /&gt;
closed + reopened on the next access.&lt;br /&gt;
* &#039;&#039;&#039;Auto-reconnect&#039;&#039;&#039; — a transport-level failure (broken pipe, EOF, MNU on nil socket) evicts the dead pool entry, opens a fresh client, retries the request &#039;&#039;&#039;once&#039;&#039;&#039;.  Application-level SFTP STATUS errors propagate immediately.&lt;br /&gt;
&lt;br /&gt;
== Future work ==&lt;br /&gt;
&lt;br /&gt;
Tracked but not yet implemented:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Multi-channel parallelism per host&#039;&#039;&#039; — today one TCP + one SFTP channel per host means N concurrent requests serialise.  Pipelining over multiple SshClients in the pool (preferred), or a transport-level reader process demultiplexing to per-channel inboxes, would let the tree pane keep listing while the content pane reads a large file.&lt;br /&gt;
* &#039;&#039;&#039;Accurate &amp;lt;code&amp;gt;#isNonEmptyDirectory&amp;lt;/code&amp;gt;&#039;&#039;&#039; via OPEN_DIR + READ_DIR (first batch only) + CLOSE — three RTTs per probe; needs SftpClient to pipeline requests before this pays off.&lt;br /&gt;
* &#039;&#039;&#039;SFTP v5/v6 negotiation&#039;&#039;&#039; for extended attrs and FTP-style canonicalisation.  (Atomic-overwrite rename is already handled via the OpenSSH &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; extension; see [[#OpenSSH SFTP extensions]].)&lt;br /&gt;
&lt;br /&gt;
= Command Shell =&lt;br /&gt;
&lt;br /&gt;
Local command shell on this expecco machine.  Typical applications:&lt;br /&gt;
local command-line, running a local helper tool, bridging a&lt;br /&gt;
remote workflow to a local utility.&lt;br /&gt;
&lt;br /&gt;
The Expecco RemoteAccess plugin exposes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CmdShell - Open&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;CmdShell - Close&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
No credentials, no network — runs as the expecco process&#039;s own&lt;br /&gt;
user.  Output streams to expecco&#039;s log.&lt;br /&gt;
&lt;br /&gt;
= Telnet =&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.svg|24px|Warning]] &#039;&#039;&#039;Telnet is a legacy protocol&lt;br /&gt;
with no encryption.&#039;&#039;&#039; Passwords are transmitted in plain text on&lt;br /&gt;
the wire; anyone on the network path can read them.  Use Telnet&lt;br /&gt;
ONLY when the target device has no other option (typically: old&lt;br /&gt;
industrial controllers, lab instruments, embedded measurement&lt;br /&gt;
equipment without an SSH stack).  For everything else use&lt;br /&gt;
[[#SSH and SFTP]].&lt;br /&gt;
&lt;br /&gt;
The expecco plugin exposes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Telnet - Open Remote Connection With Login&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Telnet - Execute Remote Command&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Example - Remote Device Control via Telnet&#039;&#039;&#039; (internal demo)&lt;br /&gt;
&lt;br /&gt;
The Telnet protocol (RFC 854) is a bidirectional 8-bit byte stream&lt;br /&gt;
over TCP, with in-band control sequences for terminal options.&lt;br /&gt;
A connection is established to a target host:port; after optional&lt;br /&gt;
in-band login, both sides can send data.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[SSH Client/en|SSH::Client]] — the SSH layer (exec, TTY, agent forwarding, ProxyJump).&lt;br /&gt;
* [[FileBrowserV2/en|FileBrowserV2]] — the main UI client of this stack.&lt;br /&gt;
* [[ClaudeCode plugin/en|Claude Code]] — uses the same SSH stack for its HTTPS transport.&lt;br /&gt;
* [[Wikipedia:Secure Shell|RFC 4251 (SSH-2 Architecture)]]&lt;br /&gt;
* [[Wikipedia:Telnet|RFC 854 (Telnet Protocol)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Network]]&lt;br /&gt;
[[Category:SSH]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31357</id>
		<title>Remote Access/en</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31357"/>
		<updated>2026-06-06T07:06:17Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* SSH and SFTP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages|Remote Access/en|label=English}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote access&#039;&#039;&#039; is the ability to drive a remote computer or&lt;br /&gt;
network from this expecco image — opening shells, running commands,&lt;br /&gt;
moving files, or driving a test target.  Three protocol families are&lt;br /&gt;
supported, listed in current-recommended order:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SSH and SFTP&#039;&#039;&#039; (recommended) — encrypted shell + secure file transfer over an SSH-2 tunnel.  Pure-Smalltalk implementation in &amp;lt;code&amp;gt;exept:libcrypt/ssh&amp;lt;/code&amp;gt;; no external dependency on OpenSSL or libssh.  Use this for anything that touches credentials or sensitive payloads.&lt;br /&gt;
* &#039;&#039;&#039;Local Command Shell&#039;&#039;&#039; — fork + exec on the local machine. Used for local-tool integration and for the local end of a remote workflow that bridges via another protocol.&lt;br /&gt;
* &#039;&#039;&#039;Telnet&#039;&#039;&#039; (legacy) — plain-text terminal session.  No encryption, passwords on the wire in clear.  Use only when the target hardware has no other option.&lt;br /&gt;
&lt;br /&gt;
= SSH and SFTP =&lt;br /&gt;
&lt;br /&gt;
The SSH stack covers the full SSH-2 protocol (RFC 4251–4254,&lt;br /&gt;
RFC 5656, RFC 8709, RFC 8731) plus OpenSSH&#039;s chacha20-poly1305&lt;br /&gt;
transport cipher and the SFTP v3 file-transfer subsystem&lt;br /&gt;
(draft-ietf-secsh-filexfer-02).&amp;lt;br&amp;gt;Two layers:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt;&#039;&#039;&#039; — programmatic SSH access&amp;lt;br&amp;gt;(remote&lt;br /&gt;
&amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, TTY shell, agent forwarding, ProxyJump bastion).&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt;&#039;&#039;&#039; — a &amp;lt;code&amp;gt;Filename&amp;lt;/code&amp;gt; subclass&amp;lt;br&amp;gt;that lets the rest of ST/X treat a remote SFTP path the same way it treats a local file.&lt;br /&gt;
&lt;br /&gt;
The rest of this section is organised user-task-first: what the user&lt;br /&gt;
sees and does, the expecco-library hooks below that, then the&lt;br /&gt;
implementation detail at the end for the curious.&lt;br /&gt;
&lt;br /&gt;
== From the FileBrowserV2 ==&lt;br /&gt;
&lt;br /&gt;
Open the location dropdown and paste an &amp;lt;code&amp;gt;sftp://&amp;lt;/code&amp;gt; URL.&lt;br /&gt;
The browser tab populates as if it were a local path.  Tree&lt;br /&gt;
expansion, column sort (name / size / mtime), preview, and&lt;br /&gt;
double-click-to-open-in-editor all behave normally.  The first&lt;br /&gt;
click on a host takes ~200–500 ms (TCP + KEX + auth); subsequent&lt;br /&gt;
clicks reuse the pooled connection.&lt;br /&gt;
&lt;br /&gt;
URL syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sftp://[user@]host[:port]/remote/path&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
User defaults to the local login name, port to 22, path to&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Refresh&#039;&#039;&#039; button in the toolbar (the round-arrow icon&lt;br /&gt;
between &#039;&#039;Forward&#039;&#039; and &#039;&#039;DirectoryUp&#039;&#039;) re-reads both the&lt;br /&gt;
directory tree and the contents pane on demand.  Works uniformly&lt;br /&gt;
for local and SFTP paths; for SFTP it also flushes the per-file&lt;br /&gt;
STAT cache, so changes made directly on the remote side become&lt;br /&gt;
visible immediately rather than waiting for the 5-second cache TTL&lt;br /&gt;
to expire.&lt;br /&gt;
&lt;br /&gt;
The small arrow next to the Refresh icon opens a dropdown with a&lt;br /&gt;
single checkbox, &#039;&#039;&#039;Automatic Refresh&#039;&#039;&#039;, controlling the&lt;br /&gt;
background polling task that walks every expanded tree item to&lt;br /&gt;
detect external changes.  The default depends on the current root:&lt;br /&gt;
&lt;br /&gt;
* Local filesystem &amp;amp;rarr; &#039;&#039;&#039;on&#039;&#039;&#039; (10-second cycle, matches the long-standing behaviour).&lt;br /&gt;
* SFTP &amp;amp;rarr; &#039;&#039;&#039;off&#039;&#039;&#039;.  Each cycle costs one STAT round-trip per child, which is fine for a handful of local directories but painful over the network.  Click Refresh manually when you need to pick up remote changes.&lt;br /&gt;
&lt;br /&gt;
When you navigate between local and SFTP roots the toggle flips&lt;br /&gt;
automatically &amp;amp;mdash; but only if you haven&#039;t overridden it for&lt;br /&gt;
the previous root.  An explicit user choice is preserved across&lt;br /&gt;
navigations.&lt;br /&gt;
&lt;br /&gt;
The Tools menu offers four browser actions, three of them gated on&lt;br /&gt;
the SSH library being loaded:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Generate SSH Key Pair...&#039;&#039;&#039; — opens the same key-generation dialog described under [[#Generating an SSH key pair]] below.&lt;br /&gt;
* &#039;&#039;&#039;SSH Connect...&#039;&#039;&#039; — opens an interactive VT100 terminal to a remote host.&lt;br /&gt;
* &#039;&#039;&#039;SFTP Connect...&#039;&#039;&#039; — points this browser tab at a remote filesystem via SFTP.&lt;br /&gt;
* &#039;&#039;&#039;Filesystem Info...&#039;&#039;&#039; — shows size, free space and usage of the filesystem holding the currently displayed directory.  Works uniformly for local paths and SFTP paths; for SFTP it requires the server to advertise the &amp;lt;code&amp;gt;statvfs@openssh.com&amp;lt;/code&amp;gt; extension (every modern OpenSSH does).  Sizes are reported in IEC binary units (MiB, GiB, TiB) — the largest unit yielding a value ≥ 1 is chosen, so a TB-scale volume reads as &#039;&#039;X TiB&#039;&#039; rather than &#039;&#039;10240 GiB&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== From expecco actions ==&lt;br /&gt;
&lt;br /&gt;
The Expecco RemoteAccess plugin&lt;br /&gt;
([[Expecco::RemoteAccessImportPlugin]]) exposes the following test&lt;br /&gt;
actions to the expecco action palette:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CmdShell - Open SSH Remote Connection&#039;&#039;&#039; — opens an SSH session via the platform&#039;s &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; binary (PuTTY&#039;s&lt;br /&gt;
&amp;lt;code&amp;gt;plink&amp;lt;/code&amp;gt; on Windows).&lt;br /&gt;
* &#039;&#039;&#039;CmdShell - Open SSH Remote Connection and PublicKey&#039;&#039;&#039; — same but with explicit public-key authentication.&lt;br /&gt;
&lt;br /&gt;
To run these you need a configured keypair (private key on this&lt;br /&gt;
machine, public key in the remote host&#039;s&lt;br /&gt;
&amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt;).  Generate one via the dialog&lt;br /&gt;
below or via &amp;lt;code&amp;gt;ssh-keygen&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The plugin also adds a settings page at &#039;&#039;&#039;Extras → Settings →&lt;br /&gt;
Plugins → Remote Access — SSH Keys&#039;&#039;&#039; carrying a single&lt;br /&gt;
&#039;&#039;&#039;Generate SSH Key Pair...&#039;&#039;&#039; button that opens the same dialog.&lt;br /&gt;
&lt;br /&gt;
== Generating an SSH key pair ==&lt;br /&gt;
&lt;br /&gt;
=== The dialog (FileBrowserV2 / settings page) ===&lt;br /&gt;
&lt;br /&gt;
The dialog asks for all parameters in one form:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Comment&#039;&#039;&#039; — embedded in the generated key (defaults to&lt;br /&gt;
&amp;lt;code&amp;gt;stx@&amp;amp;lt;hostname&amp;amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &#039;&#039;&#039;Storage&#039;&#039;&#039;:&lt;br /&gt;
** &#039;&#039;Save to disk file only&#039;&#039; — writes &amp;lt;code&amp;gt;~/.ssh/id_ed25519_stx&amp;lt;/code&amp;gt; (or wherever) plus a matching &amp;lt;code&amp;gt;.pub&amp;lt;/code&amp;gt; companion.&lt;br /&gt;
** &#039;&#039;Save to disk AND load into ssh-agent&#039;&#039; — writes the file and also hands the key to the running ssh-agent.&lt;br /&gt;
** &#039;&#039;Load into ssh-agent only&#039;&#039; — key lives in agent memory only; gone on agent restart.&lt;br /&gt;
* &#039;&#039;&#039;Private key file&#039;&#039;&#039; — full path; disabled in agent-only mode.&lt;br /&gt;
* &#039;&#039;&#039;Passphrase / Confirm&#039;&#039;&#039; — empty leaves the on-disk file unencrypted (agent-only mode ignores the passphrase, since the OpenSSH agent wire protocol carries only the decrypted key).&lt;br /&gt;
&lt;br /&gt;
On &#039;&#039;&#039;Generate&#039;&#039;&#039;, the public-key line (the same&lt;br /&gt;
&amp;lt;code&amp;gt;ssh-ed25519 AAAA... comment&amp;lt;/code&amp;gt; string ssh-keygen&lt;br /&gt;
emits) is copied to the system clipboard for pasting into the&lt;br /&gt;
remote host&#039;s &amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== From a workspace ===&lt;br /&gt;
&lt;br /&gt;
For headless deployments, sandboxed builds, or scripts,&lt;br /&gt;
&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; exposes a pure-Smalltalk key generator&lt;br /&gt;
that produces output bit-compatible with&lt;br /&gt;
&amp;lt;code&amp;gt;ssh-keygen -t ed25519&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| seed comment priv |&lt;br /&gt;
seed    := SSH::Client generateEd25519Seed.&lt;br /&gt;
comment := &#039;stx@&#039;, OperatingSystem getHostName.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ Save passphrase-encrypted to disk&amp;quot;&lt;br /&gt;
priv := (Filename homeDirectory / &#039;.ssh&#039; / &#039;id_ed25519_stx&#039;) pathName.&lt;br /&gt;
SSH::Client&lt;br /&gt;
    saveOpenSshEd25519Seed:seed&lt;br /&gt;
    toFile:priv&lt;br /&gt;
    comment:comment&lt;br /&gt;
    passphrase:&#039;choose-something-long&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ AND load into the running agent&amp;quot;&lt;br /&gt;
SSH::Client addEd25519SeedToAgent:seed comment:comment.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ Print the public-key line to paste into authorized_keys&amp;quot;&lt;br /&gt;
Transcript showCR:&lt;br /&gt;
    (SSH::Client authorizedKeysLineForEd25519Seed:seed comment:comment).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keys generated this way are interoperable with OpenSSH&#039;s own&lt;br /&gt;
tooling (&amp;lt;code&amp;gt;ssh-keygen -y -f ...&amp;lt;/code&amp;gt; re-derives the public&lt;br /&gt;
key, &amp;lt;code&amp;gt;ssh-keygen -p -f ...&amp;lt;/code&amp;gt; changes the passphrase,&lt;br /&gt;
etc.).&lt;br /&gt;
&lt;br /&gt;
=== Using the shell tools instead ===&lt;br /&gt;
&lt;br /&gt;
The traditional path also works:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519 -C &amp;quot;stx@your.host&amp;quot;&lt;br /&gt;
ssh-copy-id user@remotehost&lt;br /&gt;
ssh-add ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Preparing ssh-agent ==&lt;br /&gt;
&lt;br /&gt;
The agent path is strongly preferred over reading raw keyfiles: it&lt;br /&gt;
keeps encrypted private keys unlocked once per session, and handles&lt;br /&gt;
identities (hardware-token-backed keys, KeePassXC entries) that&lt;br /&gt;
ST/X should never see directly.&lt;br /&gt;
&lt;br /&gt;
ST/X picks the agent path automatically when&lt;br /&gt;
&amp;lt;code&amp;gt;$SSH_AUTH_SOCK&amp;lt;/code&amp;gt; is set in the process environment&lt;br /&gt;
&#039;&#039;&#039;at the time stx is launched&#039;&#039;&#039;.  Setting it later from a&lt;br /&gt;
workspace does not help.&lt;br /&gt;
&lt;br /&gt;
=== Linux / macOS ===&lt;br /&gt;
&lt;br /&gt;
Most desktop distributions launch an agent automatically as part of&lt;br /&gt;
the session (gnome-keyring on GNOME, ssh-agent.service on systemd,&lt;br /&gt;
KWallet on KDE).  Verify in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo $SSH_AUTH_SOCK    # /run/user/1000/keyring/ssh or similar&lt;br /&gt;
ssh-add -l             # lists loaded identities&lt;br /&gt;
ssh-add ~/.ssh/id_ed25519   # load yours if not loaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If no agent runs at all, add this snippet to your shell rc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ~/.bashrc or ~/.zshrc&lt;br /&gt;
if [ -z &amp;quot;$SSH_AUTH_SOCK&amp;quot; ]; then&lt;br /&gt;
    eval &amp;quot;$(ssh-agent -s)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ST/X must be launched from a shell that has seen this rc — a&lt;br /&gt;
desktop launcher started from the file manager does NOT inherit&lt;br /&gt;
the variable.  Wrap the stx start command in a small script under&lt;br /&gt;
&amp;lt;code&amp;gt;~/.local/bin/&amp;lt;/code&amp;gt; that sources the rc first.&lt;br /&gt;
&lt;br /&gt;
The Remote Access settings page (&#039;&#039;&#039;Extras → Settings → Plugins&lt;br /&gt;
→ Remote Access — SSH Keys&#039;&#039;&#039;) shows whether the running image&lt;br /&gt;
sees an agent.&lt;br /&gt;
&lt;br /&gt;
==== Permanent setup via systemd ====&lt;br /&gt;
&lt;br /&gt;
For a truly cross-session agent (survives desktop logouts, comes&lt;br /&gt;
up automatically at next login), enable the per-user systemd&lt;br /&gt;
unit shipped with most distros&#039; &amp;lt;code&amp;gt;openssh-clients&amp;lt;/code&amp;gt;&lt;br /&gt;
package:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl --user enable --now ssh-agent.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then point &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; at the user-service socket&lt;br /&gt;
in your shell rc (this replaces the &amp;lt;code&amp;gt;eval $(ssh-agent -s)&amp;lt;/code&amp;gt;&lt;br /&gt;
snippet above):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export SSH_AUTH_SOCK=&amp;quot;${XDG_RUNTIME_DIR}/ssh-agent.socket&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Auto-loading keys on first use ====&lt;br /&gt;
&lt;br /&gt;
To skip the manual &amp;lt;code&amp;gt;ssh-add&amp;lt;/code&amp;gt; step, let OpenSSH load&lt;br /&gt;
keys into the agent automatically the first time they are needed.&lt;br /&gt;
Add to &amp;lt;code&amp;gt;~/.ssh/config&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host *&lt;br /&gt;
    AddKeysToAgent yes&lt;br /&gt;
    IdentityFile ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first SSH connection then prompts for the key passphrase&lt;br /&gt;
once and hands the unlocked key to the agent; subsequent&lt;br /&gt;
connections use the cached identity without prompting.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Windows 10+ ships native OpenSSH including an agent service.&lt;br /&gt;
One-time setup:&lt;br /&gt;
&lt;br /&gt;
# Open &#039;&#039;&#039;Services&#039;&#039;&#039; (&amp;lt;code&amp;gt;services.msc&amp;lt;/code&amp;gt;) as Administrator.&lt;br /&gt;
# Find &#039;&#039;&#039;OpenSSH Authentication Agent&#039;&#039;&#039;, set Startup Type to &#039;&#039;&#039;Automatic&#039;&#039;&#039;, click &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In PowerShell: &amp;lt;code&amp;gt;ssh-add $HOME\.ssh\id_ed25519&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Verify: &amp;lt;code&amp;gt;ssh-add -l&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Windows OpenSSH agent listens on a named pipe&lt;br /&gt;
(&amp;lt;code&amp;gt;\\.\pipe\openssh-ssh-agent&amp;lt;/code&amp;gt;), not a Unix socket.  ST/X&lt;br /&gt;
supports both transports, but Windows ssh-add does &#039;&#039;&#039;not&#039;&#039;&#039; set&lt;br /&gt;
&amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; for you.  Add it manually:&lt;br /&gt;
&lt;br /&gt;
# Press {{Key|Win}} → type &amp;quot;environment&amp;quot; → &amp;quot;Edit the system environment variables&amp;quot;.&lt;br /&gt;
# &#039;&#039;&#039;Environment Variables&#039;&#039;&#039; → under &#039;&#039;&#039;User variables&#039;&#039;&#039;, &#039;&#039;&#039;New&#039;&#039;&#039;.&lt;br /&gt;
# Name: &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt;&lt;br /&gt;
# Value: &amp;lt;code&amp;gt;\\.\pipe\openssh-ssh-agent&amp;lt;/code&amp;gt;&lt;br /&gt;
# Log out and back in (or restart stx) so the new env propagates.&lt;br /&gt;
&lt;br /&gt;
==== PowerShell quick-setup ====&lt;br /&gt;
&lt;br /&gt;
The same setup from an &#039;&#039;&#039;elevated&#039;&#039;&#039; PowerShell prompt, for&lt;br /&gt;
scripts or unattended provisioning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Start the agent now AND on every reboot (permanent).&lt;br /&gt;
Set-Service -Name ssh-agent -StartupType Automatic&lt;br /&gt;
Start-Service ssh-agent&lt;br /&gt;
&lt;br /&gt;
# Persist SSH_AUTH_SOCK for the user (survives reboots).&lt;br /&gt;
[Environment]::SetEnvironmentVariable(&lt;br /&gt;
    &#039;SSH_AUTH_SOCK&#039;,&lt;br /&gt;
    &#039;\\.\pipe\openssh-ssh-agent&#039;,&lt;br /&gt;
    &#039;User&#039;)&lt;br /&gt;
&lt;br /&gt;
# Load a key (prompts for the passphrase if the file is encrypted).&lt;br /&gt;
ssh-add $HOME\.ssh\id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a one-shot agent start without making it persistent (e.g.&lt;br /&gt;
single-session test), drop the &amp;lt;code&amp;gt;Set-Service&amp;lt;/code&amp;gt; line and&lt;br /&gt;
just run &amp;lt;code&amp;gt;Start-Service ssh-agent&amp;lt;/code&amp;gt;.  The env-var line&lt;br /&gt;
can also be omitted if &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; is only needed&lt;br /&gt;
in the current shell — use &amp;lt;code&amp;gt;$env:SSH_AUTH_SOCK = &#039;...&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
instead for that session-local form.&lt;br /&gt;
&lt;br /&gt;
On stripped-down Windows installs the ssh-agent service may not&lt;br /&gt;
be present.  Add it once via &#039;&#039;&#039;Settings → Apps → Optional&lt;br /&gt;
features → OpenSSH Client&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Alternative agents:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PuTTY pageant&#039;&#039;&#039; — uses its own protocol; NOT supported by ST/X&#039;s SSH::Agent.  Migrate the keys to OpenSSH.&lt;br /&gt;
* &#039;&#039;&#039;Git for Windows ssh-agent&#039;&#039;&#039; — works; point&lt;br /&gt;
&amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; at the socket it publishes.&lt;br /&gt;
* &#039;&#039;&#039;WSL 2&#039;&#039;&#039; — a ST/X inside WSL sees WSL&#039;s Linux agent normally; a ST/X on the Windows side does not.  Bridging needs a helper like &amp;lt;code&amp;gt;npiperelay&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;socat&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Verify in the Remote Access settings page&lt;br /&gt;
(&#039;&#039;&#039;Extras → Settings → Plugins → Remote Access — SSH Keys&#039;&#039;&#039;) —&lt;br /&gt;
the agent indicator there reports whether the running image sees&lt;br /&gt;
the agent.&lt;br /&gt;
&lt;br /&gt;
==== Auto-loading keys on first use ====&lt;br /&gt;
&lt;br /&gt;
Windows OpenSSH does &#039;&#039;&#039;not&#039;&#039;&#039; persist agent-loaded keys across&lt;br /&gt;
agent restarts.  To avoid running &amp;lt;code&amp;gt;ssh-add&amp;lt;/code&amp;gt; manually&lt;br /&gt;
after each reboot, add the same lazy-load configuration to&lt;br /&gt;
&amp;lt;code&amp;gt;%USERPROFILE%\.ssh\config&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host *&lt;br /&gt;
    AddKeysToAgent yes&lt;br /&gt;
    IdentityFile ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenSSH then loads the key into the agent on first use (prompts&lt;br /&gt;
for the passphrase once) and reuses it for the rest of the&lt;br /&gt;
session.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
All tunables are class-side on &amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Accessor !! Default !! What it controls&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#idleEvictionSeconds:&amp;lt;/code&amp;gt; || 240 (4 min) || How long a pooled&lt;br /&gt;
connection sits idle before the next access proactively closes +&lt;br /&gt;
reopens it.  Just under typical sshd&lt;br /&gt;
&amp;lt;code&amp;gt;ClientAliveInterval × ClientAliveCountMax&amp;lt;/code&amp;gt; so we recycle&lt;br /&gt;
before the server TCP-RESETs us.  Pass &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; to restore&lt;br /&gt;
the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#attrsCacheTtlSeconds:&amp;lt;/code&amp;gt; || 5 || Max age (s) of a&lt;br /&gt;
cached STAT before &amp;lt;code&amp;gt;#ensureAttrs&amp;lt;/code&amp;gt; refetches.  Parent&lt;br /&gt;
listDir always re-stamps fresh attrs onto children, so navigating&lt;br /&gt;
an open directory does not pay the TTL.  Set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to&lt;br /&gt;
disable caching.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#closeAllConnections&amp;lt;/code&amp;gt; || (action) || Tears down every&lt;br /&gt;
pooled connection.  Useful after a known-bad network event, before&lt;br /&gt;
a deliberate identity swap, or as part of a clean image shutdown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Diagnostics ==&lt;br /&gt;
&lt;br /&gt;
=== SemaphoreMonitor ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;SemaphoreMonitor&amp;lt;/code&amp;gt; from the Launcher&#039;s &amp;quot;Status&amp;quot;&lt;br /&gt;
sub-menu.  Per-host SFTP mutex appears as&lt;br /&gt;
&amp;lt;code&amp;gt;SFTP/&amp;amp;lt;user@host:port&amp;amp;gt;&amp;lt;/code&amp;gt;; the pool-wide mutex as&lt;br /&gt;
&amp;lt;code&amp;gt;SFTP/pool&amp;lt;/code&amp;gt;.  Right-click a row:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Copy Waiters Stack to Clipboard&#039;&#039;&#039; — dumps the last-owner&#039;s walkback plus each waiter&#039;s, formatted as plain text.  Use when a process is wedged in &amp;lt;code&amp;gt;readWait&amp;lt;/code&amp;gt; inside&lt;br /&gt;
&amp;lt;code&amp;gt;withSftpClientDo:&amp;lt;/code&amp;gt; and you need to see which SFTP&lt;br /&gt;
request it is on.&lt;br /&gt;
* &#039;&#039;&#039;Copy List to Clipboard&#039;&#039;&#039; — the whole table, for an email-this-to-someone diagnosis.&lt;br /&gt;
* &#039;&#039;&#039;Detect Deadlocks&#039;&#039;&#039; — DFS over the wait-for graph, reports cycles.&lt;br /&gt;
&lt;br /&gt;
=== Logger ===&lt;br /&gt;
&lt;br /&gt;
The SSH stack logs interesting events:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; on auto-reconnect after a dead connection.&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; when a pool entry is idle-evicted.&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; when an SSH key file cannot be parsed (e.g. legacy PEM, encrypted-without-agent) — the file is skipped, others tried.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SFTP v3 only.&#039;&#039;&#039;  No SETSTAT (no remote chmod / chown / utime), no SSH_FXP_READLINK exposed (&amp;lt;code&amp;gt;#isSymbolicLink&amp;lt;/code&amp;gt; always&lt;br /&gt;
&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#linkInfo&amp;lt;/code&amp;gt; returns the regular&lt;br /&gt;
stat info).  Several SFTPv5+ niceties are nevertheless picked up&lt;br /&gt;
via OpenSSH SSH_FXP_EXTENDED requests — see&lt;br /&gt;
[[#OpenSSH SFTP extensions]] below.&lt;br /&gt;
* &#039;&#039;&#039;Per-host serialisation.&#039;&#039;&#039;  Two concurrent operations on the same host queue through the host mutex.  See [[#Future work]].&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;#renameTo:&amp;lt;/code&amp;gt; fallback has a TOCTOU window.&#039;&#039;&#039;  On servers that advertise &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; (every modern OpenSSH does), overwrite is atomic; on the rare server that does not, the receiver is emulated as delete-then-rename and another process can race in between.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;#isNonEmptyDirectory&amp;lt;/code&amp;gt; is heuristic.&#039;&#039;&#039;  Always returns &amp;lt;code&amp;gt;#isDirectory&amp;lt;/code&amp;gt; (the accurate answer would cost three round-trips per directory icon, which made the original tree expansion unbearably slow).&lt;br /&gt;
&lt;br /&gt;
== Implementation details ==&lt;br /&gt;
&lt;br /&gt;
For readers wanting the architecture.  Five classes, top-down:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Class !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt; || Filename subclass; the public&lt;br /&gt;
API.  Maps &amp;lt;code&amp;gt;sftp://...&amp;lt;/code&amp;gt; URLs to remote files; exposes&lt;br /&gt;
&amp;lt;code&amp;gt;directoryContents&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readingFileDo:&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;renameTo:&amp;lt;/code&amp;gt; etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::SftpClient&amp;lt;/code&amp;gt; || SFTP-v3 protocol&lt;br /&gt;
(request/response codec, listDir, stat, open, read, write, mkdir).&lt;br /&gt;
Driven by SftpFilename.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Channel&amp;lt;/code&amp;gt; || SSH channel multiplexer&lt;br /&gt;
(CHANNEL_OPEN, DATA, EOF, CLOSE, WINDOW_ADJUST).  One logical&lt;br /&gt;
session per Channel instance.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; || High-level SSH client: opens the&lt;br /&gt;
transport, runs KEX, host-key check, userauth, then dispenses&lt;br /&gt;
Channels.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Transport&amp;lt;/code&amp;gt; || Wire layer.  Banner + KEXINIT&lt;br /&gt;
exchange, ChaCha20-Poly1305 packet framing, sendSeq / recvSeq,&lt;br /&gt;
heartbeat, SSH_MSG_DISCONNECT.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OpenSSH SFTP extensions ===&lt;br /&gt;
&lt;br /&gt;
SFTP v3 (RFC draft-ietf-secsh-filexfer-02) is intentionally minimal.&lt;br /&gt;
OpenSSH ships an open-ended extension mechanism: the server lists&lt;br /&gt;
extension names it understands in its &amp;lt;code&amp;gt;SSH_FXP_VERSION&amp;lt;/code&amp;gt;&lt;br /&gt;
reply, and the client invokes them via&lt;br /&gt;
&amp;lt;code&amp;gt;SSH_FXP_EXTENDED(200)&amp;lt;/code&amp;gt; packets carrying the extension&lt;br /&gt;
name as the first string.  Each extension is feature-detected via&lt;br /&gt;
&amp;lt;code&amp;gt;SSH::SftpClient&amp;amp;gt;&amp;amp;gt;supportsExtension:&amp;lt;/code&amp;gt;; callers fall&lt;br /&gt;
back when the server doesn&#039;t advertise it.&lt;br /&gt;
&lt;br /&gt;
The stack uses four of the OpenSSH extensions today:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; — atomic rename-with-overwrite.  Picked up automatically by&lt;br /&gt;
&amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;renameTo:&amp;lt;/code&amp;gt;; the delete-then-rename&lt;br /&gt;
fallback only fires on servers that lack it.&lt;br /&gt;
* &amp;lt;code&amp;gt;hardlink@openssh.com&amp;lt;/code&amp;gt; — create a POSIX hard link. Exposed as &amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;createHardLinkAs:&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;statvfs@openssh.com&amp;lt;/code&amp;gt; — POSIX&lt;br /&gt;
&amp;lt;code&amp;gt;statvfs(3)&amp;lt;/code&amp;gt;-shape filesystem stats.  Exposed as&lt;br /&gt;
&amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;fileSystemInfo&amp;lt;/code&amp;gt;; the result is&lt;br /&gt;
shape-compatible with &amp;lt;code&amp;gt;OperatingSystem getDiskInfoOf:&amp;lt;/code&amp;gt;&lt;br /&gt;
so callers can treat local and remote uniformly.  Drives the&lt;br /&gt;
&#039;&#039;&#039;Tools &amp;amp;rarr; Filesystem Info...&#039;&#039;&#039; menu entry described at the&lt;br /&gt;
top of this page.&lt;br /&gt;
* &amp;lt;code&amp;gt;fsync@openssh.com&amp;lt;/code&amp;gt; — flush server-side write buffer to disk on an open handle.  Available on the low-level&lt;br /&gt;
&amp;lt;code&amp;gt;SftpClient&amp;amp;gt;&amp;amp;gt;fsyncHandle:&amp;lt;/code&amp;gt;; not yet plumbed&lt;br /&gt;
into a Filename-level &amp;quot;durable write&amp;quot; API.&lt;br /&gt;
&lt;br /&gt;
The remaining OpenSSH extensions&lt;br /&gt;
(&amp;lt;code&amp;gt;lsetstat@openssh.com&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fstatvfs@openssh.com&amp;lt;/code&amp;gt;)&lt;br /&gt;
are recognised in the advertised-extensions list but not wrapped at&lt;br /&gt;
Filename level — there&#039;s no Filename-side caller for them yet.&lt;br /&gt;
&lt;br /&gt;
=== Connection pooling ===&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;SftpFilename&amp;lt;/code&amp;gt; instance pointing at the same&lt;br /&gt;
&amp;lt;code&amp;gt;user@host:port&amp;lt;/code&amp;gt; triple shares one&lt;br /&gt;
&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; plus one &amp;lt;code&amp;gt;SSH::SftpClient&amp;lt;/code&amp;gt;.&lt;br /&gt;
Pool is class-side, guarded by a single&lt;br /&gt;
&amp;lt;code&amp;gt;ConnectionPoolMutex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lazy bring-up&#039;&#039;&#039; — TCP + KEX + userauth + SFTP INIT happens on the first SFTP operation, not on &amp;lt;code&amp;gt;forUrl:&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Per-host serialisation&#039;&#039;&#039; — SFTP requests on a given host are serialised through a &amp;lt;code&amp;gt;RecursionLock&amp;lt;/code&amp;gt; named&lt;br /&gt;
&amp;lt;code&amp;gt;SFTP/&amp;amp;lt;user@host:port&amp;amp;gt;&amp;lt;/code&amp;gt; (visible in&lt;br /&gt;
SemaphoreMonitor).&lt;br /&gt;
* &#039;&#039;&#039;Idle eviction&#039;&#039;&#039; — unused for longer than&lt;br /&gt;
&amp;lt;code&amp;gt;idleEvictionSeconds&amp;lt;/code&amp;gt;, the entry is proactively&lt;br /&gt;
closed + reopened on the next access.&lt;br /&gt;
* &#039;&#039;&#039;Auto-reconnect&#039;&#039;&#039; — a transport-level failure (broken pipe, EOF, MNU on nil socket) evicts the dead pool entry, opens a fresh client, retries the request &#039;&#039;&#039;once&#039;&#039;&#039;.  Application-level SFTP STATUS errors propagate immediately.&lt;br /&gt;
&lt;br /&gt;
== Future work ==&lt;br /&gt;
&lt;br /&gt;
Tracked but not yet implemented:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Multi-channel parallelism per host&#039;&#039;&#039; — today one TCP + one SFTP channel per host means N concurrent requests serialise.  Pipelining over multiple SshClients in the pool (preferred), or a transport-level reader process demultiplexing to per-channel inboxes, would let the tree pane keep listing while the content pane reads a large file.&lt;br /&gt;
* &#039;&#039;&#039;Accurate &amp;lt;code&amp;gt;#isNonEmptyDirectory&amp;lt;/code&amp;gt;&#039;&#039;&#039; via OPEN_DIR + READ_DIR (first batch only) + CLOSE — three RTTs per probe; needs SftpClient to pipeline requests before this pays off.&lt;br /&gt;
* &#039;&#039;&#039;SFTP v5/v6 negotiation&#039;&#039;&#039; for extended attrs and FTP-style canonicalisation.  (Atomic-overwrite rename is already handled via the OpenSSH &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; extension; see [[#OpenSSH SFTP extensions]].)&lt;br /&gt;
&lt;br /&gt;
= Command Shell =&lt;br /&gt;
&lt;br /&gt;
Local command shell on this expecco machine.  Typical applications:&lt;br /&gt;
local command-line, running a local helper tool, bridging a&lt;br /&gt;
remote workflow to a local utility.&lt;br /&gt;
&lt;br /&gt;
The Expecco RemoteAccess plugin exposes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CmdShell - Open&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;CmdShell - Close&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
No credentials, no network — runs as the expecco process&#039;s own&lt;br /&gt;
user.  Output streams to expecco&#039;s log.&lt;br /&gt;
&lt;br /&gt;
= Telnet =&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.svg|24px|Warning]] &#039;&#039;&#039;Telnet is a legacy protocol&lt;br /&gt;
with no encryption.&#039;&#039;&#039; Passwords are transmitted in plain text on&lt;br /&gt;
the wire; anyone on the network path can read them.  Use Telnet&lt;br /&gt;
ONLY when the target device has no other option (typically: old&lt;br /&gt;
industrial controllers, lab instruments, embedded measurement&lt;br /&gt;
equipment without an SSH stack).  For everything else use&lt;br /&gt;
[[#SSH and SFTP]].&lt;br /&gt;
&lt;br /&gt;
The expecco plugin exposes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Telnet - Open Remote Connection With Login&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Telnet - Execute Remote Command&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Example - Remote Device Control via Telnet&#039;&#039;&#039; (internal demo)&lt;br /&gt;
&lt;br /&gt;
The Telnet protocol (RFC 854) is a bidirectional 8-bit byte stream&lt;br /&gt;
over TCP, with in-band control sequences for terminal options.&lt;br /&gt;
A connection is established to a target host:port; after optional&lt;br /&gt;
in-band login, both sides can send data.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[SSH Client/en|SSH::Client]] — the SSH layer (exec, TTY, agent forwarding, ProxyJump).&lt;br /&gt;
* [[FileBrowserV2/en|FileBrowserV2]] — the main UI client of this stack.&lt;br /&gt;
* [[ClaudeCode plugin/en|Claude Code]] — uses the same SSH stack for its HTTPS transport.&lt;br /&gt;
* [[Wikipedia:Secure Shell|RFC 4251 (SSH-2 Architecture)]]&lt;br /&gt;
* [[Wikipedia:Telnet|RFC 854 (Telnet Protocol)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Network]]&lt;br /&gt;
[[Category:SSH]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31356</id>
		<title>KI Coding Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31356"/>
		<updated>2026-06-04T11:23:22Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Was kann eine lokale KI (z.B. ollama) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KI Coding Plugin =&lt;br /&gt;
&lt;br /&gt;
Das KI Coding Plugin bindet einen Large Language Model (LLM) basierten&lt;br /&gt;
KI-Assistenten in den Activity-Editor (Aktivitäten-Code), den&lt;br /&gt;
Compound-Netzwerk-Editor, den Dokumentations-Editor und in den&lt;br /&gt;
ST/X Class Browser ein.  Das Plugin unterstützt zwei Anbieter, die im&lt;br /&gt;
Einstellungsdialog umschaltbar sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anthropic Claude&#039;&#039;&#039; (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)&lt;br /&gt;
* &#039;&#039;&#039;OpenAI ChatGPT&#039;&#039;&#039; (gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o1, o3)&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; (codellama:7b, codellama:13b)&lt;br /&gt;
Je nach gewähltem Anbieter erscheint die Toolbar-Schaltfläche als&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Ask Claude&amp;quot;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;quot;Ask ChatGPT&amp;quot;&#039;&#039;&#039;; das Einstellungs-Tab&lt;br /&gt;
heißt &#039;&#039;&#039;&amp;quot;AI Coding&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten-Editor ==&lt;br /&gt;
&lt;br /&gt;
Im Aktivitäten-Code-Editor erscheint in der Toolbar eine Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit folgenden Aktionen:&lt;br /&gt;
&lt;br /&gt;
* Open KI Window — öffnet das eigenständige Chat-Fenster&lt;br /&gt;
* Explain code — erklärt den Code der aktuellen Aktivität&lt;br /&gt;
* Suggest improvement — schlägt Verbesserungen vor&lt;br /&gt;
* Find bugs — sucht nach Fehlern, Race Conditions, nil-Handling-Problemen&lt;br /&gt;
* Generate doc-comment — generiert eine Aktivitäts-Dokumentation inklusive Pin-Kommentaren und füllt den Documentation-Tab&lt;br /&gt;
* Custom prompt... — freier Prompt; der Aktivitäts-Code wird als Kontext mitgesendet&lt;br /&gt;
* Set model ▸ — Untermenü mit den Modellen des aktiven Anbieters (das aktuell aktive ist mit &#039;&#039;(active)&#039;&#039; markiert)&lt;br /&gt;
* Set provider ▸ — nur sichtbar, wenn API-Schlüssel für mehr als einen Anbieter konfiguriert sind; Untermenü zum Umschalten zwischen Claude und ChatGPT&lt;br /&gt;
&lt;br /&gt;
Code-Vorschläge können mit &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (direkt am jeweiligen&lt;br /&gt;
Code-Block im Chat oder über die obere Apply-Schaltfläche) in den&lt;br /&gt;
Aktivitäts-Body übernommen werden.  Vom KI gelieferte Smalltalk/X&lt;br /&gt;
Hilfsmethoden (Form: &amp;lt;code&amp;gt;Klasse &amp;gt;&amp;gt; selector&amp;lt;/code&amp;gt;) werden nach&lt;br /&gt;
Rückfrage in die genannte Klasse compiliert.&lt;br /&gt;
&lt;br /&gt;
== Compound (Netzwerk) Editor ==&lt;br /&gt;
&lt;br /&gt;
Auf der Toolbar von Compound-Worksheets erscheint dieselbe&lt;br /&gt;
Schaltfläche, beschränkt auf die für Netze sinnvollen Aktionen&lt;br /&gt;
(Open KI Window, Generate doc-comment) — ebenfalls mit den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Dokumentations-Editor ==&lt;br /&gt;
&lt;br /&gt;
Der Dokumentations-Tab der Block-Description (Editor für Test-Cases,&lt;br /&gt;
Test-Plans und Aktivitäten) trägt dieselbe Toolbar-Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit den Einträgen&lt;br /&gt;
&#039;&#039;&#039;Open KI Window&#039;&#039;&#039;, &#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; sowie den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; analysiert den aktuellen Block (Name,&lt;br /&gt;
vorhandene Beschreibung, Eingangs-/Ausgangs-Pins, Sub-Steps eines&lt;br /&gt;
Compound-Netzes, referenzierte Environment-Variablen) und schlägt&lt;br /&gt;
eine vollständige Block- und Pin-Dokumentation vor.&lt;br /&gt;
&lt;br /&gt;
Ist der Block schreibgeschützt (importierte Library, RTL-Lizenz),&lt;br /&gt;
fragt &#039;&#039;&#039;[Apply]&#039;&#039;&#039; nach, ob der Block freigeschaltet und die&lt;br /&gt;
Dokumentation eingetragen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Class Browser (ST/X) ==&lt;br /&gt;
&lt;br /&gt;
Im Class Browser stehen die Aktionen unter dem &#039;&#039;&#039;AI&#039;&#039;&#039;-Untermenü&lt;br /&gt;
sowie im Selektor-Kontextmenü zur Verfügung.  Die Aktionen&lt;br /&gt;
operieren auf der aktuell ausgewählten Methode (Klasse + Selektor +&lt;br /&gt;
Quelltext werden als Kontext mitgesendet).  &#039;&#039;&#039;[Apply]&#039;&#039;&#039; kann das&lt;br /&gt;
Resultat direkt in die Methode der aktiven Klasse einbauen.&lt;br /&gt;
Auch hier sind &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039; als&lt;br /&gt;
Untermenüs verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Chat-Fenster ==&lt;br /&gt;
&lt;br /&gt;
Das eigenständige Chat-Fenster trägt den Titel&lt;br /&gt;
&#039;&#039;&#039;AI Coding [&amp;amp;lt;Produkt&amp;amp;gt; / &amp;amp;lt;Modell&amp;amp;gt;]&#039;&#039;&#039; (z.B.&lt;br /&gt;
&amp;quot;AI Coding [Claude / claude-opus-4-7]&amp;quot;) und zeigt nach jedem Turn&lt;br /&gt;
den Tokenverbrauch und die kumulierten Kosten — sofern Preise für&lt;br /&gt;
das gewählte Modell hinterlegt sind.  Anbieter- und Modellwechsel&lt;br /&gt;
im Einstellungsdialog werden live übernommen.&lt;br /&gt;
&lt;br /&gt;
Das Transkript ist als vertikales Panel von &amp;quot;Karten&amp;quot; aufgebaut:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prosa-Karten&#039;&#039;&#039; enthalten den fließenden Text der Antwort; Zeilen werden auf die Fenster-Breite umgebrochen.&lt;br /&gt;
* &#039;&#039;&#039;Code-Karten&#039;&#039;&#039; (eingerahmt) entstehen aus markdown-Code-Blöcken (&amp;lt;code&amp;gt;```...```&amp;lt;/code&amp;gt;) und sind als &#039;&#039;&#039;Workspace&#039;&#039;&#039; editierbar — das Standard-Smalltalk-Popup-Menü bietet doIt / printIt / inspectIt, ein &amp;lt;code&amp;gt;TestCase&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;simulatedSelf&amp;lt;/code&amp;gt; ist gesetzt, so dass &amp;lt;code&amp;gt;self assert:... equals:...&amp;lt;/code&amp;gt; direkt ausgeführt werden kann.  Lange Blöcke scrollen innerhalb der Karte.  Rechts oben sitzen die Schaltflächen &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (sofern für den Kontext sinnvoll) und &#039;&#039;&#039;[⎘ Copy]&#039;&#039;&#039;; links wird der Sprachtag (smalltalk, python, …) angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Doku-Karten&#039;&#039;&#039; (volle Breite, Prosa) entstehen aus dem speziellen &amp;lt;code&amp;gt;```doc&amp;lt;/code&amp;gt;-Block, den der Dokumentations-Generator anfordert; Inhalt ist die Vorschlags-Dokumentation für Block- und Pin-Beschreibungen.&lt;br /&gt;
&lt;br /&gt;
Scroll-Lock: solange der Anwender bereits am unteren Ende des&lt;br /&gt;
Transkripts steht, folgt die Anzeige neu eintreffenden Karten&lt;br /&gt;
automatisch; nach manuellem Hochscrollen bleibt die Position stehen.&lt;br /&gt;
&lt;br /&gt;
Bilder können als Anhang versendet werden (Screenshot oder&lt;br /&gt;
PNG/JPG-Datei).  Anhänge funktionieren mit beiden Anbietern; bei&lt;br /&gt;
OpenAI nur mit vision-fähigen Modellen (gpt-4o-Familie).&lt;br /&gt;
&lt;br /&gt;
== Einstellungen (AI Coding) ==&lt;br /&gt;
&lt;br /&gt;
Im Einstellungsdialog unter &#039;&#039;&#039;Plugins → AI Coding&#039;&#039;&#039; (bzw. unter&lt;br /&gt;
&#039;&#039;&#039;Tools → AI Coding&#039;&#039;&#039; im Smalltalk-Launcher) werden konfiguriert:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Provider&#039;&#039;&#039; — Anthropic oder OpenAI.  Beim Wechsel werden API-URL und Default-Modell entsprechend angepasst; der gespeicherte API-Schlüssel des jeweiligen Anbieters wird geladen.&lt;br /&gt;
* &#039;&#039;&#039;API Key&#039;&#039;&#039; — Schlüssel des aktuell gewählten Anbieters.  Die Schlüssel werden pro Anbieter getrennt gespeichert (&amp;lt;code&amp;gt;#claudeApiKey_anthropic&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;#claudeApiKey_openai&amp;lt;/code&amp;gt;), so dass zwischen den Anbietern ohne erneute Eingabe gewechselt werden kann.  Das Setzen des Schlüssels erfolgt ausschließlich über diesen Dialog.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039; — ein Modell aus der Liste des aktiven Anbieters oder ein selbst eingegebener Modellname.  Kann auch direkt über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü in den Editor-Toolbars umgeschaltet werden.&lt;br /&gt;
* &#039;&#039;&#039;Max output tokens&#039;&#039;&#039; — maximale Antwortlänge.&lt;br /&gt;
* &#039;&#039;&#039;API URL&#039;&#039;&#039; — nur zu ändern für eigene Proxies / Gateways.  Standard: &amp;lt;code&amp;gt;https://api.anthropic.com/v1/messages&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;https://api.openai.com/v1/chat/completions&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API-Schlüssel beschaffen ==&lt;br /&gt;
&lt;br /&gt;
* Anthropic: [https://console.anthropic.com console.anthropic.com], Schlüsselformat &amp;lt;code&amp;gt;sk-ant-...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenAI: [https://platform.openai.com/api-keys platform.openai.com/api-keys], Schlüsselformat &amp;lt;code&amp;gt;sk-...&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sk-proj-...&amp;lt;/code&amp;gt;.  Voraussetzung ist ein aufgeladenes Konto (Mindestbetrag derzeit USD 5).&lt;br /&gt;
&lt;br /&gt;
== Datenschutz / Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Anbieter &#039;&#039;&#039;Anthropic&#039;&#039;&#039; gehen die Anfragen direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.anthropic.com&amp;lt;/code&amp;gt;, bei &#039;&#039;&#039;OpenAI&#039;&#039;&#039; direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.openai.com&amp;lt;/code&amp;gt;.  Es gibt keinen eXept-seitigen Proxy oder&lt;br /&gt;
Zwischenspeicher.  Mit dem Aktivitäts-Quelltext bzw. den Methoden-&lt;br /&gt;
Quelltexten werden auch Pin-Beschreibungen, Sub-Step-Namen und&lt;br /&gt;
referenzierte Environment-Variablen aus dem Block-Description-Modell&lt;br /&gt;
als Kontext versendet.&lt;br /&gt;
&lt;br /&gt;
Bei Benutzung von Anthropic API-Tokens - wie hier der Fall - werden laut Anthropic die Daten nicht zum Training des KI-Modells genutzt ([https://privacy.claude.com/de/articles/7996868-werden-meine-daten-fur-das-modelltraining-verwendet Anthropic Erkärung dazu]). Für die Wahrheit dieser Aussage könne wir nicht garantieren und haften.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sicher sein wollen, daß keine Information Ihr Haus verlässt empfehlen wir eine eigenem geschlossene in-house KI Umgebung, wie sie bei einigen unserer Kunden bereits existiert. Sie dürfen dann selbstverständlich nur die URLs dieser Umgebung konfigurieren. Expecco kommuniziert ausschließlich mit der von Ihnen eingegebenen KI.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mehrere Konversationen&#039;&#039;&#039;: der Chat ist ein Singleton — eine neue Anfrage über ein Browser-/Editor-Menü startet jedesmal eine &#039;&#039;&#039;neue&#039;&#039;&#039; Konversation. Folge-Fragen (Klärung, Vertiefung) gehen über das Eingabefeld in derselben Konversation.&lt;br /&gt;
* &#039;&#039;&#039;Vorsicht:&#039;&#039;&#039; Die Größe der übertragenen Daten (auch die aus dem Chatfenster) geht in die Kostenberechnung ein. Deshalb immer eine neue Konversation starten, wenn es um ein neues Thema geht.&lt;br /&gt;
* &#039;&#039;&#039;Modell wechseln&#039;&#039;&#039;: Für schnelle Routine-Antworten Sonnet, für schwierige Refactorings Opus. Über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü direkt aus der Toolbar oder über die Settings.&lt;br /&gt;
* &#039;&#039;&#039;Anbieter wechseln&#039;&#039;&#039;: Sind Schlüssel für beide Anbieter konfiguriert, schaltet das &#039;&#039;&#039;Set provider&#039;&#039;&#039;-Untermenü ohne Umweg über den Settings-Dialog um.&lt;br /&gt;
* &#039;&#039;&#039;Code direkt ausführen&#039;&#039;&#039;: In Code-Karten kann markierter Smalltalk-Code per doIt / printIt / inspectIt direkt evaluiert werden — praktisch z.B. um vom Modell vorgeschlagene SUnit-Asserts gleich auszuprobieren, ohne den Code erst in einen Workspace zu kopieren.&lt;br /&gt;
* &#039;&#039;&#039;Custom prompt&#039;&#039;&#039; eignet sich gut für „warum macht Methode X es so und nicht so?&amp;quot; oder „schreib mir einen ParameterizedTest dazu mit folgenden Daten: …&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tipps für die Arbeit mit claudeCode ==&lt;br /&gt;
Wenn Sie claudeCode verwenden, stehen ihnen noch weit mehr Funktionen zur Verfügung: sie können zum Beispiel im claudeCode Terminal eingeben: &lt;br /&gt;
* &amp;quot;mach mir eine neue Suite in einem neuen Fenster&amp;quot;,&lt;br /&gt;
* &amp;quot;Mache eine Aktion zur Berechnung des Umfangs eines Kreises bei gegebenen Radius&amp;quot;, &lt;br /&gt;
* &amp;quot;Erstelle eine neue suite mit einem Testfall der folgendes macht: &lt;br /&gt;
** 1) webbrowser auf &amp;quot;www.exept.de&amp;quot; öffnen. &lt;br /&gt;
** 2) auf das logo oben links klicken. &lt;br /&gt;
** 3) webbrowser schliessen.&lt;br /&gt;
* welche Funktionalität ist in xxx.ets&lt;br /&gt;
&lt;br /&gt;
Claude wurde von uns in die Lage versetzt, selbst nach passenden Bibliotheken zu suchen, diese zu importieren, Aktionen zu Generieren und den Testplan anzulegen.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich auch, den Test gleich durchzuführen und das Resultat zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind wir am trainieren, so dass claude z.B. selbst entscheidet ob es besser ist, eine fehlende Aktion als  Diagramm oder als elementare zu definieren. Es ist in der Lage, die Funktionen des unterliegenden Frameworks zu sehen und auch komplexe Aufgaben zu erledigen:&lt;br /&gt;
* &amp;quot;aktion zum Lesen der Jahresumsätze eines Jahres aus der Datenbank&amp;quot;&lt;br /&gt;
* extrahiere aus dem xml Dokument alle budget Einträge und liefere die Summe&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen und Tipps für die Arbeit ===&lt;br /&gt;
&lt;br /&gt;
Sonnet-4 ist gefühlt weit intelligenter als Heiku-4.5,&lt;br /&gt;
aber auch weit teurer. Ihr Budget kann sehr schnell schmelzen mit Sonnet. Insbesondere wenn man auf medium oder high Intelligenzlevel abeitet. Aber Haiku macht auch weit mehr Fehler und man sollte genau hinschauen was er so generiert. Gefühlt war Sonnet selbst im low level besser als Haiku. Aber der Preis...&lt;br /&gt;
&lt;br /&gt;
Folgende konkrete Tipps aus unseren ersten Erfahrungen, diese Liste wird aktualisiert, und kann auch basieren auf unserer eigenen Dummheit. Ist also u.U.mit Vorsicht zu geniessen.&lt;br /&gt;
&lt;br /&gt;
* geben Sie Haiku Hinweise, z.B. schau mal dort, oder nimm das als Beispiel. Sonnet findet selbst viel besser Lösungen.&lt;br /&gt;
* kurze Anweisungen, je konkreter desto günstiger.&lt;br /&gt;
* haiku ist weit &amp;quot;fauler&amp;quot;. Z.B hat sonnet automatisch eine Dokumentation bei neuen Aktionen angelegt, und diese auch aktualisiert. Haiku hingegen musste man explizit eine Regel dazu anlegen (z.B. mit &amp;quot;wenn du eine aktion anlegst oder änderst, aktualisiere die dokumentation&amp;quot;)&lt;br /&gt;
* heiku ist dümmer. Regeln die von sonnet angelegt wurden, können von haiku u.U. nicht befolgt werden, weil sonnet weit mehr generalisieren kann.&lt;br /&gt;
* sagen sie beiden sie sollten wenn sie ein Problem haben,  nicht lange selbst suchen. sondern nachfragen ob man ihnen einen Tipp geben kann. Wenn Sie das nicht tun, kann es sein dass Sonnet auch eine viertel Stunde nachdenkt und die Dollars schmelzen wie Eis in der Sonne&amp;lt;br&amp;gt;(ist mir passiert, als ein Socket Problem in der Kommunikation auftrat, und er nicht erkannte, das die Antworten von mcp falsch waren, es hat dann selbst alle möglichen Wege gesucht, eine Nachricht abzusetzen, incl. der Erstellung diverser Shell, curl und Python Scripte... obgleich es eigentlich ein Interface dafür gab, das aber einen Fehler hatte).&lt;br /&gt;
* schränken Sie das Modell in seinen Möglichkeiten ein, z.B. sagen sie &amp;quot;editiere nicht die files sondern verwende dazu ein tool&amp;quot;, oder &amp;quot;eine expecco aktion und sag mir vorher welche du nimmst&amp;quot;. Sonst kann es passieren dass es anfängt ihre ets zu entpacken um darin nach strings zu suchen, obgleich es das eigentlich einfacher über das interface machen kann (dieses konkrete Problem wird nicht mehr auftreten aber Sie sehen den Punkt). Da war Sonnet weit intelligenter hat aber auch länger nachgedacht. &lt;br /&gt;
* wenn sie feststellen, dass es einen Fehler macht, sagen sie (wörtlich) &amp;quot;remember: mach dies nicht, oder um das zu machen tu das.&amp;quot;&lt;br /&gt;
* sie können diese Erinnerungen sowohl in ihrem UserProfile (also im lokalen Filesystem) als auch in ihren expecco Präferenzen halten. Sagen Sie dazu &amp;quot;remember this in in my expecco memory&amp;quot; oder &amp;quot;remember (in my user memory): bla bla&amp;quot;. Erinnerungen kann man auch löschen &amp;quot;forget to ...&amp;quot;. Zu Beginn der nächsten session sagen sie &amp;quot;read your expecco memory&amp;quot;.&lt;br /&gt;
* wechseln sie das Modell oder den level, je nach Komplexität der Aufgabe. Aber bedenken Sie dass Wissen von Session zu Session verloren geht, wenn es nicht erinnert wird. Technisch sind Erinnerungen nichts anderes als das Lesen einer Liste der vormaligen remember Anweisungen. Kosten also auch Tokens. Sie könnten also die Erinnerunge auch einfach neu eintippen ;-)&lt;br /&gt;
* auch wenn es so scheint: das &amp;quot;Ding&amp;quot; ist kein Mensch; lassen sie &amp;quot;bitte, danke, oder Begründungen - es sei denn sie dienen der Entscheidung - weg. Tatsächlich erhöhen sie  den Tokenverbrauch u.U.&lt;br /&gt;
&lt;br /&gt;
Subjektive Zusammenfassung: &lt;br /&gt;
* haiku ist viel schneller in der Antwort und kostet ein Zehntel. Mit Sonnet war nach 3-4 Std Arbeit mein Limit erreicht und ich durfte Stunden Pause machen. Mit Haiku kann man durcharbeiten. Aber ich brauche auch mindestens doppelt so viel Zeit um haiku anzuleiten und seine Fehler wieder auszubügeln.&lt;br /&gt;
&lt;br /&gt;
== Was kann eine lokale KI (z.B. ollama) ==&lt;br /&gt;
&lt;br /&gt;
Erste Versuche sind eher ernüchternd. Ohne Zugriff auf lokale Quellen, mit rein antrainiertem Wissen sind die Modelle vermutlich zu klein. Hier eine Konversation mit gemma3:8b-it-qat (8 Mrd, quantifiziert) auf einem Rechner ohne GPU.&lt;br /&gt;
Die Antwortzeiten sind natürlich schlecht, aber mit einer GPU u.U. brauchbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig: wir sind selbst noch Anfänger und keine [https://en.wikipedia.org/wiki/Susan_Calvin KI Psychologen].&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
 install ollama&lt;br /&gt;
 ollama pull gemma3:8b-it-qat ;; gemma3:8b / gemma3:12b usw.&lt;br /&gt;
 ollama run gemma3:8b-it-qat&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 1 ===&lt;br /&gt;
Hinweise: Wichtig, sonst labert Sie das Modell voll!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; respond short and concise&lt;br /&gt;
 Understood&lt;br /&gt;
&lt;br /&gt;
Hinweise: Smalltalk/X wissen hat er nicht, aber VW und Pharo sind ähnlich genug.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are an expert in smalltalk programming, especially in Smalltalk/X, visualworks and Squeak.&lt;br /&gt;
 &lt;br /&gt;
 You have come to the right place I have a considerable depth of knowledge regarding Smalltalk...&lt;br /&gt;
Angeber- wir werden sehen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what does the smalltalk expression &amp;quot;self at:4 put:&#039;bla&#039; &amp;quot; mean&lt;br /&gt;
 &lt;br /&gt;
 Sets the character &#039;b&#039; at index 4 of `self` (assuming `self` is a string).&lt;br /&gt;
Falsche Antwort; Smalltalk verwendet 1-basierte Indices, und &#039;bla&#039; ist ein String&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to compute the area of a circle given radius&lt;br /&gt;
 &lt;br /&gt;
 ```smalltalk&lt;br /&gt;
 | radius area |&lt;br /&gt;
 radius := 5.0.&lt;br /&gt;
 area := radius * radius * PI.&lt;br /&gt;
 ^area&lt;br /&gt;
 ```&lt;br /&gt;
nicht schlecht. &lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to extract a substring&lt;br /&gt;
 &lt;br /&gt;
 `substring:startIndexToEndIndex` (inclusive). E.g., `&amp;quot;hello&amp;quot; substring:2 to:4` yields `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
wieder falsch; 1-basierter index, substring:to: möglicherweise in einem anderen Smalltalk vorhanden. Könnte man durchgehen lassen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; alternative?&lt;br /&gt;
 &lt;br /&gt;
 `copyFrom:to:` (indexes inclusive). `string copyFrom:1 to:3` gives `&amp;quot;ell&amp;quot;`.&lt;br /&gt;
besser, aber immer noch falscher Index&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;hello&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;llo&amp;quot;&lt;br /&gt;
war zu erwarten&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; smalltalk uses 1 based indexing. what is the result&lt;br /&gt;
 &lt;br /&gt;
 Correct. The result of `&#039;hello&#039; copyFrom:2 to:4` is `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
soso. Er sieht ein, dass ich korrigiert habe - dann aber dickköpfig.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; in smalltalk the first index is 1 the last is the collection&#039;s size. Not as in Python or C.&lt;br /&gt;
 &lt;br /&gt;
 Precisely. 1-based indexing is core to Smalltalk.&lt;br /&gt;
aha, er könnte es wissen; es fehlt ihm aber offensichtlich an Abstraktionsvermögen. Versuchen wir es mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 You are absolutely right! My apologies. `copyFrom:to:` includes both endpoints, so `&#039;hello&#039; copyFrom:2 to:4` results in `&amp;quot;ell&amp;quot;`. Thanks for the correction. I am still under development and learning nuances like this.&lt;br /&gt;
soso, eine Nuance. Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;bcd&amp;quot;&lt;br /&gt;
na also; geht doch.&lt;br /&gt;
&lt;br /&gt;
=== Sitzung 2 ===&lt;br /&gt;
&lt;br /&gt;
Neuer Versuch; eine neue Session. Gib ihm Grundwissen, das er nicht im Modell hat.&lt;br /&gt;
 /clear&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; answer short an concise&lt;br /&gt;
 Okay.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are expert in smalltalk programming, especially smalltalk/x, visualworks and pharo&lt;br /&gt;
 &lt;br /&gt;
 Acknowledged. I&#039;m ready to leverage my knowledge of Smalltalk (including Smalltalk/X, VisualWorks, and Pharo) to&lt;br /&gt;
assist you. Ask away!&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: because smalltalk is 1-based indexing, the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 Understood. I will keep in mind Smalltalk&#039;s 1-based indexing when answering your questions about string&lt;br /&gt;
manipulation and other operations&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &#039;bcd&#039;&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; given Array #(10 20 30 40) what is the result of array at:3&lt;br /&gt;
 &lt;br /&gt;
 30&lt;br /&gt;
richtig!&lt;br /&gt;
&lt;br /&gt;
Man muss den Context also mit Wissen füllen, dann kommt durchaus sinnvolles heraus. Wir sind dran, das zu evaluieren damit möglicherweise sogar eine lokale KI (allerdings mit GPU) hilfreich unterstützen kann.&lt;br /&gt;
[[Kategorie:Plugin]]&lt;br /&gt;
[[Kategorie:Erweiterung]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31355</id>
		<title>KI Coding Plugin</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=KI_Coding_Plugin&amp;diff=31355"/>
		<updated>2026-06-04T10:44:46Z</updated>

		<summary type="html">&lt;p&gt;Cg: /* Was kann eine lokale KI (z.B. ollama) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KI Coding Plugin =&lt;br /&gt;
&lt;br /&gt;
Das KI Coding Plugin bindet einen Large Language Model (LLM) basierten&lt;br /&gt;
KI-Assistenten in den Activity-Editor (Aktivitäten-Code), den&lt;br /&gt;
Compound-Netzwerk-Editor, den Dokumentations-Editor und in den&lt;br /&gt;
ST/X Class Browser ein.  Das Plugin unterstützt zwei Anbieter, die im&lt;br /&gt;
Einstellungsdialog umschaltbar sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Anthropic Claude&#039;&#039;&#039; (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5)&lt;br /&gt;
* &#039;&#039;&#039;OpenAI ChatGPT&#039;&#039;&#039; (gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o1, o3)&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; (codellama:7b, codellama:13b)&lt;br /&gt;
Je nach gewähltem Anbieter erscheint die Toolbar-Schaltfläche als&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;Ask Claude&amp;quot;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;quot;Ask ChatGPT&amp;quot;&#039;&#039;&#039;; das Einstellungs-Tab&lt;br /&gt;
heißt &#039;&#039;&#039;&amp;quot;AI Coding&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten-Editor ==&lt;br /&gt;
&lt;br /&gt;
Im Aktivitäten-Code-Editor erscheint in der Toolbar eine Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit folgenden Aktionen:&lt;br /&gt;
&lt;br /&gt;
* Open KI Window — öffnet das eigenständige Chat-Fenster&lt;br /&gt;
* Explain code — erklärt den Code der aktuellen Aktivität&lt;br /&gt;
* Suggest improvement — schlägt Verbesserungen vor&lt;br /&gt;
* Find bugs — sucht nach Fehlern, Race Conditions, nil-Handling-Problemen&lt;br /&gt;
* Generate doc-comment — generiert eine Aktivitäts-Dokumentation inklusive Pin-Kommentaren und füllt den Documentation-Tab&lt;br /&gt;
* Custom prompt... — freier Prompt; der Aktivitäts-Code wird als Kontext mitgesendet&lt;br /&gt;
* Set model ▸ — Untermenü mit den Modellen des aktiven Anbieters (das aktuell aktive ist mit &#039;&#039;(active)&#039;&#039; markiert)&lt;br /&gt;
* Set provider ▸ — nur sichtbar, wenn API-Schlüssel für mehr als einen Anbieter konfiguriert sind; Untermenü zum Umschalten zwischen Claude und ChatGPT&lt;br /&gt;
&lt;br /&gt;
Code-Vorschläge können mit &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (direkt am jeweiligen&lt;br /&gt;
Code-Block im Chat oder über die obere Apply-Schaltfläche) in den&lt;br /&gt;
Aktivitäts-Body übernommen werden.  Vom KI gelieferte Smalltalk/X&lt;br /&gt;
Hilfsmethoden (Form: &amp;lt;code&amp;gt;Klasse &amp;gt;&amp;gt; selector&amp;lt;/code&amp;gt;) werden nach&lt;br /&gt;
Rückfrage in die genannte Klasse compiliert.&lt;br /&gt;
&lt;br /&gt;
== Compound (Netzwerk) Editor ==&lt;br /&gt;
&lt;br /&gt;
Auf der Toolbar von Compound-Worksheets erscheint dieselbe&lt;br /&gt;
Schaltfläche, beschränkt auf die für Netze sinnvollen Aktionen&lt;br /&gt;
(Open KI Window, Generate doc-comment) — ebenfalls mit den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Dokumentations-Editor ==&lt;br /&gt;
&lt;br /&gt;
Der Dokumentations-Tab der Block-Description (Editor für Test-Cases,&lt;br /&gt;
Test-Plans und Aktivitäten) trägt dieselbe Toolbar-Schaltfläche&lt;br /&gt;
&amp;quot;Ask Claude&amp;quot; / &amp;quot;Ask ChatGPT&amp;quot; mit den Einträgen&lt;br /&gt;
&#039;&#039;&#039;Open KI Window&#039;&#039;&#039;, &#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; sowie den&lt;br /&gt;
Untermenüs &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Generate doc-comment&#039;&#039;&#039; analysiert den aktuellen Block (Name,&lt;br /&gt;
vorhandene Beschreibung, Eingangs-/Ausgangs-Pins, Sub-Steps eines&lt;br /&gt;
Compound-Netzes, referenzierte Environment-Variablen) und schlägt&lt;br /&gt;
eine vollständige Block- und Pin-Dokumentation vor.&lt;br /&gt;
&lt;br /&gt;
Ist der Block schreibgeschützt (importierte Library, RTL-Lizenz),&lt;br /&gt;
fragt &#039;&#039;&#039;[Apply]&#039;&#039;&#039; nach, ob der Block freigeschaltet und die&lt;br /&gt;
Dokumentation eingetragen werden soll.&lt;br /&gt;
&lt;br /&gt;
== Class Browser (ST/X) ==&lt;br /&gt;
&lt;br /&gt;
Im Class Browser stehen die Aktionen unter dem &#039;&#039;&#039;AI&#039;&#039;&#039;-Untermenü&lt;br /&gt;
sowie im Selektor-Kontextmenü zur Verfügung.  Die Aktionen&lt;br /&gt;
operieren auf der aktuell ausgewählten Methode (Klasse + Selektor +&lt;br /&gt;
Quelltext werden als Kontext mitgesendet).  &#039;&#039;&#039;[Apply]&#039;&#039;&#039; kann das&lt;br /&gt;
Resultat direkt in die Methode der aktiven Klasse einbauen.&lt;br /&gt;
Auch hier sind &#039;&#039;&#039;Set model&#039;&#039;&#039; und ggf. &#039;&#039;&#039;Set provider&#039;&#039;&#039; als&lt;br /&gt;
Untermenüs verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Chat-Fenster ==&lt;br /&gt;
&lt;br /&gt;
Das eigenständige Chat-Fenster trägt den Titel&lt;br /&gt;
&#039;&#039;&#039;AI Coding [&amp;amp;lt;Produkt&amp;amp;gt; / &amp;amp;lt;Modell&amp;amp;gt;]&#039;&#039;&#039; (z.B.&lt;br /&gt;
&amp;quot;AI Coding [Claude / claude-opus-4-7]&amp;quot;) und zeigt nach jedem Turn&lt;br /&gt;
den Tokenverbrauch und die kumulierten Kosten — sofern Preise für&lt;br /&gt;
das gewählte Modell hinterlegt sind.  Anbieter- und Modellwechsel&lt;br /&gt;
im Einstellungsdialog werden live übernommen.&lt;br /&gt;
&lt;br /&gt;
Das Transkript ist als vertikales Panel von &amp;quot;Karten&amp;quot; aufgebaut:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prosa-Karten&#039;&#039;&#039; enthalten den fließenden Text der Antwort; Zeilen werden auf die Fenster-Breite umgebrochen.&lt;br /&gt;
* &#039;&#039;&#039;Code-Karten&#039;&#039;&#039; (eingerahmt) entstehen aus markdown-Code-Blöcken (&amp;lt;code&amp;gt;```...```&amp;lt;/code&amp;gt;) und sind als &#039;&#039;&#039;Workspace&#039;&#039;&#039; editierbar — das Standard-Smalltalk-Popup-Menü bietet doIt / printIt / inspectIt, ein &amp;lt;code&amp;gt;TestCase&amp;lt;/code&amp;gt;-&amp;lt;code&amp;gt;simulatedSelf&amp;lt;/code&amp;gt; ist gesetzt, so dass &amp;lt;code&amp;gt;self assert:... equals:...&amp;lt;/code&amp;gt; direkt ausgeführt werden kann.  Lange Blöcke scrollen innerhalb der Karte.  Rechts oben sitzen die Schaltflächen &#039;&#039;&#039;[Apply]&#039;&#039;&#039; (sofern für den Kontext sinnvoll) und &#039;&#039;&#039;[⎘ Copy]&#039;&#039;&#039;; links wird der Sprachtag (smalltalk, python, …) angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Doku-Karten&#039;&#039;&#039; (volle Breite, Prosa) entstehen aus dem speziellen &amp;lt;code&amp;gt;```doc&amp;lt;/code&amp;gt;-Block, den der Dokumentations-Generator anfordert; Inhalt ist die Vorschlags-Dokumentation für Block- und Pin-Beschreibungen.&lt;br /&gt;
&lt;br /&gt;
Scroll-Lock: solange der Anwender bereits am unteren Ende des&lt;br /&gt;
Transkripts steht, folgt die Anzeige neu eintreffenden Karten&lt;br /&gt;
automatisch; nach manuellem Hochscrollen bleibt die Position stehen.&lt;br /&gt;
&lt;br /&gt;
Bilder können als Anhang versendet werden (Screenshot oder&lt;br /&gt;
PNG/JPG-Datei).  Anhänge funktionieren mit beiden Anbietern; bei&lt;br /&gt;
OpenAI nur mit vision-fähigen Modellen (gpt-4o-Familie).&lt;br /&gt;
&lt;br /&gt;
== Einstellungen (AI Coding) ==&lt;br /&gt;
&lt;br /&gt;
Im Einstellungsdialog unter &#039;&#039;&#039;Plugins → AI Coding&#039;&#039;&#039; (bzw. unter&lt;br /&gt;
&#039;&#039;&#039;Tools → AI Coding&#039;&#039;&#039; im Smalltalk-Launcher) werden konfiguriert:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Provider&#039;&#039;&#039; — Anthropic oder OpenAI.  Beim Wechsel werden API-URL und Default-Modell entsprechend angepasst; der gespeicherte API-Schlüssel des jeweiligen Anbieters wird geladen.&lt;br /&gt;
* &#039;&#039;&#039;API Key&#039;&#039;&#039; — Schlüssel des aktuell gewählten Anbieters.  Die Schlüssel werden pro Anbieter getrennt gespeichert (&amp;lt;code&amp;gt;#claudeApiKey_anthropic&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;#claudeApiKey_openai&amp;lt;/code&amp;gt;), so dass zwischen den Anbietern ohne erneute Eingabe gewechselt werden kann.  Das Setzen des Schlüssels erfolgt ausschließlich über diesen Dialog.&lt;br /&gt;
* &#039;&#039;&#039;Model&#039;&#039;&#039; — ein Modell aus der Liste des aktiven Anbieters oder ein selbst eingegebener Modellname.  Kann auch direkt über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü in den Editor-Toolbars umgeschaltet werden.&lt;br /&gt;
* &#039;&#039;&#039;Max output tokens&#039;&#039;&#039; — maximale Antwortlänge.&lt;br /&gt;
* &#039;&#039;&#039;API URL&#039;&#039;&#039; — nur zu ändern für eigene Proxies / Gateways.  Standard: &amp;lt;code&amp;gt;https://api.anthropic.com/v1/messages&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;https://api.openai.com/v1/chat/completions&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== API-Schlüssel beschaffen ==&lt;br /&gt;
&lt;br /&gt;
* Anthropic: [https://console.anthropic.com console.anthropic.com], Schlüsselformat &amp;lt;code&amp;gt;sk-ant-...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* OpenAI: [https://platform.openai.com/api-keys platform.openai.com/api-keys], Schlüsselformat &amp;lt;code&amp;gt;sk-...&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;sk-proj-...&amp;lt;/code&amp;gt;.  Voraussetzung ist ein aufgeladenes Konto (Mindestbetrag derzeit USD 5).&lt;br /&gt;
&lt;br /&gt;
== Datenschutz / Datenfluss ==&lt;br /&gt;
&lt;br /&gt;
Bei aktivem Anbieter &#039;&#039;&#039;Anthropic&#039;&#039;&#039; gehen die Anfragen direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.anthropic.com&amp;lt;/code&amp;gt;, bei &#039;&#039;&#039;OpenAI&#039;&#039;&#039; direkt an&lt;br /&gt;
&amp;lt;code&amp;gt;api.openai.com&amp;lt;/code&amp;gt;.  Es gibt keinen eXept-seitigen Proxy oder&lt;br /&gt;
Zwischenspeicher.  Mit dem Aktivitäts-Quelltext bzw. den Methoden-&lt;br /&gt;
Quelltexten werden auch Pin-Beschreibungen, Sub-Step-Namen und&lt;br /&gt;
referenzierte Environment-Variablen aus dem Block-Description-Modell&lt;br /&gt;
als Kontext versendet.&lt;br /&gt;
&lt;br /&gt;
Bei Benutzung von Anthropic API-Tokens - wie hier der Fall - werden laut Anthropic die Daten nicht zum Training des KI-Modells genutzt ([https://privacy.claude.com/de/articles/7996868-werden-meine-daten-fur-das-modelltraining-verwendet Anthropic Erkärung dazu]). Für die Wahrheit dieser Aussage könne wir nicht garantieren und haften.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie sicher sein wollen, daß keine Information Ihr Haus verlässt empfehlen wir eine eigenem geschlossene in-house KI Umgebung, wie sie bei einigen unserer Kunden bereits existiert. Sie dürfen dann selbstverständlich nur die URLs dieser Umgebung konfigurieren. Expecco kommuniziert ausschließlich mit der von Ihnen eingegebenen KI.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mehrere Konversationen&#039;&#039;&#039;: der Chat ist ein Singleton — eine neue Anfrage über ein Browser-/Editor-Menü startet jedesmal eine &#039;&#039;&#039;neue&#039;&#039;&#039; Konversation. Folge-Fragen (Klärung, Vertiefung) gehen über das Eingabefeld in derselben Konversation.&lt;br /&gt;
* &#039;&#039;&#039;Vorsicht:&#039;&#039;&#039; Die Größe der übertragenen Daten (auch die aus dem Chatfenster) geht in die Kostenberechnung ein. Deshalb immer eine neue Konversation starten, wenn es um ein neues Thema geht.&lt;br /&gt;
* &#039;&#039;&#039;Modell wechseln&#039;&#039;&#039;: Für schnelle Routine-Antworten Sonnet, für schwierige Refactorings Opus. Über das &#039;&#039;&#039;Set model&#039;&#039;&#039;-Untermenü direkt aus der Toolbar oder über die Settings.&lt;br /&gt;
* &#039;&#039;&#039;Anbieter wechseln&#039;&#039;&#039;: Sind Schlüssel für beide Anbieter konfiguriert, schaltet das &#039;&#039;&#039;Set provider&#039;&#039;&#039;-Untermenü ohne Umweg über den Settings-Dialog um.&lt;br /&gt;
* &#039;&#039;&#039;Code direkt ausführen&#039;&#039;&#039;: In Code-Karten kann markierter Smalltalk-Code per doIt / printIt / inspectIt direkt evaluiert werden — praktisch z.B. um vom Modell vorgeschlagene SUnit-Asserts gleich auszuprobieren, ohne den Code erst in einen Workspace zu kopieren.&lt;br /&gt;
* &#039;&#039;&#039;Custom prompt&#039;&#039;&#039; eignet sich gut für „warum macht Methode X es so und nicht so?&amp;quot; oder „schreib mir einen ParameterizedTest dazu mit folgenden Daten: …&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tipps für die Arbeit mit claudeCode ==&lt;br /&gt;
Wenn Sie claudeCode verwenden, stehen ihnen noch weit mehr Funktionen zur Verfügung: sie können zum Beispiel im claudeCode Terminal eingeben: &lt;br /&gt;
* &amp;quot;mach mir eine neue Suite in einem neuen Fenster&amp;quot;,&lt;br /&gt;
* &amp;quot;Mache eine Aktion zur Berechnung des Umfangs eines Kreises bei gegebenen Radius&amp;quot;, &lt;br /&gt;
* &amp;quot;Erstelle eine neue suite mit einem Testfall der folgendes macht: &lt;br /&gt;
** 1) webbrowser auf &amp;quot;www.exept.de&amp;quot; öffnen. &lt;br /&gt;
** 2) auf das logo oben links klicken. &lt;br /&gt;
** 3) webbrowser schliessen.&lt;br /&gt;
* welche Funktionalität ist in xxx.ets&lt;br /&gt;
&lt;br /&gt;
Claude wurde von uns in die Lage versetzt, selbst nach passenden Bibliotheken zu suchen, diese zu importieren, Aktionen zu Generieren und den Testplan anzulegen.&lt;br /&gt;
&lt;br /&gt;
Tatsächlich auch, den Test gleich durchzuführen und das Resultat zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind wir am trainieren, so dass claude z.B. selbst entscheidet ob es besser ist, eine fehlende Aktion als  Diagramm oder als elementare zu definieren. Es ist in der Lage, die Funktionen des unterliegenden Frameworks zu sehen und auch komplexe Aufgaben zu erledigen:&lt;br /&gt;
* &amp;quot;aktion zum Lesen der Jahresumsätze eines Jahres aus der Datenbank&amp;quot;&lt;br /&gt;
* extrahiere aus dem xml Dokument alle budget Einträge und liefere die Summe&lt;br /&gt;
&lt;br /&gt;
=== Erfahrungen und Tipps für die Arbeit ===&lt;br /&gt;
&lt;br /&gt;
Sonnet-4 ist gefühlt weit intelligenter als Heiku-4.5,&lt;br /&gt;
aber auch weit teurer. Ihr Budget kann sehr schnell schmelzen mit Sonnet. Insbesondere wenn man auf medium oder high Intelligenzlevel abeitet. Aber Haiku macht auch weit mehr Fehler und man sollte genau hinschauen was er so generiert. Gefühlt war Sonnet selbst im low level besser als Haiku. Aber der Preis...&lt;br /&gt;
&lt;br /&gt;
Folgende konkrete Tipps aus unseren ersten Erfahrungen, diese Liste wird aktualisiert, und kann auch basieren auf unserer eigenen Dummheit. Ist also u.U.mit Vorsicht zu geniessen.&lt;br /&gt;
&lt;br /&gt;
* geben Sie Haiku Hinweise, z.B. schau mal dort, oder nimm das als Beispiel. Sonnet findet selbst viel besser Lösungen.&lt;br /&gt;
* kurze Anweisungen, je konkreter desto günstiger.&lt;br /&gt;
* haiku ist weit &amp;quot;fauler&amp;quot;. Z.B hat sonnet automatisch eine Dokumentation bei neuen Aktionen angelegt, und diese auch aktualisiert. Haiku hingegen musste man explizit eine Regel dazu anlegen (z.B. mit &amp;quot;wenn du eine aktion anlegst oder änderst, aktualisiere die dokumentation&amp;quot;)&lt;br /&gt;
* heiku ist dümmer. Regeln die von sonnet angelegt wurden, können von haiku u.U. nicht befolgt werden, weil sonnet weit mehr generalisieren kann.&lt;br /&gt;
* sagen sie beiden sie sollten wenn sie ein Problem haben,  nicht lange selbst suchen. sondern nachfragen ob man ihnen einen Tipp geben kann. Wenn Sie das nicht tun, kann es sein dass Sonnet auch eine viertel Stunde nachdenkt und die Dollars schmelzen wie Eis in der Sonne&amp;lt;br&amp;gt;(ist mir passiert, als ein Socket Problem in der Kommunikation auftrat, und er nicht erkannte, das die Antworten von mcp falsch waren, es hat dann selbst alle möglichen Wege gesucht, eine Nachricht abzusetzen, incl. der Erstellung diverser Shell, curl und Python Scripte... obgleich es eigentlich ein Interface dafür gab, das aber einen Fehler hatte).&lt;br /&gt;
* schränken Sie das Modell in seinen Möglichkeiten ein, z.B. sagen sie &amp;quot;editiere nicht die files sondern verwende dazu ein tool&amp;quot;, oder &amp;quot;eine expecco aktion und sag mir vorher welche du nimmst&amp;quot;. Sonst kann es passieren dass es anfängt ihre ets zu entpacken um darin nach strings zu suchen, obgleich es das eigentlich einfacher über das interface machen kann (dieses konkrete Problem wird nicht mehr auftreten aber Sie sehen den Punkt). Da war Sonnet weit intelligenter hat aber auch länger nachgedacht. &lt;br /&gt;
* wenn sie feststellen, dass es einen Fehler macht, sagen sie (wörtlich) &amp;quot;remember: mach dies nicht, oder um das zu machen tu das.&amp;quot;&lt;br /&gt;
* sie können diese Erinnerungen sowohl in ihrem UserProfile (also im lokalen Filesystem) als auch in ihren expecco Präferenzen halten. Sagen Sie dazu &amp;quot;remember this in in my expecco memory&amp;quot; oder &amp;quot;remember (in my user memory): bla bla&amp;quot;. Erinnerungen kann man auch löschen &amp;quot;forget to ...&amp;quot;. Zu Beginn der nächsten session sagen sie &amp;quot;read your expecco memory&amp;quot;.&lt;br /&gt;
* wechseln sie das Modell oder den level, je nach Komplexität der Aufgabe. Aber bedenken Sie dass Wissen von Session zu Session verloren geht, wenn es nicht erinnert wird. Technisch sind Erinnerungen nichts anderes als das Lesen einer Liste der vormaligen remember Anweisungen. Kosten also auch Tokens. Sie könnten also die Erinnerunge auch einfach neu eintippen ;-)&lt;br /&gt;
* auch wenn es so scheint: das &amp;quot;Ding&amp;quot; ist kein Mensch; lassen sie &amp;quot;bitte, danke, oder Begründungen - es sei denn sie dienen der Entscheidung - weg. Tatsächlich erhöhen sie  den Tokenverbrauch u.U.&lt;br /&gt;
&lt;br /&gt;
Subjektive Zusammenfassung: &lt;br /&gt;
* haiku ist viel schneller in der Antwort und kostet ein Zehntel. Mit Sonnet war nach 3-4 Std Arbeit mein Limit erreicht und ich durfte Stunden Pause machen. Mit Haiku kann man durcharbeiten. Aber ich brauche auch mindestens doppelt so viel Zeit um haiku anzuleiten und seine Fehler wieder auszubügeln.&lt;br /&gt;
&lt;br /&gt;
== Was kann eine lokale KI (z.B. ollama) ==&lt;br /&gt;
&lt;br /&gt;
Erste Versuche sind eher ernüchternd. Ohne Zugriff auf lokale Quellen, mit rein antrainiertem Wissen sind die Modelle vermutlich zu klein. Hier eine Konversation mit gemma3:8b-it-qat (8 Mrd, quantifiziert) auf einem Rechner ohne GPU.&lt;br /&gt;
Die Antwortzeiten sind natürlich schlecht, aber mit einer GPU u.U. brauchbar.&lt;br /&gt;
&lt;br /&gt;
 install ollama&lt;br /&gt;
 ollama run gemma3:8b-it-qat&lt;br /&gt;
&lt;br /&gt;
Hinweise: Wichtig, sonst labert Sie das Modell voll!&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; respond short and concise&lt;br /&gt;
 Understood&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are an expert in smalltalk programming, especially in Smalltalk/X, visualworks and Squeak.&lt;br /&gt;
 &lt;br /&gt;
 You have come to the right place I have a considerable depth of knowledge regarding Smalltalk...&lt;br /&gt;
Angeber- wir werden sehen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what does the smalltalk expression &amp;quot;self at:4 put:&#039;bla&#039; &amp;quot; mean&lt;br /&gt;
 &lt;br /&gt;
 Sets the character &#039;b&#039; at index 4 of `self` (assuming `self` is a string).&lt;br /&gt;
Falsche Antwort; Smalltalk verwendet 1-basierte Indices, und &#039;bla&#039; ist ein String&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to compute the area of a circle given radius&lt;br /&gt;
 &lt;br /&gt;
 ```smalltalk&lt;br /&gt;
 | radius area |&lt;br /&gt;
 radius := 5.0.&lt;br /&gt;
 area := radius * radius * PI.&lt;br /&gt;
 ^area&lt;br /&gt;
 ```&lt;br /&gt;
nicht schlecht. &lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; how to extract a substring&lt;br /&gt;
 &lt;br /&gt;
 `substring:startIndexToEndIndex` (inclusive). E.g., `&amp;quot;hello&amp;quot; substring:2 to:4` yields `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
wieder falsch; 1-basierter index, substring:to: möglicherweise in einem anderen Smalltalk vorhanden. Könnte man durchgehen lassen&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; alternative?&lt;br /&gt;
 &lt;br /&gt;
 `copyFrom:to:` (indexes inclusive). `string copyFrom:1 to:3` gives `&amp;quot;ell&amp;quot;`.&lt;br /&gt;
besser, aber immer noch falscher Index&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;hello&#039; copyFrom:2 to:4&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;llo&amp;quot;&lt;br /&gt;
war zu erwarten&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; smalltalk uses 1 based indexing. what is the result&lt;br /&gt;
 &lt;br /&gt;
 Correct. The result of `&#039;hello&#039; copyFrom:2 to:4` is `&amp;quot;llo&amp;quot;`.&lt;br /&gt;
soso. Correct. Dann aber dickköpfig.&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; in smalltalk the first index is 1 the last is the collection&#039;s size. Not as in Python or C.&lt;br /&gt;
 &lt;br /&gt;
 Precisely. 1-based indexing is core to Smalltalk.&lt;br /&gt;
aha, er könnte es wissen; es fehlt ihm aber offensichtlich an Abstraktionsvermögen. Versuchen wir es mit einem Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 &lt;br /&gt;
 You are absolutely right! My apologies. `copyFrom:to:` includes both endpoints, so `&#039;hello&#039; copyFrom:2 to:4`&lt;br /&gt;
results in `&amp;quot;ell&amp;quot;`. Thanks for the correction. I am still under development and learning nuances like this.&lt;br /&gt;
soso, eine Nuance. Mal sehen:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;bcd&amp;quot;&lt;br /&gt;
na also. geht doch.&lt;br /&gt;
&lt;br /&gt;
Neuer Versuch; eine neue Session. Gib ihm Grundwissen, das er nicht im Modell hat.&lt;br /&gt;
 /clear&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; answer short an concise&lt;br /&gt;
 Okay.&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; you are expert in smalltalk programming, especially smalltalk/x, visualworks and pharo&lt;br /&gt;
 Acknowledged. I&#039;m ready to leverage my knowledge of Smalltalk (including Smalltalk/X, VisualWorks, and Pharo) to&lt;br /&gt;
assist you. Ask away!&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; remember: because smalltalk is 1-based indexing, the result of &#039;hello&#039; copyFrom:2 to4 is &#039;ell&#039;&lt;br /&gt;
 Understood. I will keep in mind Smalltalk&#039;s 1-based indexing when answering your questions about string&lt;br /&gt;
manipulation and other operations&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; what is the result of &#039;abcde&#039; copyFrom:2 to:4&lt;br /&gt;
 &#039;bcd&#039;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; given Array #(10 20 30 40) what is the result of array at:3&lt;br /&gt;
30&lt;br /&gt;
&lt;br /&gt;
Man muss den Context also mit Wissen füllen, dann kommt durchaus sinnvolles heraus. Wir sind dran, das zu evaluieren damit möglicherweise sogar eine lokale KI (allerdings mit GPU) hilfreich unterstützen kann.&lt;br /&gt;
[[Kategorie:Plugin]]&lt;br /&gt;
[[Kategorie:Erweiterung]]&lt;/div&gt;</summary>
		<author><name>Cg</name></author>
	</entry>
</feed>