diff --git a/src/libcore/future.rs b/src/libcore/future.rs
index f7efe70b5dcf..86837285c2b7 100644
--- a/src/libcore/future.rs
+++ b/src/libcore/future.rs
@@ -60,11 +60,8 @@ fn from_value(+val: A) -> future {
})
}
-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 from_port(-port: future_pipe::client::waiting) -> future {
@@ -81,7 +78,7 @@ fn from_port(-port: future_pipe::client::waiting) -> future {
port_ <-> *port;
let port = option::unwrap(port_);
alt recv(port) {
- future_pipe::completed(data) { #move(data) }
+ future_pipe::completed(data) { move!{data} }
}
}
}
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index de772b0ff1cb..d14905e1290c 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -101,52 +101,43 @@ enum class_contents { ctor_decl(fn_decl, ~[attribute], blk, codemap::span),
type arg_or_capture_item = either;
type item_info = (ident, item_, option<~[attribute]>);
+
+/* The expr situation is not as complex as I thought it would be.
+The important thing is to make sure that lookahead doesn't balk
+at ACTUALLY tokens */
+macro_rules! maybe_whole_expr{
+ {$p:expr} => { alt copy $p.token {
+ ACTUALLY(token::w_expr(e)) {
+ $p.bump();
+ ret pexpr(e);
+ }
+ ACTUALLY(token::w_path(pt)) {
+ $p.bump();
+ ret $p.mk_pexpr($p.span.lo, $p.span.lo,
+ expr_path(pt));
+ }
+ _ {}
+ }}
+}
+
+macro_rules! maybe_whole {
+ {$p:expr, $constructor:path} => { alt copy $p.token {
+ ACTUALLY($constructor(x)) { $p.bump(); ret x; }
+ _ {}
+ }}
+}
+
+/* ident is handled by common.rs */
+
fn dummy() {
-
-
-
- #macro[[#maybe_whole_item[p],
- alt copy p.token {
- ACTUALLY(token::w_item(i)) { p.bump(); ret i; }
- _ {} }]];
- #macro[[#maybe_whole_block[p],
- alt copy p.token {
- ACTUALLY(token::w_block(b)) { p.bump(); ret b; }
- _ {} }]];
- #macro[[#maybe_whole_stmt[p],
- alt copy p.token {
- ACTUALLY(token::w_stmt(s)) { p.bump(); ret s; }
- _ {} }]];
- #macro[[#maybe_whole_pat[p],
- alt copy p.token {
- ACTUALLY(token::w_pat(pt)) { p.bump(); ret pt; }
- _ {} }]];
- /* The expr situation is not as complex as I thought it would be.
- The important thing is to make sure that lookahead doesn't balk
- at ACTUALLY tokens */
- #macro[[#maybe_whole_expr_pexpr[p], /* ack! */
- alt copy p.token {
- ACTUALLY(token::w_expr(e)) {
- p.bump();
- ret pexpr(e);
- }
- ACTUALLY(token::w_path(pt)) {
- p.bump();
- ret p.mk_pexpr(p.span.lo, p.span.lo,
- expr_path(pt));
- }
- _ {} }]];
- #macro[[#maybe_whole_ty[p],
- alt copy p.token {
- ACTUALLY(token::w_ty(t)) { p.bump(); ret t; }
- _ {} }]];
- /* ident is handled by common.rs */
+ /* we will need this to bootstrap maybe_whole! */
#macro[[#maybe_whole_path[p],
alt p.token {
ACTUALLY(token::w_path(pt)) { p.bump(); ret pt; }
_ {} }]];
}
+
class parser {
let sess: parse_sess;
let cfg: crate_cfg;
@@ -734,7 +725,7 @@ class parser {
}
fn parse_bottom_expr() -> pexpr {
- #maybe_whole_expr_pexpr[self];
+ maybe_whole_expr!{self};
let lo = self.span.lo;
let mut hi = self.span.hi;
diff --git a/src/test/run-pass/macro-by-example-1.rs b/src/test/run-pass/macro-by-example-1.rs
index 5c04e1f2bb71..568739b0663d 100644
--- a/src/test/run-pass/macro-by-example-1.rs
+++ b/src/test/run-pass/macro-by-example-1.rs
@@ -9,6 +9,7 @@ fn main() {
fn add(a: int, b: int) -> int { ret a + b; }
- assert (#apply[add, [1, 15]] == 16);
+ assert(#apply[add, [1, 15]] == 16);
+ assert(apply!{add, [1, 15]} == 16);
assert(apply_tt!{add, (1, 15)} == 16);
}