Skip to content

Commit

Permalink
capability, directory, voting improvements, foreach
Browse files Browse the repository at this point in the history
  • Loading branch information
jimscarver committed Feb 17, 2019
1 parent 1298084 commit 4fce67a
Show file tree
Hide file tree
Showing 13 changed files with 245 additions and 36 deletions.
2 changes: 1 addition & 1 deletion addUser.rho
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#define $directory "testdir"
#define $username "jimscarver"
#define $username "Owans"
new ret, lookup(`rho:registry:lookup`), stdout(`rho:io:stdout`) in {
lookup!($locker_%%$myusername, *ret) | for(locker <- ret) {
locker!("get", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, *stdout, *ret) |
Expand Down
31 changes: 31 additions & 0 deletions allowalltovote.rho
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#define $directory "testdir"
#define $ballot "color"
new lockerCh, ret, ret1, loop, $stdout, $lookup in {
lookup!($locker_%%$myusername, *lockerCh) | for(locker <- lockerCh) {
locker!("get", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, *stdout, *ret) |
for (@items <- ret) {
@{items.get("peek")}!("directory", $directory, *ret) |
@{items.get("peek")}!("ballot", $ballot, *ret1) |
for ( @[{"read": *read, ..._}, ..._] <- ret;
@[{"chair": *chair, ..._}, ..._] <- ret1 ) {
contract loop ( @map ) = {
match map {
{} => Nil
{ username: *inbox, ...tail } => {
chair!("giveRightToVote", *ret) |
for (@vote <- ret) {
inbox!(["vote", $ballot, vote])
} |
loop!(tail)
}
}
} |
read!(*ret) |
for ( @members <- ret ) {
loop!(members)
}
} |
stdout!(["#define $locker_nonce_" ++ $myusername, {$locker_nonce_%%$myusername + 1}])
}
}
}
25 changes: 10 additions & 15 deletions allowtovote.rho
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
#define $user "dummyuser"
#define $ballot "flavors"
new inboxCh, lockerCh, itemsCh, voteCh,
lookup(`rho:registry:lookup`), stdout(`rho:io:stdout`) in {
lookup!($locker_%%$myusername, *lockerCh) |
for(locker <- lockerCh) {
locker!("get", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, *stdout, *itemsCh) |
stdout!(["#define $locker_nonce_" ++ $myusername, {$locker_nonce_%%$myusername + 1}]) |
for (@{$ballot: ballot, ..._} <- itemsCh) {
@{ballot.get("chair")}!("giveRightToVote", *voteCh) |
for (vote <- voteCh) {
lookup!($inbox_%%$user, *inboxCh) |
for(inbox <- inboxCh) {
inbox!(["vote",$ballot,*vote],*stdout) |
stdout!({"sending right to vote to": $user})
} } } } }
#define $ballot "color"
new ret in {
$peek("ballot",$ballot,*ret) |
for ( @[{"chair": chair, ..._}, ..._] <- ret ) {
@chair!("giveRightToVote", *ret) |
for (@vote <- ret) {
$send($user,"vote", $ballot, vote)
}
}
}
44 changes: 44 additions & 0 deletions control.rho
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@

new ret, x, y, z, xCh, condCh, _if, _while, _until, stdout(`rho:io:stdout`) in {
contract _while(condCh,body) = {
for (cond <- condCh ) {
if (*cond) {
condCh!(*body ) |
_while!(*condCh,*body)
}
}
} |

contract _if(condCh,_then,_else) = {
for (cond <- condCh) {
stdout!(*cond) |
stdout!(*@{*cond}) |
*cond |
if ( *cond ) *_then
else *_else
}
} |
contract _if(cond,_then,_else, ret) = {
stdout!(*cond) |
if ( *cond ) ret!(*_then)
else ret!(*_else)
} |

condCh!(for (x <- xCh) {*x == 0}) |
//condCh!(3==3) |
_if!(*condCh, {xCh!(0)|stdout!("truly")}, xCh!(3+2)) |
for ( val <- xCh ) {
stdout!({"x1": *val})
} |
/*
_if!(3==5, 1+1, 2+2, *stdout) |
_if!(3==3, x!(10+1), x!(02+2), *y) |
for (rho <- y) {
stdout!(*rho) |
*rho |
for ( val <- x ) {
stdout!({"x2": *val})
}
}
*/ Nil
}
2 changes: 1 addition & 1 deletion dummyuser.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
#define $myprivkey "aaaa"
#define $mypubkey "deadaaaa"
#define $locker_dummyuser `rho:id:j6afr73pzy8dk6qa7qn9h9pbp87wgdgrww4dzy9ngf8jedwp9iqbwr`
#define $locker_nonce_dummyuser 6
#define $locker_nonce_dummyuser 16
#define $inbox_dummyuser `rho:id:chbabwgtyy6fcs7hkft4dfc57fxmu6bkrawygabtbq3f68ijqqjmpd`
25 changes: 25 additions & 0 deletions foreach.rho
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#define $collection {"a": "b", "c": "d", "e": "f", "g": "h"}
#define $code stdout!({_key: _value})
new $stdout, _loop in {
contract _loop ( @_map ) = {
match _map {
{} => Nil
{ _key: _value, ..._tail } => {
$code |
_loop!(_tail)
}
[] => Nil
[_value, ..._tail] /\ _key => {
$code |
_loop!(_tail)
}
Set() => Nil
Set(_value, ..._tail) /\ _key => {
$code |
_loop!(_tail)
}
/* _ /\ _name => {for ( @collection <- @_name ) { _loop!(collection) } } */
}
} | _loop!( $collection )
}

61 changes: 61 additions & 0 deletions global.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,64 @@
#define $add2Directory($name, $key,$value,$ret) new ret, $stdout in { $peek("directory",$name,*ret) | for (@[dir, ..._] <- ret ) { @{dir.get("write")}!($key,$value,$ret) } }
#define $addUser( $username,$directory) new ret, lookup(`rho:registry:lookup`), stdout(`rho:io:stdout`) in { lookup!($locker_%%$myusername, *ret) | for(locker <- ret) { locker!("get", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, *stdout, *ret) | for (@items <- ret) { if ( items.get("peek") == Nil ) { stdout!("you do not have an mailbox") } else { @{items.get("peek")}!("directory", $directory,*ret) | for ( @[{"read": *read, "write": *write, ..._ }, ..._] <- ret ) { if ( *write == Nil ) { stdout!("you do not have permission to write to " ++ $directory) } else { lookup!($inbox_%%$username,*ret) | for( inbox <- ret ) { write!($username,*inbox, *stdout) | inbox!(["directory", $directory, {"read": *read}], *stdout) } } } } | stdout!(["#define $locker_nonce_" ++ $myusername, {$locker_nonce_%%$myusername + 1}]) } } }
#define $locker_nonce_jimscarver 42
#define $locker_nonce_jimscarver 43
#define $locker_nonce_jimscarver 44
#define $locker_nonce_jimscarver 45
#define $locker_nonce_jimscarver 46
#define $newBallot($name,$choiceSet) new lookupCh, bCh, $lookup, $stdout in { lookup!($Ballot, *lookupCh) | for(Ballot <- lookupCh) { Ballot!($choiceSet, *bCh) | for (chair, getWinner <- bCh) { $send($myusername, "ballot", $name, {"chair": *chair, "getWinner": *getWinner}) } } }
#define $locker_nonce_jimscarver 47
#define $allowtovote($user,$ballot) new ret in { $peek("ballot",$ballot,*ret) | for ( @[{"chair": chair, ..._}, ..._] <- ret ) { @chair!("giveRightToVote", *ret) | for (@vote <- ret) { $send($user,"vote",vote,*stdout) } } }
#define $locker_nonce_jimscarver 48
#define $locker_nonce_jimscarver 49
#define $allowtovote($user,$ballot) new ret in { $peek("ballot",$ballot,*ret) | for ( @[{"chair": chair, ..._}, ..._] <- ret ) { @chair!("giveRightToVote", *ret) | for (@vote <- ret) { $send($user,"vote", $ballot, vote) } } }
#define $locker_nonce_jimscarver 50
#define $locker_nonce_jimscarver 51
#define $locker_nonce_jimscarver 52
#define $locker_nonce_jimscarver 53
#define $voteresults($ballot) new ret, $stdout in { $peek("ballot",$ballot,*ret) | for ( @[{"getWinner": results, ..._}, ..._] <- ret ) { @results!(*stdout) } }
#define $locker_nonce_jimscarver 54
#define $receive($type,$subtype_return...) new lockerCh, itemsCh, $stdout, $lookup in { lookup!($locker_%%$myusername, *lockerCh) | for(locker <- lockerCh) { locker!("get", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, *stdout, *itemsCh) | for (@items <- itemsCh) { if ( items.get("receive") == Nil ) { stdout!("you do not have a receive channel for your inbox") } else { @{items.get("receive")}!($type, $subtype_return) } | stdout!(["#define $locker_nonce_" ++ $myusername, {$locker_nonce_%%$myusername + 1}]) } } }
#define $locker_nonce_jimscarver 55
#define $locker_nonce_jimscarver 56
#define $locker_nonce_jimscarver 57
#define $locker_nonce_jimscarver 58
#define $allowalltovote($directory,$ballot) new lockerCh, ret, ret1, loop, $stdout, $lookup in { lookup!($locker_%%$myusername, *lockerCh) | for(locker <- lockerCh) { locker!("get", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, *stdout, *ret) | for (@items <- ret) { @{items.get("peek")}!("directory", $directory, *ret) | @{items.get("peek")}!("ballot", $ballot, *ret1) | for ( @[{"read": *read, ..._}, ..._] <- ret; @[{"chair": *chair, ..._}, ..._] <- ret1 ) { contract loop ( @map ) = { match map { {} => Nil { username: *inbox, ...tail } => { chair!("giveRightToVote", *ret) | for (@vote <- ret) { inbox!(["vote", $ballot, vote]) } | loop!(tail) } } } | read!(*ret) | for ( @members <- ret ) { loop!(members) } } | stdout!(["#define $locker_nonce_" ++ $myusername, {$locker_nonce_%%$myusername + 1}]) } } }
#define $locker_Owans `rho:id:muoibisbyqztaa9didj65otyxoio95yjkgqj7sgpo55xakhr4ysarq`
#define $locker_nonce_Owans 1
#define $inbox_Owans `rho:id:k3465k7e67faohyo8kt9n9ypaaeiru7hyenbys9rjq3x79a9ssx4dn`
#define $locker_nonce_jimscarver 59
#define $addUser( $username,$directory) new ret, lookup(`rho:registry:lookup`), stdout(`rho:io:stdout`) in { lookup!($locker_%%$myusername, *ret) | for(locker <- ret) { locker!("get", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, *stdout, *ret) | for (@items <- ret) { if ( items.get("peek") == Nil ) { stdout!("you do not have an mailbox") } else { @{items.get("peek")}!("directory", $directory,*ret) | for ( @[{"read": *read, "write": *write, ..._ }, ..._] <- ret ) { if ( *write == Nil ) { stdout!("you do not have permission to write to " ++ $directory) } else { lookup!($inbox_%%$username,*ret) | for( inbox <- ret ) { write!($username,*inbox, *stdout) | inbox!(["directory", $directory, {"read": *read}], *stdout) } } } } | stdout!(["#define $locker_nonce_" ++ $myusername, {$locker_nonce_%%$myusername + 1}]) } } }
#define $locker_nonce_jimscarver 60
#define $addUser( $username,$directory) new ret, lookup(`rho:registry:lookup`), stdout(`rho:io:stdout`) in { lookup!($locker_%%$myusername, *ret) | for(locker <- ret) { locker!("get", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, *stdout, *ret) | for (@items <- ret) { /* stdout!(items) | */ if ( items.get("peek") == Nil ) { stdout!("you do not have an mailbox") } else { stdout!("finding " ++ $directory ++ " in inbox of " ++ $myusername) | @{items.get("peek")}!("directory", $directory,*ret) | for ( @[{"read": *read, "write": *write, ..._ }, ..._] <- ret ) { if ( *write == Nil ) { stdout!("you do not have permission to write to " ++ $directory) } else { lookup!($inbox_%%$username,*ret) | for( inbox <- ret ) { stdout!("adding " ++ $username) | write!($username,*inbox, *stdout) | inbox!(["directory", $directory, {"read": *read}], *stdout) } } } } | stdout!(["#define $locker_nonce_" ++ $myusername, {$locker_nonce_%%$myusername + 1}]) } } }
#define $locker_nonce_jimscarver 61
#define $locker_nonce_jimscarver 62
#define $locker_nonce_jimscarver 63
#define $locker_nonce_jimscarver 64
#define $locker_nonce_jimscarver 65
#define $locker_nonce_jimscarver 66
#define $locker_nonce_jimscarver 67
#define $locker_nonce_jimscarver 68
#define $locker_nonce_jimscarver 69
#define $locker_nonce_SteveHenley 3
#define $locker_nonce_SteveHenley 4
#define $locker_nonce_jimscarver 70
#define $locker_nonce_SteveHenley 5
#define $locker_nonce_jimscarver 71
#define $locker_nonce_jimscarver 72
#define $locker_nonce_jimscarver 73
#define $locker_tgrospic `rho:id:mb3e8gadzbcuydgng9ig4he7dx1nfgups8xz8jfi6km5bwouupbigd`
#define $locker_nonce_tgrospic 1
#define $inbox_tgrospic `rho:id:k6hn3yz3kforb95bxypa5wb4oakpra64exgj6cmm3mbhh3fhj6xhej`
#define $locker_nonce_jimscarver 74
#define $locker_nonce_jimscarver 75
#define $locker_nonce_jimscarver 76
#define $locker_nonce_jimscarver 77
#define $Inbox `rho:id:as81nitjknceoawprj7fe6euu336xwajng4c1axpqq7hq8k348jweu`
#define $foreach($collection, $body) contract _loop ( @_map ) = { match _map { {} => Nil { _key: _value, ..._tail } => { $body | _loop!(_tail) } [] => Nil [_value, ..._tail] /\ _key => { $body | _loop!(_tail) } Set() => Nil Set(_value, ..._tail) /\ _key => { $body | _loop!(_tail) } } } | _loop!( $map )
#define $foreach($collection,$code) contract _loop ( @_map ) = { match _map { {} => Nil { _key: _value, ..._tail } => { $body | _loop!(_tail) } [] => Nil [_value, ..._tail] /\ _key => { $body | _loop!(_tail) } Set() => Nil Set(_value, ..._tail) /\ _key => { $body | _loop!(_tail) } } } | _loop!( $collection )
#define $foreach($collection,$code) contract _loop ( @_map ) = { match _map { {} => Nil { _key: _value, ..._tail } => { $body | _loop!(_tail) } [] => Nil [_value, ..._tail] /\ _key => { $code | _loop!(_tail) } Set() => Nil Set(_value, ..._tail) /\ _key => { $body | _loop!(_tail) } } } | _loop!( $collection )
#define $foreach($collection,$code) contract _loop ( @_map ) = { match _map { {} => Nil { _key: _value, ..._tail } => { $code | _loop!(_tail) } [] => Nil [_value, ..._tail] /\ _key => { $body | _loop!(_tail) } Set() => Nil Set(_value, ..._tail) /\ _key => { $code | _loop!(_tail) } } } | _loop!( $collection )
#define $foreach($collection,$code) contract _loop ( @_map ) = { match _map { {} => Nil { _key: _value, ..._tail } => { $code | _loop!(_tail) } [] => Nil [_value, ..._tail] /\ _key => { $code | _loop!(_tail) } Set() => Nil Set(_value, ..._tail) /\ _key => { $code | _loop!(_tail) } } } | _loop!( $collection )
#define $foreach($collection,$code) contract _loop ( @_map ) = { match _map { {} => Nil { _key: _value, ..._tail } => { $code | _loop!(_tail) } [] => Nil [_value, ..._tail] /\ _key => { $code | _loop!(_tail) } Set() => Nil Set(_value, ..._tail) /\ _key => { $code | _loop!(_tail) } }
#define $foreach($collection,$code) contract _loop ( @_map ) = { match _map { {} => Nil { _key: _value, ..._tail } => { $code | _loop!(_tail) } [] => Nil [_value, ..._tail] /\ _key => { $code | _loop!(_tail) } Set() => Nil Set(_value, ..._tail) /\ _key => { $code | _loop!(_tail) } } }
#define $foreach($collection,$code) new $stdout, _loop in { contract _loop ( @_map ) = { match _map { {} => Nil { _key: _value, ..._tail } => { $code | _loop!(_tail) } [] => Nil [_value, ..._tail] /\ _key => { $code | _loop!(_tail) } Set() => Nil Set(_value, ..._tail) /\ _key => { $code | _loop!(_tail) } } } | _loop!( $collection ) }
45 changes: 36 additions & 9 deletions inbox.rho
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
new $stdout, Inbox in {
stdout!("begin") |
contract Inbox(capabilities) = {
new read, write, peek, box in {
capabilities!(bundle+{*read}, bundle+{*write}, bundle+{*peek}) |
Expand Down Expand Up @@ -74,27 +75,53 @@ contract Inbox(capabilities) = {
}
} |

contract write(message,ret) = {
for (items <- box) {
//stdout!([*message, *items]) |
box!(*items | *message) |
ret!("message sent.")
}
}
}
contract write(@message,ret) = {
for (items <- box) {
/*
match *items {
{[type /\ {=message}.nth(0), subtype /\ {=message}.nth(1), map ] | more } => {
box!([type, subtype, message.nth(2).union(map)] | more) |
ret!("added.")
} xx}
*/
match message {
[type, subtype, map /\ {a: b, ..._} ] => {
match *items {
{[=type, =subtype, oldmap] | more } => {
box!([type, subtype, map.union(oldmap)] | more) |
ret!("added.")
}
_ => {
box!(*items | message) |
ret!("sent...")
}
}
}
_ => {
//stdout!([*message, *items]) |
box!(*items | message) |
ret!("sent.")
}
}
}
}
}
} |
new capabilities, ack, ack1, message, uriCh, $insertArbitrary in {
stdout!("hello world") |
insertArbitrary!(*Inbox, *uriCh)|
for (uri <- uriCh) {
stdout!(["#define $Inbox", *uri])
} |
Inbox!(*capabilities) |
for (receive, send, peek <- capabilities) {
stdout!("received capabilities") |
send!(["values","test", {"a": "b"}], *ack) |
send!(["chat",$myusername ++ ": Watson come quickly!"], *ack) |
send!(["chat",$myusername, "Watson come now!"], *ack) |
send!(["chat","hello world"], *ack) |
for ( _ <- ack; _ <- ack; _ <- ack) {
for ( _ <- ack; _ <- ack; _ <- ack; _ <- ack) {
send!(["values","test", {"c": "d"}], *stdout) |
//receive!(["chat", _ ], *message) |
receive!("chat", *message) |
for ( text <- message ) {
Expand Down
24 changes: 24 additions & 0 deletions loop.rho
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#define $collection {"a": "b", "c": "d", "e": "f", "g": "h"}
#define $code stdout!({_key: _value})
new $stdout, _loop in {
contract _loop ( @_map ) = {
match _map {
{} => Nil
{ _key: _value, ..._tail } => {
$code |
_loop!(_tail)
}
[] => Nil
[_value, ..._tail] /\ _key => {
$code |
_loop!(_tail)
}
Set() => Nil
Set(_value, ..._tail) /\ _key => {
$code |
_loop!(_tail)
}
}
} | _loop!( $collection )
}

11 changes: 3 additions & 8 deletions newBallot.rho
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
#define $name color
#define $name "color"
#define $choiceSet Set("red","green","blue")
new lookupCh, bCh, Ballot, lookup(`rho:registry:lookup`), stdout(`rho:io:stdout`), lockerCh, ackCh
in {
new lookupCh, bCh, $lookup, $stdout in {
lookup!($Ballot, *lookupCh) |
for(Ballot <- lookupCh) {
Ballot!($choiceSet, *bCh) |
for (chair, getWinner <- bCh) {
lookup!($locker_%%$myusername, *lockerCh) |
for(locker <- lockerCh) {
locker!("update", $myprivkey.hexToBytes(), $locker_nonce_%%$myusername, {$name: {"chair": *chair, "getWinner": *getWinner}}, *stdout, *ackCh) |
stdout!(["#define $locker_nonce_" ++ $myusername, {$locker_nonce_%%$myusername + 1}])
}
$send($myusername, "ballot", $name, {"chair": *chair, "getWinner": *getWinner})
}
}
}
2 changes: 1 addition & 1 deletion rhoexec
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ if [ "$nonce" ]; then sed -i "/^#define \$locker_nonce_/ s/ [0-9]*$/ $nonce/" du

cat global.h dummyuser.h end.h "$1" |
cpp 2>/dev/null|
sed -n '/^_end_$/,${s/\%\%"\([^"]*\)"/\1/;p}'|tee /dev/tty|
sed -n '/^_end_$/,${s/\%\%"\([^"]*\)"/\1/g;p}'|tee /dev/tty|
cat global.h dummyuser.h -|cpp 2>/dev/null|
sed -n '/^_end_$/,$p' |
tail +2 >"$1"x &&
Expand Down
2 changes: 1 addition & 1 deletion server.js
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ client.on('message', msg => {
"echo '"+content.substring(5).replace("'","'\"'\"'")+"'|"+
"cat global.h end.h - |cpp 2>/tmp/cpp-error|"+
"sed -n '/^#/d;/^_end_$/,$p'|tail +2|clang-format|"+
"perl -0777 -pe 's/\\n[ \\t]*-/-/igs;s/<\\w-/<- /g;s/\\n[ \\t]*:/:/igs;"+
"perl -0777 -pe 's/\\n[ \\t]*-/-/igs;s/<\\w-/<- /g;s/=\\w>/=> /g;s/\\n[ \\t]*:/:/igs;"+
"s/ :/:/g;s/rho: ([a-zA-Z0-9]*:) /rho:\\1/g;s/ :/:/g;s/ !/!/g;"+
"s/ \\+\\+/ \+\+ /g;s/ \\% \\% \"([^\"]*)\"/\\1/g;s/ < -/ <- /g;"+
"s/ \\% \\% /%%/g'|tee lastecho";
Expand Down
7 changes: 7 additions & 0 deletions voteresults.rho
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#define $ballot "color"
new ret, $stdout in {
$peek("ballot",$ballot,*ret) |
for ( @[{"getWinner": results, ..._}, ..._] <- ret ) {
@results!(*stdout)
}
}

0 comments on commit 4fce67a

Please sign in to comment.