PassByConstruction

From Erights

(Difference between revisions)
Jump to: navigation, search
m
m
Line 15: Line 15:
<code>
<code>
-
 
def makeVector implements pbc {
def makeVector implements pbc {
     to run(var x, var y) {
     to run(var x, var y) {
Line 22: Line 21:
             to getY() :any { return y }
             to getY() :any { return y }
             to __optUncall() :any { return [makeVector, "run", [x,y]] }
             to __optUncall() :any { return [makeVector, "run", [x,y]] }
-
             to __printOn(out) {out.print(`<Vector $x $y>`)}
+
             to __printOn(out) {out.print(`&lt;Vector $x $y&gt;`)}
         }
         }
         return vector
         return vector
Line 30: Line 29:
     }
     }
}
}
-
 
</code>
</code>
Line 36: Line 34:
<code>
<code>
-
 
#create a new Vector object
#create a new Vector object
-
? def makeVector := <import:tests.makeVector>
+
? def makeVector := &lt;import:tests.makeVector&lgt;
-
# value: <makeVector>
+
# value: &lt;makeVector&gt;
? def vector := makeVector(6.6,7.7)
? def vector := makeVector(6.6,7.7)
-
# value: <Vector 6.6 7.7>
+
# value: &lt;Vector 6.6 7.7&gt;
#create a new vat
#create a new vat
Line 48: Line 45:
# value: ["3DES_SDH_M2", "3DES_SDH_M"]
# value: ["3DES_SDH_M2", "3DES_SDH_M"]
-
? def seedVatAuthor := <elang:interp.seedVatAuthor>(<unsafe>).virtualize((introducer))
+
? def seedVatAuthor := &lt;elang:interp.seedVatAuthor&gt;(&lt;unsafe&gt;).virtualize((introducer))
-
# value: <virtualSeedVat>
+
# value: &lt;virtualSeedVat&gt;
# source code for the new vat
# source code for the new vat
Line 56: Line 53:
? def [scriptObj, vat] := seedVatAuthor(scriptSource)
? def [scriptObj, vat] := seedVatAuthor(scriptSource)
-
# value: [<Promise>, <Vat newVirtualSeedVat in <runs in newVirtualSeedVat>>]
+
# value: [&lt;Promise&gt;, &lt;Vat newVirtualSeedVat in &lt;runs in newVirtualSeedVat&gt;&gt;]
-
? scriptObj <- run(vector)
+
? scriptObj &lt;- run(vector)
-
# value: <Remote Promise>
+
# value: &lt;Remote Promise&gt;
-
? Thing: <Vector 6.6 7.7>
+
? Thing: &lt;Vector 6.6 7.7&gt;
</code>
</code>

Revision as of 10:26, 18 April 2007

An object declared as, for example

   def foo implements pbc {
       to __optUncall() { return [1, "add", [2]] }
       # ...
   }

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, "add", [2])”) to create the object as received.

Example

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. 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]. This code should be positioned in a file in the java classpath at the location "tests.makeVector.emaker"

def makeVector implements pbc {

   to run(var x, var y) {
       def vector implements pbc {
           to getX() :any { return x }
           to getY() :any { return y }
           to __optUncall() :any { return [makeVector, "run", [x,y]] }
           to __printOn(out) {out.print(`<Vector $x $y>`)}
       }
       return vector
   }
   to __optUncall() :any {
       return [<import>, "get", ["tests.makeVector"]]
   }

}

Example of usage:

  1. create a new Vector object

? def makeVector := <import:tests.makeVector&lgt;

  1. value: <makeVector>

? def vector := makeVector(6.6,7.7)

  1. value: <Vector 6.6 7.7>
  1. create a new vat

? introducer.onTheAir()

  1. value: ["3DES_SDH_M2", "3DES_SDH_M"]

? def seedVatAuthor := <elang:interp.seedVatAuthor>(<unsafe>).virtualize((introducer))

  1. value: <virtualSeedVat>
  1. source code for the new vat

? def scriptSource:="def run(thing :pbc) {println(`Thing: $thing`)}"

  1. value: "def run(thing :near) {println(`Thing: $thing`)}"

? def [scriptObj, vat] := seedVatAuthor(scriptSource)

  1. value: [<Promise>, <Vat newVirtualSeedVat in <runs in newVirtualSeedVat>>]

? scriptObj <- run(vector)

  1. value: <Remote Promise>

? Thing: <Vector 6.6 7.7>

Personal tools
more tools