<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://50.77.162.165/mediawiki/skins/common/feed.css?207"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://50.77.162.165/mediawiki/index.php?feed=atom&amp;target=Mscheffler&amp;title=Special%3AContributions</id>
		<title>Erights - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://50.77.162.165/mediawiki/index.php?feed=atom&amp;target=Mscheffler&amp;title=Special%3AContributions"/>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Special:Contributions/Mscheffler"/>
		<updated>2026-04-20T01:12:22Z</updated>
		<subtitle>From Erights</subtitle>
		<generator>MediaWiki 1.15.5-7</generator>

	<entry>
		<id>http://50.77.162.165/wiki/Emaker</id>
		<title>Emaker</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Emaker"/>
				<updated>2007-04-23T08:43:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The E library package system is based on emakers. An emaker is an E source file named with &amp;quot;.emaker&amp;quot; as the suffix.&lt;br /&gt;
&lt;br /&gt;
When an emaker is imported into an application, the code is executed at the time of import, and the result of that execution is returned to the importing program. Usually an emaker will return an object that can be used to create other objects - a maker (or factory).&lt;br /&gt;
&lt;br /&gt;
There are several ways of making E aware of the availability of an emaker, corresponding to the several ways Java can become aware of a class. You can place it in a zip or a jar and place it in the jvm's ext directory. Or you can place it in a subfolder in the jvm's ext directory. Or you can place it, or a jar that contains it, on the classpath when you start up the jvm.&lt;br /&gt;
&lt;br /&gt;
Emakers have an important security property: they come to life contained in a world with no authority. Such a world is even more restrictive than the Java sandbox used for applets. However, this world is more flexible than the sandbox because authority can be granted and revoked during operation using capabilities, as described in the [[http://wiki.erights.org/wiki/Walnut/Secure_Distributed_Computing/Capabilities Walnut chapter on Secure Distributed Computing]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Simple Example==&lt;br /&gt;
Place this in the java classpath of your E application (the classpath of the E interpreter is usually set in the E startup file &amp;quot;rune&amp;quot; or &amp;quot;rune.bat&amp;quot;). Name it &amp;quot;makeVector.emaker&amp;quot;. For this example let's assume the position of the emaker relative to the classpath root is &amp;quot;/tests/makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def makeVector(var x, var y) {&lt;br /&gt;
    def Vector { &lt;br /&gt;
        to getX() :any { return x }&lt;br /&gt;
        to getY() :any { return y }&lt;br /&gt;
        to setX(_x :float64) :void { x := _x }&lt;br /&gt;
        to setY(_y :float64) :void { y := _y }&lt;br /&gt;
    }&lt;br /&gt;
    return Vector&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the emaker, you will have to import it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
? def makeVector := &amp;lt;import:tests.makeVector&amp;gt;&lt;br /&gt;
# value: &amp;lt;makeVector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def myVector := makeVector(2,4)&lt;br /&gt;
# value: &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? myVector.getX()&lt;br /&gt;
# value: 2&lt;br /&gt;
&lt;br /&gt;
? myVector.setX(8)&lt;br /&gt;
? myVector.getX()&lt;br /&gt;
# value: 8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[[Walnut/Ordinary_Programming/Emakers |E in a Walnut: Emakers]]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Emaker</id>
		<title>Emaker</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Emaker"/>
				<updated>2007-04-23T08:42:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;initial, 95% copied from walnut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The E library package system is based on emakers. An emaker is an E source file named with &amp;quot;.emaker&amp;quot; as the suffix.&lt;br /&gt;
&lt;br /&gt;
When an emaker is imported into an application, the code is executed at the time of import, and the result of that execution is returned to the importing program. Usually an emaker will return an object that can be used to create other objects - a maker (or factory).&lt;br /&gt;
&lt;br /&gt;
There are several ways of making E aware of the availability of an emaker, corresponding to the several ways Java can become aware of a class. You can place it in a zip or a jar and place it in the jvm's ext directory. Or you can place it in a subfolder in the jvm's ext directory. Or you can place it, or a jar that contains it, on the classpath when you start up the jvm.&lt;br /&gt;
&lt;br /&gt;
Emakers have an important security property: they come to life contained in a world with no authority. Such a world is even more restrictive than the Java sandbox used for applets. However, this world is more flexible than the sandbox because authority can be granted and revoked during operation using capabilities, as described in the [[http://wiki.erights.org/wiki/Walnut/Secure_Distributed_Computing/Capabilities | Walnut chapter on Secure Distributed Computing]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Simple Example==&lt;br /&gt;
Place this in the java classpath of your E application (the classpath of the E interpreter is usually set in the E startup file &amp;quot;rune&amp;quot; or &amp;quot;rune.bat&amp;quot;). Name it &amp;quot;makeVector.emaker&amp;quot;. For this example let's assume the position of the emaker relative to the classpath root is &amp;quot;/tests/makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def makeVector(var x, var y) {&lt;br /&gt;
    def Vector { &lt;br /&gt;
        to getX() :any { return x }&lt;br /&gt;
        to getY() :any { return y }&lt;br /&gt;
        to setX(_x :float64) :void { x := _x }&lt;br /&gt;
        to setY(_y :float64) :void { y := _y }&lt;br /&gt;
    }&lt;br /&gt;
    return Vector&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use the emaker, you will have to import it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
? def makeVector := &amp;lt;import:tests.makeVector&amp;gt;&lt;br /&gt;
# value: &amp;lt;makeVector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def myVector := makeVector(2,4)&lt;br /&gt;
# value: &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? myVector.getX()&lt;br /&gt;
# value: 2&lt;br /&gt;
&lt;br /&gt;
? myVector.setX(8)&lt;br /&gt;
? myVector.getX()&lt;br /&gt;
# value: 8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[[Walnut/Ordinary_Programming/Emakers |E in a Walnut: Emakers]]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-23T08:20:30Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;linked to emaker article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When objects are transfered to another [[vat]], they arrive as [[far reference|far references]] by default. To reconstruct the object as a [[near reference]] in the receiving vat, Pass By Construction (pbc) can be used.&lt;br /&gt;
&lt;br /&gt;
E [[comm system]]s serialize any object approved by the &amp;lt;code&amp;gt;pbc&amp;lt;/code&amp;gt; auditor as the [[portrayal]] returned by its [[Miranda optUncall|__optUncall/0]] method. For example, this is an object which will always arrive as the number 3:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to [[Miranda optUncall|__optUncall]]() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
This code should be positioned in an [[emaker]] file in the java classpath at the location &amp;quot;tests/makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;amp;lt;Vector $x $y&amp;amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;amp;lt;import&amp;amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# create a new Vector object&lt;br /&gt;
? def makeVector := &amp;amp;lt;import:tests.makeVector&amp;amp;gt;&lt;br /&gt;
# value: &amp;amp;lt;makeVector&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
# function for creating a new local vat&lt;br /&gt;
? def seedVatAuthor := &amp;amp;lt;elang:interp.seedVatAuthor&amp;amp;gt;(&amp;amp;lt;unsafe&amp;amp;gt;).virtualize(introducer)&lt;br /&gt;
# value: &amp;amp;lt;virtualSeedVat&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Run this source code in the new vat. The method accepts a pbc object and prints it.&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# create the new vat. Return a far reference to the object and a reference to the vat object&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;amp;lt;Promise&amp;amp;gt;, &amp;amp;lt;Vat newVirtualSeedVat in &amp;amp;lt;runs in newVirtualSeedVat&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
# pass the pbc object into the new vat&lt;br /&gt;
? scriptObj &amp;amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;amp;lt;Remote Promise&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/FAQ</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/FAQ"/>
				<updated>2007-04-22T09:19:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
===What is E?===&lt;br /&gt;
E is a programming language designed to make it easy to write distributed programs that are correct and secure. For more information, see [[Walnut|E in a Walnut]] and the [http://erights.org Erights.org web site].&lt;br /&gt;
&lt;br /&gt;
===Why is it called 'E'?===&lt;br /&gt;
Douglas Crockford writes: 'I chose E because of the progression B, C. I observed that there was no language D. I figured it was a bad luck letter, so we moved on to E. That 'E' was also the initial of Electric Communities was noticed at the time. It also tied in to our development of the Unum distributed object model.'&lt;br /&gt;
&lt;br /&gt;
===How can I learn about E?===&lt;br /&gt;
A good starting point is the [[Walnut]]. For further information check out [[Getting_Started]]&lt;br /&gt;
&lt;br /&gt;
===Is E free?===&lt;br /&gt;
The code distributed with E is [http://www.erights.org/download/licenses.html licensed] under Mozilla-compatible licenses. According to opensource.org, Mozilla is an open-source license. According to gnu.org, Mozilla is a free software license.&lt;br /&gt;
&lt;br /&gt;
===Can't E's goals be met by an API (instead of a language)?===&lt;br /&gt;
An API on an IPC system can provide inter-process security. But it can't provide intra-process security, because adding an API cannot take away security holes.&lt;br /&gt;
&lt;br /&gt;
ELib, the Java API that underlies E, provides the means for objects to speak to one another in a capability-secure fashion. Objects defined in the E language may only affect the world outside of themselves according to the semantics provided by ELib.&lt;br /&gt;
&lt;br /&gt;
=== I thought Java was secure. Isn't it?===&lt;br /&gt;
Sun claims that 'right from the beginning, the Java platform was designed to run programs securely on networks'. Java takes many steps in the direction of language-based security, such as pointer safety and garbage collection. However, as explained in [[Walnut/Secure_Distributed_Computing|E in a Walnut's 'Capability security' section]], Java security is based on identities of principals, not on keys, and is so complicated that no one uses it nontrivially. It may work for confining applets, but not for more sophisticated patterns of cooperation. For an example of Java's pervasive inattention to security, see the discussion in the same section of how Java's ReadStream class fails to be secure.&lt;br /&gt;
&lt;br /&gt;
==Miscellaneous==&lt;br /&gt;
===How can I declare a Java class as safe for importing?===&lt;br /&gt;
Create a file with the extension .safej and save it to the same class path location as the java class you want to declare as safe. In the .safej file you can declare methods of that class as allowed or rejected. Take a look at the [[Safej_example]]. You can find more .safej files in the E distribution in the folder src/safej.&lt;br /&gt;
&lt;br /&gt;
==Not yet answered questions==&lt;br /&gt;
===Which E implementation should I use? E-on-Java or E-on-CL?===&lt;br /&gt;
===Is there an IDE?===&lt;br /&gt;
===Why should I use E instead of (language X)?===&lt;br /&gt;
===Is E stable?===&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Category:Applications</id>
		<title>Category:Applications</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Category:Applications"/>
				<updated>2007-04-22T09:14:26Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;hmm, we need SOME text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A list of applications using E&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/CapDesk</id>
		<title>CapDesk</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/CapDesk"/>
				<updated>2007-04-21T12:54:53Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''CapDesk''' is a file browser and [[caplet]] launcher written in E.&lt;br /&gt;
&lt;br /&gt;
CapDesk is included in the [[E-on-Java]] distribution. To run it, start &amp;lt;code&amp;gt;scripts/capDesk.e-awt&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;scripts/capDesk.e-swt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[http://en.wikipedia.org/wiki/CapDesk CapDesk at Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/skynet/index.html The SkyNet Virus - Why it is Unstoppable; How to Stop it]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/virus-safe/index.html Talk: Building a Virus-Safe Computing Platform: Don't Add Security, Remove Insecurity]&lt;br /&gt;
&lt;br /&gt;
[[Category:Applications]]&lt;br /&gt;
&lt;br /&gt;
[http://www.combex.com/papers/darpa-review/index.html A Security Analysis of the Combex DarpaBrowser Architecture], David Wagner and Dean Tribble, March 4, 2002&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/CapDesk</id>
		<title>CapDesk</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/CapDesk"/>
				<updated>2007-04-21T12:53:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;wikipedia link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''CapDesk''' is a file browser and [[caplet]] launcher written in E.&lt;br /&gt;
&lt;br /&gt;
CapDesk is included in the [[E-on-Java]] distribution. To run it, start &amp;lt;code&amp;gt;scripts/capDesk.e-awt&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;scripts/capDesk.e-swt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[http://en.wikipedia.org/wiki/CapDesk CapDesk at Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/skynet/index.html The SkyNet Virus - Why it is Unstoppable; How to Stop it]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/virus-safe/index.html Talk: Building a Virus-Safe Computing Platform: Don't Add Security, Remove Insecurity]&lt;br /&gt;
&lt;br /&gt;
[[Category:Applications]]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Vat</id>
		<title>Vat</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Vat"/>
				<updated>2007-04-21T11:37:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Example: How to create a new Vat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See [http://www.erights.org/elib/concurrency/vat.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example: How to create a new Vat==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def  seedVatAuthor := &amp;lt;elang:interp.seedVatAuthor&amp;gt;(&amp;lt;unsafe&amp;gt;).virtualize(introducer)&lt;br /&gt;
# value: &amp;lt;virtualSeedVat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;lt;Promise&amp;gt;, &amp;lt;Vat newVirtualSeedVat in &amp;lt;runs in newVirtualSeedVat&amp;gt;&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj&amp;lt;-run(&amp;quot;Hello Vat&amp;quot;)&lt;br /&gt;
# value: &amp;lt;Remote Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: Hello Vat&lt;br /&gt;
&lt;br /&gt;
# shutting down the vat&lt;br /&gt;
? def ack := vat &amp;lt;- orderlyShutdown(&amp;quot;because I said so&amp;quot;)&lt;br /&gt;
# value: &amp;lt;Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Vat</id>
		<title>Vat</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Vat"/>
				<updated>2007-04-21T11:36:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Example: How to create a new Vat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See [http://www.erights.org/elib/concurrency/vat.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example: How to create a new Vat==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def  seedVatAuthor := &amp;lt;elang:interp.seedVatAuthor&amp;gt;(&amp;lt;unsafe&amp;gt;).virtualize(introducer)&lt;br /&gt;
# value: &amp;lt;virtualSeedVat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;lt;Promise&amp;gt;, &amp;lt;Vat newVirtualSeedVat in &amp;lt;runs in newVirtualSeedVat&amp;gt;&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj&amp;lt;-run(&amp;quot;Hello Vat&amp;quot;)&lt;br /&gt;
# value: &amp;lt;Remote Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: Hello Vat&lt;br /&gt;
&lt;br /&gt;
#shutting down the vat&lt;br /&gt;
? def ack := vat &amp;lt;- orderlyShutdown(&amp;quot;because I said so&amp;quot;)&lt;br /&gt;
# value: &amp;lt;Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Vat</id>
		<title>Vat</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Vat"/>
				<updated>2007-04-21T11:36:25Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Example: How to create a new Vat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See [http://www.erights.org/elib/concurrency/vat.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example: How to create a new Vat==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def  seedVatAuthor := &amp;lt;elang:interp.seedVatAuthor&amp;gt;(&amp;lt;unsafe&amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;lt;virtualSeedVat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;lt;Promise&amp;gt;, &amp;lt;Vat newVirtualSeedVat in &amp;lt;runs in newVirtualSeedVat&amp;gt;&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj&amp;lt;-run(&amp;quot;Hello Vat&amp;quot;)&lt;br /&gt;
# value: &amp;lt;Remote Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: Hello Vat&lt;br /&gt;
&lt;br /&gt;
#shutting down the vat&lt;br /&gt;
? def ack := vat &amp;lt;- orderlyShutdown(&amp;quot;because I said so&amp;quot;)&lt;br /&gt;
# value: &amp;lt;Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Vat</id>
		<title>Vat</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Vat"/>
				<updated>2007-04-21T11:34:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;Created seedVatAuthor example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See [http://www.erights.org/elib/concurrency/vat.html].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example: How to create a new Vat==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def  seedVatAuthor := &amp;lt;elang:interp.seedVatAuthor&amp;gt;(&amp;lt;unsafe&amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;lt;virtualSeedVat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;lt;Promise&amp;gt;, &amp;lt;Vat newVirtualSeedVat in &amp;lt;runs in newVirtualSeedVat&amp;gt;&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj&amp;lt;-run(&amp;quot;Hello Vat&amp;quot;)&lt;br /&gt;
# value: &amp;lt;Remote Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: Hello Vat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/FAQ</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/FAQ"/>
				<updated>2007-04-21T11:29:48Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
===What is E?===&lt;br /&gt;
E is a programming language designed to make it easy to write distributed programs that are correct and secure. For more information, see [[Walnut|E in a Walnut]] and the [http://erights.org Erights.org web site].&lt;br /&gt;
&lt;br /&gt;
===Why is it called 'E'?===&lt;br /&gt;
Douglas Crockford writes: 'I chose E because of the progression B, C. I observed that there was no language D. I figured it was a bad luck letter, so we moved on to E. That 'E' was also the initial of Electric Communities was noticed at the time. It also tied in to our development of the Unum distributed object model.'&lt;br /&gt;
&lt;br /&gt;
===How can I learn about E?===&lt;br /&gt;
A good starting point is the [[Walnut]]. For further information check out [[Getting_Started]]&lt;br /&gt;
&lt;br /&gt;
===Is E free?===&lt;br /&gt;
The code distributed with E is [http://www.erights.org/download/licenses.html licensed] under Mozilla-compatible licenses. According to opensource.org, Mozilla is an open-source license. According to gnu.org, Mozilla is a free software license.&lt;br /&gt;
&lt;br /&gt;
===Can't E's goals be met by an API (instead of a language)?===&lt;br /&gt;
An API on an IPC system can provide inter-process security. But it can't provide intra-process security, because adding an API cannot take away security holes.&lt;br /&gt;
&lt;br /&gt;
ELib, the Java API that underlies E, provides the means for objects to speak to one another in a capability-secure fashion. Objects defined in the E language may only affect the world outside of themselves according to the semantics provided by ELib.&lt;br /&gt;
&lt;br /&gt;
=== I thought Java was secure. Isn't it?===&lt;br /&gt;
Sun claims that 'right from the beginning, the Java platform was designed to run programs securely on networks'. Java takes many steps in the direction of language-based security, such as pointer safety and garbage collection. However, as explained in [[Walnut/Secure_Distributed_Computing|E in a Walnut's 'Capability security' section]], Java security is based on identities of principals, not on keys, and is so complicated that no one uses it nontrivially. It may work for confining applets, but not for more sophisticated patterns of cooperation. For an example of Java's pervasive inattention to security, see the discussion in the same section of how Java's ReadStream class fails to be secure.&lt;br /&gt;
&lt;br /&gt;
==Miscellaneous==&lt;br /&gt;
===How can I declaring a Java class as safe for importing?===&lt;br /&gt;
Create a file with the extension .safej and save it to the same class path location as the java class you want to declare as safe. In the .safej file you can declare methods of that class as allowed or rejected. Take a look at the [[Safej_example]]. You can find more .safej files in the E distribution in the folder src/safej.&lt;br /&gt;
&lt;br /&gt;
==Not yet answered questions==&lt;br /&gt;
===Which E implementation should I use? E-on-Java or E-on-CL?===&lt;br /&gt;
===Is there an IDE?===&lt;br /&gt;
===Why should I use E instead of (language X)?===&lt;br /&gt;
===Is E stable?===&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/FAQ</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/FAQ"/>
				<updated>2007-04-21T11:28:35Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
===What is E?===&lt;br /&gt;
E is a programming language designed to make it easy to write distributed programs that are correct and secure. For more information, see [[Walnut|E in a Walnut]] and the [http://erights.org Erights.org web site].&lt;br /&gt;
&lt;br /&gt;
===Why is it called 'E'?===&lt;br /&gt;
Douglas Crockford writes: 'I chose E because of the progression B, C. I observed that there was no language D. I figured it was a bad luck letter, so we moved on to E. That 'E' was also the initial of Electric Communities was noticed at the time. It also tied in to our development of the Unum distributed object model.'&lt;br /&gt;
&lt;br /&gt;
===How can I learn about E?===&lt;br /&gt;
A good starting point is the [[Walnut]]. For further information check out [[Getting_Started]]&lt;br /&gt;
&lt;br /&gt;
===Is E free?===&lt;br /&gt;
The code distributed with E is [http://www.erights.org/download/licenses.html licensed] under Mozilla-compatible licenses. According to opensource.org, Mozilla is an open-source license. According to gnu.org, Mozilla is a free software license.&lt;br /&gt;
&lt;br /&gt;
===Can't E's goals be met by an API (instead of a language)?===&lt;br /&gt;
An API on an IPC system can provide inter-process security. But it can't provide intra-process security, because adding an API cannot take away security holes.&lt;br /&gt;
&lt;br /&gt;
ELib, the Java API that underlies E, provides the means for objects to speak to one another in a capability-secure fashion. Objects defined in the E language may only affect the world outside of themselves according to the semantics provided by ELib.&lt;br /&gt;
&lt;br /&gt;
=== I thought Java was secure. Isn't it?===&lt;br /&gt;
Sun claims that 'right from the beginning, the Java platform was designed to run programs securely on networks'. Java takes many steps in the direction of language-based security, such as pointer safety and garbage collection. However, as explained in [[Walnut/Secure_Distributed_Computing|E in a Walnut's 'Capability security' section]], Java security is based on identities of principals, not on keys, and is so complicated that no one uses it nontrivially. It may work for confining applets, but not for more sophisticated patterns of cooperation. For an example of Java's pervasive inattention to security, see the discussion in the same section of how Java's ReadStream class fails to be secure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Miscellaneous==&lt;br /&gt;
===How can I declaring a Java class as safe for importing?===&lt;br /&gt;
Create a file with the extension .safej and save it to the same class path location as the java class you want to declare as safe. In the .safej file you can declare methods of that class as allowed or rejected. Take a look at the [[Safej_example]]. You can find more .safej files in the E distribution in the folder src/safej.&lt;br /&gt;
&lt;br /&gt;
==Unanswered questions==&lt;br /&gt;
===Which E implementation should I use? E-on-Java or E-on-CL?===&lt;br /&gt;
===Is there an IDE?===&lt;br /&gt;
===Why should I use E instead of (language X)?===&lt;br /&gt;
===Is E stable?===&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/FAQ</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/FAQ"/>
				<updated>2007-04-21T10:57:31Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
===What is E?===&lt;br /&gt;
E is a programming language designed to make it easy to write distributed programs that are correct and secure. For more information, see [[Walnut|E in a Walnut]] and the [http://erights.org Erights.org web site].&lt;br /&gt;
&lt;br /&gt;
===Why is it called 'E'?===&lt;br /&gt;
&lt;br /&gt;
Douglas Crockford writes: 'I chose E because of the progression B, C. I observed that there was no language D. I figured it was a bad luck letter, so we moved on to E. That 'E' was also the initial of Electric Communities was noticed at the time. It also tied in to our development of the Unum distributed object model.'&lt;br /&gt;
&lt;br /&gt;
===How can I learn about E?===&lt;br /&gt;
A good starting point is the [[Walnut]]. For further information check out [[Getting_Started]]&lt;br /&gt;
&lt;br /&gt;
===Is E free?===&lt;br /&gt;
The code distributed with E is [http://www.erights.org/download/licenses.html licensed] under Mozilla-compatible licenses. According to opensource.org, Mozilla is an open-source license. According to gnu.org, Mozilla is a free software license.&lt;br /&gt;
&lt;br /&gt;
===Can't E's goals be met by an API (instead of a language)?===&lt;br /&gt;
&lt;br /&gt;
An API on an IPC system can provide inter-process security. But it can't provide intra-process security, because adding an API cannot take away security holes.&lt;br /&gt;
&lt;br /&gt;
ELib, the Java API that underlies E, provides the means for objects to speak to one another in a capability-secure fashion. Objects defined in the E language may only affect the world outside of themselves according to the semantics provided by ELib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unanswered questions==&lt;br /&gt;
===Which E implementation should I use? E-on-Java or E-on-CL?===&lt;br /&gt;
===Is there an IDE?===&lt;br /&gt;
===Why should I use E instead of (language X)?===&lt;br /&gt;
===Is E stable?===&lt;br /&gt;
&lt;br /&gt;
==Miscellaneous==&lt;br /&gt;
===How can I declaring a Java class as safe for importing?===&lt;br /&gt;
Create a file with the extension .safej and save it to the same class path location as the java class you want to declare as safe. In the .safej file you can declare methods of that class as allowed or rejected. Take a look at the [[Safej_example]]. You can find more .safej files in the E distribution in the folder src/safej.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/FAQ</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/FAQ"/>
				<updated>2007-04-21T10:56:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;Started to copy stuff from the old FAQ&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
===What is E?===&lt;br /&gt;
E is a programming language designed to make it easy to write distributed programs that are correct and secure. For more information, see [[Walnug E in a Walnut]] and the [http://erights.org Erights.org web site].&lt;br /&gt;
&lt;br /&gt;
===Why is it called 'E'?===&lt;br /&gt;
&lt;br /&gt;
Douglas Crockford writes: 'I chose E because of the progression B, C. I observed that there was no language D. I figured it was a bad luck letter, so we moved on to E. That 'E' was also the initial of Electric Communities was noticed at the time. It also tied in to our development of the Unum distributed object model.'&lt;br /&gt;
&lt;br /&gt;
===How can I learn about E?===&lt;br /&gt;
A good starting point is the [[Walnut]]. For further information check out [[Getting_Started]]&lt;br /&gt;
&lt;br /&gt;
===Is E free?===&lt;br /&gt;
The code distributed with E is [http://www.erights.org/download/licenses.html licensed] under Mozilla-compatible licenses. According to opensource.org, Mozilla is an open-source license. According to gnu.org, Mozilla is a free software license.&lt;br /&gt;
&lt;br /&gt;
===Can't E's goals be met by an API (instead of a language)?===&lt;br /&gt;
&lt;br /&gt;
An API on an IPC system can provide inter-process security. But it can't provide intra-process security, because adding an API cannot take away security holes.&lt;br /&gt;
&lt;br /&gt;
ELib, the Java API that underlies E, provides the means for objects to speak to one another in a capability-secure fashion. Objects defined in the E language may only affect the world outside of themselves according to the semantics provided by ELib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unanswered questions==&lt;br /&gt;
===Which E implementation should I use? E-on-Java or E-on-CL?===&lt;br /&gt;
===Is there an IDE?===&lt;br /&gt;
===Why should I use E instead of (language X)?===&lt;br /&gt;
===Is E stable?===&lt;br /&gt;
&lt;br /&gt;
==Miscellaneous==&lt;br /&gt;
===How can I declaring a Java class as safe for importing?===&lt;br /&gt;
Create a file with the extension .safej and save it to the same class path location as the java class you want to declare as safe. In the .safej file you can declare methods of that class as allowed or rejected. Take a look at the [[Safej_example]]. You can find more .safej files in the E distribution in the folder src/safej.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/User:Mscheffler</id>
		<title>User:Mscheffler</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/User:Mscheffler"/>
				<updated>2007-04-21T10:46:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;User: Martin Scheffler&lt;br /&gt;
&lt;br /&gt;
martin_chocob on #erights&lt;br /&gt;
&lt;br /&gt;
[mailto:wooyay@web.de Mail address]&lt;br /&gt;
&lt;br /&gt;
[http://www.uni-weimar.de/~scheffl2 Homepage]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Talk:Main_Page</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Talk:Main_Page"/>
				<updated>2007-04-21T10:43:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goals for the Main Page ==&lt;br /&gt;
&lt;br /&gt;
I've been trying to keep the main page as short and concise as possible.  We need to keep in mind the users of this site.  The main page is, in a sense, the main user interface for the wiki... it is how people start using the 'application'.  So I'll be trying very hard to keep only the most important and relevant stuff on the main page. --[[User:Ansible|Ansible]] 11:32, 28 March 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
In fact, either on the main page, or on the getting started page, I'd like to have a 1 (one!) paragraph summary of '''''E''''' and why it the greatest thing since sliced bread.  And then 3 or so paragraphs of further explaination.   Perhaps we need to have an updated FAQ, and the first question answers this.  --[[User:Ansible|Ansible]] 11:37, 28 March 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
I just starded the [[FAQ]]. I'll try to hack in as many questions as I can think of. --[[User:mscheffler|mscheffler]] 12:43, 21 April 2007 (CDT)&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Getting_Started</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Getting_Started"/>
				<updated>2007-04-21T10:38:00Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;Removed safej stuff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains some helpful tips for people who are planning on learning E.&lt;br /&gt;
&lt;br /&gt;
==Where to start==&lt;br /&gt;
&lt;br /&gt;
* You should have basic knowledge of [[wikipedia:Java_(language)|Java]] and its [[wikipedia:Classpath_(Java)|class path system]]. &lt;br /&gt;
* [[Downloads|Download]] and install '''''E'''''&lt;br /&gt;
* Read the [[Walnut]] - it is the most concise text on the E language and library.&lt;br /&gt;
* Bookmark the [http://erights.org/javadoc/index.html ELib api].&lt;br /&gt;
* Either download the '''''E''''' source or open the e.jar (for example with unzip) and take a look around.&lt;br /&gt;
* You can get information about '''''E''''' objects by using the help() method. For example, open rune and enter: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;? help([])&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
You will get information about the ConstList class and its methods.&lt;br /&gt;
*[[Syntax-props-default.txt]] contains information about various language constructs not explained elsewhere at this point.   In the '''''E''''' distribution, it is stored as: &amp;lt;code&amp;gt;org.erights.e.elang.syntax/syntax-props-default.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The source also contains a number of [[Walnut/Ordinary_Programming/Emakers|emakers]] that can be used when developing programs. For example:&lt;br /&gt;
**&amp;lt;code&amp;gt;org.erights.e.facet.makeStoneCast.emaker&amp;lt;/code&amp;gt;: An implementation of the [[Walnut/Secure_Distributed_Computing/Capability_Patterns#Facets|Facets]] pattern&lt;br /&gt;
**&amp;lt;code&amp;gt;org.erights.e.facet.makeCaretaker.emaker&amp;lt;/code&amp;gt;: An implementation of the [[Walnut/Secure_Distributed_Computing/Capability_Patterns#Revocable_Capabilities|Revocable Capabilities]] pattern&lt;br /&gt;
**&amp;lt;code&amp;gt;org.erights.e.elib.slot.makeLamportSlot.emaker&amp;lt;/code&amp;gt;: An implementation of the [http://www.erights.org/javadoc/org/erights/e/elib/slot/EverReporter.html EverReporter] pattern/interface&lt;br /&gt;
&lt;br /&gt;
== [[Documentation]] and help==&lt;br /&gt;
* The [[Walnut]]&lt;br /&gt;
* The [http://erights.org/javadoc/index.html ELib api]&lt;br /&gt;
* Documentation on the [http://www.erights.org ERights homepage]. See [[List_of_papers]]&lt;br /&gt;
* The [http://www.eros-os.org/pipermail/e-lang/ E mailing list]. You can search the archives using google by including &amp;quot;site:eros-os.org&amp;quot; in the search field.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/FAQ</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/FAQ"/>
				<updated>2007-04-21T10:37:00Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;Let's get this started!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
==How can I declaring a Java class as safe for importing?==&lt;br /&gt;
Create a file with the extension .safej and save it to the same class path location as the java class you want to declare as safe. In the .safej file you can declare methods of that class as allowed or rejected. Take a look at the [[Safej_example]]. You can find more .safej files in the E distribution in the folder src/safej.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/CapDesk</id>
		<title>CapDesk</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/CapDesk"/>
				<updated>2007-04-21T09:36:46Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;Added links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''CapDesk''' is a file browser and [[caplet]] launcher written in E.&lt;br /&gt;
CapDesk is included in the [[E-on-Java]] distribution.&lt;br /&gt;
&lt;br /&gt;
To run it, start &amp;lt;code&amp;gt;scripts/capDesk.e-awt&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;scripts/capDesk.e-swt&amp;lt;/code&amp;gt; in the main folder of the distribution.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/skynet/index.html The SkyNet Virus - Why it is Unstoppable; How to Stop it]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/virus-safe/index.html Talk: Building a Virus-Safe Computing Platform: Don't Add Security, Remove Insecurity]&lt;br /&gt;
&lt;br /&gt;
[[Category:Applications]]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-18T16:11:48Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;image placement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An unum can be described as a single conceptual object with a distributed implementation.&lt;br /&gt;
An object, called the &amp;quot;master presence&amp;quot;, is replicated at different locations using smart proxies, called &amp;quot;presences&amp;quot;.&lt;br /&gt;
The presences cache some state of the master presence and can be used to communicate with the master presence.&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;width:360px;font-size:80%;border:1px solid #aaaaaa;padding:5px;margin-left:5px;margin-top:20px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Unum.png|Unum Example]]&lt;br /&gt;
&lt;br /&gt;
A simple unum representing a circle. Using lamport slots, the non-authoritative presences on the right synchronize their state with the authoritative presence on the left. Mutating message calls are forwarded from the presences to their respective authoritative presence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: At this point this page is directly copied from [http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
[[Pass By Construction]]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/elib/distrib/unum/index.html The Unum: a form of distributed object]&lt;br /&gt;
&lt;br /&gt;
[http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/uni-tea/index.html Uni-Tea - Towards a unified, parameterizable model of distributed &amp;quot;object&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-18T15:58:39Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An unum can be described as a single conceptual object with a distributed implementation.&lt;br /&gt;
An object, called the &amp;quot;master presence&amp;quot;, is replicated at different locations using smart proxies, called &amp;quot;presences&amp;quot;.&lt;br /&gt;
The presences cache some state of the master presence and can be used to communicate with the master presence.&lt;br /&gt;
----&lt;br /&gt;
[[Image:Unum.png|200px|thumb|Unum Example]]&lt;br /&gt;
&lt;br /&gt;
A simple unum representing a circle. Using lamport slots, the non-authoritative presences on the right synchronize their state with the authoritative presence on the left. Mutating message calls are forwarded from the presences to their respective authoritative presence.&lt;br /&gt;
----&lt;br /&gt;
Note: At this point this page is directly copied from [http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
[[Pass By Construction]]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/elib/distrib/unum/index.html The Unum: a form of distributed object]&lt;br /&gt;
&lt;br /&gt;
[http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/uni-tea/index.html Uni-Tea - Towards a unified, parameterizable model of distributed &amp;quot;object&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/File:Unum.png</id>
		<title>File:Unum.png</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/File:Unum.png"/>
				<updated>2007-04-18T15:52:32Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;A simple unum representing a circle. Using lamport slots, the non-authoritative presences on the right synchronize their state with the authoritative presence on the left. Mutating message calls are forwarded from the presences to their respective authori&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A simple unum representing a circle. Using lamport slots, the non-authoritative presences on the right synchronize their state with the authoritative presence on the left. Mutating message calls are forwarded from the presences to their respective authoritative presence.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T11:11:04Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When objects are transfered to another [[vat]], they arrive as proxies by default. To reconstruct the object as a local object in the receiving vat, Pass By Construction (pbc) can be used.&lt;br /&gt;
To mark an object as pbc, it has to implement the interface pbc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The method __optUncall is a [[miranda method]]. When the object is passed to another [[vat]], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to reconstruct the object in the destination [[vat]]. &lt;br /&gt;
&lt;br /&gt;
The triple returned by __optUncall has this format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[constructor, method, args]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where constructor is a reference to the maker that is to be used to reconstruct the object in the receiving vat, method is the method of the maker to run and args is a ConstList of arguments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;amp;lt;Vector $x $y&amp;amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;amp;lt;import&amp;amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# create a new Vector object&lt;br /&gt;
? def makeVector := &amp;amp;lt;import:tests.makeVector&amp;amp;lgt;&lt;br /&gt;
# value: &amp;amp;lt;makeVector&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
# function for creating a new local vat&lt;br /&gt;
? def seedVatAuthor := &amp;amp;lt;elang:interp.seedVatAuthor&amp;amp;gt;(&amp;amp;lt;unsafe&amp;amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;amp;lt;virtualSeedVat&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Run this source code in the new vat. The method accepts a pbc object and prints it.&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# create the new vat. Return a far reference to the object and a reference to the vat object&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;amp;lt;Promise&amp;amp;gt;, &amp;amp;lt;Vat newVirtualSeedVat in &amp;amp;lt;runs in newVirtualSeedVat&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
# pass the pbc object into the new vat&lt;br /&gt;
? scriptObj &amp;amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;amp;lt;Remote Promise&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Walnut/Distributed_Computing/Multiway_when-catch</id>
		<title>Walnut/Distributed Computing/Multiway when-catch</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Walnut/Distributed_Computing/Multiway_when-catch"/>
				<updated>2007-04-18T11:09:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Pass By Construction and Pass By Proxy, References Far and Near */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Walnut|3]]&lt;br /&gt;
&lt;br /&gt;
===Multiway when-catch===&lt;br /&gt;
&lt;br /&gt;
If you need to resolve several references before making a computation, use a multiway when-catch, in which you specify several arguments in the structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# E syntax&lt;br /&gt;
 def maxTempVow := vehicleSpecsRcvr &amp;lt;- getMaxEngineTemperature(carType)&lt;br /&gt;
 def engineTempVow := carRcvr &amp;lt;- getEngineTemperature()&lt;br /&gt;
 when (engineTempVow,maxTempVow) -&amp;gt; {&lt;br /&gt;
     if (engineTempVow &amp;gt; maxTempVow) {println(&amp;quot;Car overheating!&amp;quot;)}&lt;br /&gt;
 } catch e {println(`Lost car or vehicleSpecs: $e`)}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this when-catch, since all the arguments are vows, the corresponding parameters (engineTemp and maxTemp, to the right of the &amp;quot;-&amp;gt;&amp;quot;) are simply local objects (integers in this case). How do we know that these integers will be local, not remote, even though we retrieved them from Rcvrs? Because integers are passed by construction, as discussed next.&lt;br /&gt;
&lt;br /&gt;
===Pass By Construction and Pass By Proxy, References Far and Near===&lt;br /&gt;
&lt;br /&gt;
In the above example, the temperature is an integer and is guaranteed to resolve to a local integer object upon which you can make immediate calls, even if the car is remote. Transparent immutable objects, such as integers, floating point numbers, booleans, strings, and the &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; data structures ConstLists and ConstMaps, are always ''passed by copy''(which is the most common form of ''[[Pass By Construction]]''), so you always get a local copy of the object on resolution if one of these is returned by a method call or send. This local copy can of course accept immediate calls.&lt;br /&gt;
&lt;br /&gt;
Mutable objects, like the car in this example, reside on the machine upon which they were constructed. Such an object is ''passed by proxy''. If such an object is on a different machine from the one on which your piece of the system is running, even when the promise resolves it will only resolve into a ''far reference'' (as opposed to a ''near reference'' for a local object). Far references accept eventual sends, but cannot accept immediate calls.&lt;br /&gt;
&lt;br /&gt;
So in general, if you created the car using an eventual send to a possibly remote object (a receiver), you would probably have to interact with the car using eventual sends forever, since only such sends are guaranteed to work with remote objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# E syntax&lt;br /&gt;
 def carRcvr := carMakerRcvr &amp;lt;- (&amp;quot;Mercedes&amp;quot;)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(2,3)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(5,6)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(7,3)&lt;br /&gt;
 def fuelVow := carRcvr &amp;lt;- fuelRemaining()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Walnut/Distributed_Computing/Multiway_when-catch</id>
		<title>Walnut/Distributed Computing/Multiway when-catch</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Walnut/Distributed_Computing/Multiway_when-catch"/>
				<updated>2007-04-18T11:08:43Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Pass By Construction and Pass By Proxy, References Far and Near */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Walnut|3]]&lt;br /&gt;
&lt;br /&gt;
===Multiway when-catch===&lt;br /&gt;
&lt;br /&gt;
If you need to resolve several references before making a computation, use a multiway when-catch, in which you specify several arguments in the structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# E syntax&lt;br /&gt;
 def maxTempVow := vehicleSpecsRcvr &amp;lt;- getMaxEngineTemperature(carType)&lt;br /&gt;
 def engineTempVow := carRcvr &amp;lt;- getEngineTemperature()&lt;br /&gt;
 when (engineTempVow,maxTempVow) -&amp;gt; {&lt;br /&gt;
     if (engineTempVow &amp;gt; maxTempVow) {println(&amp;quot;Car overheating!&amp;quot;)}&lt;br /&gt;
 } catch e {println(`Lost car or vehicleSpecs: $e`)}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this when-catch, since all the arguments are vows, the corresponding parameters (engineTemp and maxTemp, to the right of the &amp;quot;-&amp;gt;&amp;quot;) are simply local objects (integers in this case). How do we know that these integers will be local, not remote, even though we retrieved them from Rcvrs? Because integers are passed by construction, as discussed next.&lt;br /&gt;
&lt;br /&gt;
===Pass By Construction and Pass By Proxy, References Far and Near===&lt;br /&gt;
&lt;br /&gt;
In the above example, the temperature is an integer and is guaranteed to resolve to a local integer object upon which you can make immediate calls, even if the car is remote. Transparent immutable objects, such as integers, floating point numbers, booleans, strings, and the &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; data structures ConstLists and ConstMaps, are always ''passed by copy''(which is the most common form of ''[[Pass by Construction]]''), so you always get a local copy of the object on resolution if one of these is returned by a method call or send. This local copy can of course accept immediate calls.&lt;br /&gt;
&lt;br /&gt;
Mutable objects, like the car in this example, reside on the machine upon which they were constructed. Such an object is ''passed by proxy''. If such an object is on a different machine from the one on which your piece of the system is running, even when the promise resolves it will only resolve into a ''far reference'' (as opposed to a ''near reference'' for a local object). Far references accept eventual sends, but cannot accept immediate calls.&lt;br /&gt;
&lt;br /&gt;
So in general, if you created the car using an eventual send to a possibly remote object (a receiver), you would probably have to interact with the car using eventual sends forever, since only such sends are guaranteed to work with remote objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# E syntax&lt;br /&gt;
 def carRcvr := carMakerRcvr &amp;lt;- (&amp;quot;Mercedes&amp;quot;)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(2,3)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(5,6)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(7,3)&lt;br /&gt;
 def fuelVow := carRcvr &amp;lt;- fuelRemaining()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Walnut/Distributed_Computing/Multiway_when-catch</id>
		<title>Walnut/Distributed Computing/Multiway when-catch</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Walnut/Distributed_Computing/Multiway_when-catch"/>
				<updated>2007-04-18T11:07:58Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;linked to PBC page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Walnut|3]]&lt;br /&gt;
&lt;br /&gt;
===Multiway when-catch===&lt;br /&gt;
&lt;br /&gt;
If you need to resolve several references before making a computation, use a multiway when-catch, in which you specify several arguments in the structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# E syntax&lt;br /&gt;
 def maxTempVow := vehicleSpecsRcvr &amp;lt;- getMaxEngineTemperature(carType)&lt;br /&gt;
 def engineTempVow := carRcvr &amp;lt;- getEngineTemperature()&lt;br /&gt;
 when (engineTempVow,maxTempVow) -&amp;gt; {&lt;br /&gt;
     if (engineTempVow &amp;gt; maxTempVow) {println(&amp;quot;Car overheating!&amp;quot;)}&lt;br /&gt;
 } catch e {println(`Lost car or vehicleSpecs: $e`)}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this when-catch, since all the arguments are vows, the corresponding parameters (engineTemp and maxTemp, to the right of the &amp;quot;-&amp;gt;&amp;quot;) are simply local objects (integers in this case). How do we know that these integers will be local, not remote, even though we retrieved them from Rcvrs? Because integers are passed by construction, as discussed next.&lt;br /&gt;
&lt;br /&gt;
===Pass By Construction and Pass By Proxy, References Far and Near===&lt;br /&gt;
&lt;br /&gt;
In the above example, the temperature is an integer and is guaranteed to resolve to a local integer object upon which you can make immediate calls, even if the car is remote. Transparent immutable objects, such as integers, floating point numbers, booleans, strings, and the &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; data structures ConstLists and ConstMaps, are always ''passed by copy''(which is the most common form of ''[[pass by construction]]''), so you always get a local copy of the object on resolution if one of these is returned by a method call or send. This local copy can of course accept immediate calls.&lt;br /&gt;
&lt;br /&gt;
Mutable objects, like the car in this example, reside on the machine upon which they were constructed. Such an object is ''passed by proxy''. If such an object is on a different machine from the one on which your piece of the system is running, even when the promise resolves it will only resolve into a ''far reference'' (as opposed to a ''near reference'' for a local object). Far references accept eventual sends, but cannot accept immediate calls.&lt;br /&gt;
&lt;br /&gt;
So in general, if you created the car using an eventual send to a possibly remote object (a receiver), you would probably have to interact with the car using eventual sends forever, since only such sends are guaranteed to work with remote objects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# E syntax&lt;br /&gt;
 def carRcvr := carMakerRcvr &amp;lt;- (&amp;quot;Mercedes&amp;quot;)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(2,3)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(5,6)&lt;br /&gt;
 carRcvr &amp;lt;- moveTo(7,3)&lt;br /&gt;
 def fuelVow := carRcvr &amp;lt;- fuelRemaining()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-18T10:46:00Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;added link to PBC page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An unum can be described as a single conceptual object with a distributed implementation.&lt;br /&gt;
An object, called the &amp;quot;master presence&amp;quot;, is replicated at different locations using smart proxies, called &amp;quot;presences&amp;quot;.&lt;br /&gt;
The presences cache some state of the master presence and can be used to communicate with the master presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Note: At this point this page is directly copied from [http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
[[Pass By Construction]]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/elib/distrib/unum/index.html The Unum: a form of distributed object]&lt;br /&gt;
&lt;br /&gt;
[http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/uni-tea/index.html Uni-Tea - Towards a unified, parameterizable model of distributed &amp;quot;object&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T10:44:36Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;reformated, commented example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When objects are transfered to another [[vat]], they arrive as proxies by default. To reconstruct the object as a local object in the receiving vat, Pass By Construction (pbc) can be used.&lt;br /&gt;
To mark an object as pbc, it has to implement the interface pbc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The method __optUncall is a [[miranda method]]. When the object is passed to another [[vat]], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to reconstruct the object in the destination [[vat]]. &lt;br /&gt;
&lt;br /&gt;
The triple returned by __optUncall has this format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[constructor, method, args]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where constructor is a reference to the maker that is to be used to reconstruct the object in the receiving vat, method is the method of the maker to run and args is a ConstList of arguments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;amp;lt;Vector $x $y&amp;amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;amp;lt;import&amp;amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#create a new Vector object&lt;br /&gt;
? def makeVector := &amp;amp;lt;import:tests.makeVector&amp;amp;lgt;&lt;br /&gt;
# value: &amp;amp;lt;makeVector&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
#function for creating a new local vat&lt;br /&gt;
? def seedVatAuthor := &amp;amp;lt;elang:interp.seedVatAuthor&amp;amp;gt;(&amp;amp;lt;unsafe&amp;amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;amp;lt;virtualSeedVat&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Run this source code in the new vat. The method accepts a pbc object and prints it.&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#create the new vat. Return a far reference to the object and a reference to the vat object&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;amp;lt;Promise&amp;amp;gt;, &amp;amp;lt;Vat newVirtualSeedVat in &amp;amp;lt;runs in newVirtualSeedVat&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
#pass the pbc object into the new vat&lt;br /&gt;
? scriptObj &amp;amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;amp;lt;Remote Promise&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T10:31:18Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An object declared as, for example&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, &amp;quot;add&amp;quot;, [2])”) to create the object as received.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
The method __optUncall is a [[miranda method]]. When the vector is copied to another [[vat]], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to recreate the object in the destination [[vat]].&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;amp;lt;Vector $x $y&amp;amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;amp;lt;import&amp;amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#create a new Vector object&lt;br /&gt;
? def makeVector := &amp;amp;lt;import:tests.makeVector&amp;amp;lgt;&lt;br /&gt;
# value: &amp;amp;lt;makeVector&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
#create a new vat&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def seedVatAuthor := &amp;amp;lt;elang:interp.seedVatAuthor&amp;amp;gt;(&amp;amp;lt;unsafe&amp;amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;amp;lt;virtualSeedVat&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
# source code for the new vat&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;amp;lt;Promise&amp;amp;gt;, &amp;amp;lt;Vat newVirtualSeedVat in &amp;amp;lt;runs in newVirtualSeedVat&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj &amp;amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;amp;lt;Remote Promise&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T10:29:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An object declared as, for example&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, &amp;quot;add&amp;quot;, [2])”) to create the object as received.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
The method __optUncall is a [[Miranda_Method miranda method]]. When the vector is copied to another [[vat]], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to recreate the object in the destination [[vat]].&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;amp;lt;Vector $x $y&amp;amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;amp;lt;import&amp;amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#create a new Vector object&lt;br /&gt;
? def makeVector := &amp;amp;lt;import:tests.makeVector&amp;amp;lgt;&lt;br /&gt;
# value: &amp;amp;lt;makeVector&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
#create a new vat&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def seedVatAuthor := &amp;amp;lt;elang:interp.seedVatAuthor&amp;amp;gt;(&amp;amp;lt;unsafe&amp;amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;amp;lt;virtualSeedVat&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
# source code for the new vat&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;amp;lt;Promise&amp;amp;gt;, &amp;amp;lt;Vat newVirtualSeedVat in &amp;amp;lt;runs in newVirtualSeedVat&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj &amp;amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;amp;lt;Remote Promise&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T10:28:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An object declared as, for example&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, &amp;quot;add&amp;quot;, [2])”) to create the object as received.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
The method __optUncall is a [Miranda_Method miranda method]. When the vector is copied to another [vat], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to recreate the object in the destination [vat].&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;amp;lt;Vector $x $y&amp;amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;amp;lt;import&amp;amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#create a new Vector object&lt;br /&gt;
? def makeVector := &amp;amp;lt;import:tests.makeVector&amp;amp;lgt;&lt;br /&gt;
# value: &amp;amp;lt;makeVector&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
#create a new vat&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def seedVatAuthor := &amp;amp;lt;elang:interp.seedVatAuthor&amp;amp;gt;(&amp;amp;lt;unsafe&amp;amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;amp;lt;virtualSeedVat&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
# source code for the new vat&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;amp;lt;Promise&amp;amp;gt;, &amp;amp;lt;Vat newVirtualSeedVat in &amp;amp;lt;runs in newVirtualSeedVat&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj &amp;amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;amp;lt;Remote Promise&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T10:27:30Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An object declared as, for example&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, &amp;quot;add&amp;quot;, [2])”) to create the object as received.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
The method __optUncall is a [Miranda_Method miranda method]. When the vector is copied to another [vat], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to recreate the object in the destination [vat].&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;amp;lt;Vector $x $y&amp;amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;amp;lt;import&amp;amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
#create a new Vector object&lt;br /&gt;
? def makeVector := &amp;amp;lt;import:tests.makeVector&amp;amp;lgt;&lt;br /&gt;
# value: &amp;amp;lt;makeVector&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
#create a new vat&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def seedVatAuthor := &amp;amp;lt;elang:interp.seedVatAuthor&amp;amp;gt;(&amp;amp;lt;unsafe&amp;amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;amp;lt;virtualSeedVat&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
# source code for the new vat&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;amp;lt;Promise&amp;amp;gt;, &amp;amp;lt;Vat newVirtualSeedVat in &amp;amp;lt;runs in newVirtualSeedVat&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj &amp;amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;amp;lt;Remote Promise&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T10:26:32Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An object declared as, for example&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, &amp;quot;add&amp;quot;, [2])”) to create the object as received.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
The method __optUncall is a [Miranda_Method miranda method]. When the vector is copied to another [vat], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to recreate the object in the destination [vat].&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;amp;lt;Vector $x $y&amp;amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;lt;import&amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
#create a new Vector object&lt;br /&gt;
? def makeVector := &amp;amp;lt;import:tests.makeVector&amp;amp;lgt;&lt;br /&gt;
# value: &amp;amp;lt;makeVector&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
#create a new vat&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def seedVatAuthor := &amp;amp;lt;elang:interp.seedVatAuthor&amp;amp;gt;(&amp;amp;lt;unsafe&amp;amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;amp;lt;virtualSeedVat&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
# source code for the new vat&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;amp;lt;Promise&amp;amp;gt;, &amp;amp;lt;Vat newVirtualSeedVat in &amp;amp;lt;runs in newVirtualSeedVat&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj &amp;amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;amp;lt;Remote Promise&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;amp;lt;Vector 6.6 7.7&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T09:59:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An object declared as, for example&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, &amp;quot;add&amp;quot;, [2])”) to create the object as received.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
The method __optUncall is a [Miranda_Method miranda method]. When the vector is copied to another [vat], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to recreate the object in the destination [vat].&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;lt;Vector $x $y&amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;lt;import&amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#create a new Vector object&lt;br /&gt;
? def makeVector := &amp;lt;import:tests.makeVector&amp;gt;&lt;br /&gt;
# value: &amp;lt;makeVector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;lt;Vector 6.6 7.7&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#create a new vat&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def seedVatAuthor := &amp;lt;elang:interp.seedVatAuthor&amp;gt;(&amp;lt;unsafe&amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;lt;virtualSeedVat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# source code for the new vat&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;lt;Promise&amp;gt;, &amp;lt;Vat newVirtualSeedVat in &amp;lt;runs in newVirtualSeedVat&amp;gt;&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj &amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;lt;Remote Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;lt;Vector 6.6 7.7&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T09:58:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An object declared as, for example&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, &amp;quot;add&amp;quot;, [2])”) to create the object as received.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.&lt;br /&gt;
The method __optUncall is a [Miranda_Method miranda method]. When the vector is copied to another [vat], the method __optUncall is called by the CapTP networking subsystem of E. The result of the method is used to recreate the object in the destination [vat].&lt;br /&gt;
This code should be positioned in a file in the java classpath at the location &amp;quot;tests.makeVector.emaker&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
def makeVector implements pbc {&lt;br /&gt;
    to run(var x, var y) {&lt;br /&gt;
        def vector implements pbc {&lt;br /&gt;
            to getX() :any { return x }&lt;br /&gt;
            to getY() :any { return y }&lt;br /&gt;
            to __optUncall() :any { return [makeVector, &amp;quot;run&amp;quot;, [x,y]] }&lt;br /&gt;
            to __printOn(out) {out.print(`&amp;lt;Vector $x $y&amp;gt;`)}&lt;br /&gt;
        }&lt;br /&gt;
        return vector&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :any {&lt;br /&gt;
        return [&amp;lt;import&amp;gt;, &amp;quot;get&amp;quot;, [&amp;quot;tests.makeVector&amp;quot;]]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
#create a new Vector object&lt;br /&gt;
? def makeVector := &amp;lt;import:tests.makeVector&amp;gt;&lt;br /&gt;
# value: &amp;lt;makeVector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? def vector := makeVector(6.6,7.7)&lt;br /&gt;
# value: &amp;lt;Vector 6.6 7.7&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#create a new vat&lt;br /&gt;
? introducer.onTheAir()&lt;br /&gt;
# value: [&amp;quot;3DES_SDH_M2&amp;quot;, &amp;quot;3DES_SDH_M&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
? def seedVatAuthor := &amp;lt;elang:interp.seedVatAuthor&amp;gt;(&amp;lt;unsafe&amp;gt;).virtualize((introducer))&lt;br /&gt;
# value: &amp;lt;virtualSeedVat&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# source code for the new vat&lt;br /&gt;
? def scriptSource:=&amp;quot;def run(thing :pbc) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
# value: &amp;quot;def run(thing :near) {println(`Thing: $thing`)}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
? def [scriptObj, vat] := seedVatAuthor(scriptSource)&lt;br /&gt;
# value: [&amp;lt;Promise&amp;gt;, &amp;lt;Vat newVirtualSeedVat in &amp;lt;runs in newVirtualSeedVat&amp;gt;&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
? scriptObj &amp;lt;- run(vector)&lt;br /&gt;
# value: &amp;lt;Remote Promise&amp;gt;&lt;br /&gt;
&lt;br /&gt;
? Thing: &amp;lt;Vector 6.6 7.7&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/PassByConstruction</id>
		<title>PassByConstruction</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/PassByConstruction"/>
				<updated>2007-04-18T07:06:04Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;Initial entry&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An object declared as, for example&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    def foo implements pbc {&lt;br /&gt;
        to __optUncall() { return [1, &amp;quot;add&amp;quot;, [2]] }&lt;br /&gt;
        # ...&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, &amp;quot;add&amp;quot;, [2])”) to create the object as received.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T14:05:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An unum can be described as a single conceptual object with a distributed implementation.&lt;br /&gt;
An object, called the &amp;quot;master presence&amp;quot;, is replicated at different locations using smart proxies, called &amp;quot;presences&amp;quot;.&lt;br /&gt;
The presences cache some state of the master presence and can be used to communicate with the master presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
[http://www.erights.org/elib/distrib/unum/index.html The Unum: a form of distributed object]&lt;br /&gt;
&lt;br /&gt;
[http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/uni-tea/index.html Uni-Tea - Towards a unified, parameterizable model of distributed &amp;quot;object&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T14:04:38Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Unum Pattern can be described as a single conceptual object with a distributed implementation.&lt;br /&gt;
An object, called the &amp;quot;master presence&amp;quot;, is replicated at different locations using smart proxies, called &amp;quot;presences&amp;quot;.&lt;br /&gt;
The presences cache some state of the master presence and can be used to communicate with the master presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
[http://www.erights.org/elib/distrib/unum/index.html The Unum: a form of distributed object]&lt;br /&gt;
&lt;br /&gt;
[http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/uni-tea/index.html Uni-Tea - Towards a unified, parameterizable model of distributed &amp;quot;object&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T14:03:09Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Unum Pattern can be described as a single conceptual object with a distributed implementation.&lt;br /&gt;
An object, called the &amp;quot;master presence&amp;quot;, is replicated at different locations using smart proxies, called &amp;quot;presences&amp;quot;.&lt;br /&gt;
The presences cache some state of the master presence and can be used to communicate with the master presence.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
[http://www.erights.org/elib/distrib/unum/index.html The Unum: a form of distributed object]&lt;br /&gt;
&lt;br /&gt;
[http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/uni-tea/index.html Uni-Tea - Towards a unified, parameterizable model of distributed &amp;quot;object&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T13:53:52Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
he other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
[http://www.erights.org/elib/distrib/unum/index.html The Unum: a form of distributed object]&lt;br /&gt;
&lt;br /&gt;
[http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
[http://www.erights.org/talks/uni-tea/index.html Uni-Tea - Towards a unified, parameterizable model of distributed &amp;quot;object&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T13:51:20Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;Links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
he other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
[http://www.erights.org/elib/distrib/unum/index.html The Unum: a form of distributed object]&lt;br /&gt;
[http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
[http://www.erights.org/talks/uni-tea/index.html Uni-Tea - Towards a unified, parameterizable model of distributed &amp;quot;object&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T13:48:15Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
he other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T13:47:53Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
he other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
1. is Granovetter introduction, and supports grant matching.  2. is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T13:46:56Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
he other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes the authoritative presence A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
&lt;br /&gt;
# a new shadow presence A3 is created that takes shadow presence A2 as authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
#1 is Granovetter introduction, and supports grant matching.  #2 is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Unum</id>
		<title>Unum</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Unum"/>
				<updated>2007-04-17T13:42:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;Lifted Unum descripting from MarkM's post&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note: At this point this page is directly copied from [http://http://www.eros-os.org/pipermail/e-lang/2001-September/005728.html MarkM's post to the E-Lang mailing list]&lt;br /&gt;
&lt;br /&gt;
The Unum Pattern goes back to Chip Morningstar's work at Electric Communities.&lt;br /&gt;
&lt;br /&gt;
Each replica of an Unum is a &amp;quot;presence&amp;quot; of the Unum, and all the presences jointly are taken &lt;br /&gt;
to form the Unum.  One of the presences is the &amp;quot;authoritative presence&amp;quot; -- &lt;br /&gt;
its state is considered to be the &amp;quot;true&amp;quot; state of the Unum.  &lt;br /&gt;
A1, being the &lt;br /&gt;
initial presence, therefore starts out as the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
he other presences are effectively smart remote references to the &lt;br /&gt;
authoritative presence.  These &amp;quot;shadow presences&amp;quot; maintain a somewhat stale &lt;br /&gt;
cache of a copy of some state from the authoritative presence -- but only &lt;br /&gt;
state that can be useful even when it's stale.  These shadow presences do &lt;br /&gt;
support immediate calls for those operations that can be sensible performed &lt;br /&gt;
using this stale data -- giving us another huge victory over network &lt;br /&gt;
latency.  But operations needing accurate state must still be eventual, and &lt;br /&gt;
must be delegated to the authoritative presence.&lt;br /&gt;
&lt;br /&gt;
The shadow presences also register themselves as observers (in E, &lt;br /&gt;
&amp;quot;reactors&amp;quot;) on the authoritative presence.  Every time the authoritative &lt;br /&gt;
presence changes replicated state, it notifies all its reactors, so that &lt;br /&gt;
they may update their cached copies.  In the absence of partition, we can &lt;br /&gt;
say that these caches are always &amp;quot;eventually consistent&amp;quot; -- they are always &lt;br /&gt;
consistent with some past state, they only move forward in time, and under &lt;br /&gt;
quiescence they will always eventually become accurate.  &lt;br /&gt;
(Does this capture &lt;br /&gt;
Lamport-like eventual consistency?)&lt;br /&gt;
&lt;br /&gt;
During a partition, the presence can still give correct, even if &lt;br /&gt;
increasingly stale, service for the staleness tolerant operations.  Of &lt;br /&gt;
course, it must refuse the accurate operations.  Should the authoritative &lt;br /&gt;
presence again become reachable, the shadow should &amp;quot;heal&amp;quot;.  (Note: at EC we &lt;br /&gt;
didn't do this.  Instead, we always invalidated shadow presences on &lt;br /&gt;
partition.  So although both choices seem valuable, we don't yet have any &lt;br /&gt;
experience with shadows that survive partition.)&lt;br /&gt;
&lt;br /&gt;
What happens when a shadow presence A2 is passed?  Two simple possibilities are&lt;br /&gt;
&lt;br /&gt;
1) a new shadow presence A3 is created that takes the authoritative presence &lt;br /&gt;
    A1 as authoritative.  A2 and A3 would both be registered as reactors on A1.&lt;br /&gt;
&lt;br /&gt;
2) a new shadow presence A3 is created that takes shadow presence A2 as &lt;br /&gt;
    authoritative.  A2 is a reactor on A1, and A3 is a reactor on A2.&lt;br /&gt;
&lt;br /&gt;
#1 is Granovetter introduction, and supports grant matching.  #2 is &lt;br /&gt;
proxying, and does not.&lt;br /&gt;
&lt;br /&gt;
Answer #1 gives us a flat multicast fanout for state updates.  Answer #2 &lt;br /&gt;
turns the presences into a spontaneously malformed multicast tree.  (I say &lt;br /&gt;
&amp;quot;malformed&amp;quot; because the topology of the tree is based only on acts of &lt;br /&gt;
introduction, and not on any sensible performance issues.)  NetNews, DNS, &lt;br /&gt;
and Notes are all massively scalable systems that use Lamport-like eventual &lt;br /&gt;
consistency to distribute state updates.&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Rune</id>
		<title>Rune</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Rune"/>
				<updated>2007-03-15T14:33:21Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Setting up rune */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rune is the interactive command line interpreter for E code.&lt;br /&gt;
&lt;br /&gt;
== Setting up rune ==&lt;br /&gt;
&lt;br /&gt;
'''Windows:''' Copy the file &amp;lt;code&amp;gt;rune-bat-template.txt&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;rune.bat&amp;lt;/code&amp;gt; and edit the settings in the file.&lt;br /&gt;
&lt;br /&gt;
''Hint:'' If you plan on using rune a lot, you should try [http://sourceforge.net/projects/console Console], a Windows console window enhancement&lt;br /&gt;
&lt;br /&gt;
'''unix/linux/mac:''' Copy &amp;lt;code&amp;gt;rune-template.txt&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;rune&amp;lt;/code&amp;gt; and edit it.&lt;br /&gt;
Add execute rights to the file by entering &amp;lt;code&amp;gt;chmod a+x rune&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You should now be able to execute rune and get an interactive shell.&lt;br /&gt;
&lt;br /&gt;
As an alternative, rune can be started using the java executable:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
java -jar e.jar --rune&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running an E script from rune ==&lt;br /&gt;
&lt;br /&gt;
There are two ways to start an E script using rune.&lt;br /&gt;
First, you can give the name of the script as a command line argument:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./rune example.e&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Second, you can start the script directly from the E command prompt, which can save some time because the running Java VM is used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;? rune([&amp;quot;example.e&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Command history ==&lt;br /&gt;
The interactive E interpreter does not provide command history. Under windows, the shell has its own command history, which can be used by pressing the up and down arrow keys.&lt;br /&gt;
If your system does not provide command history, you can try [http://freshmeat.net/projects/rlwrap/ rlwrap].&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Rune</id>
		<title>Rune</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Rune"/>
				<updated>2007-03-15T14:32:55Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Setting up rune */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rune is the interactive command line interpreter for E code.&lt;br /&gt;
&lt;br /&gt;
== Setting up rune ==&lt;br /&gt;
&lt;br /&gt;
'''Windows:''' Copy the file &amp;lt;code&amp;gt;rune-bat-template.txt&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;rune.bat&amp;lt;/code&amp;gt; and edit the settings in the file.&lt;br /&gt;
&lt;br /&gt;
''Tip:'' If you plan on using rune a lot, you should try [http://sourceforge.net/projects/console Console], a Windows console window enhancement&lt;br /&gt;
&lt;br /&gt;
'''unix/linux/mac:''' Copy &amp;lt;code&amp;gt;rune-template.txt&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;rune&amp;lt;/code&amp;gt; and edit it.&lt;br /&gt;
Add execute rights to the file by entering &amp;lt;code&amp;gt;chmod a+x rune&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You should now be able to execute rune and get an interactive shell.&lt;br /&gt;
&lt;br /&gt;
As an alternative, rune can be started using the java executable:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
java -jar e.jar --rune&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running an E script from rune ==&lt;br /&gt;
&lt;br /&gt;
There are two ways to start an E script using rune.&lt;br /&gt;
First, you can give the name of the script as a command line argument:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./rune example.e&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Second, you can start the script directly from the E command prompt, which can save some time because the running Java VM is used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;? rune([&amp;quot;example.e&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Command history ==&lt;br /&gt;
The interactive E interpreter does not provide command history. Under windows, the shell has its own command history, which can be used by pressing the up and down arrow keys.&lt;br /&gt;
If your system does not provide command history, you can try [http://freshmeat.net/projects/rlwrap/ rlwrap].&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Rune</id>
		<title>Rune</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Rune"/>
				<updated>2007-03-15T14:32:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Setting up rune */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rune is the interactive command line interpreter for E code.&lt;br /&gt;
&lt;br /&gt;
== Setting up rune ==&lt;br /&gt;
&lt;br /&gt;
'''Windows:''' Copy the file &amp;lt;code&amp;gt;rune-bat-template.txt&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;rune.bat&amp;lt;/code&amp;gt; and edit the settings in the file.&lt;br /&gt;
&lt;br /&gt;
''Tip:'' If you plan on using rune a lot, you may consider using [http://sourceforge.net/projects/console Console], which is a Windows console window enhancement&lt;br /&gt;
&lt;br /&gt;
'''unix/linux/mac:''' Copy &amp;lt;code&amp;gt;rune-template.txt&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;rune&amp;lt;/code&amp;gt; and edit it.&lt;br /&gt;
Add execute rights to the file by entering &amp;lt;code&amp;gt;chmod a+x rune&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You should now be able to execute rune and get an interactive shell.&lt;br /&gt;
&lt;br /&gt;
As an alternative, rune can be started using the java executable:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
java -jar e.jar --rune&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running an E script from rune ==&lt;br /&gt;
&lt;br /&gt;
There are two ways to start an E script using rune.&lt;br /&gt;
First, you can give the name of the script as a command line argument:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./rune example.e&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Second, you can start the script directly from the E command prompt, which can save some time because the running Java VM is used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;? rune([&amp;quot;example.e&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Command history ==&lt;br /&gt;
The interactive E interpreter does not provide command history. Under windows, the shell has its own command history, which can be used by pressing the up and down arrow keys.&lt;br /&gt;
If your system does not provide command history, you can try [http://freshmeat.net/projects/rlwrap/ rlwrap].&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Rune</id>
		<title>Rune</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Rune"/>
				<updated>2007-03-15T14:31:28Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Setting up rune */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rune is the interactive command line interpreter for E code.&lt;br /&gt;
&lt;br /&gt;
== Setting up rune ==&lt;br /&gt;
&lt;br /&gt;
'''Windows:''' Copy the file &amp;lt;code&amp;gt;rune-bat-template.txt&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;rune.bat&amp;lt;/code&amp;gt; and edit the settings in the file.&lt;br /&gt;
'''Tip:''' If you plan on using rune a lot, you may consider using [http://sourceforge.net/projects/console Console], which is a Windows console window enhancement&lt;br /&gt;
&lt;br /&gt;
'''unix/linux/mac:''' Copy &amp;lt;code&amp;gt;rune-template.txt&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;rune&amp;lt;/code&amp;gt; and edit it.&lt;br /&gt;
Add execute rights to the file by entering &amp;lt;code&amp;gt;chmod a+x rune&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You should now be able to execute rune and get an interactive shell.&lt;br /&gt;
&lt;br /&gt;
As an alternative, rune can be started using the java executable:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
java -jar e.jar --rune&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running an E script from rune ==&lt;br /&gt;
&lt;br /&gt;
There are two ways to start an E script using rune.&lt;br /&gt;
First, you can give the name of the script as a command line argument:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./rune example.e&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Second, you can start the script directly from the E command prompt, which can save some time because the running Java VM is used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;? rune([&amp;quot;example.e&amp;quot;])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Command history ==&lt;br /&gt;
The interactive E interpreter does not provide command history. Under windows, the shell has its own command history, which can be used by pressing the up and down arrow keys.&lt;br /&gt;
If your system does not provide command history, you can try [http://freshmeat.net/projects/rlwrap/ rlwrap].&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	<entry>
		<id>http://50.77.162.165/wiki/Walnut/intro</id>
		<title>Walnut/intro</title>
		<link rel="alternate" type="text/html" href="http://50.77.162.165/wiki/Walnut/intro"/>
				<updated>2007-03-15T14:25:37Z</updated>
		
		<summary type="html">&lt;p&gt;Mscheffler:&amp;#32;/* Rune and Trace Log */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Walnut|1]]&lt;br /&gt;
== Introduction==&lt;br /&gt;
&lt;br /&gt;
=== Why E? ===&lt;br /&gt;
&lt;br /&gt;
Java, Perl, Python, C++, TCL, and on and on. Don't we have enough languages already? How could we justify bringing yet another programming language into the world?&lt;br /&gt;
&lt;br /&gt;
In fact, there is still a compelling reason for developing better programming languages: we keep on writing more complicated programs. And worse, we keep on writing more complicated systems of interdependent programs.&lt;br /&gt;
&lt;br /&gt;
We have entered the age of globally distributed computing with a vengeance. Anyone who has cobbled together a major system with a hodgepodge of Web servers, Java, JSP, SQL, CGI, CORBA, RMI, XML, and Perl knows that this cannot be the toolset we will use in 20 years. The sooner we move up to the tools of 20 years hence, the better off we will be. Into this situation we introduce &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;float: right; width: 2in; border-style: inset; border-width: 3;background-color: #FFFF99; font-size:80%&amp;quot; &lt;br /&gt;
|&amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;E&amp;lt;/span&amp;gt; uses a specific flavor of capability-based security known as ''object capabilities''. With object capabilities, capability-oriented programming has the same flavor as object-oriented programming, except that capability-oriented programming takes the usual OO strictures more seriously. Often when using object capabilities for security, one finds that a more secure program is simply a program that follows OO principles of modularization more closely.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; has significant advantages compared to other popular programming languages for distributed computing. As one quick example of its power, &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;E&amp;lt;/span&amp;gt;'s ''promise-pipelining'' architecture ensures that ''deadlock cannot occur.''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; has dramatic advantages for ''secure'' distributed systems. All communication in &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; is strongly encrypted, transparently to the programmer. Capability-based security enables the concise composition of powerful patterns of interoperation, patterns that enable extensive cooperation even in the presence of severely limited trust. Excluding user interface code, a simple but effective peer-to-peer secure chat system has been written in less than 30 lines of code; no more lines of code were required to write a basic digital-money bank server ''despite the severe security issues involved''. When the time comes for a security inspection, capability security allows simple reachability analysis to exclude huge swaths of code because they cannot embody a threat. As a consequence, auditing a system for security becomes cost effective to an extent that is simply unimaginable with other approaches, as documented in [http://www.combex.com/papers/darpa-report/index.html the DarpaBrowser report]. With &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt;, it is straightforward to create systems that run across the Internet that are as secure and safe as if the entire system were running on a single computer in your basement. As one of the original developers of Smalltalk observed, upon learning about the object-capability paradigm from &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;E&amp;lt;/span&amp;gt;, capability security is &amp;quot;natural security&amp;quot;: if you shouldn't use it, you just can't see it.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; can even enable the fearless yet powerful use of multi-party limited-trust mobile code. &amp;quot;Mobile code&amp;quot; is just about anything executable on your computer that you get from somewhere else. Every time you turn on a word processor, play a game of Solitaire, or double click on an email attachment, you are executing mobile code written by someone you probably don't know and should not trust. Yet we give Solitaire, Barbie Fashion Designer, and Christmas Elf Bowling the full power to read our most private documents, sell them on EBay to the highest bidder, and then delete all your files. Our grandchildren will laugh at how silly this was, yet today there is no choice. If Microsoft used &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; instead of Visual Basic for its application language, Word and Excel would not be vectors for attacks like the original Love Letter virus. If all software were written in &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt;, Klez and BackOrifice could never have existed: indeed, the term &amp;quot;virus&amp;quot;, so loved by the press because it implies incurability, would never have been applied to computing.&lt;br /&gt;
&lt;br /&gt;
These qualities cannot be achieved with traditional security approaches. Do not expect the next release of Java, Windows, or Linux to fix the problem: the flaws in these systems lie at the heart of their architectures, unfixable without breaking upward compatibility, as we shall discuss in the chapter on Secure Distributed Programming. Of course, there is nothing to prevent people from advertising that they are releasing a new, upward compatible, totally-secure version of a product. Just don't jump off the Brooklyn Bridge to buy it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; wraps these strengths in a C/Java syntax to make it quickly comfortable for a large number of software engineers. It is built with objects at the core of its design, making it easy to write modular, readable, maintainable software using the strategies familiar from Java. It has the kind of powerful string handling that will be recognized and seized upon by the Perl programmer. For both better and for worse, &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; is a dynamically typed language like Smalltalk, not a statically typed language like Java. Users of Perl and Python will immediately assert this is an advantage; Java and C++ programmers will not be so sure. A discussion of the merits and demerits of static typing could fill a book the size of this one. Many of the most complex yet most reliable systems in the world today have been developed with dynamically typed languages. If you are a Java programmer, unshakably convinced of the perfect correctness of static typing, all we can do is urge you to try E first and form your conclusions later. We believe you will find the experience both pleasant and productive, as the long heritage of programmers from Scheme to Smalltalk to Perl and Python have found in the past.&lt;br /&gt;
&lt;br /&gt;
=== Why not E? ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; is not a panacea. The current implementation of &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; runs on top of the Java Virtual Machine. As such, it is not a good language for low-level machine manipulation. So do not try to use &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; for writing device drivers. And &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt;'s performance is quite unfavorable compared to raw C, so do not write the real-time kernel of a missile guidance system with it, either.&lt;br /&gt;
&lt;br /&gt;
Actually, most arguments over performance miss the most important points about software development. One of the few time-tested truths of software development is, &amp;quot;first get it to work, then get it to work fast&amp;quot;. &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; is an excellent language for getting a system to work. Once it is working, you can gain the performance rewards by profiling to see which portions of the code actually affect performance, then rewriting those (typically small) portions in Java, or C, or assembler, depending on your needs. In fact, for many traditional compute-intensive activities, &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; is just as performance-efficient as anything else: when creating windows and buttons on the screen, you use the GUI widgets from the underlying JVM. Since the JVM uses native drawing machinery, there is little distinction among languages when working with windows.&lt;br /&gt;
&lt;br /&gt;
So perhaps &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; is in fact almost a panacea. But not quite.&lt;br /&gt;
&lt;br /&gt;
=== Why this Book? Why not this Book? ===&lt;br /&gt;
&lt;br /&gt;
This book is intended as an introductory text for practical &amp;lt;span class=&amp;quot;e&amp;quot;&amp;gt;''E''&amp;lt;/span&amp;gt; programming. Comparisons to Java are frequent, so some understanding of Java is desirable. If you wish to write software with point-and-click user interfaces, familiarity with either the Java Swing classes or the IBM Standard Widget Toolkit (SWT) is practically required.&lt;br /&gt;
&lt;br /&gt;
This book is not a language specification. This book is an introduction to get you started and productive. If you encounter some surprising behavior not explained here, please join the e-lang discussion group and ask there: many helpful people can be found. If you need a precise specification, look to the reference materials posted by the language author and keeper, Mark Miller, at the [http://www.erights.org/ ERights web site]. You can join the e-lang discussion group at the same site.&lt;br /&gt;
&lt;br /&gt;
=== Fireworks In Part II ===&lt;br /&gt;
&lt;br /&gt;
When a very early version of '''''E''''' and '''''E''''' ''in a Walnut ''were presented to a programmer chat group, this was one of the comments:&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;I think the key to hooking someone is to make them read the whole walnut cause it just looks like another scripting language until you get into the security and distribution then its like fireworks.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Though '''''E''''' is a powerful language with which to write single-CPU programs, the main power of '''''E''''' becomes evident only after you move into distributed programming. It would be tempting to introduce the distributed computing features first...except that you can't really do any meaningful computing without the basic data, flow, function, and object structures. So this book introduces &amp;quot;Ordinary Programming&amp;quot; Part I before getting into the serious distributed computing facilities. However, since '''''E''''' was designed in the C/Java syntax tradition, an experienced programmer can probably glean enough from the [http://www.erights.org/elang/quick-ref.html Quick Reference Card] to skip directly to [[Walnut/Distributed Computing|Part 3 on Distributed Computing]]. If you are short of time and have the requisite background, we recommend that strategy. Go back and read Part I when you are convinced that '''''E''''''s power for distributed programming meets your needs.&lt;br /&gt;
&lt;br /&gt;
=== [[Rune]] and Trace Log ===&lt;br /&gt;
&lt;br /&gt;
If you have read this far, you will probably want to [[Downloads|retrieve a current version of '''''E''''']].  Follow the installation directions in the distribution.&lt;br /&gt;
&lt;br /&gt;
You will find the [[rune]] interactive interpreter by going into the '''''E ''''' directory and typing&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 java -jar e.jar --rune&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rune will be your friend for experimentation as you learn''''' E'''''. Indeed, you may find, as others have, that rune is useful even when developing ordinary Java: with this scratchpad you can quickly explore what the API for Java really does when you use it, quickly and easily, before you put Java code into the middle of a program that is difficult to test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color:red&amp;quot;&amp;gt;&lt;br /&gt;
''Crucial note: At the time of this writing, '''''E''''' is in transition to a return-keyword based syntax for returning values from methods and functions. The following examples will only work if you put the following pragmas at the top of '''''E''''' source files: ''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# E sample&lt;br /&gt;
 pragma.syntax(&amp;quot;0.9&amp;quot;)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using Rune: One-line commands start with a question mark prompt and return the result on the next line in a comment:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;? 2 + 2&lt;br /&gt;
 # value: 4&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commands that cannot be completed in a single line will receive close-angle-bracket continuations when you press carriage return at the end of the first line; the whole set of lines from the question mark down to the end of the command (the closing brace) will be evaluated when you close the statement:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ? if (3 &amp;lt; 5) {&lt;br /&gt;
 &amp;gt;     println(&amp;quot;is less&amp;quot;)&lt;br /&gt;
 &amp;gt; }&lt;br /&gt;
 is less&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another one of the wonderful little '''''E''''' features that helps enormously in rune is the help(obj) function. Type &amp;quot;help(interp)&amp;quot; into rune, and you will get a complete listing of all the methods you can call on the interp object. You will be surprised at first glance by the number of methods there; these methods are explained throughout the course of the book, starting at the end of the discussion of '''''E''''' objects.&lt;br /&gt;
&lt;br /&gt;
We will present examples both as straight '''''E''''' source and as rune source, depending on how complex the example is.&lt;br /&gt;
&lt;br /&gt;
The Trace Log will be one of your best friends when you step outside of rune and start writing '''''E''''' programs. When you install '''''E''''', one of the items in the &amp;quot;eprops.txt&amp;quot; file is a specification of the directory where trace information should be written when a program fails during execution. Find your etrace directory (enter &amp;lt;code&amp;gt;interp.getProps()[&amp;quot;TraceLog_dir&amp;quot;]&amp;lt;/code&amp;gt;), and go there when you need debugging information. This is an important resource--more than one early adopter of '''''E''''' has kicked himself for forgetting that it is there, then spending several hours trying to understand a problem that was simple and obvious if you just looked at the log.&lt;br /&gt;
&lt;br /&gt;
Next Part: [[Walnut/Ordinary_Programming|Ordinary Programming]]&lt;/div&gt;</summary>
		<author><name>Mscheffler</name></author>	</entry>

	</feed>