Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
471370a1
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
471370a1
编写于
8月 04, 2015
作者:
J
Jared Roesch
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix last nits
上级
2919e326
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
54 addition
and
49 deletion
+54
-49
src/libsyntax/ext/expand.rs
src/libsyntax/ext/expand.rs
+2
-1
src/test/compile-fail/type-macros-fail.rs
src/test/compile-fail/type-macros-fail.rs
+1
-0
src/test/run-pass/type-macros-hlist.rs
src/test/run-pass/type-macros-hlist.rs
+51
-48
未找到文件。
src/libsyntax/ext/expand.rs
浏览文件 @
471370a1
...
...
@@ -1581,7 +1581,8 @@ pub fn expand_type(t: P<ast::Ty>, fld: &mut MacroExpander) -> P<ast::Ty> {
"type_macros"
,
t
.span
,
"type macros are experimental (see issue: #27336)"
);
t
DummyResult
::
raw_ty
(
t
.span
)
}
}
_
=>
t
...
...
src/test/compile-fail/type-macros-fail.rs
浏览文件 @
471370a1
...
...
@@ -14,6 +14,7 @@
struct
Foo
<
T
>
{
x
:
Id!
(
T
)
//~^ ERROR: type macros are experimental (see issue: #27336)
}
fn
main
()
{
...
...
src/test/run-pass/type-macros-hlist.rs
浏览文件 @
471370a1
...
...
@@ -13,74 +13,77 @@
use
std
::
ops
::
*
;
#[derive(Copy,
Clone,
Debug,
Eq,
Ord,
PartialEq,
PartialOrd)]
struct
Nil
;
// empty HList
struct
Nil
;
// empty HList
#[derive(Copy,
Clone,
Debug,
Eq,
Ord,
PartialEq,
PartialOrd)]
struct
Cons
<
H
,
T
:
HList
>
(
H
,
T
);
// cons cell of HList
struct
Cons
<
H
,
T
:
HList
>
(
H
,
T
);
// cons cell of HList
// trait to classify valid HLists
trait
HList
{}
impl
HList
for
Nil
{}
impl
<
H
,
T
:
HList
>
HList
for
Cons
<
H
,
T
>
{
}
// trait to classify valid HLists
trait
HList
{
}
impl
HList
for
Nil
{
}
impl
<
H
,
T
:
HList
>
HList
for
Cons
<
H
,
T
>
{
}
// term-level macro for HLists
macro_rules!
hlist
{
{}
=>
{
Nil
};
{
$head:expr
}
=>
{
Cons
(
$head
,
Nil
)
};
{
$head:expr
,
$
(
$tail:expr
),
*
}
=>
{
Cons
(
$head
,
hlist!
(
$
(
$tail
),
*
))
};
}
macro_rules!
hlist
({
}
=>
{
Nil
}
;
{
$
head
:
expr
}
=>
{
Cons
(
$
head
,
Nil
)
}
;
{
$
head
:
expr
,
$
(
$
tail
:
expr
)
,
*
}
=>
{
Cons
(
$
head
,
hlist
!
(
$
(
$
tail
)
,
*
)
)
}
;);
// type-level macro for HLists
macro_rules!
HList
{
{}
=>
{
Nil
};
{
$head:ty
}
=>
{
Cons
<
$head
,
Nil
>
};
{
$head:ty
,
$
(
$tail:ty
),
*
}
=>
{
Cons
<
$head
,
HList!
(
$
(
$tail
),
*
)
>
};
}
macro_rules!
HList
({
}
=>
{
Nil
}
;
{
$
head
:
ty
}
=>
{
Cons
<
$
head
,
Nil
>
}
;
{
$
head
:
ty
,
$
(
$
tail
:
ty
)
,
*
}
=>
{
Cons
<
$
head
,
HList
!
(
$
(
$
tail
)
,
*
)
>
}
;);
// nil case for HList append
impl
<
Ys
:
HList
>
Add
<
Ys
>
for
Nil
{
type
Output
=
Ys
;
impl
<
Ys
:
HList
>
Add
<
Ys
>
for
Nil
{
type
Output
=
Ys
;
fn
add
(
self
,
rhs
:
Ys
)
->
Ys
{
rhs
}
fn
add
(
self
,
rhs
:
Ys
)
->
Ys
{
rhs
}
}
// cons case for HList append
impl
<
Rec
:
HList
+
Sized
,
X
,
Xs
:
HList
,
Ys
:
HList
>
Add
<
Ys
>
for
Cons
<
X
,
Xs
>
where
Xs
:
Add
<
Ys
,
Output
=
Rec
>
,
{
type
Output
=
Cons
<
X
,
Rec
>
;
impl
<
Rec
:
HList
+
Sized
,
X
,
Xs
:
HList
,
Ys
:
HList
>
Add
<
Ys
>
for
Cons
<
X
,
Xs
>
where
Xs
:
Add
<
Ys
,
Output
=
Rec
>
{
type
Output
=
Cons
<
X
,
Rec
>
;
fn
add
(
self
,
rhs
:
Ys
)
->
Cons
<
X
,
Rec
>
{
Cons
(
self
.0
,
self
.1
+
rhs
)
}
fn
add
(
self
,
rhs
:
Ys
)
->
Cons
<
X
,
Rec
>
{
Cons
(
self
.0
,
self
.1
+
rhs
)
}
}
// type macro Expr allows us to expand the + operator appropriately
macro_rules!
Expr
{
{
(
$
(
$LHS:tt
)
+
)
}
=>
{
Expr!
(
$
(
$LHS
)
+
)
};
{
HList
!
[
$
(
$LHS:tt
)
*
]
+
$
(
$RHS:tt
)
+
}
=>
{
<
Expr!
(
HList!
[
$
(
$LHS
)
*
])
as
Add
<
Expr!
(
$
(
$RHS
)
+
)
>>
::
Output
};
{
$LHS:tt
+
$
(
$RHS:tt
)
+
}
=>
{
<
Expr!
(
$LHS
)
as
Add
<
Expr!
(
$
(
$RHS
)
+
)
>>
::
Output
};
{
$LHS:ty
}
=>
{
$LHS
};
}
macro_rules!
Expr
({
(
$
(
$
LHS
:
tt
)
+
)
}
=>
{
Expr
!
(
$
(
$
LHS
)
+
)
}
;
{
HList
!
[
$
(
$
LHS
:
tt
)
*
]
+
$
(
$
RHS
:
tt
)
+
}
=>
{
<
Expr
!
(
HList
!
[
$
(
$
LHS
)
*
]
)
as
Add
<
Expr
!
(
$
(
$
RHS
)
+
)
>>
::
Output
}
;
{
$
LHS
:
tt
+
$
(
$
RHS
:
tt
)
+
}
=>
{
<
Expr
!
(
$
LHS
)
as
Add
<
Expr
!
(
$
(
$
RHS
)
+
)
>>
::
Output
}
;
{
$
LHS
:
ty
}
=>
{
$
LHS
}
;);
// test demonstrating term level `xs + ys` and type level `Expr!(Xs + Ys)`
fn
main
()
{
fn
aux
<
Xs
:
HList
,
Ys
:
HList
>
(
xs
:
Xs
,
ys
:
Ys
)
->
Expr!
(
Xs
+
Ys
)
where
Xs
:
Add
<
Ys
>
{
xs
+
ys
}
fn
aux
<
Xs
:
HList
,
Ys
:
HList
>
(
xs
:
Xs
,
ys
:
Ys
)
->
Expr!
(
Xs
+
Ys
)
where
Xs
:
Add
<
Ys
>
{
xs
+
ys
}
let
xs
:
HList!
[
&
str
,
bool
,
Vec
<
u64
>
]
=
hlist!
[
"foo"
,
false
,
vec!
[]];
let
ys
:
HList!
[
u64
,
[
u8
;
3
],
()]
=
hlist!
[
0
,
[
0
,
1
,
2
],
()];
let
xs
:
HList!
(
&
str
,
bool
,
Vec
<
u64
>
)
=
hlist!
(
"foo"
,
false
,
vec
!
[
]);
let
ys
:
HList!
(
u64
,
[
u8
;
3
]
,
(
))
=
hlist!
(
0
,
[
0
,
1
,
2
]
,
(
));
// demonstrate recursive expansion of Expr!
let
zs
:
Expr!
((
HList!
[
&
str
]
+
HList!
[
bool
]
+
HList!
[
Vec
<
u64
>
])
+
(
HList!
[
u64
]
+
HList!
[[
u8
;
3
],
()])
+
HList!
[])
=
aux
(
xs
,
ys
);
assert_eq!
(
zs
,
hlist!
[
"foo"
,
false
,
vec!
[],
0
,
[
0
,
1
,
2
],
()])
let
zs
:
Expr!
((
HList
!
[
&
str
]
+
HList
!
[
bool
]
+
HList
!
[
Vec
<
u64
>
]
)
+
(
HList
!
[
u64
]
+
HList
!
[
[
u8
;
3
]
,
(
)
]
)
+
HList
!
[
])
=
aux
(
xs
,
ys
);
assert_eq!
(
zs
,
hlist
!
[
"foo"
,
false
,
vec
!
[
]
,
0
,
[
0
,
1
,
2
]
,
(
)
])
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录