From f65d6026ef84d16e5b27ab4c852df46044091e2d Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Wed, 18 Jul 2012 16:28:58 -0700 Subject: [PATCH] Started playing with macros to make receiving easier --- src/test/run-pass/pipe-bank-proto.rs | 78 +++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/src/test/run-pass/pipe-bank-proto.rs b/src/test/run-pass/pipe-bank-proto.rs index 72bdfff9f42..d811eaacbe1 100644 --- a/src/test/run-pass/pipe-bank-proto.rs +++ b/src/test/run-pass/pipe-bank-proto.rs @@ -32,20 +32,86 @@ proto! bank { } } -fn macros() { - #macro[ - [#move[x], - unsafe { let y <- *ptr::addr_of(x); y }] - ]; +macro_rules! move { + { $x:expr } => { unsafe { let y <- *ptr::addr_of($x); y } } } +fn switch(+endp: pipes::recv_packet, + f: fn(+option) -> U) -> U { + f(pipes::try_recv(endp)) +} + +fn move(-x: T) -> T { x } + +macro_rules! follow { + { + $($message:path($($x: ident),+) => $next:ident $e:expr)+ + } => ( + |m| alt move(m) { + $(some($message($($x,)* next)) { + let $next = move!{next}; + $e })+ + _ { fail } + } + ); + + { + $($message:path => $next:ident $e:expr)+ + } => ( + |m| alt move(m) { + $(some($message(next)) { + let $next = move!{next}; + $e })+ + _ { fail } + } + ) +} + +/* +fn client_follow(+bank: bank::client::login) { + import bank::*; + + let bank = client::login(bank, ~"theincredibleholk", ~"1234"); + let bank = switch(bank, follow! { + ok => connected { connected } + invalid => _next { fail ~"bank closed the connected" } + }); + + /* // potential alternate syntax + let bank = recv_alt! { + bank => { + | ok -> connected { connected } + | invalid -> _next { fail } + } + bank2 => { + | foo -> _n { fail } + } + } + */ + + let bank = client::deposit(bank, 100.00); + let bank = client::withdrawal(bank, 50.00); + alt try_recv(bank) { + some(money(m, _)) { + io::println(~"Yay! I got money!"); + } + some(insufficient_funds(_)) { + fail ~"someone stole my money" + } + none { + fail ~"bank closed the connection" + } + } +} +*/ + fn bank_client(+bank: bank::client::login) { import bank::*; let bank = client::login(bank, ~"theincredibleholk", ~"1234"); let bank = alt try_recv(bank) { some(ok(connected)) { - #move(connected) + move!{connected} } some(invalid(_)) { fail ~"login unsuccessful" } none { fail ~"bank closed the connection" }