Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
b766fa88
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,发现更多精彩内容 >>
提交
b766fa88
编写于
12月 06, 2017
作者:
J
Jeffrey Seyfried
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add example of making an unhygienic macro hygienic by wrapping it in a declarative macro.
上级
d052d28d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
91 addition
and
0 deletion
+91
-0
src/test/run-pass/hygiene/auxiliary/my_crate.rs
src/test/run-pass/hygiene/auxiliary/my_crate.rs
+11
-0
src/test/run-pass/hygiene/auxiliary/unhygienic_example.rs
src/test/run-pass/hygiene/auxiliary/unhygienic_example.rs
+37
-0
src/test/run-pass/hygiene/wrap_unhygienic_example.rs
src/test/run-pass/hygiene/wrap_unhygienic_example.rs
+43
-0
未找到文件。
src/test/run-pass/hygiene/auxiliary/my_crate.rs
0 → 100644
浏览文件 @
b766fa88
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
pub
fn
f
()
{}
src/test/run-pass/hygiene/auxiliary/unhygienic_example.rs
0 → 100644
浏览文件 @
b766fa88
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![crate_type
=
"lib"
]
extern
crate
my_crate
;
pub
fn
g
()
{}
// (a)
#[macro_export]
macro_rules!
unhygienic_macro
{
()
=>
{
// (1) unhygienic: depends on `my_crate` in the crate root at the invocation site.
::
my_crate
::
f
();
// (2) unhygienic: defines `f` at the invocation site (in addition to the above point).
use
my_crate
::
f
;
f
();
g
();
// (3) unhygienic: `g` needs to be in scope at use site.
$crate
::
g
();
// (4) hygienic: this always resolves to (a)
}
}
#[allow(unused)]
fn
test_unhygienic
()
{
unhygienic_macro!
();
f
();
// `f` was defined at the use site
}
src/test/run-pass/hygiene/wrap_unhygienic_example.rs
0 → 100644
浏览文件 @
b766fa88
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// ignore-pretty pretty-printing is unhygienic
// aux-build:my_crate.rs
// aux-build:unhygienic_example.rs
#![feature(decl_macro)]
extern
crate
unhygienic_example
;
extern
crate
my_crate
;
// (b)
// Hygienic version of `unhygienic_macro`.
pub
macro
hygienic_macro
()
{
fn
g
()
{}
// (c)
::
unhygienic_example
::
unhygienic_macro!
();
// ^ Even though we invoke an unhygienic macro, `hygienic_macro` remains hygienic.
// In the above expansion:
// (1) `my_crate` always resolves to (b) regardless of invocation site.
// (2) The defined function `f` is only usable inside this macro definition.
// (3) `g` always resolves to (c) regardless of invocation site.
// (4) `$crate::g` remains hygienic and continues to resolve to (a).
f
();
}
#[allow(unused)]
fn
test_hygienic_macro
()
{
hygienic_macro!
();
fn
f
()
{}
// (d) no conflict
f
();
// resolves to (d)
}
fn
main
()
{}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录