์ด ๋ฌธ์ ๋ ๋ณด๋ค ์ธ๋ถํ๋ ์ถ์ ๋ฌธ์ ๋ฅผ ์ํด ์ข ๋ฃ๋์์ต๋๋ค.
๋ค์ ๋จ๊ณ:
use_extern_macros
์์ ํ ](https://github.com/rust-lang/rust/pull/50911)proc_macro
๊ธฐ๋ฅ ์์ ํ๊ฐ๋ฅํ ์์ ํ ์ผ์คํ ํผ
macro_rules!
ํ์ฌ ๋ชจ๋ ์์คํ
๋งคํฌ๋ก๋ฅผ ์ง์ํ๊ณ 1.29 ์ด์ ๋ฒ์ ๊ณผ๋ ํธํ๋๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค.RFC .
์ด RFC๋ Rust์ ์ ์ฐจ์ ๋งคํฌ๋ก ์์คํ (์ผ๋ช ๊ตฌ๋ฌธ
ํ์ฅ, ์ผ๋ช ์ปดํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ). ์ด RFC๋ ์ ์์ ๋ํ ๊ตฌ๋ฌธ์ ์ง์ ํฉ๋๋ค.
์ ์ฐจ์ ๋งคํฌ๋ก, ์ปดํ์ผ๋ฌ์์์ ๊ตฌํ์ ๋ํ ์์ ์์ค ๋ณด๊ธฐ,
์ปดํ์ผ ํ๋ก์ธ์ค์ ์ํธ ์์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ต์์ ์์ค์์ ๋งคํฌ๋ก๋ ๋ค์์ผ๋ก ํ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ์ ์๋ฉ๋๋ค.
#[macro]
์์ฑ. ๋งคํฌ๋ก๋ ๋ค์์์ ์ ๊ณตํ๋ ํ ํฐ ๋ชฉ๋ก์์ ์๋ํฉ๋๋ค.
์ปดํ์ผ๋ฌ๋ฅผ ์คํํ๊ณ ๋งคํฌ๋ก ์ฌ์ฉ์ด ๋์ฒด๋๋ ํ ํฐ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค. ์ฐ๋ฆฌ
์ด๋ฌํ ํ ํฐ์์ ์๋ํ๊ธฐ ์ํ ๋ฎ์ ์์ค์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ ๋์ ๋จ๊ณ
๊ธฐ๋ฅ(์: AST์ ๋ํ ํ ํฐ ๊ตฌ๋ฌธ ๋ถ์์ฉ)์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๋ ์ดํธ๋ก ์กด์ฌํด์ผ ํฉ๋๋ค.
๋ก๋๋งต: https://github.com/rust-lang/rust/issues/38356#issuecomment -274377210.
#[proc_macro_attribute]
๊ตฌํ(PR #38842).#[proc_macro]
๊ตฌํ(PR #40129).InvocationCollector
์์ proc_macro_derive
์ ์ฉ๋๋ฅผ ์๋ณํ๊ณ ์์งํฉ๋๋ค(PR #39391).proc_macro_derive
๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค.#[derive(Trait, OtherTrait)] struct S; // Both these derives should resolve
macro_rules! m { () => {
#[macro_use(Trait)] extern crate derives;
use derives::OtherTrait; // this kind of import is gated behind `#![feature(proc_macro)]`
} }
m!();
proc_macro_derive
s(PR #48465)๋ฅผ ํ์ฅํ๊ธฐ ์ ์ ํญ๋ชฉ์ ํ์ฅํฉ๋๋ค.#[macro_use]
๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ๊ตฌํํฉ๋๋ค(PR #39060).TokenStream
๋ฅผ ์ ๋ฆฌํฉ๋๋ค(PR #39173).TokenTree::Sequence
์ ๊ฑฐ(PR #39419).tokenstream::TokenTree
์ Delimited
๋ณํ์์ tokenstream::TokenTree
Vec<TokenTree>
๋์ TokenStream
s๋ฅผ ์ฌ์ฉํฉ๋๋ค(PR #40202).Path
s์์ TokenStream
ast::Attribute
s(PR #40346)๋ฅผ ์ฌ์ฉํฉ๋๋ค.#[foo::bar]
, #[derive(foo::Bar)]
).proc_macro::TokenStream
๋ํ ์ต์ API๋ฅผ ๊ตฌํํฉ๋๋ค.Token::Interpolated
ํ ํฐ์ ๋ณด๊ฐ๋ AST ์กฐ๊ฐ์ ๋ํ ์์ค TokenStream
ํฌํจํฉ๋๋ค.proc_macro
๊ธฐ๋ฅ ๊ฒ์ดํธ ๋ค์ TokenStream
์ธ์ฉ์ proc_macro::quote!
๋ฅผ ํฌํจํฉ๋๋ค.proc_macro
์์ฑ์๊ฐ ๋งคํฌ๋ก ์ฌ์ฉ์๊ฐ ํฌ๋ ์ดํธ ๋ฃจํธ์ extern crate foo;
๋ฅผ ํฌํจํ ํ์ ์์ด ๋ฏธ๋ฆฌ ๊ฒฐ์ ๋ ํฌ๋ ์ดํธ foo
ํญ๋ชฉ์ ์ฌ์ฉํ๋ ํ์ฅ์ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค(PR # 40939).TokenStream
๋ฅผ ํฌํจํฉ๋๋ค.proc_macro::quote!
๋ด๋ถ์ ์๋ชป๋ ๊ตฌ๋ฌธ์ผ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๊ฐ์ ํฉ๋๋ค(๋ฌธ์ #47315).cc @nrc @jseyfried
#[proc_macro_attribute]
์ด ๊ณง ๊ตฌํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ ์ด๋ฏธ ์ปดํ์ผ๋ฌ ์ง์์ด ์๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ธฐ ์ ์ ์พ
์พ
์๋ฆฌ๋ฅผ ๋ธ ํ๋กํ ํ์
๊ณผ ํ
์คํธ ์ฌ์ฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค :unamused: :
ํ๋กํ ํ์
: https://github.com/abonander/anterofit/blob/proc_macro/macros/src/lib.rs
์/ํ
์คํธ: https://github.com/abonander/anterofit/blob/proc_macro/examples/post_service_proc_macro.rs
(dtolnay ํธ์ง: ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ OP๋ก ์ด๋)
cc @nrc @petrochenkov @durka @Ralith
@jseyfried ๋ ๊ฑฐ์ ๋งคํฌ๋ก์ ์ด๋ฆ์ด ๊ฐ์ ์์ฑ์ ๋์ผํ ๋ฒ์๋ก ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ ์์ฑ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋งคํฌ๋ก๋ฅผ ์์ฑ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ ๋ค ๊ฐ์ ๋ฒ์์ ์๊ณ ์๋ํ ๋๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ด ์์ ์ ์ํํ ์ ์์ต๋๊น?
@abonander ๋ชจ๋ ๋งคํฌ๋ก(๋ฑ , ์์ฑ ๋ฐ ํ์)๋ ๋์ผํ ๋ค์์คํ์ด์ค๋ฅผ ๊ณต์ ํ๋ฏ๋ก ๋์ผํ ๋ฒ์์์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋ ๊ฐ์ ๋ค๋ฅธ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๋น ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ์ด์ด์ฃผ์๊ฒ ์ต๋๊น?
ํํฐ์ ๋ฆ์ด์ ์ฃ์กํฉ๋๋ค. AST๊ฐ ์๋ ํ ํฐ์ ๋
ธ์ถํ๋ ๋ฐฉํฅ์ ๋ง์กฑํ์ง๋ง RFC์์ ์ ์๋ ํน์ TokenStream
API์ ๋ํด ๋ช ๊ฐ์ง ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
pub enum TokenKind {
Sequence(Delimiter, TokenStream),
// The content of the comment can be found from the span.
Comment(CommentKind),
// `text` is the string contents, not including delimiters. It would be nice
// to avoid an allocation in the common case that the string is in the
// source code. We might be able to use `&'codemap str` or something.
// `raw_markers` is for the count of `#`s if the string is a raw string. If
// the string is not raw, then it will be `None`.
String { text: Symbol, raw_markers: Option<usize>, kind: StringKind },
// char literal, span includes the `'` delimiters.
Char(char),
// These tokens are treated specially since they are used for macro
// expansion or delimiting items.
Exclamation, // `!`
Dollar, // `$`
// Not actually sure if we need this or if semicolons can be treated like
// other punctuation.
Semicolon, // `;`
Eof, // Do we need this?
// Word is defined by Unicode Standard Annex 31 -
// [Unicode Identifier and Pattern Syntax](http://unicode.org/reports/tr31/)
Word(Symbol),
Punctuation(char),
}
pub enum StringKind {
Regular,
Byte,
}
์ด API๊ฐ RFC๊ฐ ๋ณํฉ๋ ๋ ์๋ฝ๋ ์์ ํ ๊ณํ์ผ๋ก ์๋๋ ๊ฒ์ธ์ง ์๋๋ฉด ๋์ค์ ํด๊ฒฐ๋ ์์์ผ ๋ฟ์ธ์ง ๋ช ํํ์ง ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ์ปดํ์ผ๋ฌ๊ฐ ๋งคํฌ๋ก ์ธ๋ถ์์ ํ์ฉํ๋ "์ ์์ ์ธ" Rust ๊ตฌ๋ฌธ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๊ฒ ๊ฐ์ต๋๋ค. ์ผ๋ถ ๋งคํฌ๋ก๋ ์ผ๋ถ ์์ ๋๋ฉ์ธ ํน์ ์ธ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ค๋ ๋ฐ๋ฉด ๋ค๋ฅธ ๋งคํฌ๋ก๋ "์ค์ Rust" ๊ตฌ๋ฌธ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ดํดํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
(Minor) Eof
๋ ํ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Iterator
๋ TokenStream
๋ฐ๋ณตํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ Iterator::next
์ด๋ฏธ None
๋ฅผ ๋ฐํํ์ฌ ๋ฐ๋ณต์ ๋์ ์๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
(์ฌ์ํ) Exclamation
, Dollar
๋๋ Semicolon
๊ฐ ํ์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด Punctuation('!')
์์ ์ผ์นํ๋ ๊ฒ์ ๋ ์ด๋ ต์ง ์์ต๋๋ค.
(์ฌ์) ๋ค๋ฅธ ์ฌ๋๋ค์ด RFC PR์์ ์ธ๊ธํ๋ฏ์ด ๋ฌธ์ ์ฃผ์์ด ์๋ ์ฃผ์์ ์๋ตํ ์ ์์ต๋๋ค. (์ฃผ์์ ๋ณด์กดํ๋ ค๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ ๊ณต๋ฐฑ๋ ๋ณด์กดํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.)
๋ด๊ฐ ๋งํ ์ ์๋ ํ, ๋ค์ค ๋ฌธ์ ์ฐ์ฐ์(๊ฐ๊ฐ ๋จ์ผ ํ ํฐ์ด์ด์ผ ํจ)๋ก ๋ฌด์์ ํด์ผ ํ๋์ง๋ ์ฌ์ ํ ๋ฏธํด๊ฒฐ ์ง๋ฌธ์ ๋๋ค. ๊ฐ๋ฅํ ์๋ฃจ์ ์ PR ์ฃผ์์ ์ค๋ช ๋์ด ์์ง๋ง RFC ํ ์คํธ์๋ ํฌํจ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ซ์ ๋ฆฌํฐ๋ด์ด ์์ต๋๋ค. ๋งคํฌ๋ก๋ ๋ฆฌํฐ๋ด์ ํ๊ฐํ๊ธฐ ์ํด ์์ฒด์ ์ผ๋ก [Punct('1'), Punct('_'), Punct('2'), Punct('3'), Punct('4'), Punct('.'), Punct('5'), Punct('e'), Punct('6')]
๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํฉ๋๊น? ํ์ฉํ๋ ๊ตฌ๋ฌธ์ด Rust ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ(์๋ฅผ ๋ค์ด ์ค๊ฐ์ _
์ด ์์ ์ ์์)๊ณผ ๋์ผํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด str::parse::<f32>
๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์์ ์ฑ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. u128
/ i128
(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋ฏธ๋์๋ f128
, u256
, ...)์ ๊ฐ์ ์๋ก์ด ์ซ์ ์ ํ๊ณผ ํด๋น ๋ฆฌํฐ๋ด์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋์
ํ ์ ์์ต๋๊น? ํ ํฐ API? ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
struct IntegerLiteral { negative: bool, decimal_digits: String, type_suffix: Option<String> }
impl TryInto<u32> IntegerLiteral { type Err = OutOfRange; /* โฆ */ }
// Other impls for integer types supported in this compiler version
// Something similarly for floats
์๋๋ฉด ๋ค๋ฅธ ๊ฒ์ผ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ "์ซ์๊ฐ ์กด์ฌํ์ง ์๋ ์ฒ"ํ๋ ๊ฒ์ด ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
// Word๋ ์ ๋์ฝ๋ ํ์ค ๋ถ๋ก 31์ ์ํด ์ ์๋ฉ๋๋ค. -
์ด ์ ์๋ ๊ทธ๋ณด๋ค ๋ ์ ํํด์ผ ํฉ๋๋ค. UAX 31์ ์๋ณ์ ๊ตฌ๋ฌธ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ณํ์ ์ง์ ํ๋ฉฐ ๊ทธ ์ค ์ด๋ ๊ฒ๋ "๋จ์ด"๋ผ๊ณ ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ ํํ ๋ณํ์ ์ ํํ๋ ๊ฒ์ด ํ์ฌ ๋นASCII ์๋ณ์์ ๊ธฐ๋ฅ์ด ์ ํ๋ ์ด์ ์ ๋๋ค.
๋์ "ํ์ฌ ์ปดํ์ผ๋ฌ๊ฐ ์๋ณ์ ๋๋ ํค์๋๋ก ํ์ฉํ๋ ๋ชจ๋ ๊ฒ"(#28979์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์์)์ผ๋ก ์ ์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. libmacro์ pub fn is_identifier(&str) -> bool
๊ณต๊ฐ API๊ฐ ์์ ์ ์์ต๋๋ค.
์ ๋์ฝ๋ ๋ฌธ์์ด๊ณผ ๋ฐ์ดํธ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋จ์ผ ํ ํฐ ๋ณํ์ ๊ณต์ ํฉ๋๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํํ์ด ๋ค๋ฅธ ์ ํ( str
vs [u8]
)์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. text: Symbol
๊ตฌ์ฑ ์์๊ฐ ์์ค ์ฝ๋์ ๋ฆฌํฐ๋ด ์ฌ๋ผ์ด์ค์ธ์ง ๋๋ ๋ฐฑ์ฌ๋์ ์ด์ค์ผ์ดํ๋ฅผ ํด๊ฒฐํ ํ์ ๊ฐ์ธ์ง๋ ๋ช
ํํ์ง ์์ต๋๋ค. ๋๋ ๋น์ฐํ ํ์์ฌ์ผ ํ๋ค๊ณ ์๊ฐํ๋ค. (๋น๊ต๋ฅผ ์ํด \u{A0}
๋ ๋ฌธ์ ๊ทธ๋๋ก ๋ํ๋ด๊ธฐ ์ํด ๋ ์ด์์ char
๊ฐ ํ์ํ๋ฏ๋ก Char(char)
๋ ํ์์ฌ์ผ ํฉ๋๋ค.)
๋์ ์์ค์ ๋งคํฌ๋ก๋ฅผ ์์ฑํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋งคํฌ๋ก์ ๊ฐ์ lisp๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด์ง๋ง ์ด๊ฒ์ ์ ์ฒด rust ast์ ๋ํ s-ํํ์ ํํ์ด ํ์ํฉ๋๋ค.
@SimonSapin ,
๋ค๋ฅธ ์ฌ๋๋ค์ด RFC PR์์ ์ธ๊ธํ๋ฏ์ด ์ฐ๋ฆฌ๋ ๋ฌธ์ ์ฃผ์์ด ์๋ ์ฃผ์์ ์๋ตํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. (์ฃผ์์ ๋ณด์กดํ๋ ค๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ ๊ณต๋ฐฑ๋ ๋ณด์กดํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.)
ํ์ง ๋ง์ธ์. ๊ตฌ๋ฌธ์์ ์ฃผ์์ ์ฌ์ฉํ๊ณ ์ถ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค(๋ณด์กด์ ์๋์ง๋ง ๋์ ๋ณ๋์ ์ปดํ์ผ ์ ํ์ ์์ฑ๋จ).
ํนํ, ๋ณ๋์ ์์ค ํ์ผ์์ ๋ฌธ์์ด ๋ฒ์ญ์ ๋ก๋ํ๋ ๋ฒ์ญ ๋งคํฌ๋ก๋ฅผ ๋ง๋ค๊ณ ๋๋ฒ๊ทธ ๋น๋์์ ๋ถ์ฐ๋ฌผ๋ก ๋ฒ์ญ๋ ๋ฌธ์์ด ๋ชฉ๋ก์ ์์ฑํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ชฉ๋ก(rust-locale/rust-locale#19)์ ๋ด๋ณด๋ผ ์ฃผ์์ ํฌํจํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฃผ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ฉฐ ๋งคํฌ๋ก๊ฐ ์ฃผ์ ๊ตฌ๋ฌธ์ ๋ณผ ํ์๊ฐ ์์ต๋๋ค.
๋๋ ๊ทธ ๊ฒ์๋ฌผ์ ๋ค๋ฅธ ์์ ์ ๋์ํฉ๋๋ค.
@jan-hudec
TokenKind::Comment
๊ฐ ์๋๋ผ๋ ์ฐ์ ํ ํฐ ์ฌ์ด์ ๋ฒ์ ๋ด์ฉ์ ๋ณด๊ณ ์ฃผ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์๋ฏธ ์ฒด๊ณ ๋ณ๊ฒฝ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ ๋งคํฌ๋ก ํธ์ถ์ ์ฃผ์์ ์์ ๋กญ๊ฒ ์ถ๊ฐํ ์ ์๋๋ก ์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ ์ฃผ์์ ๋ฌด์ํ๋๋ก ์ฅ๋ คํ๊ธฐ ์ํด TokenKind::Comment
๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@jan-hudec ์์ฑ์ด ์๋ฃจ์ ์์ ์๋ํ์ง ์๋ ์ด์ ๊ฐ ์์ต๋๊น?
@abonander , ์์ฑ์ ์ ๋์ ์ผ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ฒ์ญ ๊ฐ๋ฅํ ๋ฌธ์์ด์ ํญ๋ชฉ์ด ์๋ ๋ฆฌํฐ๋ด๋ก ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ปดํ์ผํ๋ ๋์ ์ถ์ถํ๋ ๊ฒ์ ๋จ์ง ํธ์๋ฅผ ์ํ ๊ฒ์ผ ๋ฟ์ ๋๋ค. ํญ์ ๋ณ๋์ ๊ตฌ๋ฌธ ๋ถ์์ผ๋ก ์ํํ ์ ์์ต๋๋ค. (์ฌ์ค, ๊ฒฐ๊ตญ ๊ทธ๋ ๊ฒ ๋ ์๋ ์์ต๋๋ค. ์๋ํ๋ฉด ํฌ๋ ์ดํธ์์ _๋ชจ๋_๋ฅผ ๋ณผ ํ์๊ฐ ์๊ณ ์ฆ๋ถ ์ปดํ์ผ์ ์ด๋ฅผ ๊นจ๊ธฐ ๋๋ฌธ์ ๋๋ค).
๋๋ serde ํ์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ์ฐจ์ ๋งคํฌ๋ก๋ฅผ ๋ง๋ค๊ณ ์ถ์ง๋ง(์ง์ ์ ์ผ๋ก serde tokenstream ํจ์๋ฅผ ํธ์ถํจ), serde ํ์์ ์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๊ณ ๋งํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๊ฒ์ ๋งคํฌ๋ก ํ์์๋ง ๊ตญํ๋์ง ์๊ณ '์ผ๋ฐ' ์ ์ฐจ ๋งคํฌ๋ก์๋ ๋น์ทํ ๊ฒ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ํ์ฌ ๋ด ์ ์ผํ ์๋ฃจ์ ์ serde_derive๋ฅผ ๋ถ๊ธฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฌธ์ ๋ Rustc์ ๋ค์ ์ค๋ฅ ๋ฉ์์ง์ ๋๋ค.
error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type
๊ทธ๊ฒ์ ์ ๊ฑฐํ๊ณ ์๋ํ๊ฒ ๋ง๋๋ ๊ฒ์ ์ฝ์ง๋ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๋ ๋ณต์ก์ฑ๋ ์์ต๋๋ค. ์ ์ฐจ์ ๋งคํฌ๋ก ํฌ๋ ์ดํธ๋ ๋ค๋ฅธ ์ ์ฐจ์ ๋งคํฌ๋ก ํฌ๋ ์ดํธ์์ ํ์๋ proc-macro๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ๋ค์ด์คํธ๋ฆผ ์ฌ์ฉ์์ ๋ํ ํ์์ ์์ฑํ๊ธฐ ์ํด ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ป๊ฒ ์๊ฒผ์๊น์? ์๋นํ๋ ์์์ ์์ฒญ์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์์๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ ์ด์ ๋น์ทํ ๊ฒ์ด ํ์ฌ ์ฃผ๋ณ์ ์์ต๋๊น?
@aidanhs
์ ์ฐจ์ ๋งคํฌ๋ก ํฌ๋ ์ดํธ๋ ๋ค๋ฅธ ์ ์ฐจ์ ๋งคํฌ๋ก ํฌ๋ ์ดํธ์์ ํ์๋ proc-macro๋ฅผ ์ฌ์ฉํ๊ณ ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ค์ด์คํธ๋ฆผ ์ฌ์ฉ์์ ๋ํ ํ์์ ์์ฑํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ์๊ฒผ์๊น์?
proc-macro
ํฌ๋ ์ดํธ์์ ํจ์(๋๋ ์ ์ฐจ์ ๋งคํฌ๋ก ์ด์ธ์ ๋ค๋ฅธ ๊ฒ)์ ์ก์ธ์คํ ์ ์์ต๋๋ค. TokenStream -> TokenStream
ํจ์์ ํด๋น ์ ์ฐจ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด TokenStream -> TokenStream
ํจ์๋ฅผ proc-macro
์๋ ๋ณ๋์ ํฌ๋ ์ดํธ์ ๋ฃ์ด์ผ ํฉ๋๋ค. ํด๋น ๊ธฐ๋ฅ์ ์์ํ๋ proc-macro
ํฌ๋ ์ดํธ์
๋๋ค.
์ด RFC๋ #40939๊ฐ ๋์ฐฉํ๋ฉด ๋๋ถ๋ถ ๊ตฌํ๋ฉ๋๋ค.
proc_macro
์์ฑ์๊ฐ ๋งคํฌ๋ก ์ฌ์ฉ์๊ฐ ํฌ๋ ์ดํธ ๋ฃจํธ์extern crate foo;
๋ฅผ ํฌํจํ ํ์ ์์ด ๋ฏธ๋ฆฌ ๊ฒฐ์ ๋ ํฌ๋ ์ดํธfoo
ํญ๋ชฉ์ ์ฌ์ฉํ๋ ํ์ฅ์ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ ์ ๊ณต
๋งคํฌ๋ก๊ฐ ์๋ ํญ๋ชฉ๊ณผ ํด๋น ํญ๋ชฉ์ ์ฐธ์กฐํ๋ ์ ์ฐจ์ ๋งคํฌ๋ก๋ฅผ ๋ชจ๋ ํฌํจํ๋ ๋จ์ผ ์์๋ฅผ ์ ๊ณตํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. #40939๊ฐ ์ฐฉ๋ฅํ๋ฉด ์ด 3๊ฐ์ ์์ ํจํด์ด ์ด ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๊ด์ฉ์ ๋ฐฉ๋ฒ์ด ๋ ๊น์?
foo_runtime
๋ฃ์ต๋๋ค.foo_runtime
์ ๊ธฐํธ๋ฅผ ์ฐธ์กฐํ์ฌ foo_macros
์ ์ ์ฐจ ๋งคํฌ๋ก๋ฅผ ๊ตฌํํฉ๋๋ค.foo_runtime
๋ฐ foo_macros
์ ํญ๋ชฉ pub use
์ต์ข
"ํ์ฌ๋" ์์ foo
foo_macros
์ ์ฌ์ฉ ์ฌ๋ก์ ๋ ๊ฐ์ ํฌ๋ ์ดํธ ๋ฅผ
@lfairy "two-crate" ํจํด์ด ๊ด์ฉ์ ์ธ ๋ฐฉ์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
foo
๋ฃ์ต๋๋ค.foo_macros
์ ์ ์ฐจ ๋งคํฌ๋ก๋ฅผ ๊ตฌํํ๊ณ ํ์์ ๋ฐ๋ผ foo
๊ธฐํธ๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์:#[proc_macro]
fn m(_: TokenStream) -> TokenStream {
quote! {
extern crate foo; // due to hygiene, this is never a conflict error
foo::f();
// --- or just --- (if/when we get the sugar)
$universe::foo::f();
}
}
pub use
foo_macros
pub use
ํญ๋ชฉ foo
.์์ ์์คํ ์ด ์ฌ๋ฐ๋ฅธ ์์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋งคํฌ๋ก๋ฅผ ์์ ํ๊ธฐ ๋๋ฌธ์ ์๋ํฉ๋๋ค.
๋ค๋ฅธ ์์์์ ์ ์ฐจ ๋งคํฌ๋ก๋ฅผ ๋ค์ ๋ด๋ณด๋ด๋ ์ ์ฐจ ๋งคํฌ๋ก์ ์ด๋ฆ์ด ํ์ธ๋๋ ๋ฐฉ์์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
@jseyfried : ์ด ์ฌ์์ถ ํธ๋ฆญ์ด ์ฌ์ฉ์ ์ ์ ํ์ ์ํ์์๋ ์๋ํ๋์ง ์์ญ๋๊น? ์ด๋ฌํ ์์์๋ ํญ๋ชฉ์ ๋ด๋ณด๋ผ ์ ์๋ค๋ ๊ฒ๊ณผ ์ ํํ ๋์ผํ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
@colin-kiegel
์ปค์คํ
ํ์ ํฌ๋ ์ดํธ๋ #[proc_macro_derive]
๋ง ์๋ proc ๋งคํฌ๋ก ํฌ๋ ์ดํธ์
๋๋ค.
#[feature(proc_macro)]
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ proc ๋งคํฌ๋ก๋ฅผ ๋ค์ ๋ด๋ณด๋ผ ์ ์๋ ๊ฒ์ฒ๋ผ ์ผ๋ฐ ์์์์ ์ฌ์ฉ์ ์ ์ ํ์ ์ํ์ ๋ค์ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
@jseyfried ํ์ฌ ์ํฉ์ ์ธ์งํ๊ณ ์๊ณ ์ด์์ ์ด์ง ์๋ค๊ณ ์๊ฐํด์ ์ง๋ฌธ์
์ฆ, ํธํ์ฑ ์ํ์ ์ธ์ํฉ๋๋ค. ๋งคํฌ๋ก์ ์ํด ์์ฑ๋ ์ ํํ ํ ํฐํธ๋ฆฌ๋ ์์ ์ ์ธ ์ธํฐํ์ด์ค์ ์ผ๋ถ๊ฐ ๋๋ฏ๋ก serde๊ฐ ํจ์น ๋ฒ์ ์์ Derive
๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝํ๊ณ ์ทจ์ฝํ ๋งคํฌ๋ก๋ฅผ ์์ฑํ๋ฉด ๋งคํฌ๋ก๋ ๋ด ์์์ ๋ชจ๋ ์๋ก์ด ์ฌ์ฉ์์ ๋ํด ์์๋ฉ๋๋ค(์ต์
์ ๊ฒฝ์ฐ ํน์ ์
๋ ฅ์ ๋ํด์๋ง ์๋ํ์ง๋ง ์ผ๊ด๋๊ฒ ์๋ํ๋ ํ์ฌ์ ๊ฒฝ์ฐ ์ทจ์ฝํ ๋งคํฌ๋ก์ ๋ฐ๋).
@jseyfried
ํ์ฌ ํ๋ฌผ ๋ชฉ๋ก์์ foo
๊ฐ์ ธ์ค๋์? ๊ทธ๊ฒ์ ๋์๊ฒ ๋ค๋ฆฝ๋๋ค(์ฆ, ํ์ฌ ๋ฐ์ด๋๋ฆฌ์ foo
๋ผ๋ ์ด๋ฆ์ 2๊ฐ์ ํฌ๋ ์ดํธ๊ฐ ๋งํฌ๋์ด ์๋ค๋ฉด ํนํ ์ด๋ฆฌ์์ ์ผ์ ํฉ๋๊น?).
@aidanhs ๊ทธ๊ฒ์ ์์ฒด RFC๋ฅผ ๋ณด์ฆํ๋ ์ฃผ์ ์ธ์ด ๋ณ๊ฒฝ/์ถ๊ฐ๊ฐ ๋ ๊ฒ์ ๋๋ค.
@arielb1
ํ์ฌ ํ๋ฌผ ๋ชฉ๋ก์์
foo
๊ฐ์ ธ์ค๋์? ๋์ ์๋ฆฌ
์ -- ์ฌํ๊ฒ๋ ์ธ์ฉ๋ extern crate
์ด๋ฆ์ ์์์ ์ด์ง ์์ต๋๋ค. ์ฆ, ํด์๋๋ ์ ์ฐจ ๋งคํฌ๋ก๊ฐ ์ฌ์ฉ๋๋ ๋ฒ์์ ์๋ ํฌ๋ ์ดํธ ์ด๋ฆ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ๋ค์ ๋ด๋ณด๋ด๊ธฐ ํธ๋ฆญ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ง๋ง(์ฆ, foo
์์ foo_macros
๋ฅผ ๋ค์ ๋ด๋ณด๋ด์ด foo
๊ฐ ๋ฒ์ ๋ด์ ์์์ ์ ์ ์์) foo
๋ผ๋ ๋ ๊ฐ์ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจํธ์ฑ ์ค๋ฅ์ ๋๋นํฉ๋๋ค.
์ฌ๊ธฐ์์ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ
์ --target-extern
๋ช
๋ น์ค ์ธ์๋ฅผ ํตํด proc-macro
์์์ ๋ํ Cargo.toml
์ 1๋จ๊ณ(์ฆ, ๋์ wrt ํธ์คํธ ๋ ๋์) ์ข
์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ช
์ ์ ์ผ๋ก ๋์ด ํ ์์๋ ๊ฒ์
๋๋ค extern crate
๋ด๋ถ์ ๋ฒ์์์๋ ์ด๋ฆ quote!
.
@jseyfried
proc-macro ํฌ๋ ์ดํธ๊ฐ "๋์" ๋ฉํ๋ฐ์ดํฐ์ ์ข ์์ฑ์ ๊ฐ์ง ๊ฒ์ด๋ผ๋ ์์ด๋์ด์ ๋๋ค. ๋ง์ต๋๊น?
@arielb1 ๋ค,
์ด RFC๋ #40939๊ฐ ๋์ฐฉํ๋ฉด ๋๋ถ๋ถ ๊ตฌํ๋ฉ๋๋ค.
@jseyfried PR์ด
๊ทธ PR์ด ๋์ฐฉํ๋ฉด ์์ ํ๋ ์ค๋น๊ฐ ๋์์ต๋๊น?
์๋์, ์ฐ๋ฆฌ๋ extern crate
์ด๋ฆ์ ์์ ํํ๊ธฐ ์ ์ API์ ๋ํ ์ฝ๊ฐ์ ๊ฒฝํ์ ์ป๊ณ ์ถ์ต๋๋ค(์: @arielb1์ด ์ง์ ํ ์ด ๋ฌธ์ ํด๊ฒฐ ).
์ฐ๋ฆฌ๋ ์๋ง๋ ์ด API๋ฅผ ํฌ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒ์
๋๋ค. @eddyb ๋ OpKind
๋ฅผ ๋ชจ๋ ํ ํฐ ํธ๋ฆฌ์ ์ผ๋ฐํํ๋ ๊ฒ์ ์ ์/๊ณ ๋ คํ์ต๋๋ค. ๋ํ ๋ฌธ์ ์ฃผ์, ๋ถ๋ ์์์ ๋ฆฌํฐ๋ด ๋ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ ๋ฐ์ ์ผ๋ก ์ด PR์ API๋ ์์ง ์์ ํ๋ฅผ ๊ณ ๋ คํ ๋งํผ ์ฑ์ํ์ง ์์ต๋๋ค.
@bstrie ์ฌํ๊ฒ๋ ํ์ ๋งคํฌ๋ก ์์ ํ์ ๊ฐ์ด proc ๋งคํฌ๋ก ์์ ํ๋ฅผ ๋น ๋ฅด๊ฒ ์ถ์ ํ๋ RFC(์: ํ ํฐ ์คํธ๋ฆผ์ด ๋ฌธ์์ด ํํ์ ํตํด์๋ง ์ก์ธ์คํ ์ ์๋ ์ ํ๋ API ์ฌ์ฉ)๊ฐ ์คํจํ์ต๋๋ค: https://github.com/rust-lang/rfcs/ ํ/1913
@est31 ์ฐ๊ธฐ๋จ -- ์ด API์ ๋ํ ์ฝ๊ฐ์ ๊ฒฝํ ํ์ ์ฐ๋ฆฌ๋ ์์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ ํํ๋ ๋ฐ ๋์ํ ์ ์๋ ํ์ ์งํฉ์ ๋์ํ ์ ์์ต๋๋ค.
String
๊ธฐ๋ฐ API๋ ์ ์ธ์ ๋งคํฌ๋ก 2.0๊ณผ ์ฌํ๊ฒ ์ํธ ์์ฉํ๋ฉฐ ๋งคํฌ๋ก 2.0์ด ์๊ณ #[derive]
๋ง ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ฏธ ์ ํ์ ์
๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๋งคํฌ๋ก 2.0์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด String
๊ธฐ๋ฐ API์ ํ์ฐ์ ์ต๋ํ ํผํ๊ณ ์ถ์ต๋๋ค.
๋๋ #[proc_macro_attribute]
๋ํ ์ด์ ๋ฅผ
์ด๊ฒ์ ์ด์ proc_macro
ํฌ๋ ์ดํธ ๋ฐ ์ API์ ๋ํ ์ถ์ ๋ฌธ์ ์ด๋ฏ๋ก ๋ช ๊ฐ์ง ์๊ฐ๋ ์ ์ด ๋ณด๊ฒ ์ต๋๋ค. ์ ๋ proc-macro2
๋ผ๋ ํฌ๋ ์ดํธ๋ฅผ ๊ณต๊ฐํ์ต๋๋ค. ์ด ํฌ๋ ์ดํธ๋ ์์ ์ ์ธ Rust์์ ์ปดํ์ผํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ํธ๋ฆฌ์ ์๋ proc_macro
ํฌ๋ ์ดํธ์ ์์ ํ ๋์ผํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ๋์ ๋ฒ์ ์ ๋ณด์ ์ด์ ์ ์ป๊ธฐ ์ํด ์ผ๊ฐ Rust์์ ์ปดํ์ผํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ syn
์ ๊ฐ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฐ์ด ๋๊ธฐ ์ํ ๊ฒ์ด๋ฉฐ syn
๊ฐ๋ฐ์์ ์ฐ๋ฆฌ๋ proc_macro
์ง์ ํด๊ฒฐํ๊ณ ์ถ์ ๋ช ๊ฐ์ง ๋จ์ ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
Literal
์์ฑ์๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฌธ์์ดํ์ ํ์ฑ์ ํตํด ํด๊ฒฐ๋์ง๋ง ๋ฌธ์์ด API๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์ง์ ๊ตฌ์ฑํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.r###" foo "###
rb#" foo "#
b'x'
Literal
ํ ํฐ์ผ๋ก ํ์๋ฉ๋๋ค.Literal
๋ฅผ ๊ฒ์ฌํ๊ณ ๊ฐ์ ์ถ์ถํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ง๊ธ ์ฐ๋ฆฌ๋ to_string
๋ฆฌํฐ๋ด์ literalext ํฌ๋ ์ดํธ ์ ์์กดํ๊ณ ๊ทธ๊ฒ์ ์ฌ๋ถ์ํ์ง๋ง ์ด๋ก ์ ์ด ์ ๋ณด๋ ์ด๋ฏธ Literal
์ ์ฅ๋์ด ์๊ณ ์ก์ธ์คํ์ญ์์ค.Literal
์ ํ์ ๋งคํ๋ฉ๋๋ค.์ฌ๊ธฐ์์ ์์๋๋ ๋ค๋ฅธ ๋ชจ๋ ๋ฌธ์ ๋ ๊ทธ ์ดํ๋ก ํด๊ฒฐ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ก ํ
์คํธ ํ ๋ ๋๋ ํ์์ ๋ฐ์ #![feature(proc_macro)]
๊ฐ ์ฌ์ฉ์ ์ ์ ๋์ถ์ ์ํฅ์ #[proc_macro_derive(foo, attributes(foo))]
. ์ฆ, ์ฌ์ฉ์ ์ ์ ํ์๊ณผ ๋์ผํ ์์ฑ์ ์ด๋ฆ์ ๊ฐ์ง ์ฌ์ฉ์ ์ ์ ํ์์
๋๋ค. ๊ทธ๋ฌํ ์์ ์ค ํ๋๋ #[derive(error_chain)] #[error_chain(...)] struct ErrorKind { ... }
๊ฐ ์๋ mine-derivative-error-chain์
๋๋ค. ๋ ๋ค๋ฅธ ๊ฒ์ #[derive(new)] #[new] struct S;
๊ฐ ์๋ ํ์ ์์
๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด์ ๊ฐ์ ์ฝ๋์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ "foo" is a derive mode
๋ ๋ฒ์งธ ์์ฑ์์ ๋ถํํฉ๋๋ค. ์ด๊ฒ์ ์๋์ ์ธ ๊ฒ์
๋๊น ์๋๋ฉด ๊ณ ์น ์ ์์ต๋๊น? ์๋์ ์ธ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ง์ ํ์ ํญ๋ชฉ์ ์ด๋ฆ์ ErrorChain
์ผ๋ก ๋ฐ๊ฟ ์ค๋น๊ฐ ํ์ํฉ๋๋ค.
@์๋ฅด๋๋น์จ
์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์๋๋ ๊ฒ์
๋๋ค. proc_macro_attribute
๋ ํ์ ์ ์ ํ์ฅ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ new
์ด proc_macro_attribute
์ด๋ฉด ํ์ฅ์ด ๋ชจํธํฉ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก new
๊ฐ proc_macro_derive
๋๋๋ก ํ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋์ง ํ์คํ์ง ์์ต๋๋ค(๋ฏธ๋ ํธํ์ฑ ์ํ์ด ๋ ์๋ ์์).
์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์๋๋ ๊ฒ์ ๋๋ค.
proc_macro_attributes
๋ ํ์ ์ ์ ํ์ฅ๋์ด์ผ ํ๋ฏ๋กnew
๊ฐproc_macro_attribute
์ด๋ฉด ํ์ฅ์ด ๋ชจํธํฉ๋๋ค.
์ข์, ๋ด๊ฐ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค #[derive(error_chain)]
์ #[derive(ErrorChain)]
.
๊ตฌ์ฒด์ ์ผ๋ก
new
๊ฐproc_macro_derive
๋๋๋ก ํ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋์ง ํ์คํ์ง ์์ต๋๋ค(๋ฏธ๋ ํธํ์ฑ ์ํ์ด ๋ ์๋ ์์).
๋ฌผ๋ก new
์ด ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์๊ตฌํ ๊ฒ์ ์๋๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ์๋ ๋ ๊ฐ์ proc_macro_derive
์ค ํ๋์ ์์ผ ๋ฟ์
๋๋ค.
๋๋ ํน๋ณํ ๊ฒฝ์ฐ์ ํ๊ท ์์๋ค - ์ฃ์กํฉ๋๋ค @Arnavion, ๋ด ๋ง์ง๋ง ์ฝ๋ฉํธ๋ ๊นจ๋ํ ์๋์๋ค new
ํน๋ณํํ์ง๋ง ํ์ฉํ๋ ค๋ฉด #[derive(some_macro)] #[some_attr] struct S;
ํ๋ฉด some_attr
๊ฒฐ์๋ฅผ A์ proc_macro_derive
. some_attr
๊ฐ proc_macro_attribute
ํด์๋๋ฉด ์ด๋ ๋ชจํธ์ฑ ์ค๋ฅ์ฌ์ผ ํฉ๋๋ค. ์ค๋๋ some_attr
๋งคํฌ๋ก๋ก ํด์๋๋ฉด ๋ชจํธ์ฑ ์ค๋ฅ์
๋๋ค.
๋ค, ์๊ฒ ์ต๋๋ค.
( ์ด๋ฐ ์ง๋ฌธ์ ํ ์ ์๋ ๊ณณ์ด ์ฌ๊ธฐ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. )
์ด ์ํ๋ ์ด๋ป์ต๋๊น?
- [ ]
proc_macro
์์ฑ์๊ฐ ๋งคํฌ๋ก ์ฌ์ฉ์๊ฐ ํฌ๋ ์ดํธ ๋ฃจํธ์extern crate foo;
๋ฅผ ํฌํจํ ํ์ ์์ด ๋ฏธ๋ฆฌ ๊ฒฐ์ ๋ ํฌ๋ ์ดํธfoo
ํญ๋ชฉ์ ์ฌ์ฉํ๋ ํ์ฅ์ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค(PR #40939 ).
PR์ด ๋์ฐฉํ์ง๋ง ์์๊ฐ ์์ง ์ ํ๋์ง ์์์ต๋๋ค. @jseyfried ๋ ์ฌ๊ธฐ์์ ๋ญ๊ฐ๋ฅผ ์ธ๊ธํ์ผ๋ฉฐ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ use
์์๋ ์ ํ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
let call_site_self = TokenTree {
kind: TokenNode::Term(Term::intern("self")),
span: Span::call_site(),
};
quote! {
extern crate foo; // due to hygiene, this is never a conflict error
// Neither of those works
use foo::f;
use self::foo::f;
use $call_site_self::foo:f;
}
๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ต๋๊น? ๋งคํฌ๋ก์์ ๊ฐ์ ธ์จ extern ์์์ use
๊ธฐํธ์ ๋ํ ๊ด์ฉ์ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
use
์ฌ์ฉํ ์ ์์ต๋๋ค( https://github.com/rust-lang/rfcs/issues/959 ์ฐธ์กฐ). ๊ทธ๋ฌ๋ ๋งคํฌ๋ก์ ๊ฒฝ์ฐ ๋งค๋ฒ ์ ๊ทํ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ ๋ก ๋จ์ ์ ์๋๋๋ค. (ํน์ฑ์ ์ ์ธํ๊ณ ๋ ์๊ฐํฉ๋๋ค)
@parched ์ด ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ฐ๊ฒฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ด ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ด ๋งคํฌ๋ก์์ ์ฌ์ฉ์๊ฐ match-matcher์ ์ ์ฌํ ๊ฒ์ ์์ฑํ ์ ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค. ํนํ, ์ฌ์ฉ์๋ Term
ํ๋ฉฐ ์ด๋ ์ด๊ฑฐํ์ ๋ณํ ์ด๊ฑฐ๋ ์ผ์น ๊ฐ์ ๋ฐ์ธ๋ฉํ๋ ๊ฐ๋จํ ๋ณ์ ์ด๋ฆ์ผ ์ ์์ต๋๋ค. macro_rules!
๊ตฌ๋ฌธ์ผ๋ก ์์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด:
macro_rules foo {
($matcher:ident) => {
match something() {
$matcher => {}
_ => {}
}
}
}
์ด์ ์ฌ์ฉ์๊ฐ ์ด๊ฑฐํ ์ด๋ฆ ์์ด ๋ณํ ์ด๋ฆ use my_crate::AnEnum::*;
๋ฌธ์ ์ฝ์
ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ (์ง๊ธ์) ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ $matcher
๊ฐ ์ด๊ฑฐํ์ ๋ณํ์ธ์ง ์๋์ง ์ง์ ํ์ธํด์ผ ํฉ๋๋ค.
๋ด ์ค๋ช
์ด ์ดํด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋งคํฌ๋ก ์์ฑ ์ฝ๋์์ use
์ ๋ํ ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณตํ๊ณ ์ถ์์ต๋๋ค.
@LukasKalbertodt์ ๊ทธ๋ฅ ์ฌ์ฉํ ์ my_crate::AnEnum::$matcher => {}
์์ match
?
์ ๊ฒฝ์ฐ์ง ๋ง์ธ์, ์ ๋ ๋น์ ์ ๋ฌธ์ ์
๋๋ค -- ๋๋ ๊ทธ๊ฒ์ ์ํด https://github.com/rust-lang/rfcs/issues/959 ๊ฐ ํ์ํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
@jseyfried ์๋์: $matcher
๋ ๋ณํ ์ด๋ฆ(์ด ๊ฒฝ์ฐ ์๋ฃจ์
์ด ์๋ํจ) ๋๋ match x { simple_var_name => {} }
์ ๊ฐ์ ๊ฐ๋จํ ๋ณ์ ์ด๋ฆ์ด ๋ ์ ์์ต๋๋ค. ํ์์ ๊ฒฝ์ฐ AFAICT๊ฐ ์๋ํ์ง ์์ต๋๋ค. (btw, use
๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ธ๊ธํ๊ณ ์ถ์์ต๋๋ค.)
@jseyfried
์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์๋๋ ๊ฒ์ ๋๋ค.
proc_macro_attributes
๋ ํ์ ์ ์ ํ์ฅ๋์ด์ผ ํ๋ฏ๋กnew
๊ฐproc_macro_attribute
์ด๋ฉด ํ์ฅ์ด ๋ชจํธํฉ๋๋ค.
์ข์, ๋ด๊ฐ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค
#[derive(error_chain)]
์#[derive(ErrorChain)]
.
์ฌ์ฉ์ ์ง์ ํ์ ํญ๋ชฉ์ ์์ฑ์ ๊ฐ์ ธ์ค๊ธฐ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ฌ์ฉ์ ์ง์ ํ์ ํญ๋ชฉ์ฒ๋ผ ์ฌ์ ์ํ๋ ๋์ macro_rules
๋งคํฌ๋ก์ ์ถฉ๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, ์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ปดํ์ผ๋ฉ๋๋ค.
#![feature(proc_macro)]
#[macro_use] extern crate error_chain; // macro_rules! error_chain
#[macro_use] extern crate derive_error_chain; // #[proc_macro_derive(error_chain, attributes(error_chain))]
#[derive(error_chain)] // No error. Resolves to custom derive
enum ErrorKind {
/*#[error_chain]*/ // (1) As discussed above, can't use this any more since it conflicts with the name of the custom derive
Foo,
}
์ด๊ฒ์ (1)
๊ฐ stable์์ ์๋ํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ํ์ฌ ์์ ์ ์ธ Rust์ ๋์๊ณผ ์ผ์นํฉ๋๋ค. ๋ ๋ช
์ ์ ์ผ๋กํ๊ณ ์ํ๋ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฌธ์ํ ํ #[macro_use]
์ผ๋ก error-chain
๊ฐ์ ธ ์ค๊ธฐ ์ ์ ๊ฐ์ ธํด์ผํฉ๋๋ค ์์ derive-error-chain
.
๊ทธ๋ฌ๋ (1)
๊ฐ proc_macro
๊ธฐ๋ฅ๊ณผ ํจ๊ป ์๋ํ๋๋ก ์ฌ์ฉ์ ์ ์ ํ์ ์ด๋ฆ์ ErrorChain
๋ก ๋ณ๊ฒฝํ๋๋ผ๋(์ด๋ฏธ ์์ ์ ์ธ ์ฝ๋์ ๋ํ ํ ๊ฐ์ง ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์):
#![feature(proc_macro)]
#[macro_use] extern crate error_chain; // macro_rules! error_chain
#[macro_use] extern crate derive_error_chain; // #[proc_macro_derive(ErrorChain, attributes(error_chain))]
#[derive(ErrorChain)] // Unique name, so no error
enum ErrorKind {
#[error_chain] // (2)
Foo,
}
์ฌ์ ํ ์ปดํ์ผ๋์ง ์์ต๋๋ค. (2)
์ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ ์ ๋์ macro_rules
๋งคํฌ๋ก๊ฐ ์ฌ์ฉ์ ์ ์ ํ์์ ์ํด ๋ฑ๋ก๋ ์์ฑ๊ณผ ๋ถ๋ช
ํ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์ macro `error_chain` may not be used in attributes
์ค๋ฅ๋ฅผ ์์ฑํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ.
๋ฐ๋ผ์ ์ฌ์ฉ์ ์ง์ ํ์ ํญ๋ชฉ ๊ณผ ํด๋น ์์ฑ์ ์ด๋ฆ์ ๋ชจ๋ ๋ฐ๊ฟ์ผ ํฉ๋๋ค. ์์ฑ์ ์ฌ์ฉ์ ์ ์ ํ์(๊ฐ ์ด๊ฑฐํ์ ํ๋์ฉ)๋ณด๋ค ํจ์ฌ ๋ ๋ง์ด(์ด๊ฑฐํ์ ๊ฐ ๋ณํ์ ํ๋์ฉ) ์ฌ์ฉ๋๋ฏ๋ก ์์๋ณด๋ค ๋ ํฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์
๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ด ์์ ์ ๊ตฌ์ฑ์ ๊น๋ค๋ก์ด ์ํฉ์ด๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค(์ฌ์ฉ์ ์ ์ ํ์ ๋ฐ ํด๋น ์์ฑ์ ๋ํด macro_rules
๋งคํฌ๋ก์ ์ด๋ฆ ์ฌ์ฌ์ฉ). ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฌ์ฉ์ ์ ์ ํ์์ด ์์๋ ์ดํ๋ก ์์ ์ ์ผ๋ก ์ปดํ์ผ๋ ์ฝ๋์ด๊ธฐ๋ ํฉ๋๋ค. ์์ ํ๋์ด 6๊ฐ์ ํ์ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ด์ ๊ฐ ์์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ํ์ ์์ฒด๊ฐ macro_rules
๋งคํฌ๋ก๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉ์ ์ ์ ํ์์ ์์ฑ์ด macro_rules
๋งคํฌ๋ก๋ฅผ ์ฌ์ ์ํ๋๋ก ๋ง๋ค ์ ์์ต๋๊น? ์ค์ ๋ก ๋๋ ๊ทธ๋ค ์ฌ์ด์ ์ด๋ค ๋ชจํธ์ฑ์ด ์์ ์ ์๋์ง ์์ง ๋ชปํ์ง๋ง ๋์ผํ ์ด๋ฆ์ ์ฌ์ฉ์ ์ ์ ํ์ ํ์ macro_rules
๋งคํฌ๋ก๋ฅผ ๊ฐ์ ธ์ฌ ๋์ ๊ฐ์ ์ด์ ๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ชจ๋ ๋งคํฌ๋ก๋ ์ด๋ค ์ข
๋ฅ์ ๋งคํฌ๋ก์ธ์ง ๊ณ ๋ คํ์ง ์๊ณ ๋์ผํ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
proc ๋งคํฌ๋ก์ ๋ํด ์ด์ผ๊ธฐํ ๋ ํ์์ ์ธ "์ฅ์"๊ฐ ์์ต๋๊น? #rust-proc-macro
IRC ์ฑ๋์ ์ข์ํ์๋์? ์ด ๊ธฐ๋ฅ์ ๋ํด ๊ฐ๋ ์ง๋ฌธ์ ํ๊ณ ์ถ์ง๋ง ์ด ์ค๋ ๋๋ฅผ ์คํธํ๋ ๊ฒ์ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค.see_no_evil: ๊ทธ๋ฆฌ๊ณ #rust
์ฑ๋์์ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ proc-macro ๋ฐ ํนํ ์๋ก์ด proc_macro
API(๋ถ์์ ํ๊ณ ๋ชจ๋). ๊ทธ๋์: ์ด ์ฃผ์ ์ ๋ํด ๋
ผ์ํ ๊ณณ์ด ์์ต๋๊น?
@LukasKalbertodt #rust-internals
, ์๋ง๋ ๋๋ ๊ทธ๋ฅ /r/rust์์ ์ ์ค๋ ๋๋ฅผ ์์ํ์ญ์์ค.
TokenStream::from_str
์ ์ฐจ ๋งคํฌ๋ก ์ธ๋ถ์์ ์ฌ์ฉํ๋ฉด ํจ๋์ด ๋ฐ์ํฉ๋๋ค(์: ๋น๋ ์คํฌ๋ฆฝํธ์์).
thread 'main' panicked at 'proc_macro::__internal::with_sess() called before set_parse_sess()!', /checkout/src/libproc_macro/lib.rs:758:8
์ด ํจ๋์ ์์์ ์ผ๋ก ๋๋ฏธ "์ธ์ "์ ์์ฑํ๋ ๊ฒ์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ด ๊ฐ๋ฅ/๋ฐ๋์งํฉ๋๊น? ์๋๋ฉด ๊ณต์ฉ API(์์ ํ ๊ฒฝ๋ก ํฌํจ)๋ฅผ ์ถ๊ฐํ์ฌ ์์ฑํ์๊ฒ ์ต๋๊น?
๋ค๋ฅธ ์์คํ ์ ๋งคํฌ๋ก์ ๋ํ ๋ฌธํ์ ๋ณธ ์ฌ๋์ด ์์ต๋๊น? ์ด์ ๋ํ ์ฌ๋๋ค์ ์๊ฐ์ ๋ฃ๊ณ ์ถ์ต๋๋ค. ์ฌ๊ธฐ์์ Scheme์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ ๊ฐ์ฅ ์ ์๊ณ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ ํ๋ก์ ํธ์์ R7RS Scheme์ฉ syntax-rules
์ ๊ตฌํํ๋ ์์
์ ํ๊ณ ์์ผ๋ฉฐ syntax-case
๊ฐ ๋น์์์ ์ธ ๋งคํฌ๋ก ์์คํ
( defmacro
๋ฐ syntax-rules
). GNU Guile์ด ์ด ์์
์ ์ํํฉ๋๋ค. syntax-case
๋ ๊ตฌ๋ฌธ ๊ฐ์ฒด ๋ชฉ๋ก(๋๋ Scheme์ TokenStream
ํ ์ค ์ผ๋ถ)์ ๋ํ ์ถ๊ฐ ์กฐ๊ฑด์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ ์ ์๋ fender๋ ์ง์ํฉ๋๋ค. Mark
๊ฐ ์์
์ค์ด๊ณ Bindings as Sets of Scopes ์์ ์๊ฐ์ ๋ฐ์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ์ปดํ์ผ ํ์์ ์์ ๊ณ์ฐ์ ์ง์ํด์ผ ํ๋์ง ์ฌ๋ถ๋ ๋
ผ์ํด์ผ ํฉ๋๊น? Racket์ ์ค์ ๋ก ์ ์ฒด "๋จ๊ณ" ์ ๊ทผ ๋ฐฉ์์ ์ทจํฉ๋๋ค. begin-for-syntax
๋ ๋งคํฌ๋ก ํ์ฅ ๋์ ์ปดํ์ผ ํ์ ์์ค์์ ์ ์ ๋ฐ ๊ณ์ฐ(?)์ ํ์ฉ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค
Scheme์์ (datum->syntax <thing-to-copy-scope-from> <thing-to-apply-scope-to>)
๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ๋ํ ์ ์ด๊ฐ ๋งค์ฐ ๊ฐ๋ฅํ๋ฏ๋ก ๋งคํฌ๋ก ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๋์ ์ฆ๊ฐ์ ์ธ ๋ฒ์ ์ธ๋ถ์ ์๋ ๊ฐ์ฒด ๋ฒ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
The Scheme Programming Language, 3rd ed. ์์ ์ด ์์ ๋ฅผ ๊ฐ์ ธ http://www.scheme.com/tspl3/syntax.html . ์ด ์์์๋ (include "filename.scm")
๋ฅผ syntax-case
๋งคํฌ๋ก๋ก ํ์ํ๊ณ ์ธํฐํ๋ฆฌํฐ๊ฐ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์์ ์ฝ๊ณ ํ๊ฐ๋ฅผ ๊ณ์ํ๋๋ก ๋ฐํ์์ ์ค์ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ๊น์ ์ง๋ฌธ์ ๋งคํฌ๋ก ํ์ฅ ์ ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ๋๋ก ๋งคํฌ๋ก ๋งคํฌ๋ก ์์คํ
์ ์ํ๊ณ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ ํธ๋ฆฌ๊ฑฐ์ ๊ฐ์ ์ปดํ์ผ ์๊ฐ ๊ณ์ฐ์ ํธ๋ฆฌ๊ฑฐํ๊ธฐ๋ฅผ ์ํ๋์ง ์ฌ๋ถ์
๋๋ค(๋น๋ก ์ง์ ์ปดํ์ผ๋ฌ ๊ธฐ๋ฅ์์ ๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ๊ทธ๋์ ์๋ง๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ํ๊ณ ์ถ์ง ์์ ๊ฒ์
๋๋ค).
๋งคํฌ๋ก์ ํ๊ณ๋ ๋ฌด์์ ๋๊น? ์ปดํ์ผ ์๊ฐ์ ์ค์ด๊ณ ์ ํ๋ Rust๊ฐ ์ปดํ์ผ ์๊ฐ ํ๊ฐ๋ฅผ ์ ํํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ์์ํ ์ ์์ต๋๋ค(ํนํ ๋ฌดํ ๋ฃจํ๋ฅผ ํผํจ). Racket์ Lisp in Small Pieces์์ ์ฐธ์กฐ๋๋ ๋จ๊ณ๋ฅผ ํตํด "์ค๋น์์ ํ์ฅ์์ ํ" ์ ๊ทผ ๋ฐฉ์์ ์ทจํ์ต๋๋ค. ํ์ผ I/O ๋ฐ ์ ํ๋ ์ฌ๊ท ๊ณ์ฐ์ ์ํํ๊ธฐ ์ํด ์ปดํ์ผ ํ์ API์ ๋ํ ์ก์ธ์ค ํ์ฉ๊ณผ ๊ฐ์ ๊ฒ์ ํ์ฉํ์๊ฒ ์ต๋๊น? ์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ CSV ์คํ๋ ๋์ํธ ์ฌ์์ switch ๋ฌธ์ผ๋ก ์ ํํ ์ ์๋๋ก ํ์ฉํด์ผ ํฉ๋๊น?
๋ค๋ฅธ ์์คํ ์ ๋ํด ๋ฃ๊ณ ์ถ์ต๋๋ค! Template Haskell์ AST๋ฅผ ๋ํ๋ด๋ ์ ์ ์๋ ์ ํ์ ์ฌ์ฉํ๋ ํฅ๋ฏธ๋ก์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ Haskell์ ๊ฒ์ผ๋ฆ์ ์ ์ด ๊ตฌ์กฐ์ ๋ํ ๋งคํฌ๋ก ์ฌ์ฉ์ ๋์ฒดํ ์ ์๋ค๊ณ ๋ค์์ต๋๋ค.
๋ด๊ฐ ์ ์์ ๋ฒ์ด๋๋ฉด ์ฃ์กํฉ๋๋ค.
๋งคํฌ๋ก์ ํ๊ณ๋ ๋ฌด์์ ๋๊น?
์ด๋ฒ ํธ์์ ๋ ผ์๋ ์ ์ฐจ์ ๋งคํฌ๋ก์ ๊ฒฝ์ฐ none . ์ ์ฐจ ๋งคํฌ๋ก๋ ์ปดํ์ผ๋ฌ ํ์ฅ์ ๋๋ค. ์ฝ๊ฐ์ C++ ์ฝ๋๊ฐ ํ์ํ๊ณ clang์ ํตํด ์คํํ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ปดํ์ผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ผ๋ถ SQL์ ์ฌ์ฉํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฟผ๋ฆฌํ์ฌ ํด๋น ๊ฒฐ๊ณผ ์ ํ์ ์ฐพ๊ณ ์ ์ ํ ๊ฒฐ๊ณผ ์ธํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๋๋ค์ด ํ๊ณ ์ถ์ดํ๋ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค!
Rust์๋ ๋ค๋ฅธ ๋งคํฌ๋ก ์์คํ ์ด ์์ต๋๋ค. ์ ๋ฐ์ดํธ๋ RFC 1584 ๋ก ์น์ธ๋์์ผ๋ฉฐ ๊ตฌํ์ https://github.com/rust-lang/rust/issues/39412์์ ์ถ์ ํฉ๋๋ค
@VermillionAzure , ์ฐธ์กฐํ Scheme ์์์
macro_rules
๋ฐ RFC 1584 ์ ๋ฐ๋ฅธ ์
๋ฐ์ดํธ๋ syntax-rules
์ ์ ์ฌํฉ๋๋ค. ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ์ ์ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ https://github.com/rust-lang/rust/issues/39412 ๊ฐ ์ด์ ๋ํด ๋
ผ์ํ๊ธฐ์ ๊ฐ์ฅ ์ข์ ์ฅ์์ผ ๊ฒ์
๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํ๋ก์์ ๋งคํฌ๋ก๋ define-syntax
์ ์ผ๋ฐ์ ์ธ ํ์๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด RFC( 1566 )๋ ๋งค์ฐ ์๋์ ์ผ๋ก syntax-case
์ ๊ฐ์ ๊ฒ์ ์ ์ํ์ง ์์ต๋๋ค . ํ ํฐ ์คํธ๋ฆผ์ ๋ณํํ๋ ํจ์๋ฅผ ํธ์ถํ๋ ์ธํฐํ์ด์ค์ผ ๋ฟ์
๋๋ค.
์ธํฐํ์ด์ค๋ syntax-case
์ ๊ฐ์ ๊ฒ์ด ๋ณ๋์ ํฌ๋ ์ดํธ(๋ผ์ด๋ธ๋ฌ๋ฆฌ)์์ ๊ตฌํ๋ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ ์๋๋ฉฐ ์๋๋ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ์ฑํฅ์ด ์๋ค๋ฉด ๋ง์๊ป ๋ฐ์ด๋ ์ ์์ต๋๋ค. API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฌ์ด์ง ๋๋ ์ด๋ ค์ด์ง์ ๋ํ ๋ชจ๋ ํ๋กํ ํ์
๊ณผ ๋ณด๊ณ ์๋ ๋ชจ๋ ํ์๋ฐ์ ๊ฒ์
๋๋ค.
๋ด ์๊ฐ์ ์์ด๋์ด๋ lisp์์์ ๊ฐ์ด ํจ์์ ๊ฐ์ ๋งคํฌ๋ก๋ฅผ ์ ์ํ์ง๋ง macro_rules!
์ ์ํ๋ ๋งคํฌ๋ก๋ฅผ ๋ฐํํ๋ ๋งคํฌ๋ก๋ฅผ ๊ฐ๋ ๊ฒ์ด์์ต๋๋ค.
๋ฐ๋ผ์ ๋ค์์ ๋์ผํฉ๋๋ค.
macro_rules! foo {/*define macro here*/}
#[proc_macro]
pub fn foo(tokens: TokenStream) -> TokenStream {
macro_case! tokens {/*define macro here*/} //takes `tokens` as first argument, returns a `TokenStream`
}
์ด๊ฒ์ด syntax-rules
๋ฐ syntax-case
๊ฐ ๊ณํ์์ ์๋ํ๋ ๋ฐฉ์์
๋๋ค.
@VermillionAzure
์ด๊ฒ์, ๋น์ ์ด ์ํ๋ ๋ฌด์์
๋๊น?
@porky11 ์๋์, ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Scheme ๋งคํฌ๋ก๊ฐ ํ ๋ก ์ ์ถ๊ฐํ ์ ์ ํ ์์ด๋์ด์ธ์ง ํ์ธํ๊ณ ์ถ์์ต๋๋ค. ์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ Scheme์ syntax-case
๋งคํฌ๋ก ์์คํ
๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๋ ฅํ๊ธฐ ๋๋ฌธ์ ์ฌ์ํ๋ค๋ ๊ฒ์ ๋ถ๋ช
ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ๊ณต๋ ์์์ ํ์ ๊ด์ ์์ ๋ชจ๋ ๋งคํฌ๋ก ์์คํ
์ ๊ตฌํํฉ๋๋ค.
@jan-hudec ์ด๋ค ์ข ๋ฅ์ ๋ณด์ ๋ณด์ฅ ์์ด ์ปดํ์ผ๋ฌ ํ์ฅ์ผ๋ก ์์์ ๊ณ์ฐ์ ํ์ฉํ๋ ๊ฒ์ด ํ๋ช ํฉ๋๊น? ์ฌ๊ธฐ์์ ์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ ๋งค์ฐ ๊ฐ๋ ฅํ ๊ฒ์ด๋ผ๋ ์๊ฐ์ ์์ ํ ๊ฐ๋ช ์ ๋ฐ์์ง๋ง, Rust์ ์ ์ฌ์ ์ธ ์ฌ์ฉ์๊ฐ ์ด๊ฒ์ ํจํค์ง ์ฌ์ฉ์ ๋จ์ ์ด๋ผ๊ณ ์๊ฐํ ๊น์? ์ ๋ ๋ณด์ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง ์ปดํ์ผ๋ฌ ํ์ฅ ๋ด์์ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ทจ์ฝ์ ์ด ์ ์์ ์ผ๋ก Rust ์ปดํ์ผ๋ฌ๋ฅผ ๊ณต๊ฒฉ ๋ฒกํฐ๋ก ๋ฐ๊พธ๋ ๋ฐ ์ฝ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๊น? ๋ํ, ์ ์ฐจ์ ๋งคํฌ๋ก์ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ(์: ์๋ชป๋ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๋ segfault), ์ด๋ segfault๊ฐ ๊ณ์ํด์ ๋ฐ์ํ์ฌ ์ ์ ํ ์ค๋ฅ ๋ฉ์์ง ์์ด ์ปดํ์ผ๋ฌ๊ฐ ์คํจํ๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
์ปดํ์ผ๋ฌ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๋ฐฉ์์ผ๋ก ์ ์ฐจ์ ๋งคํฌ๋ก์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์บก์ํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ ๋ค๋ฅธ ์์ด๋์ด: ์ ์ฐจ์ ๋งคํฌ๋ก๋ ์ธ์ ์คํ๋ฉ๋๊น? ์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ ๊ด๋ จ๋ ์ ์๋ ๋ถ์์ฉ์ด ์๋ ์ฝ๋์ ์ํธ ์์ฉํ ์ ์๋ ๊ฒฝ์ฐ(์: ์ํ ์ ์ฅ ์ธ๋ถ ์๋ฒ์์ ํต์ , ์ธ๋ถ SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ, ์ธ๋ถ ์์คํ ์ ๋ก๊ทธ์ธํ๊ธฐ ์ํ ๋ณด์ ํค ๊ฐ์ ธ์ค๊ธฐ) ์ปดํ์ผ ํ๋ก์ธ์ค์ ์ํด ์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ ์์๊ฐ ์ค์ํฉ๋๊น?
@VermillionAzure Cargo ํจํค์ง์๋ ์ปดํ์ผ ํ์์ ์์์ ์ฝ๋๋ฅผ ์คํํ๋ ๋น๋ ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ฏธ ์์ ์ ์์ผ๋ฏ๋ก ์ ์ฐจ์ ๋งคํฌ๋ก๋ ๊ทธ๋ฐ ๋ฉด์์ ์ํฉ์ ์
ํ์ํค์ง ์์ต๋๋ค. ์ด๋ฏธ ์ข
์์ฑ์ ์ ๋ขฐํด์ผ ํฉ๋๋ค. (์ด๊ฒ์ crates.io๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ/์ถ๊ฐ ์ ์ฉ์ด ๋๊ณ Cargo.lock
ํ์ผ์ด ์๋ ๊ฒฝ์ฐ ์ข
์์ฑ์ด ์๋์ผ๋ก ์
๋ฐ์ดํธ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์ฌ์์ง๋๋ค. ํน์ ๋ฒ์ ๋ง ์ ๋ขฐํ๋ฉด ๋ฉ๋๋ค.) ๊ทธ๋ฆฌ๊ณ ๋น๋ ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ๋ ์ง ์๋๋ผ๋ ์กด์ฌํ๋๋ผ๋ ์ข
์์ฑ์ ์ฌ์ ํ โโ๋ณธ์ง์ ์ผ๋ก ๋ฐํ์์ ์์์ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์ปดํ์ผ ์๊ฐ์ด ํจ์ฌ ๋ ๋์ฉ๋๊น?
์ด ํ ๋ก ์ ๊ด๋ จ์ด ์์ง๋ง ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์๊ฐํ๊ฒ ํฉ๋๋ค.
ํฌ๋ ์ดํธ๊ฐ ๋ ๊ฐ์ proc ๋งคํฌ๋ก๋ฅผ ์ ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. foo!()
๋ ์์ ํ์ผ์ ์์ฑํ๊ณ bar!()
๋ ๋์ผํ ํ์ผ์ ์ฝ์ต๋๋ค. ์ด ํฌ๋ ์ดํธ์ ์๋น์๋ ๋์ผํ ๋ชจ๋์์ foo!()
๋ฐ bar!()
๋ฅผ ๋ชจ๋ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ปดํ์ผ ์ฑ๊ณต ์ฌ๋ถ๋ foo!()
๋๋ bar!()
๊ฒ์ด ๋จผ์ ํ์ฅ๋๋์ง์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์ด ์์๋ ๊ตฌํ์ ๋ฐ๋ผ ์ ์๋๋ฉฐ ์ถฉ๋ถํ ์ฌ๋๋ค์ด ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ฌ์ค์ ํ์ค์ด ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์ผ๋ง๋ ๋ฌธ์ ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ด ๊ตฌ์กฐ ํ๋ ์ฃผ๋ฌธ ์์์๋ฅผ ๋ฐ๋ณตํ๊ฒ ๋ ์ง ๊ฑฑ์ ๋ฉ๋๋ค.
@SimonSapin
๋๋ ๋น์ ์ ์ ์ฅ์ ๋์ํ์ง๋ง ์ปดํ์ผ ํ์ ์คํ๊ณผ ๋ฐํ์ ์คํ ์ฌ์ด์๋ ํ ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์์ ์ง์ ํด์ผ ํฉ๋๋ค.
์ฌ๋ฌผ์ด ํ ๋ฒ ์ปดํ์ผ๋ ๋ค์ ์ฌ๋ฌ ์์คํ ์ ๋ฐฐํฌ๋๋ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ํ ๋ชจ๋ธ์ ์ ๊ณตํฉ๋๋ค. (์: Linux ๋ฐฐํฌํ ๋น๋ ํด๋ฌ์คํฐ์์ ์ ์ง ๊ด๋ฆฌ์์ ๋ถ์ฃผ์์ ์๋๋ฐ์ฑ์ ๋จ์ ์ ์ ์ฉํฉ๋๋ค.)
@lfairy ์, ์ด๊ฒ์ 2002๋ ์ Racket์ด ๊ฒช์๋ ์ ํํ ๋ฌธ์ ์ ๋๋ค. Racket์ ์ต๊ณ ๊ธฐ์ฌ์์ธ Matthew Flatt๋ "๊ตฌ์ฑ ๊ฐ๋ฅํ๊ณ ์ปดํ์ผ ๊ฐ๋ฅํ ๋งคํฌ๋ก: ์ธ์ ์ํ์ญ๋๊น . R. Kent Dybvig, Chez Scheme์์ ์ผํ ๊ทธ๋ "R6RS Libraries์ ์์์ ๋จ๊ณ
@SimonSapin ์ปดํ์ผ ์๊ฐ์ ์ ์ฌ์ ์ผ๋ก ํจ์ฌ ๋ ๋์ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋ฌด์์๋ก ์ถฉ๋ํ๊ฑฐ๋ ์ปดํ์ผ๋ฌ์ ์ํด ์ ๋ฐ๋๋ ์ ์์ ์ธ ๋์์ ์ํํ๋ ๊ฒฝ์ฐ ๋๊ตฐ๊ฐ๊ฐ "Rust์ ๋ชจ๋์ ๋ณธ์ง์ ์ผ๋ก ์์ ํ์ง ์์ต๋๋ค"๋ผ๋ ์ ๋ชฉ์ ๊ฑฐ๋ํ Reddit ๊ฒ์๋ฌผ์ ์์ฑํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
@VermillionAzure , ๋๋ ๊ธฐ์ฌ๋ฅผ ์์ธํ ์ฝ์ง
Scheme์์ ํ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจ์์ ๋งคํฌ๋ก๋ฅผ ๋ชจ๋ ์ ๊ณตํ ์ ์์ผ๋ฏ๋ก ์ปดํ์ผ๋ฌ๋ ์ปดํ์ผ ์๊ฐ์ด ํ์ํ ํจ์์ ๋ฐํ์์ด ํ์ํ ํจ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Rust์์ ํฌ๋ ์ดํธ๋ ์ ์ฐจ์ ๋งคํฌ๋ก๋ ๋ฐํ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก ์ด ๊ตฌ๋ถ์ (๋น๋ถ๊ฐ) ๋ช ๋ฐฑํฉ๋๋ค.
(๋ฐํ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํฌ๋ ์ดํธ๋ ๊ท์น ๊ธฐ๋ฐ(์์์ ์ธ) ๋งคํฌ๋ก๋ ์ ๊ณตํ ์ ์์ง๋ง, ์ด๋ Rust์์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค)
@lfairy ๊ฐ ๋งํ๋ ๋ฌธ์ ๋ ํ์ฅ๊ธฐ ๊ธฐ๋ฅ์ ์คํ ์์ ์ค ํ๋์ ๋๋ค. Rust์์ ์ปดํ์ผ์ ๊ฐ๋ณ ํ์ผ์ ๋ํด ๋ณ๋ ฌ์ผ ์ ์๊ณ ์ฆ๋ถ์ผ ์ ์์ผ๋ฏ๋ก ํ์ฅ๊ธฐ์ ์คํ ์์๋ ์ ์๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ธฐ์ฌ ๋ชจ๋ ์ค์ ๋ก ๊ทธ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๊น? ๋๋ ๊ทธ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค.
@jan-hudec ๋ค, ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ํน์ ๋ชจ๋์ด ๋ถ์์ฉ์ ์ผ์ผํค์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค๋ฉด ์ปดํ์ผ ํ์์ ๋ถ์์ฉ์ด ํ์ฉ๋๋ค๋ฉด ํ๊ฐ ์์๋ ํ์คํ ์ค์ํฉ๋๋ค. ๋ชจ๋์ด "ํ์ ๊ฐ๋ฅ"ํฉ๋๊น?
์ผ๋ถ ์ธ๋ถ ์ฌํญ(์๋ ์ฐธ์กฐ)์ ์์กดํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฐจ์ ๋งคํฌ๋ก๋ "์๋ง๋ ์์ด์ ์ ๋๋" ๋ถ์์ฉ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ฅ์.
์ด๋ฌํ ์ธ๋ถ ์ ๋ณด์๋ ๋ค๋ฅธ proc ๋งคํฌ๋ก์ ๋น๊ตํ ์คํ ๋ฐ ๋์์ฑ ์์์ proc-macro๊ฐ ์ฆ๋ถ ๋น๋์์ ๋ค์ ์คํ๋๋์ง ์ฌ๋ถ๊ฐ ํฌํจ๋ฉ๋๋ค. ํ์์ ๊ฒฝ์ฐ ๋น๋ ์คํฌ๋ฆฝํธ์์ rerun-if-changed
์ ์ ์ฌํ ์ข
์์ฑ์ ์ ์ธํ๊ธฐ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น๋ ์คํฌ๋ฆฝํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฌํ ์ ์ธ์ ๋ถ์์ ํ๊ฑฐ๋ ๋ฒ๊ทธ๊ฐ ์์ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ฒ๊ทธ๋ฅผ ์ ์ ์ผ๋ก ๋ฐฉ์งํ ์๋ ์์ต๋๋ค.
๋ถ์์ฉ์ ๋ํ ๋ณด์ฅ์ ํผํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(์: ๋งคํฌ๋ก ํฌ๋ ์ดํธ๋ ๋ถ์์ฉ์ด ์๋ํ๋ ๊ฒ์ ์์กดํ๋ ๊ฒ์ด ํ์ฉ๋์ง ์์ผ๋ฉฐ, ์ ์ฉ๋๋ ๋ชจ๋์ ์ฝ๋ ๋ณ๊ฒฝ ์ด์ธ์ ๋ค๋ฅธ ๊ฒ์ ๋ํด ๋ค์ ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฒ์ ์์กดํ๋ ๊ฒ๋ ํ์ฉ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ญ ์ํ๊ฐ ์์).
๋์ค์ rerun-if-changed ๋ฐ ๊ธฐํ ์ฌํญ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด ์๊ตฌ ์ฌํญ์ ์ํํ ์ ์์ต๋๋ค.
(์ฌ๊ธฐ์ ๋ค์ ๋์์ด ๋ ๋ฐ์ฏค ๊ตฌ์ด ์ผ๋ฐ ๋น๋ ์คํฌ๋ฆฝํธ/ํ๋ก์์ ๋งคํฌ๋ก ๋ณด์ ์ ์์ด ์์ง๋ง ์์ง ์์ฑํ์ง๋ ์์์ต๋๋ค)
IMO proc ๋งคํฌ๋ก/์ฌ์ฉ์ ์ ์ ํ์์ ์ธ๋ถ์ ๋ํ I/O ๋๋ ๊ธฐํ ์ฐ๊ฒฐ ์์ด ์๋๋ฐ์ค ํ๊ฒฝ์ ๋ฃ์ด์ผ ํ๋ฉฐ ์๋ง๋ ํฌ๋ ์ธ ๋ฆฌํํธ JIT๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฆฌ์์ ํ๊ฐํด์ผ ํฉ๋๋ค.
@est31 ์ข์ ์์ด๋์ด์ง๋ง ๋์ ค infer_schema์ ๊ฐ์ ๊ฒ์
๋๋ค! ์ด๋ฏธ
์กด์ฌํ๋ ๊ฒฝ์ฐ bindgen์ ํ์ผ์ ์ฝ๊ณ ํ๋ก๊ทธ๋จ์ ์คํํด์ผ ํ๋ฉฐ ์ฌ์ง์ด ํฌํจํด์ผ ํฉ๋๋ค! ๊ทธ๋ฆฌ๊ณ
ํ๊ฒฝ! I/O๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2017๋ 11์ 9์ผ 06:19์ "est31" [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
IMO proc ๋งคํฌ๋ก/์ฌ์ฉ์ ์ ์ ํ์์ ์๋๋ฐ์ค ํ๊ฒฝ์ ๋ฃ์ด์ผ ํฉ๋๋ค.
์ธ๋ถ์ ๋ํ I/O ๋๋ ๊ธฐํ ์ฐ๊ฒฐ ์์ด
๋ฏธ๋ฆฌ, ์๋ง๋ ํฌ๋ ์ธ ๋ฆฌํํธ JIT์ ํจ๊ป.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/38356#issuecomment-343124957 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAC3n5VOPdKBsu81Sp3tp2XlIQ05L865ks5s0t_PgaJpZM4LMWlc
.
#40939์ #44528์ด ์ด๋ฏธ ๋ณํฉ๋ ๊ฒ ๊ฐ์ต๋๋ค ...
@mark-im์ด ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ ์ ์ฐจ์ ๋งคํฌ๋ก๋ฅผ ์์ฑํ ์ ์์ต๋๊น?
@VermillionAzure ๋๋ ๊ทธ๊ฒ์ ์๋ํ์ง ์์์ง๋ง ๊ทธ๋ค์ด ํ ์ ์์๋ ์ด์ ๋ฅผ ์์ง ๋ชปํฉ๋๋ค. ๋ฌผ๋ก , "๋ฐํ์" ์ฝ๋๋ฅผ ์์ฑํ๋ proc ๋งคํฌ๋ก์ฒ๋ผ, ๊ทธ๊ฒ๋ค์ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ๋ ๋ณ๊ฐ์ ์์์ ์์ด์ผ ํฉ๋๋ค.
syn์์ ์ฐ๋ฆฌ๋ ์ค๋ proc_macro::TokenNode์ ์ ํ์ ๋ถ๋ช์ณค์ต๋๋ค. -- ๋ธ๋ก ๊ตฌ๋ถ ๊ธฐํธ {
... }
๋ ์
๋ ฅ TokenStream์์ ํ๋์ Span๊ณผ๋ง ์ฐ๊ฒฐ๋๋ฏ๋ก ํธ๋ฆฌ๊ฑฐํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ซ๋ }
๋ง ๊ฐ๋ฆฌํค๋ ์ค๋ฅ์
๋๋ค. Rustc์๋ ์ด๋ฌํ ์ ํ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
mod m {
type T =
}
error: expected type, found `}`
--> src/main.rs:3:1
|
3 | }
| ^
proc ๋งคํฌ๋ก์์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ต์ ์ ๋ธ๋ก ๋ด๋ถ์ ๋ง์ง๋ง ํ ํฐ์ ๊ฐ๋ฆฌํค๊ฑฐ๋, ์ ์ฒด ๋ธ๋ก์ ๊ฐ๋ฆฌํค๊ฑฐ๋, ๋ธ๋ก ๋ค์ ๋ค์ ํ ํฐ์ ๊ฐ๋ฆฌํค๋ ๊ฒ์ ๋๋ค.
์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ
์ Span::start
๋ฐ Span::end
๊ฐ ํ์ฌ์ ๊ฐ์ด LineColumn
๋์ 1์ Span
๋ฅผ ๋ฐํํ๋๋ก ํ ๋ค์ Span
์์ ๋ฒ์์ ์ฒซ ๋ฒ์งธ ์ค/์ด๋ก ์ด๋ํฉ๋๋ค.
sp.begin().line // before
sp.line() // after
sp.end().line // before
sp.end().line() // after
sp.end() // after, not possible before
#43604์์ ํด๋น API๋ฅผ ์ถ๊ฐํ @abonander ๋ฅผ ์ธ๊ธํฉ๋๋ค.
Span::start ๋ฐ Span::end๋ ํ์ฌ์ ๊ฐ์ด LineColumn ๋์ 1์ Span์ ๋ฐํํ ๋ค์ Span์์ Span์ ์ฒซ ๋ฒ์งธ ์ค/์ด๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ ธ์ถํฉ๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด Span์ด ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ ํ์ํ ํน๋ณํ ๋์์ ์ฑํํ๊ฒ ๋์ง๋ง ๋ค๋ฅธ ๋ชจ๋ ๋ฒ์์์๋ ์๋ชป๋ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ํญ๋ชฉ์ ๊ฒฐํฉํ์ฌ foo(hi)
์ ๊ฐ์ ํํ์์ ๋ฒ์๋ฅผ ์ป๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด์ foo
๋ฅผ ๊ฐ๋ฆฌํค๊ณ sp.begin()
๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง sp.begin()
๋ foo
์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ง ๊ฐ๋ฆฌํต๋๋ค.
๋ ๋์ ์๋ฃจ์
์ proc_macro::TokenNode::Group
์ ๋ ๊ฐ์ ๋ฒ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์์ ๋ฒ์๋ฅผ ์์ฑํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค.
Span::begin
/ end
๋ฐํ ์ ํ์ด ๋ณ๊ฒฝ๋์ด์ผ ํ ์๋ ์์ต๋๋ค. https://github.com/rust-lang/rust/pull/43604#issuecomment -327643229
๋ด ์ ์ฐจ ๋งคํฌ๋ก์ ๋ฒ์์ ์๋ ๊ฒ์ ๋ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Span::def_site()
๋ฅผ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค. ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํด์ผํ๋์ง ์คํดํ๊ณ ์์ต๋๊น?
Span::call_site()
๋ฅผ ์ฌ์ฉํ๊ณ main.rs์ MySend
์ ์๋์ด ์์ผ๋ฉด ๊ฑฐ์ ๋์ผํ ์ฝ๋๊ฐ ์๋ํฉ๋๋ค. ํ์ง๋ง def_site()
์๋ํ๋๋ก ํ ์ ์์์ต๋๋ค.
#![feature(proc_macro)]
extern crate proc_macro;
use std::marker::Send as MySend;
use proc_macro::{TokenStream, TokenTree, TokenNode, Term, Delimiter, Span};
#[proc_macro]
pub fn impl_mysend_for(tokens: TokenStream) -> TokenStream {
let span = Span::def_site();
let ident = tokens.into_iter().next().unwrap();
vec![
TokenTree { span, kind: TokenNode::Term(Term::intern("unsafe")) },
TokenTree { span, kind: TokenNode::Term(Term::intern("impl")) },
TokenTree { span, kind: TokenNode::Term(Term::intern("MySend")) },
TokenTree { span, kind: TokenNode::Term(Term::intern("for")) },
ident,
TokenTree { span, kind: TokenNode::Group(Delimiter::Brace, TokenStream::empty()) }
].into_iter().collect()
}
#![feature(proc_macro)]
extern crate mac;
struct S;
mac::impl_mysend_for!(S);
fn main() {}
error[E0405]: cannot find trait `MySend` in this scope
--> src/main.rs:6:1
|
6 | mac::impl_mysend_for!(S);
| ^^^^^^^^^^^^^^^^^^^^^^^^^ did you mean `Send`?
Syn ์ธก์์ ์ถ์ : https://github.com/dtolnay/syn/issues/290.
@dtolnay
์ฌ๊ธฐ์ ๋ฌธ์ ๋ MySend
๊ฐ 0๋จ๊ณ(์ฆ, ํฌ๋ก์ค ์ปดํ์ผ ์ ํธ์คํธ ์ํคํ
์ฒ์ ๋ํด)์์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ 1๋จ๊ณ(์ฆ, ๋์ ์ํคํ
์ฒ์ ๋ํด ์ปดํ์ผํ ๋)์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์ ํด๊ฒฐ์ฑ ์ proc-macro ํฌ๋ ์ดํธ๊ฐ 1๋จ๊ณ(๋์ ์ํคํ ์ฒ) ์ข ์์ฑ์ ๊ฐ๋๋ก ํ์ฌ 1๋จ๊ณ ํญ๋ชฉ์ ๋ฒ์๋ก ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ค๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์์ ๋ฐํํ๋ ๊ฒ์ ๋๋ค.
quote! { // n.b. non-interpolated tokens from `quote!` have `Span::def_site()`
mod dummy {
extern crate std;
use self::std::marker::Send as MySend;
unsafe impl MySend for $ident {} // this line is equivalent to what you have above
}
}
์ด๊ฒ์ ์๋์ผ๋ก ๊ตฌ์ฑํ ์๋ ์์ต๋๋ค. ์ ๋ ํธ์์ quote!
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์์์์ ์ด์ ๋ก dummy
/ std
/ MySend
๋ ๋ฒ์ ๋ด์ ๋ค๋ฅธ ์ด๋ค ๊ฒ๊ณผ๋ ์ถฉ๋ํ์ง ์์ผ๋ฏ๋ก ์๋ฅผ ๋ค์ด ๋์ผํ ๋ชจ๋์์ ์ด ๋งคํฌ๋ก๋ฅผ ๋ ๋ฒ ์ด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. ident
๋ "MySend" ๋ฑ์ผ๋ก ์์ ํฉ๋๋ค.
์ด ๋ฌธ์ ์ mod dummy
์ ํ์์ฑ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ https://github.com/rust-lang/rust/issues/45934#issuecomment -344497531์ ์์ธํ ์ค๋ช
๋์ด
์ฌํ๊ฒ๋ 1๋จ๊ณ ์ข ์์ฑ์ด ๊ตฌํ๋ ๋๊น์ง ์ด๊ฒ์ ์ธ์ฒด๊ณตํ์ ์ด์ง ์์ ๊ฒ์ ๋๋ค.
@jseyfried ๊ฐ์ฌํฉ๋๋ค! ์๋ํฉ๋๋ค. ๋ช ๊ฐ์ง ํ์ ์ง๋ฌธ:
๋ด ์ด์ ์ฝ๋ฉํธ์ ์ฝ๋์์, ๋๋ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ impl_mysend_for
์ํ IMPL ์์ฑํ๊ธฐ Send
๋์ MySend
๋ค์ ๋ชจ๋ ๊ฒ์ ์ปดํ์ผํฉ๋๋ค. ์ด๊ฒ์ด ํด๊ฒฐํ๋ Send
๋ ๋ฌด์์ด๋ฉฐ 0๋จ๊ณ์ 1๋จ๊ณ์ ๊ตฌ๋ถ์ ๋ง์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ด๊ฒ์ ์๋์ ์ผ๋ก ์๋ํฉ๋๊น ์๋๋ฉด ์ฐ์ฐํ ์๋ํฉ๋๊น?
Send
์ ๊ฐ์ด ๋ด def_site()
ํ ํฐ์ด ์ฌ์ฉํ ์ ์๋ ๋ฒ์์๋ ์ด๋ค ๊ฒ์ด ์์ต๋๊น?
MySend
๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ(์ serde::Serialize
ํ์) ์ต์ข
์ฌ์ฉ์๋ Cargo.toml์ serde
๊ฐ ํ์ํฉ๋๋ค. extern crate serde
๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. def_site()
ident ํ์ธ์ผ๋ก extern crate
์ ์ ์ฐจ ๋งคํฌ๋ก์ Cargo.toml์ ๋ํด ํ์ธํ๊ณ extern crate
์ฌ์ฉํ์ฌ call_site()
ident ํ์ธ์ ๋ค์ด์คํธ๋ฆผ์ ๋ํด ํ์ธํ ์ ์์ต๋๊น? ํ๋ฌผ.ํฐ?
extern ํฌ๋ ์ดํธ์ ๊ฒฝ์ฐ proc ๋งคํฌ๋ก์ ์ํด 1๋จ๊ณ์์ ํฌ๋ ์ดํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
#[proc_macro_derive(Serialize, attributes(serde), crates(serde))]
@dtolnay
์ด์ ์ฃผ์์ ์ฝ๋์์ MySend ๋์ Send์ ๋ํ impl์ ์์ฑํ๋๋ก impl_mysend_for๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ปดํ์ผ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ฌด์์ผ๋ก ํด๊ฒฐ๋๋ฉฐ ์ 0๋จ๊ณ์ 1๋จ๊ณ ๊ตฌ๋ถ์ ๋ง์ง ์์ต๋๊น? ์ด๊ฒ์ ์๋์ ์ผ๋ก ์๋ํฉ๋๊น ์๋๋ฉด ์ฐ์ฐํ ์๋ํฉ๋๊น?
์ข์ ์ง๋ฌธ. ๋ฐ๋ก ์ง๊ธ, ์๊ณก์ ์ ์ ์ฌ์ดํธ์ ๋ฒ์์ ์์ผ๋ฉฐ(proc-macro crate๊ฐ #![no_implicit_prelude]
๊ฐ ์๋ ๊ฒฝ์ฐ) ์ด๊ฒ์ ๋น์ ์ด ์ง์ ํ ๊ฒ์ฒ๋ผ 0๋จ๊ณ์ 1๋จ๊ณ ๊ตฌ๋ณ๋ก ์ธํ ์ฌ๊ณ (์ด๋ค ์๋ฏธ์์)์
๋๋ค. .
๊ทธ๋ฌ๋ ์ธ์ฒด ๊ณตํ์ ๊ฒฝ์ฐ 1๋จ๊ณ๋ proc-macro ๋ฃจํธ์ ์์์ ์ผ๋ก std
๋ฅผ ํฌํจํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(ํญ์ quote!(use std::...);
). 0๋จ๊ณ์์. ๊ณง 1๋จ๊ณ์์ ๋ฃจํธ์ std
๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ PR์ด ์์ ๊ฒ์
๋๋ค.
Send์ ๊ฐ์ def_site() ํ ํฐ์ด ์ฌ์ฉํ ์ ์๋ ๋ฒ์์๋ ์ด๋ค ๊ฒ์ด ์์ต๋๊น?
์์์ ๋
ผ์ํ ์๊ณก๊ณผ (๊ณง) std
์ธ์ 1๋จ๊ณ์ ๋ฒ์์ ์๋ ๋ค๋ฅธ ์ ์ผํ ๊ฒ์ proc-macro ์์ฒด์
๋๋ค(๋จ๊ณ 0์ธ proc-macro ํจ์ ๊ฐ ์๋).
์๋ฅผ ๋ค์ด,
#[proc_macro]
fn f(input: TokenStream) -> TokenStream { ... }
#[proc_macro]
fn g(_input: TokenStream) -> TokenStream {
quote! {
f!(); ::f!(); // These both resolve to the above proc macro
f(); // This doesn't resolve since the function is in phase 0
}
}
์ ์ฐจ์ ๋งคํฌ๋ก์ Cargo.toml์ ๋ํด def_site() ident๊ฐ ์๋ extern ํฌ๋ ์ดํธ๋ฅผ ๋ง๋ค๊ณ ๋ค์ด์คํธ๋ฆผ Cargo.toml์ ๋ํด call_site() ident๊ฐ ํด๊ฒฐ๋๋ extern ํฌ๋ ์ดํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
์, Span::def_site()
๊ฐ ์๋ extern ํฌ๋ ์ดํธ๊ฐ ์ ์ฐจ์ ๋งคํฌ๋ก Cargo.toml
์ 1๋จ๊ณ(๋์) ์ข
์์ฑ์ ๋ํด ํด๊ฒฐ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ์ค๋์ 0๋จ๊ณ ์ข
์์ฑ์ ํธ์คํธ ํ๋ซํผ์ฉ์ผ๋ก ์ปดํ์ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. . 1๋จ๊ณ ์ข
์์ฑ์ ์์ง ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ extern crate์ ์ด๋ฆ์ด ๋น์์์ ์ผ๋ก ํด์๋์ด ์ง์ ํ ๋๋ก ์ง์ฆ์ด ๋ฉ๋๋ค.
1๋จ๊ณ ์ข
์์ฑ์ด ์์ผ๋ฉด ์ฒ์์๋ ๊ฐ ํ์ฅ์์ extern crate
๋ฅผ ์ธ์ฉํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ์์ ํด์ผ ํฉ๋๋ค. ํ์ฌ ๊ณํ์ ๋จผ์ proc-macro crate์ ๋์ ์ข
์์ฑ์ ํด๊ฒฐํ ๋ค์ ์ดํ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฎ์ ์ฐ์ ์์ ๊ฒฝ๊ณ ์ฃผ๊ธฐ๋ก ๋น์์์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ํด๋ฐฑํ๋ ๊ฒ์
๋๋ค.
extern ํฌ๋ ์ดํธ์ ๊ฒฝ์ฐ proc ๋งคํฌ๋ก์ ์ํด 1๋จ๊ณ์์ ํฌ๋ ์ดํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
#[proc_macro_derive(Serialize, attributes(serde), crates(serde))]
ํฅ๋ฏธ๋กญ๊ฒ๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ด๋ฐ ์์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
๋์ 1๋จ๊ณ ํฌ๋ ์ดํธ๊ฐ proc-macro ํฌ๋ ์ดํธ ๋ฃจํธ(์: #[phase(1)] extern crate foo;
)์์ ์ ์ธ๋์ด ๋ชจ๋ proc ๋งคํฌ๋ก(์: quote!(use foo::bar);
)์์ ์๋์ผ๋ก ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์ด์จ๋ extern crate
๊ฐ ๋์ฌ ์์ ์ด๋ฏ๋ก 1๋จ๊ณ ํฌ๋ ์ดํธ๋ฅผ ๋ชจ๋ ์ ์ธํ๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค. Cargo.toml์ ๋ชจ๋ ๋์ ์ข
์์ฑ์ 1๋จ๊ณ์ proc-macro ํฌ๋ ์ดํธ ๋ฃจํธ ๋ฒ์์ ์๋์ผ๋ก ํฌํจ๋ฉ๋๋ค.
๋ด ์ฝ๋์์ ์ด๋ฆ ํ์ธ์ ์ ์ดํ๊ณ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ์ดํ๋ โโ๋ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก ์คํฌ์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋ ๊ฐ์ง๊ฐ ๋ถ๊ฐ๋ถ์ ๊ด๊ณ์ ์์ต๋๊น? ์๋๋ฉด ํ ๋ฒ์์ ์ด๋ฆ ํ์ธ ์ธก๋ฉด๊ณผ ๋ค๋ฅธ ๋ฒ์์ ํ/์ด ์ค๋ฅ ๋ฉ์์ง ์์น๋ฅผ ํผํฉํ๋ ๋ฒ์๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น? ๋๋ ์ด๊ฒ์ด ์ผ๋ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ด ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ๋ฉด, ๋ด ์ฌ์ฉ์ ์ ์ ํ์์ def_site ๋ด ๋ฒ์๋ก ํธ๋ ์ดํธ๋ฅผ ๊ฐ์ ธ์๊ณ ์ฌ์ฉ์ ๊ตฌ์กฐ์ฒด์ ํ๋์์ ํธ๋ ์ดํธ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๊ณ ํฉ๋๋ค. ํ๋ ์ ํ์ด ์ฌ๋ฐ๋ฅธ ํน์ฑ์ ๊ตฌํํ์ง ์์ผ๋ฉด ์ค๋ฅ ๋ฉ์์ง๊ฐ ํด๋น ๊ตฌ์กฐ์ฒด ํ๋์ ๋ฐ์ค์ ๊ธ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ปดํ์ผํ๊ณ ์คํํ๋ def_site ๋ฒ์๋ก ๋ฉ์๋ ํธ์ถ์ ์์ฑํ ์ ์์ง๋ง ์ํ๊น๊ฒ๋ ์ค๋ฅ ๋ฉ์์ง๋ ๋งคํฌ๋ก 1.1์์ ๋ณธ ๊ฒ์ฒ๋ผ ํญ์ ํ์ ์์ฑ์ ๊ฐ๋ฆฌํต๋๋ค.
|
4 | #[derive(HeapSize)]
| ^^^^^^^^
๋๋ ๊ตฌ์กฐ์ฒด ํ๋์ ident ๋๋ ์ ํ๊ณผ ๋์ผํ ๋ฒ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ํธ์ถ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ์ฌ๋ฐ๋ฅธ ๋ฐ์ค์ ํ์ํ์ง๋ง def_site์ ๋ฒ์ ๋ด ํน์ฑ์ ํ์ธํ๋ ๋ฐ ์คํจํฉ๋๋ค.
|
7 | bad: std::thread::Thread,
| ^^^^^^^^^^^^^^^^^^^^^^^^
์ด๋ป๊ฒ ํ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ํด๊ฒฐํ๊ณ ์ํ๋ ๋ฐฉ์์ผ๋ก ์ค๋ฅ๋ฅผ ํ์ํ ์ ์์ต๋๊น?
@dtolnay ํ๋ฅญํ ์ง์ ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
https://github.com/rust-lang/rust/issues/46489 ๋ฅผ ์์ ํ๋ ์ ์ ํ ๋ฐฉ๋ฒ์ ์์ฑ๋ #[derive(โฆ)]
ํ ํฐ์ด ๋์ผํ ์ด๋ฆ-ํด์๋ ๋ฒ์๋ฅผ ๊ฐ๋๋ก ๋ง๋๋ ๊ฒ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฒ์๋ฅผ ์ ํ ์ ์๋ก ์ฌ์ฉํ๊ณ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์์ฑํ quote! {}
๋งคํฌ๋ก ํธ์ถ ์ ์ค๋ฅ ๋ฉ์์ง ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค.
ํ์ฌ ์์์ ๊ดํ ์ด์ผ๊ธฐ๋ ๋ฌด์์ ๋๊น? ๋๋ (4 ๊ฐ์ ์ ) ์๋ํ๋ ์ ์ฐจ ๋งคํฌ๋ก์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ง๋ง Rustc 1.24.0-nightly (b65f0bedd 2018-01-01) ํ์ฌ ๋ฒ์์์ ์ธ์๋ฅผ ์ฐพ์ ์ ์๋ค๊ณ ๋ถํํฉ๋๋ค.
์ฃ์กํฉ๋๋ค. ์ด์ ํธ๋์ปค๋ฅผ ๋จผ์ ๊ฒ์ํ์ด์ผ ํ๋๋ฐ ๋ฐฉ๊ธ https://github.com/rust-lang/rust/issues/46489๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒ ๊ฐ์ต๋๋ค
๋๋ ํ์ฌ ํ์(์ญ์ง๋ ฌํ)์ ์ฌ๋ฐ๋ฅธ ๊ตฌํ์ ์ฐจ๋จํ๋ค๊ณ ์๊ฐํ๋ #47311์ ์ ์ถํ์ต๋๋ค. ์ ์ฐจ์ ๋งคํฌ๋ก๋ ๊ฐ์ธ ํ๋๊ฐ ์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
self.0
์ ๊ฐ์ ๋ช
๋ช
๋์ง ์์ ํํ ๊ตฌ์กฐ์ฒด ํ๋์ ๋ํ ์ก์ธ์ค๋ self.x
์ ๊ฐ์ ๋ช
๋ช
๋ ๊ตฌ์กฐ์ฒด ํ๋์ ๋ํ ์ก์ธ์ค์ .
ํ ํฐ์ ๋ฒ์์ ๋ํ ์๊ตฌ ์ฌํญ์ด ๋ค๋ฅธ #47312๋ฅผ ์ ์ถํ์ต๋๋ค
์์ ๋ PR์ด ๊ฒํ /๋๊ธ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
์ด์ https://github.com/rust-lang/rust/pull/41029 ๊ฐ ์๋ฃ๋ ๊ฒ ๊ฐ์ต๋๊น?
๊ทธ PR์ ํฌ๊ธฐํ์ง๋ง ๋์ด์๋ฌ๊ณ #48465์์ ๊ณ์ ์์ ํ๊ณ ์์ต๋๋ค. ํ์ฌ Crater์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
@petrochenkov @nrc
syntax::ext::expand
๋ฅผ ๋ณด๋ฉด proc_macro_attribute
๊ฐ ํ์ฌ ์ฌ๋ฌ ์ปจํ
์คํธ์์ ์ฒ๋ฆฌ๋๊ณ ์์ง ์์ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
fold_block()
๋ ๋ฉ์ฒญํ ์ง์
๋๋ค)extern {}
๋ธ๋ก ๋ด๋ถ(#48747)RFC 1566์ ์์ฑ ๋งคํฌ๋ก๋ฅผ ์ ์ฉํ ์ ์๋ ํน์ AST ๋ ธ๋ ์ข ๋ฅ๋ฅผ ๋์ดํ์ง ์์ผ๋ฏ๋ก ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ์ ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฝ๊ฐ ์ฐ์ค๊ฝ์ค๋ฌ์ธ ์ ์์ผ๋ฏ๋ก ์ฒ๋ฆฌํด์ผ ํ์ง๋ง ์ฒ๋ฆฌํ์ง ์์์ผ ํ๋ ๊ฒ๊ณผ ์์ฑ์ด ํ์ฉ๋์ด์๋ ์ ๋์ง๋ง ํ์ฌ ํ์ฉ๋ ์ ์๋ ์์น๋ฅผ ๋ช ํํ๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค(#43988).
@abonander ์๋๋ proc ๋งคํฌ๋ก ์์ฑ์ด ์ผ๋ฐ ์์ฑ์ด ์์ ์ ์๋ ๊ณณ์ด๋ฉด ์ด๋๋ ์ง ์ฌ์ฉํ ์ ์๊ณ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์์ ๋ชจ๋ ์ฌํญ์ ํฌํจํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(์ผ๋ถ๋ ์์ ์ ์ด์ง ์๊ณ proc ๋งคํฌ๋ก๋ฅผ ์์ ํํ๋ค๋ฉด ๋ค๋ฅธ ์์ฑ์ ๋ํด ์์ ์ ์ธ ์ฉ๋๋ง ์์ ํ).
@nrc ๋ ์์ฑ์ด ๋ชจ๋ ํญ๋ชฉ์ ์ ์ฉ๋ ์ ์๋ค๋ ์ฐธ์กฐ ๋ง ํ์๋๊ธฐ ๋๋ฌธ์ ํด๋น ์์น๋ฅผ ์ด๊ฑฐํ๋ ๋ชจ๋ ์์น์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฆฐํธ ์์ฑ์ด ๋ธ๋ก๊ณผ ๋ช ๋ น๋ฌธ์๋ ์ ์ฉ๋ ์ ์๋ค๊ณ ๊ฑฐ์ ํ์ ํฉ๋๋ค.
@nrc ๋ ์์ฑ์ด ๋ชจ๋ ํญ๋ชฉ์ ์ ์ฉ๋ ์ ์๋ค๊ณ ์ฐธ์กฐ์ ๋ช ์๋์ด ์๊ธฐ ๋๋ฌธ์ ํด๋น ์์น๋ฅผ ์ด๊ฑฐํ๋ ๋ชจ๋ ์์น์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฆฐํธ ์์ฑ์ด ๋ธ๋ก๊ณผ ๋ช ๋ น๋ฌธ์๋ ์ ์ฉ๋ ์ ์๋ค๊ณ ๊ฑฐ์ ํ์ ํฉ๋๋ค.
afaik์ ์์ต๋๋ค. ๋ชจ๋ ํํ์์ ์์ฑ์ ๋ํด ํ์ฉ๋๋ RFC ๋ฐ ๋ถ์์ ํ ๊ธฐ๋ฅ ํ๋๊ทธ๊ฐ ์์ง๋ง ๋ช ๋ น๋ฌธ ๋ฐ ๋ธ๋ก์์๋ง ์์ ํ๋ ๊ฒ์ผ๋ก ์๊ฐํฉ๋๋ค. ์ฐธ์กฐ์ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.
์ด ๋ฌธ์ :
์์ ์ฑ ๊ฒ์ฌ(proc-) ๋งคํฌ๋ก(๋ฌธ์ #34079).
์ด์ WRT ํ๋ก์์ ๋งคํฌ๋ก๊ฐ ๋ซํ๋๋ค. ๋ด PR์ Macros 2.0 ๋งคํฌ๋ก์ ๋ํ ์์ ์ฑ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์ฌ์ ํ ์ด๋ ค ์์ต๋๋ค(๋น๋ก ์๋ก์ด ๋ฌธ์ ์ผ ์ ์์ง๋ง).
@rfcbot fcp ๋ณํฉ
์ ๋ Rust 1.28 ๋ฆด๋ฆฌ์ค๋ฅผ ์ํด ๋งคํฌ๋ก 2.0 ์ด์ผ๊ธฐ์ ํ์ ์งํฉ ์ ๋งคํฌ๋ก 1.2๋ก ์์ ํํ ๊ฒ์ ์ ์ํ๊ณ ์ถ์ต๋๋ค. Rust 1.28์ 2018๋ 5์ 10์ผ ๋ฐค์ ์์๋๊ณ (์ด ๊ธ์ ์์ฑํ ํ ~2.5์ฃผ) 2018๋ 8์ 2์ผ์ ์์ ํ๋ ๊ฒ์ ๋๋ค. FCP๊ฐ 5์ 10์ผ ๋ฒ ํ์ ๋ค์ด๊ฐ๋ 1.27 ์ปท์คํ ์ ์ ์๋ฃ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ณด๋ฅํ๊ณ ์ถ์ต๋๋ค. ์ปท์คํ๊ฐ ๋ฐ์ํ ๋๊น์ง ์ฌ๊ธฐ์์ ๋ชจ๋ ์์ ํ๋ฅผ ๋๊ณ 1.28 ๋ฆด๋ฆฌ์ค๋ก ์ฐ๊ธฐํ์ญ์์ค.
์ด๊ฒ์ @petrochenkov์ ์ํด ๋ฑ๋ก๋ ๋ง์ ๋ฌธ์ ์ ํจ๊ป ์ต๊ทผ ๋ด๋ถ ์์
์ด๊ฒ์ด ๋ถ๋ถ์งํฉ ์ด๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์ฌ๊ธฐ์ ๊ธฐ๋ฅ์ด ์๋ค๊ณ ํด์ ์ปดํ์ผ๋ฌ์์ ์์ ํ๋๊ฑฐ๋ ์ ๊ฑฐ๋์ง ์๋๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ์คํ๋ ค ์ด ๊ธฐ๋ฅ์ ์ด ์์ ํ ๋จ๊ณ๊ฐ ์ ์๋ ์ดํ์๋ ๋ถ์์ ํ ์ํ๋ฅผ ์ ์งํ์ฌ ๋์ค์ ์์ ํ๋ ๊ฒ์ ๋๋ค.
์ฃผ๋ก https://github.com/rust-lang/rust/issues/35896 ๋ฐ ํ์ฌ ์ ์ฉ๋จ
FCP๋ฅผ ์๋ฃํ ์ฃผ์ ์์ด๋์ด๋ use
๋ฌธ์ ์ฌ์ฉํ์ฌ
๋งคํฌ๋ก๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋:
use some_proc_macro_crate::bar;
#[bar]
fn baz() {}
๋๋
use some_proc_macro_crate::bar;
bar!();
๋๋
pub use some_proc_macro_crate::bar; // reexport an attribute or macro
์ด๊ฒ์ Rust์ ์ธ ๋ฒ์งธ ๋ค์์คํ์ด์ค๋ฅผ ๋์
ํฉ๋๋ค(๊ฐ/์ ํ ์ถ๊ฐ
๋ค์์คํ์ด์ค), ๋งคํฌ๋ก ๋ค์์คํ์ด์ค. ์์ฑ, macro_rules ๋ฐ ์ ์ฐจ
๋งคํฌ๋ก๋ ๋ชจ๋ maro ๋ค์์คํ์ด์ค์ ์์ต๋๋ค.
๋ณธ๊ฒฉ์ ์ธ ๋ชจ๋ ์์คํ
๊ณผ์ ์ฐจ์ด์ ์ ๋จ ํ๋์ ์์ ๊ฒฝ๋ก๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.๋งคํฌ๋ก .
์๋ฅผ ๋ค์ด #[foo::bar]
๋๋ ::bar::baz!()
๋ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ฒ
์ ํ์ ์ธ์ ๊ฐ ํด์ ๋ ์ ์์ง๋ง ์ด๊ฒ์
์์ํฉ๋๋ค.
์์ฑ ์ ๋ชจ๋์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉํ ์ ์์ต๋๋ค.ํญ๋ชฉ .
์ฌ๊ธฐ์ "ํญ๋ชฉ"์๋ ํน์ฑ ํญ๋ชฉ, impl ํญ๋ชฉ ๋ฐ ์ธ๋ถ ๋ชจ๋๊ณผ ๊ฐ์ ํญ๋ชฉ์ด ํฌํจ๋ฉ๋๋ค.
ํญ๋ชฉ. ๋ชจ๋ ํ์ฅ์ ์์ ๋ฐ
๊ตฌํ ๊ฒฐ๊ณผ. ์ด๊ฒ์ ์ง์ ํ๊ณ ์์ ํํ๋ ๊ฒ์ด ๋จ์ ์์ต๋๋ค.
๋์ค ๋ ์ง.
๋ช
๋ น๋ฌธ ๋ฐ ํํ์ ์์ฑ ๋งคํฌ๋ก๋ ์์ง ์์ ์ ์ด์ง ์์ต๋๋ค. ์ด๊ฒ์
์ฃผ๋ก ํํ ์์ค์์ ์์์ด ์ค์ ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค(
์์ดํ
๋ ๋ฒจ๊ณผ ๋ฐ๋). ์ด๋ ์ถํ ์์ ํ๋ฅผ ์ํด ๋จ๊ฒจ๋ก๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์ฑ ๋งคํฌ๋ก ์๋ ๋ด๋ถ์ ์ธ์๊ฐ ์์ด์ผ ํฉ๋๋ค.๊ตฌ๋ถ์ .
์: #[foo]
, #[foo(bar)]
๋ฐ #[foo { bar baz ... @ | ^ hello }]
์ ํจํ ํธ์ถ์
๋๋ค. #[foo = "baz"]
, #[foo bar]
, ๋๋
#[foo ... = ( baz )]
๋ ์ฒ์์๋ ์์ ์ ์ด์ง ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ํ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก proc-macro
ํฌ๋ ์ดํธ ์ ํ ํฌ๋ ์ดํธ์ ์ ์๋ฉ๋๋ค.
์ ์ฐจ์ ๋งคํฌ๋ก์ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
extern crate proc_macro;
use proc_macro::TokenStream;
/// Invoked as `foo!()`
///
/// When invoked as `foo!(a b ( c ))` then the `TokenStream`
/// here will be `a b ( c )`.
///
/// The invocation is replaced with the `TokenStream` returned
#[proc_macro]
pub fn foo(a: TokenStream) -> TokenStream {
// ...
}
/// Invoked as `#[bar]`
///
/// The first argument, `attr`, is the token stream inside of the attribute
/// itself. The second argument, `item`, is the token stream corresponding to
/// the item the attribute is attached to.
///
/// An attribute of the form `#[bar ( a b [ c ] )]` will have the `attr`
/// argument look like `a b [ c ]`. Note the lack of delimiters passed to
/// `attr`! An API may later be added to learn what delimiter a macro was
/// invoked with.
///
/// The `item` here is a tokenified version of the original item.
///
/// The return value here will contain all non-expanded attributes as well for
/// this attribute to inspect. The return value replaces the original item.
#[proc_macro]
pub fn bar(attr: TokenStream, item: TokenStream) -> TokenStream {
// ...
}
์์์ ์ฌ์ฉ์ ์ ์ ์์ฑ๊ณผ ๋งคํฌ๋ก๋
ํญ๋ชฉ ์ปจํ
์คํธ, ํนํ
์ฆ, ์๋ก์ด AST ํญ๋ชฉ์ ์์ฑํ๋ ์์์ ๋ํด์๋ง ๊ฑฑ์ ํ๋ฉด๋ฉ๋๋ค.
๋
ธ๋.
์ ํ๋ชฉ์ ์์ ์ํ๋ ํ์ฌ macro_rules!
์ ๋์ผํฉ๋๋ค. ๊ทธ๋ค์ ํ ๊ฒ์ด๋ค
์์์ ์ด์ง ์๋ค. AST์ ์ถ๊ฐ๋ ์ ํญ๋ชฉ์ ๋ค์๊ณผ ๋์ผํ ๋ค์์คํ์ด์ค์ ๋ค์ด๊ฐ๋๋ค.
๋ชจ๋์ ๋ค๋ฅธ ํญ๋ชฉ.
proc_macro
API.์ด ๋ชจ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ๋ค์ ํ๋ฉด์ ์ด ์์ ํ๋ ๊ฒ์
๋๋ค.
proc_macro
์์:
pub struct TokenStream(_);
impl TokenStream {
pub fn empty() -> TokenStream;
pub fn is_empty(&self) -> bool;
}
impl Clone for TokenStream { ... }
impl Debug for TokenStream { ... }
impl Display for TokenStream { ... }
impl FromStr for TokenStream { ... }
impl From<TokenTree> for TokenStream { ... }
impl FromIterator<TokenTree> for TokenStream { ... }
impl FromIterator<TokenStream> for TokenStream { ... }
impl !Send for TokenStream { ... }
impl !Sync for TokenStream { ... }
impl IntoIterator for TokenStream {
type Item = TokenTree;
type Iter = token_stream::IntoIter;
}
pub mod token_stream {
pub struct IntoIter(_);
impl Iterator for IntoIter {
type Item = ::TokenTree;
}
}
pub enum TokenTree {
Op(Op),
Term(Term),
Literal(Literal),
Group(Group),
}
impl TokenTree {
pub fn span(&self) -> Span;
pub fn set_span(&mut self, span: Span);
}
impl Clone for TokenTree { ... }
impl Debug for TokenTree { ... }
impl Display for TokenTree { ... }
impl From<Op> for TokenTree { ... }
impl From<Term> for TokenTree { ... }
impl From<Literal> for TokenTree { ... }
impl From<Group> for TokenTree { ... }
impl !Send for TokenTree { ... }
impl !Sync for TokenTree { ... }
pub struct Span(_);
impl Span {
pub fn call_site() -> Span;
}
impl Clone for Span { ... }
impl Copy for Span { ... }
impl Debug for Span { ... }
impl !Send for Span { ... }
impl !Sync for Span { ... }
pub struct Group(_);
pub enum Delimiter {
Parenthesis,
Brace,
Bracket,
None,
}
impl Group {
pub fn new(delimiter: Delimiter, stream: TokenStream) -> Group;
pub fn stream(&self) -> TokenStream;
pub fn delimiter(&self) -> Delimiter;
pub fn span(&self) -> Span;
pub fn set_span(&mut self, span: Span);
}
impl Clone for Group { ... }
impl Debug for Group { ... }
impl Display for Group { ... }
impl !Send for Group { ... }
impl !Sync for Group { ... }
impl Copy for Delimiter { ... }
impl Clone for Delimiter { ... }
impl Debug for Delimiter { ... }
impl PartialEq for Delimiter { ... }
impl Eq for Delimeter { ... }
pub struct Term(_);
impl Term {
pub fn new(s: &str, span: Span) -> Term;
pub fn span(&self) -> Span;
pub fn set_span(&mut self, span: Span);
}
impl Copy for Term { ... }
impl Clone for Term { ... }
impl Debug for Term { ... }
impl Display for Term { ... }
impl !Send for Term { ... }
impl !Sync for Term { ... }
pub struct Op(_);
pub enum Spacing {
Alone,
Joint,
}
impl Op {
pub fn new(op: char, spacing: Spacing) -> Op;
pub fn op(&self) -> char;
pub fn spacing(&self) -> Spacing;
pub fn span(&self) -> Span;
pub fn set_span(&mut self, span: Span);
}
impl Debug for Op { ... }
impl Display for Op { ... }
impl Clone for Op { ... }
impl Copy for Op { ... }
impl !Send for Op { ... }
impl !Sync for Op { ... }
impl Copy for Spacing { ... }
impl Clone for Spacing { ... }
impl Debug for Spacing { ... }
impl PartialEq for Spacing { ... }
impl Eq for Spacing { ... }
pub struct Literal(_);
impl Literal {
// panic on infinity and NaN
pub fn f{32,64}_{un,}suffixed(f: f{32,64}) -> Literal;
pub fn i{8,16,32,64,128,size}_{un,}suffixed(n: i{8,16,32,64,128,size}) -> Literal;
pub fn u{8,16,32,64,128,size}_{un,}suffixed(n: u{8,16,32,64,128,size}) -> Literal;
pub fn string(s: &str) -> Literal;
pub fn character(c: char) -> Literal;
pub fn byte_string(b: &[u8]) -> Literal;
pub fn span(&self) -> Span;
pub fn set_span(&mut self, span: Span) -> Span;
}
impl Clone for Literal { ... }
impl Debug for Literal { ... }
impl Display for Literal { ... }
impl !Send for Literal { ... }
impl !Sync for Literal { ... }
์ด API์ ๋ํ ์์ธํ ๋ด์ฉ์ ์จ๋ผ์ธ ๋๋ ์๋ณธ ์์ ์ฐพ์ ์ ์์ต๋๋ค.
๋งคํฌ๋ก 1.1 ๋ฐ ๋งคํฌ๋ก 2.0 ์์คํ
์ ์ ์ฒด์ ๊ฑธ์ณ ๊ด๋ฒ์ํ๊ฒ dogfood๋์์ต๋๋ค.
๊ฝค ์ค๋ซ๋์ ์ํ๊ณ. ํนํ ์ด ์ ์ฒด ์ ์์
proc-macro2
ํฌ๋ ์ดํธ ์ 0.3 ๋ฆด๋ฆฌ์ค๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ด ๊ด๋ฒ์ํ๊ฒ ํ
์คํธ๋์์ต๋๋ค.
syn
ํฌ๋ ์ดํธ ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ํ
์คํธ๋ฅผ ํตํด ๋ง์ ๋ฒ๊ทธ๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์๋ณ ๋ฐ ๊ณ ์ ๋์์ผ๋ฉฐ ํ์ฌ ์์คํ
์
์์ ๋. (๋ฒ๊ทธ๊ฐ ์๋ค๋ ๋ง์ ์๋๋๋ค!)
ํ์ @alexcrichton ์ด ์ด๋ฅผ ๋ณํฉํ ๊ฒ์ ์ ์ํ์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ ํ๊ทธ๊ฐ ์ง์ ๋ ๋๋จธ์ง ํ์ด ๊ฒํ ํ๋ ๊ฒ์ ๋๋ค.
ํ์ฌ ๋์ด๋ ์ฐ๋ ค ์ฌํญ์ด ์์ต๋๋ค.
๊ณผ๋ฐ์์ ๊ฒํ ์๊ฐ ์น์ธํ๊ณ ๋ฐ๋ํ์ง ์์ผ๋ฉด ์ต์ข ์๊ฒฌ ์ ์ถ ๊ธฐ๊ฐ์ด ์์๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค์ ์ด๋ ์์ ์์๋ ์ ๊ธฐ๋์ง ์์ ์ฃผ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ ค์ฃผ์ธ์!
ํ๊ทธ๊ฐ ์ง์ ๋ ํ ๊ตฌ์ฑ์์ด ๋์๊ฒ ์ค ์ ์๋ ๋ช ๋ น์ ๋ํ ์ ๋ณด๋ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
cc @rust-lang/compiler, ์ฌ๋ฌ๋ถ๋ ์ด์ ๋ํด ๋งค์ฐ ๊ด์ฌ์ด ๋ง์ผ๋ ์ธ์ ๋ ์ง ์ด์๋ฅผ ์ ๊ธฐํด ์ฃผ์ญ์์ค. ์ฐจ๋จ ์ด์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฑ๋กํ ์๋ ์์ต๋๋ค.
์์ ํ๋ฅผ ์ํด ์ ์๋ API๋ฅผ ์ฌ์ฉํ์ฌ proc ๋งคํฌ๋ก๋ ๋ชจ๋ ์ข
๋ฅ์ ํ ํฐ์ ์ฝ๊ฒ ์์ฑํ๊ฑฐ๋ ์
๋ ฅ์์ ์ถ๋ ฅ์ผ๋ก ๋ณต์ฌํ ์ ์์ง๋ง ํ๋ฉด ์์ค์์๋ ํ ํฐ ์คํธ๋ฆผ์ ์ฝ๊ฒ ๊ฒ์ฌํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์๋ฅผ ๋ค์ด Literal
๋ Eq
๋๋ PartialEq
๊ตฌํํ์ง ์์ต๋๋ค. ํน๋ณํ ์ด์ ๊ฐ ์๋์? (๊ทธ๊ฒ๋ ๊ฐ์ ์ถ์ถํ๊ณ ์ฝ๋์์ ์ฒ๋ฆฌํ๋ ๋์ ์ง์ ๋ ์์ ๊ฐ๊ณผ์ ๋น๊ต๋ง ํ์ฉํฉ๋๋ค.)
TokenStream
์ฃผ์ด์ง๋ฉด proc ๋งคํฌ๋ก ๊ตฌํ ๋ด๋ถ์์ proc ๋งคํฌ๋ก๋ ๋ฆฌํฐ๋ด์ ๊ฒ์ฌํ๊ธฐ ์ํด ๋ฌด์์ ํ ์ ์์ต๋๊น? ๋๋ ๊ทธ ๋ฌธ์ ์ ๋ํด 1์ ๊ฐ์ ์ถ์ถํฉ๋๊น? ์ด๊ฒ์ ๋จ์ํ ์์ง ์ง์๋์ง ์์ต๋๊น? ํฅํ ์ง์ํ ๊ณํ์ด ์์ต๋๊น?
(์ ์๋ ํ์ ์งํฉ์ ์์ ํ๋ฅผ ์ฐจ๋จํ๋ ค๋ ๊ฒ์ด ์๋๋๋ค. ํด๋น ํ์ ์งํฉ๊ณผ ์๋๋ ๊ธฐ๋ฅ์ ๋ ์ ์ดํดํ๊ณ ์ถ์ต๋๋ค.)
@alexcrichton ์ ํญ๋ชฉ์
์์์ ์ด์ง ์๋ค. AST์ ์ถ๊ฐ๋ ์ ํญ๋ชฉ์ ๋ค์๊ณผ ๋์ผํ ๋ค์์คํ์ด์ค์ ๋ค์ด๊ฐ๋๋ค.
๋ชจ๋์ ๋ค๋ฅธ ํญ๋ชฉ.
์ ๋ Rust ํต์ฌ ํ์ ์ํด ์์ง ์๊ณ ๊ณผ๊ฑฐ์ ๋ชจ๋ ํ ๋ก ์ ์ฒ ์ ํ ์ดํด๋ณด์ง๋ ์์์ง๋ง ์ด๊ฒ์ ๋์๊ฒ ์ ๋ง ๋์๊ฒ ๋ค๋ฆฝ๋๋ค. ๋งคํฌ๋ก๊ฐ ๋งคํฌ๋ก์์๋ง ์ก์ธ์คํ ์ ์๋ ๋์ฐ๋ฏธ ํญ๋ชฉ์ ์์ฑํ๋ ค๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํฉ๋๊น?
์์์ ๋ฒ๋ฆฌ๋ ๊ฒ๋ณด๋ค ์์ ํ 100% ์์์ ์ํํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํ์ง๋ง ๋งคํฌ๋ก๊ฐ ํน์ ๋ณ์์ ๋ํด ์์์ ๋ช ์์ ์ผ๋ก ์ตํธ์์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
@joshtriplett ๋ฆฌํฐ๋ด์ Display impl์ ์ฌ์ฉํฉ๋๋ค.
@joshtriplett ์ @dtolnay๊ฐ ์ธ๊ธํ๋ฏ์ด literalext ์ ๊ฐ์ ์์๊ฐ ๊ตฌ์ถ๋๋ Display
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก API๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ผ๋ฅ API๊ฐ ์๋๋ผ "์ต์ํ์" ์์ค์ผ๋ก ์ฌ์ฉํ๋๋ก ๋์ด ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ์๋ง๋ ๋์ค์ ์ฌ ๊ฒ์
๋๋ค!
์ด ์์ ํ ๋จ๊ณ๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก( Display
๊ฒฝ์ฐ Literal
๋ฐ ์ด๋ฅผ ํด์ํ ๋ค๋ฅธ ๊ฒ์ ์์)๋ฅผ ํฌํจํ๋ ์ต์ํ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ ์๋ฏธ์์ "์ต๋ํ ์ต์ํ"ํ๊ธฐ ์ํ ๊ฒ์
๋๋ค. ).
@Pauan ์ข์ง ๋ ์์ง๋ง macro_rules!
์ ์ ํํ ๋์ผํฉ๋๋ค. ์ด ํ๊ณ ์ถ์ง๋ง ์์ง ์ค๋น๊ฐ ๋์ง ์์์ต๋๋ค. Span::call_site()
์์ฑ์๋ ์ฌ๊ธฐ์์ "์์ ์์"์ ์์ฒญํ๋ ํต์ฌ ํ์
๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ๋ ๋ง์ ์ต์
์ ์์ ํํ ๊ฒ์
๋๋ค.
๋ถํํ๋ "์์ ํ 100% ์์"์ ๋ช ๋ ์ด ๋จ์๊ณ ์ด ์ ์์ ๋ชฉ์ ์ Rust 2018์์ ์์ ์ ์ธ ๊ฒ์ ์ป๋ ๊ฒ์ ๋๋ค.
@alexcrichton ๊ทธ๋์ ์ง๊ธ ์์์ ์ธ โโ๊ตฌ๋ฉ์ผ๋ก ๊ทธ๊ฒ์ ์์ ํ์ํจ ๋ค์ ๋ช ๊ฐ์ ์๋/์๋/์๋์ ์ด ๋์ค์ ๊ทธ ์์์ ์ธ โโ๊ตฌ๋ฉ์ ๊ณ ์น ๊ณํ์ ๋๊น?
Span::call_site()
์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ง๊ธ ์์ ํ ์์์ ๊ฐ์ง ์ ์๋ ์ด์ ๊ฐ ์์ต๋๊น? ์ธ๋ ฅ/์๊ฐ์ด ๋ถ์กฑํฉ๋๊น, ์๋๋ฉด RFC์์ ๊ตฌ์ฒดํํด์ผ ํ๋ ์ด๋ก ์ /์๋ฏธ๋ก ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
@Pauan ์ ์ค๋๋ ์ด๋ฏธ ์กด์ฌํ๋ค๋ ์๋ฏธ์์ ์ค์ "๊ตฌ๋ฉ"์ด ์์์ ๋ฐ๋ณตํฉ๋๋ค. ์ด๊ฒ์ macro_rules!
๋ฐ ์ฌ์ฉ์ ์ ์ ํ์๊ณผ ์ ํํ ๋์ผํ ์์ ์ด์ผ๊ธฐ์
๋๋ค. ์ด ์ ์์ ์๋ก์ด ๊ฒ์ ๋์
ํ๋ ๊ฒ์ด ์๋๋ผ ์ฌ์ค์ ๊ทธ ํ์ฅ์
๋๋ค.
"์๋ฒฝํ ์์ ์ด์ผ๊ธฐ"๊ฐ ์ฃผ์ด์ง๋ฉด ์ฐ๋ฆฌ๋ ํญ์ ์ด๋ค ํํ์ ์ ํ ํด์ ๋ฅผ ์ํ ๊ฒ์
๋๋ค. ํ์ฌ ํด๋น ์ตํธ์์์ Span::call_site()
(ํจ๊ณผ์ ์ผ๋ก). ์ฐ๋ฆฌ๋ ์์์ ์ํ ์ตํธ์์ ๋ฉ์ปค๋์ฆ๋ง ์์ ํํ๊ณ ์๋ค๋ ์ฌ์ค๋ง ์์ ํํ๋ฉด ๋ฉ๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ํ์ํ ๊ฒฝ์ฐ ํญ๋ชฉ์ ์์ ํ ์์์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ๋ ๋ง์ ๊ธฐ๋ฅ์ ์์ ํํ ๊ฒ์
๋๋ค.
์์์ ์์ ํํ๋ ๊ฒ์ ํจ์ฌ ๋ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ต๋๋ค. (AFAIK) ํด๊ฒฐ๋์ง ์์ ์ฐ๊ตฌ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ธ๋ ฅ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
@dtolnay ์,
cc @rust-lang/compiler, ์ฌ๋ฌ๋ถ๋ ์ด์ ๋ํด ๋งค์ฐ ๊ด์ฌ์ด ๋ง์ผ๋ ์ธ์ ๋ ์ง ์ด์๋ฅผ ์ ๊ธฐํด ์ฃผ์ญ์์ค. ์ฐจ๋จ ์ด์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฑ๋กํ ์๋ ์์ต๋๋ค.
์์ง ๊ฒํ ํด์ผ ํ ๋ช ๊ฐ์ง ์ฌํญ๊ณผ ๋ช ๊ฐ์ง proc-macro API ์กฐ์ ์ด ์งํ ์ค์ธ PR์ด ์์ต๋๋ค.
์ด๊ฒ์ macro_rules์ ๋๊ฐ์ ์์ ์ด์ผ๊ธฐ์ ๋๋ค! ๋ฐ ์ฌ์ฉ์ ์ ์ ํ์.
๋ฌผ๋ก , ํ์ง๋ง ๋ชฉํ ์ค ํ๋๋ ๋ ๋์ ๋งคํฌ๋ก ์์คํ ์ ๋ง๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด(๊ณ ์ฅ๋๊ณ ์ ํ๋) ์์คํ ์ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ๋์๊ฒ ๊ทธ๋ค์ง ์ค๋๋ ฅ์๊ฒ ๋ค๋ฆฌ์ง ์์ต๋๋ค.
"์๋ฒฝํ ์์ ์ด์ผ๊ธฐ"๊ฐ ์ฃผ์ด์ง๋ฉด ์ฐ๋ฆฌ๋ ํญ์ ์ด๋ค ํํ์ ์ ํ ํด์ ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
๋ฌผ๋ก , ํ์ง๋ง ์ ์์ ์ ์ํ๋ ๊ฒฝ์ฐ Span::call_site()
๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๊นจ๊ณ (๋ฐ๋ผ์ macro_rules!
๊ธฐ๋ฅ์ ์ป์ ์ ์์ผ๋ฏ๋ก) ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ ์ผ๋ก ๋ง๋ค๋ฉด ์์๊ณผ ์์์ ๋ชจ๋ ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋น์์์ . ๋ฐ๋ฉด ๋น์์ ์ํ๋ก ์์ ํ๋๋ฉด ๋น์์ ์ํ ๋ก๋ง ๊ณ ์ ๋ฉ๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ํ์ํ ๊ฒฝ์ฐ ํญ๋ชฉ์ ์์ ํ ์์์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ๋ ๋ง์ ๊ธฐ๋ฅ์ ์์ ํํ ๊ฒ์ ๋๋ค.
์คํ๋ ค ์ฑ๊ฐ์ (ํผ๋) ๋ฐ์ฐฝ๊ณ ๊ฐ์ ๊ทธ ์๋ฆฌ : PROC ๋งคํฌ๋ก๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ (ํ์ง๋ง ํญ๋ชฉ)์์ ์์ ๊ฒ์ ๋๋ค,ํ์ง๋ง ๋น์ ์ ๋ค์ ํญ๋ชฉ์ ๋ํ ์์์ ์์ ๊ฑฐ๋ถ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๊ฐ ์ดํดํ๊ณ ์๋ ๊ฒ์ด ๋ง์ต๋๊น?
(AFAIK) ํด๊ฒฐ๋์ง ์์ ์ฐ๊ตฌ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ธ๋ ฅ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
์๊ฒ ์ต๋๋ค. ์ถฉ๋ถํฉ๋๋ค. ๋๋ ํธ์์ ์ค์ฉ์ฃผ์์ ๋ํ ์ด๋ง์ ์ดํดํฉ๋๋ค. ์ธ์ ๊น์ง๋ ๊ณํ์ด ๊ฒฐ๊ตญ ๋์ค์ ์๋ / ์๋ / ํ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณ ์ฒด ์์์ ๊ฐ์ง๊ณ ์๋ ํ, ๋๋ ์ผ์์ ์ผ๋ก ๋์ ์์์ ๊ฐ์ง ๊ด์ฐฎ์. ๋๋ ์ฐ๋ฆฌ๊ฐ ๋์ค์ ํํํ ๋ฌด์ธ๊ฐ๋ฅผ ์์ ํํ๊ธฐ๋ฅผ ์ํ์ง ์์ ๋ฟ์ ๋๋ค.
์ด๋ค ์๋ฏธ์์, ์ด๋ฏธ "๊ธฐ๋ณธ์ ์ผ๋ก ์์์,"์ด ๊ธฐ๋ณธ์ด ์์ง ์ง์๋์ง ์์ต๋๋ค ๋จ์ง์
๋๋ค์ด๋ค. Span::call_site
๋ ์ ํ ํด์ ์
๋๋ค. :)
@Pauan @alexcrichton์ด ๋งํ ๊ฒ์ ์์ธํ ์ค๋ช ํ๋ ค๋ฉด
์๋ณ์๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ์์ ์ ๋ณด๊ฐ ํฌํจ๋ Span
๊ฐ ํ์ํฉ๋๋ค. ( Term::new
)
์์ผ๋ก ์ฐ๋ฆฌ๋ ๋ค์ํ ์์ ์ต์
์ ๋ฐ์ํ๋ Span
๋ฅผ ๊ตฌ์ฑํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ๊ณต๊ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ์ ํธ์ถ์์ ๋ฒ์๋ฅผ ์ฌ์ฉํ๋ Span::call_site
๋ง ๋
ธ์ถํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด ์์ ์์คํ ์ด ์ฆ์ ์์ ํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋์ค์ ์์์ ์ถ๊ฐํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ด์ด๋ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๊ฝค ์๋ฆฌํ ํธ๋ฆญ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค!
@rpjohnst ๋ฐ๋ผ์ proc ๋งคํฌ๋ก์์ ์ ํญ๋ชฉ์ ๋ฐํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ Span::call_site
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ฟ์
๋๊น?
๊ทธ๋ ๋ค๋ฉด ์๋ฒฝํ๊ฒ ๋ค๋ฆด ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์์์ ์ค์ ๋ก ๊นจ๋ํ๊ณ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ์์ผ๋ก ๋ฏธ๋์ ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
@lfairy ์, ๋ด๊ฐ ๋ณผ, ๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๋ฐ ํ์ํ ๊ฒ์ ๊นจ๋ฌ์๋คํ์ง ์์๋ค Span::call_site
, ๋๋ ์์ ์ ๊ธฐ๋ณธ ๋น์์์ ๋ฒ์๊ฐ ์๊ฐํ๋ค. ์ค๋ช
๊ฐ์ฌํฉ๋๋ค! ๋น์ ์ด ์ณ์ต๋๋ค. ๊ทธ๊ฒ์ ๋งค์ฐ ์๋ฆฌํ ์์์์
๋๋ค.
๋ฐ๋ผ์ ๋ ์ด์ ์ด์๊ฐ ์์ต๋๋ค.
@alexcrichton
์์ฑ, macro_rules ๋ฐ ์ ์ฐจ
๋งคํฌ๋ก๋ ๋ชจ๋ maro ๋ค์์คํ์ด์ค์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก #[feature(proc_macro)]
๋ก ํ์ธํ๋๋ฐ ์ฌ๊ธฐ์ ์ค๋ช
๋ ๋๋ก ํ์ ์ค๋ฅ ์ฒด์ธ ํฌ๋ ์ดํธ์ ๋ํ ์์ ์ ์ธ ์ฝ๋์์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์์ต๋๋ค. ์ธ์ฉ๋ ๋ฌธ์ฅ์ ๋ณด๋ฉด ๋งคํฌ๋ก 1.2์์๋ ๊ณ์ ์ด์ ๊ฐ์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ ๋ง์ต๋๊น?
@Arnavion ์ค ์ด๋ฐ, #[derive]
ํ์ฅ ์ดํ๊น์ง "์์ฑ์ด ์๋๋๋ค" ์ค๋ฅ๋ฅผ ์ฐ๊ธฐํ๋ ๊ฒ์
๋๋ค.
#48644 ๋ฐ #47786์ด ์๋ฃ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๊ตฐ๊ฐ OP๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๊น?
@alexcrichton Literal
๋ฐ ์น๊ตฌ๋ค์ ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค ํ์ฉ์ ๋ํ ๋
ผ์๊ฐ ์์๋์? ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด ๋ ์ด์ ์ด๊ฑฐํ์ด ์๋๋ผ๋ ๊ฒ์ ์์ง๋ง Literal
๋ก ์์ํ ์ ์๋ ์ด์ ๊ฐ ๋ฌด์์
๋๊น?
impl Literal {
pub fn as_str(&self) -> Option<&str> {}
pub fn to_int(&self) -> Option<i64> {}
pub fn to_uint(&self) -> Option<u64> {}
pub fn to_float(&self) -> Option<f64> {}
}
๋ค๋ฅธ ๋ฆฌํฐ๋ด ํ์ ์ ํ์ ๋ํด ๋ง์ TryFrom
impls๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
@abonander ๊ทธ๊ฒ์ ๋
ผ์๋์์ง๋ง ๊ฒฐ๋ก ์ ์์ ํ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ ํ์ํ๊ฒ ๋ง๋๋ ๊ฒ๋ณด๋ค ๋์ค์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. Display
๊ตฌํ์ผ๋ก crates.io์ ๊ตฌ์ถํ ์ ์์ผ๋ฉฐ ๋์ค์ ์ถ๊ฐํ ์ฌ์ง๊ฐ ์์ต๋๋ค.
:bell: ์ ์ ์ด์ ์ต์ข ๋๊ธ ๊ธฐ๊ฐ์ ์ ์ด๋ค์์ต๋๋ค . :๋ฒจ:
@alexcrichton
proc ๋งคํฌ๋ก API ์ ํ์ ๋ํ !Send
๋ฐ !Sync
impls๋ ๋ช
์์ ์ผ๋ก ์์ฑ๋์ง ์์์ง๋ง ์ ์ถ๋์์ต๋๋ค.
์ผ๋ถ ๊ตฌ์กฐ์ฒด(์: Op
)์ ๊ฒฝ์ฐ ์ถ๋ก ๋ impl์ https://github.com/rust-lang/rust/issues/38356#issuecomment -383693017์ ์ง์ ๋ ๊ฒ๊ณผ ๋ค๋ฆ
๋๋ค.
impls๋ฅผ ๋ช
์์ ์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ๊ฒ์
๋๋ค.
์ ์ ๋ง ๊ทธ๋ ์ต๋๋ค! ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด https://github.com/rust-lang/rust/pull/50453 ์ ์ด์์ต๋๋ค.
@alexcrichton Term::as_str
์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๊ฒฉํ ๋ฒ์๋ก ์ธํด &'a Term -> &'a str
๋ฅผ ๊ตฌํํ์ฌ ๋ฒ์๊ฐ ์ง์ ๋ ๋ด๋ถ ์ง์์๊ฒ 'a
๋ฅผ ๋น๋ฆด ์ ์๋ค๋ ๋น๊ณต์ ์ฆ๊ฑฐ๋ฅผ ์ค์ผ์นํ๋ ค๊ณ ํ์ต๋๋ค.
AFAICT, Term::as_str
์ ๊ฑด์ ํ์ง๋ง 'a
์กฐ๊ฑด ๋ง ๊ฐ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด thread_local!
์ํด ์ง์ง๋๋ ์ด์ ๋ Term
๊ฐ์ ์ด์ค์ผ์ดํํ ์ ์์ง๋ง ๋งค์ฐ ๋จ๊ธฐ์ ์ธ 'a
s๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค. Term::as_str
์ฑ๊ณต, ๋ด๋ถ ๋ฒ์๋ณด๋ค ์๊ฒฉํ๊ฒ ์งง์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก proc_macro
ํ์ฅ์ด ์ผ์ด๋๋ ๋ฐฉ์ Term
๊ฐ ์ค๋ ๋ ๋ก์ปฌ์ด๊ธฐ ๋๋ฌธ์ Term
๋ฅผ ํ์ถํ๋ ๋ฐฉ๋ฒ์ ๊ฑฐ์ ์์ผ๋ฉฐ thread_local!
๋ผ๊ณ ๊ฐ์
ํ์ง๋ง Box::leak
๋ ์กด์ฌํฉ๋๋ค! ์ฌ์ ํ ๋ถ์์ ํ์ง๋ง ์ค๋ Box::leak(Box::new(term)).as_str()
๋ &'static str
๋ฐํํฉ๋๋ค. Box::leak
(cc @RalfJung)์ ์ํด ๊นจ์ง ๋ค๋ฅธ ์ถ์ํ๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
OTOH, Term
Copy
์ด๋ฏ๋ก ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ณต์กํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ Copy
์ Term
, ์ฐ๋ฆฌ๋ ๊ฒ์ผ๋ฅธ ์ ์งํ ์ Option<Cell<Rc<String>>
์์๋ค.
@eddyb oh Term::as_str
์ ์ ๊ฑฐ ์์ ์ด๋ฉฐ ์ฌ๊ธฐ ์์ ํ์ ํฌํจ๋์ง ์์์ผ๋ฏ๋ก ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค! proc-macro2
์ค๋จ๋์ง ์๋๋ก ๊ณ ์ ๋์ด ์์ง๋ง ์ผ๋จ ์์ ํ๋๋ฉด proc-macro2
๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฆด๋ฆฌ์คํ ์ ์์ต๋๋ค.
@eddyb ์ฌ๊ธฐ์ ์ปจํ
์คํธ๋ฅผ ์์ง ๋ชปํ์ง๋ง Box::leak
๋ ๋ด ๊ณต์ ๋ชจ๋ธ์์ ์ ๋นํ๋ฉ๋๋ค. ์ด๋ค ๊ธฐ์ต์ ์์ํ ์์ ํ๊ณ ์๋ค๋ฉด(์ฆ, ์์ ์์) ํ์์ด ์๋ค๊ณ ์์ ํ ๋งํ ์ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
quote!
์ด ์์ ํ๋์ง ์์ต๋๊น?quote!
์ proc_macro_non_items
๊ธฐ๋ฅ ๊ฒ์ดํธ๊ฐ ์ ์ฉ๋ฉ๋๊น? ์ด์ ์ปค๋ฐ 79630d4fdfc775b241cae0a209edec2687a29f0f ๊ฐ ํ์ํ์ง๋ง quote!
๋ ์ฌ์ ํ #[unstable(feature = "proc_macro" ...
๋ฉ๋๋ค.proc_macro_path_invoc
, proc_macro_mod
, proc_macro_expr
๋ฐ proc_macro_non_items
์ ์์ ํ๋ฅผ ์ํด ์ถ์ ๋ฌธ์ ๊ฐ ์ ์ถ๋ฉ๋๊น?๊ด๋ จ ์๋ ๋ถ์์ ์ธ ์ง๋ฌธ: quote!
๋ ์ด๋์ ๊ตฌํ๋์ด ์์ต๋๊น?
SOOO ์ฌ๋ฏธ์๋ ์ด์ผ๊ธฐ๋ฅผ @mjbshaw : ๊ทธ๊ฒ์์์ ๊ตฌํ proc_macro::quote
.
rustc_metadata
๋ proc_macro
๋ผ๋ ์ด๋ฆ์ ์์์ quote
๋ผ๋ ์ ์ฐจ ๋งคํฌ๋ก๊ฐ ๋ค์ด ์๋ ๊ฒ์ฒ๋ผ ๊ฐ์ฅํ์ง๋ง ์ฌ์ฉ๋ ๊ตฌํ์ proc_macro
rustc_metadata
์ ๋ํ ๋งํฌ.
์์ง ๊ฒํ ํด์ผ ํ ๋ช ๊ฐ์ง ์ฌํญ๊ณผ ๋ช ๊ฐ์ง proc-macro API ์กฐ์ ์ด ์งํ ์ค์ธ PR์ด ์์ต๋๋ค.
PR ๊ฒํ : https://github.com/rust-lang/rust/pull/50473
1.2 API์ ๋ํ ๊ธฐ๋ฅ ์์ฒญ: ๊บพ์ ๊ดํธ( <
/ >
)์ ๋ํ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ถ๊ฐํ์ฌ <T>
( fn foo<T>() {}
)์ ๊ฐ์ ํญ๋ชฉ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค. Group
. ์ด๋ ๊ฒ ํ์ง ์์ผ๋ฉด ์ ๋ค๋ฆญ๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ ๋ถ์์ด ๋ถํ์ํ๊ฒ ๋ณต์กํด์ง๋๋ค.
@mjbshaw ๋ ๊ฐ์ <
>
๊ฐ ์๋ก ๊ทธ๋ฃนํ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด ํ ํฐ ์์ค์์ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋งคํฌ๋ก ์
๋ ฅ์์:
m!($A<$B, $C>=$D);
์ด๊ฒ์ ๋ ๊ฐ์ ๋ถ์ธ ํํ์ $A < $B
๋ฐ $C >= $D
์ด๊ฑฐ๋, ์๋ฅผ ๋ค์ด type $A <$B,$C> = $D;
ํ์ฅํ๋ ์ ํ ๋ณ์นญ์ ์ ๋ค๋ฆญ์ ๋ํ๋ผ ์๋ ์์ต๋๋ค.
assert_both!(a<AMAX, b>=BMIN);
define_type_alias!(SwappedResult<E, T>=std::result::Result<T, E>);
OP๋ฅผ ์ฝ๊ฐ ์ ๋ฐ์ดํธํ์ง๋ง ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์์๊ณผ ๊ด๋ จ๋ ๋ ๊ฐ์ง ๊ฐ๋ฅ์ฑ ์๋ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด ์ค๋ ๋๋ฅผ ๋ฐ๋ฅด๋ ์ฌ๋๋ค์ ์ํด API๋ @petrochenkov๊ฐ ์ ์ํ https://github.com/rust-lang/rust/pull/50473 ์ ์๋ FCP ์ฃผ์์์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ง๊ธ๊น์ง์ ์์ฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Term::new
์ Term::ident
์๊ธฐ ์
๋ ฅ์ ๊ฒ์ฆTerm::lifetime
์ถ๊ฐํ๊ณ ์
๋ ฅ์ ํ์ธํ์ญ์์ค.Term::raw_ident
๋ฐ ์
๋ ฅ ํ์ธOp
์ Punct
Punct::new
์ ๋ํ ์
๋ ฅ ํ์ธOp::op
์ Punct::as_char
๋ด๊ฐ ๋ง๋ค ์์ API ์์ฒญ(#50473 -- @petrochenkov)์ TokenStream์ ํ ํฐ์ ์ถ๊ฐํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋๋ค. ํน์:
impl Extend<TokenTree> for TokenStream
๋๋ ์ด๊ฒ์ด quote::Tokens
์ ํ(๊ธฐ๋ณธ์ ์ผ๋ก Vec<TokenTree>
)์ ์ ๊ฑฐํ๊ณ ์ํ๊ณ์์ "์ผ๋ถ ํ ํฐ"์ ์๋ฏธํ๋ ๋ค์ํ ์ ํ์ ํ์ฐ์ ์ค์ด๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค -- https ์์ ์ถ์
@dtolnay์ ์ ์ ์์ +1.
์ ์ ๋ณํฉ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋ ์ต์ข ์๊ฒฌ ์๋ ด ๊ธฐ๊ฐ์ด ์ด์ ์๋ฃ๋์์ต๋๋ค .
๋ ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
์ด๋ฏธ ์ฌ๊ธฐ ์์ ๋ฌผ์๋ฏ์ด quote!
๋ฌด์์
๋๊น? ์ต์ข
TokenStream
๋ฅผ ๋ง๋๋ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น? ์๋์ผ๋ก ํด์ผ ํ๋์? ์๋๋ฉด quote
์์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น? proc_macro::quote!
๋ ๋ฏธ๋์ ์ด๋ ์์ ์์ ์์ ํ๋์ด์ผ ํฉ๋๊น?
ํจ์์ ๊ฐ์ ๋งคํฌ๋ก์ ์์ฑ๊ณผ ๊ฐ์ ๋งคํฌ๋ก๋ฅผ ์ ์ธํ๋ ๊ฒ์ ์ฐจ์ด๋ ๋จ์ง ์ธ์์ ์์ ๋ถ๊ณผํ๋ค๋ ์ ์์ ๋ด๊ฐ ์ดํดํ ๊ฒ์ด ๋ง์ต๋๊น? ์ฆ:
/// Invoked as `foo!()`
#[proc_macro]
pub fn foo(a: TokenStream) -> TokenStream {
// ...
}
/// Invoked as `#[bar]`
#[proc_macro]
pub fn bar(attr: TokenStream, item: TokenStream) -> TokenStream {
// ...
}
์ ์ผํ ์ฐจ์ด์ ์ ํ๋ ํ๋๋ฅผ ์ทจํ๋ค๋ ๊ฒ์
๋๋ค TokenStream
๋ค๋ฅธ ํ๋๋์ด ์์ ์ธ์, ๋ฑ. ์ด๊ฑด ์ข ๋ฏธ๋ฌํ์ง ์์? ๋์ #[proc_macro_attribute]
๋ฐ #[proc_macro_function_like]
๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ด๊ฒ์ ์ด๋์ ๊ฐ ๋
ผ์๋ ์ ์ด ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ๋๊ตฐ๊ฐ๊ฐ ํ ๋ก ์ ์ฐ๊ฒฐํ ์ ์๋ค๋ฉด ๊ธฐ์ ๊ฒ์
๋๋ค.
์์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! :)
@LukasKalbertodt ์์ฑ์ ํ์ฌ #[proc_macro_attribute]
์ ์ธ๋ฉ๋๋ค. ๊ณ ์์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ ์๋๊ฐ ์๋์ง FCP ์ ์์์ ์คํ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ฌธ์ : ๋ฌธ์์ด์์ ๊ตฌ๋ฌธ ๋ถ์๋ ํ ํฐ์ Span::call_site
๋ฒ์๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค. https://github.com/rust-lang/rust/issues/50050#issuecomment -390520317.
ํธ์ถ ์ฌ์ดํธ ๋ฒ์๋ฅผ ์ฌ์ฉํ๋ ํ ํฐ์ ๋ํ ๋งคํฌ๋ก ์ญ์ถ์ , ํด๋ฆฌํผ ๋ฐ ์๋์
์์์ ์์ ํ๊ธฐ ์ํด ์ด๊ฒ์ ๋ณ๊ฒฝํ๊ณ Span::call_site
๋ฐํํ๋ ๊ฒ๋ ๋ณ๊ฒฝํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@LukasKalbertodt proc_macro
ํฌ๋ ์ดํธ์ quote!
๋งคํฌ๋ก๋ ์ด FCP์ ์ผ๋ถ๋ก ์์ ํ๋์ง ์์์ง๋ง crates.io์ quote
ํฌ๋ ์ดํธ๋ ์ฌ๊ธฐ์ ์ ์๋ API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋ํ @abonander๊ฐ ์ง์ ํ๋ฏ์ด ์์ฑ ๋งคํฌ๋ก๋ #[proc_macro_attribute]
๋ก ์ ์ธ๋๊ณ #[proc_macro]
๋ foo!()
์คํ์ผ ๋งคํฌ๋ก ์ ์ฉ์ผ๋ก ์์ฝ๋ฉ๋๋ค.
#[proc_macro_attribute]
์ด๋ฆ์ #[proc_attribute_macro]
๋๋ #[attribute_proc_macro]
๋ฉ๋๊น?
@Zoxc ์ฐ๋ฆฌ๋ ์ด๋ฏธ #[proc_macro_derive]
์์ ๋์ด ์์ผ๋ฏ๋ก ์์ฑ ๋งคํฌ๋ก์ ๋ํด ์ด๋ฅผ ๋ฐ๋ฅด์ง ์๋ ๊ฒ์ด ์ด์ํ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋๋ฐ์ ์ PartialEq<char>
๋ฐ PartialEq<Punct>
์ ๋ํด Punct
(์ ์ฌ Ident
์ PartialEq
๊ตฌํ)? ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฝค ์์ ํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ PR์ ์์ฑํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ด๋์ด๊ฐ ์ค๋จ๋๋ฉด ํ๊ณ ์ถ์ง ์์ต๋๋ค.
@mjbshaw PartialEq<Punct>
๋ ์คํฌ์ ๋น๊ตํ ๊น์? PartialEq<char>
๊ด์ฐฎ์ ๋ณด์
๋๋ค. OTOH.
@eddyb PartialEq
์ ๋ํด Ident
๋น๊ตํ์ง ์์ต๋๋ค ์คํฌ (๋๋์ด PROC-macro2 ์์ค๊ฐ ์๋ PROC ๋งคํฌ๋ก ์์ค ์๊ณ ). ์คํฌ์ด ๋น๊ต์ ํฌํจ๋๋์ง ์ฌ๋ถ์ ๋ํด ๋ชจํธํ์ง๋ง Punct
๋ฐ Ident
๊ฐ ์ด์ ๊ด๋ จํ์ฌ ์ ์ฌํ๊ฒ ์๋ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. Punct
์๋ ์์ฒด Spacing
์์ต๋๋ค. ๋น๊ต ๋์์ ํฌํจ๋ ๊ฒ์
๋๋ค(๋ค๋ฅธ ์ฌ๋๋ค์ ๋ค๋ฅด๊ฒ ์๊ฐํ ์๋ ์์).
์ง๊ธ์ Punct
๋ํด PartialEq<char>
๋ง ๊ตฌํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. PartialEq<Punct>
๋ ๋์ค์ ํด์ํ ์ ์์ต๋๋ค.
@mjbshaw proc-macro2 ํฌ๋ ์ดํธ๋ proc_macro
๊ฐ ์
์คํธ๋ฆผ์ ์๋ ๊ฒ๊ณผ ์ ํํ ๊ฐ์ง ์์ proc_macro
์ถ๊ฐํ ์ ์์ง๋ง proc_macro
์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฌผ๋ก ์ญํธํ์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ต์ํ์ ๊ฒ๋ถํฐ ์์ํ๊ณ ์ผ๋จ ์์ ๋๋ฉด ๊ฑฐ๊ธฐ์์ ํ์ฅํ ์ ์์ต๋๋ค.
๋๋ ๋งคํฌ๋ก 1.2์ ๊ด๋ จ๋ ๋ชจ๋ ๋ฒ๊ทธ์ ๋ํด ๋ช ๊ฐ์ง https://github.com/rust-lang/rust/issues/50050 ์ด๋ฉฐ @petrochenkov ๊ฐ .
Gnome ํด๋์ค๋ proc_macro2/syn/quote์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ๊ณผ proc ๋งคํฌ๋ก์์ ๋ชจ๋์ ์์ฑํ๊ธฐ ์ํ ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ก ์ค๋จ๋์์ต๋๋ค. ์ง๊ธ์ ํด๊ฒฐ๋์์ต๋๋ค. ๋คํํ๋.
์ด ์์ ์ํ๊ณ์ ๋ณํ๋ฅผ ํ์ ํ๋ ค๋ฉด ์ด๋ค ๊ฒ๋ค์ ๋ชจ๋ํฐ๋งํด์ผ ํ๋์?
@federicomenaquintero ๋ถ์์ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ต์ Nightly๋ก ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ์คํจํ ๊ฒฝ์ฐ ์๋ ค์ฃผ๋ ์ผ๋ฐ CI ์์ (๋งค์ผ, ๋งค์ฃผ, ๋ฌด์์ด๋ ์ ํฉํ ์์ )์ ๊ฐ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. (Travis-CI๋ ์ค์ ์์ ์ด๋ฌํ "ํฌ๋ก ์์ " ํ์ฑํ๋ฅผ ์ง์ํฉ๋๋ค.)
@SimonSapin ๊ฐ์ฌํฉ๋๋ค, ์ข์ ์๊ฐ์ ๋๋ค. ์ฐ๋ฆฌ๋ Cargo.toml์ ํด๋น ์์์ ๋ฒ์ ์ ๊ณ ์ ํ์ง๋ง ๋ฒ์ ๋ฒํธ๋ฅผ ์ ๊ฑฐํ๊ณ Cargo๊ฐ ์ต์ ๋ฒ์ ์ ๋ค์ด๋ก๋ํ๋๋ก ํด์ผ ํ ๋์ ๋๋ค. ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋๊น?
@federicomenaquintero ์ด๊ฒ์ ์ ์ ์ฃผ์ ์์ http://users.rust-lang.org/ ์ ๊ฐ์ ๋ค๋ฅธ ๊ณณ์์ ํ์ญ์์ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ธ ๊ถ์ฅ ์ฌํญ์ ์์ฉ ํ๋ก๊ทธ๋จ( ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ๋) ์์ค ์ฝ๋์ ํจ๊ป Cargo.lock
๋ฅผ ์ ๊ณตํด์ผ ์ข
์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ณ ์ ํ ์ ์์ต๋๋ค. Cargo.toml
์์ foo = "1.2.3"
์ ๊ฐ์ ์ข
์์ฑ์ ์ ์ธํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ฉฐ ์ด๋ ์์์ ์ผ๋ก "SemVer์ ๋ฐ๋ผ ํธํ๋๋ ๊ฒฝ์ฐ ํด๋น ๋ฒ์ ์ด์"์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋์, ๋ง๋ค๊ณ ์ถ์ ์์๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๋ ์ ์ฐจ์ ๋งคํฌ๋ก ๋ฌธ์ ์ ๋ด์ฐฉํ์ต๋๋ค.
๋ค์์ ๊ณ ๋ คํ์ธ์:
#[my_attribute]
struct MyStruct {
#[other_attribute]
field: String,
}
proc_macro
๋ฐ custom_attributes
์ด ๋ชจ๋ ํ์ํ์ง๋ง ๋์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ฌ ์๋ํ์ง ์์ต๋๋ค. proc ๋งคํฌ๋ก๋ฅผ ์์ ํํ๋ฉด ๊ธฐ๋ฅ ํ๋๊ทธ๊ฐ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๊น?
๋ค๋ฅธ ๊ฒ์ ์ด๋ฐ ์์ผ๋ก #[my_attribute]
๊ฐ ์ ์ฌ์ ์ผ๋ก #[other_attribute]
๊ฐ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. "์ธ๋ถ" ์์ฑ์์ #[derive(Foo)]
๊ฐ ์๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ๋ด๋ถ ์์ฑ์ ๋ฑ๋กํ ์ ์๋ค๋ฉด ์ ๋ง ๋ฉ์ง ๊ฒ์
๋๋ค.
๋๋ฏธ ์ธ์ ์ ๋ํ
์ด ํจ๋์ ์์์ ์ผ๋ก ๋๋ฏธ "์ธ์ "์ ์์ฑํ๋ ๊ฒ์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ด ๊ฐ๋ฅ/๋ฐ๋์งํฉ๋๊น? ์๋๋ฉด ๊ณต์ฉ API(์์ ํ ๊ฒฝ๋ก ํฌํจ)๋ฅผ ์ถ๊ฐํ์ฌ ์์ฑํ์๊ฒ ์ต๋๊น?
๋๋ฏธ ์ธ์
์ ๊ฐ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. proc-macro
ํฌ๋ ์ดํธ์ ๋ํ ๋จ์ ํ
์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ ์ด๋ ๋งค์ฐ ๋ถํธํฉ๋๋ค. ๋ํ TokenStream::from_str
๋ฟ๋ง ์๋๋ผ ์ธ์
์ด ํ์ํ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ ์์ต๋๋ค.
@alexcrichton
๋งคํฌ๋ก 1.2์ ๊ด๋ จ๋ ๋ชจ๋ ๋ฒ๊ทธ์ ๋ํด ์ผ๋ถ ๋ถ๋ฅ ์์ ์ ์ํํ์ต๋๋ค. ๋๋ถ๋ถ์ ๋ฒ๊ทธ๋ "์ฌ๊ฐํ ๋ฒ๊ทธ" ๋๋ "์ ์ฒด ๋ฒ์ ๊ด๋ จ ๋ฒ๊ทธ"๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค.
https://github.com/rust-lang/rust/issues/50504 ๋ฅผ "์ฌ๊ฐํ" ์ํ๋ก ์
๊ทธ๋ ์ด๋ํ๊ณ ์ถ์ต๋๋ค. ๋ชจ๋ ๋ฌธ์ ๋ ๋ ๊น์ ๋ฌธ์ ์ ์ฆ์์ผ ๋ฟ์ด๋ผ๊ณ ์ค๋ช
ํ์ต๋๋ค. proc ๋งคํฌ๋ก์ ํ์ฅ ID๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ ๋๋ก ๋ฑ๋ก๋๊ณ ์์ต๋๋ค. ์ด๊ฒ์ด ์ด๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ์ง ๋ชจ๋ฆ
๋๋ค.
๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ์์ ํ๋ PR์ด ์์ง๋ง(https://github.com/rust-lang/rust/pull/51952), ์์ ์ฌํญ์์ ํ๊ท๊ฐ ์์ผ๋ฉฐ ์์ง ์ดํด๋ณด์ง ์์์ต๋๋ค.
https://github.com/rust-lang/rust/pull/52081 ์์ ๋ ๋ง์ ์ ์ฐจ์ ๋งคํฌ๋ก๋ฅผ ์์ ํํ๊ธฐ ์ํ PR์ ๊ฒ์ํ์ต๋๋ค.
@petrochenkov ๋ ๋์๊ฒ
๋ฐฉ๊ธ proc_macro_derive
ํ์ ์์ฑ ๋ฌธ์ ๋ฐ ์ด๋ฆ ์ง์ ์์คํ
๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ์ ์ ๋ํ ๋งคํฌ๋ก ์ด๋ฆ ์ง์ ์ถ์ ๋ฌธ์ ์ ๋ํด ๊ฒ์ proc_macro_derive
์์ ์์ฑ์ด ๋ฒ์ ์ง์ ๋ฐ ์ด๋ฆ ์ง์ ๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ฌ๊ธฐ์์ ์ธ๊ธํ๋ ๊ฒ์ด ๋ ์ ์ ํด ๋ณด์
๋๋ค. ์์ฑ์ ๊ฒฝ๋ก๋ ํ์ฌ ์์ ํ ๊ณผ์ ์ ์์ง ์๊ธฐ ๋๋ฌธ์ #[derive(foo::Parent)]
๊ฐ ์์ ์์ฑ #[foo::Child]
์ ๊ฐ์ง ์ ์์ง๋ง ํ์ ๋งคํฌ๋ก๋ ํ๋ฉด์ ์ผ๋ก๋ ๋ค์์ ์ํํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๋ฆ ์กฐํ๋ฅผ ์ํํ ์ ์์ผ๋ฏ๋ก ์์ ์์ฑ์ด ์ค์ ๋ก ์์ ์ ์์์ธ์ง ์๋ณํฉ๋๋ค. ํ์ฌ๋ก์๋ ์ฌ์ด ํด๊ฒฐ์ฑ
์ด ์์ง๋ง ์ํธ ์์กด์ ์ธ ์์ฑ์ ๋ฏธ๋๋ฅผ ์ํด ๋ ์ด๋์ ์์ด์ผ ํ๋ ๊ฒ์
๋๋ค. proc_macro_attribute
์์ฑ์ด ์ ์ฌํ ์กฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ์ํธ ์์ฉํ๊ธฐ๋ฅผ ์ํ์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค.
์ค๋ ๋ด ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผํ๋ ค๊ณ ํ์ง๋ง ์๋ง๋ ์ด ๋ฌธ์ ์ ๊ด๋ จ๋ ๋ฌด์ธ๊ฐ๊ฐ ๊นจ์ก์ต๋๋ค. ๋ชจ๋ ์ค๋ฅ ๋ฉ์์ง์๋ "(๋ฌธ์ #38356 ์ฐธ์กฐ)" ๋ฉ์์ง๊ฐ ์์์ต๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์ฌ๊ธฐ๊น์ง ์จ ๋ฐฉ๋ฒ์
๋๋ค.
์ฌ๊ธฐ์ ์ปดํ์ผํ๋ ๋์ ๋ฐ์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํฌํจํฉ๋๋ค. ๋ด Cargo.toml๋ ํฌํจํฉ๋๋ค.
๋ด ํ๋ก์ ํธ๊ฐ ํน์ Rust nightly ๋ฒ์ (rustc 1.29.0-nightly (9bd8458c9 2018-07-09))์ ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋งค์ฐ ๋๋์ต๋๋ค. ๋ฌด์์ด ๋ณ๊ฒฝ๋์์ ์ ์์ต๋๊น? ์๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ ๋์์ต๋๊น?
ํ๋ฌผ.toml
[[bin]]
name = "main"
path = "src/bin/main.rs"
[dependencies]
log = "0.4"
pretty_env_logger = "0.2"
rand = "0.4"
ring = "=0.13.0-alpha"
untrusted = "0.6"
bytes = "0.4"
futures = "0.1"
tokio-io = "0.1"
tokio-core = "0.1"
futures-await = "0.1"
capnp = "0.8"
rusqlite = "0.13"
async_mutex = { git = "https://github.com/realcr/async_mutex", rev = "a1d973ed7" }
num-bigint = "0.2.0"
num-traits = "0.2.4"
[dev-dependencies]
[dependencies.byteorder]
version = "1.1"
features = ["i128"]
[build-dependencies]
capnpc = "0.8"
[profile.release]
debug = true
์ปดํ์ผ ์ค๋ฅ
$ cargo test
Updating git repository `https://github.com/realcr/async_mutex`
Compiling proc-macro2 v0.4.8
Compiling cswitch v0.1.0 (file:///home/real/projects/d/cswitch)
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)8: proc-macro2
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:33:40
|
33 | let works = panic::catch_unwind(|| proc_macro::Span::call_site()).is_ok();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:213:13
|
213 | Nightly(proc_macro::token_stream::IntoIter),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:438:11
|
438 | impl From<proc_macro::Span> for ::Span {
| ^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:284:13
|
284 | Nightly(proc_macro::SourceFile, FileName),
| ^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:332:13
|
332 | Nightly(proc_macro::Span),
| ^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:461:13
|
461 | Nightly(proc_macro::Ident),
| ^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:523:13
|
523 | Nightly(proc_macro::Literal),
| ^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:116:47
|
116 | Delimiter::Parenthesis => proc_macro::Delimiter::Parenthesis,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:117:43
|
117 | Delimiter::Bracket => proc_macro::Delimiter::Bracket,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:118:41
|
118 | Delimiter::Brace => proc_macro::Delimiter::Brace,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:119:40
|
119 | Delimiter::None => proc_macro::Delimiter::None,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:122:33
|
122 | let mut group = proc_macro::Group::new(delim, tt.stream.inner.unwrap_nightly());
| ^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:128:39
|
128 | Spacing::Joint => proc_macro::Spacing::Joint,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:129:39
|
129 | Spacing::Alone => proc_macro::Spacing::Alone,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:131:30
|
131 | let mut op = proc_macro::Punct::new(tt.as_char(), spacing);
| ^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:113:17
|
113 | let tt: proc_macro::TokenTree = match token {
| ^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:238:13
|
238 | proc_macro::TokenTree::Group(tt) => {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:240:21
|
240 | proc_macro::Delimiter::Parenthesis => Delimiter::Parenthesis,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:241:21
|
241 | proc_macro::Delimiter::Bracket => Delimiter::Bracket,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:242:21
|
242 | proc_macro::Delimiter::Brace => Delimiter::Brace,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:243:21
|
243 | proc_macro::Delimiter::None => Delimiter::None,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:250:13
|
250 | proc_macro::TokenTree::Punct(tt) => {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:252:21
|
252 | proc_macro::Spacing::Joint => Spacing::Joint,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:253:21
|
253 | proc_macro::Spacing::Alone => Spacing::Alone,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:259:13
|
259 | proc_macro::TokenTree::Ident(s) => ::Ident::_new(Ident::Nightly(s)).into(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:260:13
|
260 | proc_macro::TokenTree::Literal(l) => ::Literal::_new(Literal::Nightly(l)).into(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:289:20
|
289 | fn nightly(sf: proc_macro::SourceFile) -> Self {
| ^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:339:27
|
339 | Span::Nightly(proc_macro::Span::call_site())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:347:27
|
347 | Span::Nightly(proc_macro::Span::def_site())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:369:30
|
369 | pub fn unstable(self) -> proc_macro::Span {
| ^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:430:32
|
430 | fn unwrap_nightly(self) -> proc_macro::Span {
| ^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:439:24
|
439 | fn from(proc_span: proc_macro::Span) -> ::Span {
| ^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:468:48
|
468 | Span::Nightly(s) => Ident::Nightly(proc_macro::Ident::new(string, s)),
| ^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:475:48
|
475 | Span::Nightly(s) => Ident::Nightly(proc_macro::Ident::new_raw(string, s)),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:495:32
|
495 | fn unwrap_nightly(self) -> proc_macro::Ident {
| ^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:583:30
|
583 | Literal::Nightly(proc_macro::Literal::f32_unsuffixed(f))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:591:30
|
591 | Literal::Nightly(proc_macro::Literal::f64_unsuffixed(f))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:599:30
|
599 | Literal::Nightly(proc_macro::Literal::string(t))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:607:30
|
607 | Literal::Nightly(proc_macro::Literal::character(t))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:615:30
|
615 | Literal::Nightly(proc_macro::Literal::byte_string(bytes))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:636:32
|
636 | fn unwrap_nightly(self) -> proc_macro::Literal {
| ^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/lib.rs:322:30
|
322 | pub fn unstable(self) -> proc_macro::Span {
| ^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:531:34
|
531 | Literal::Nightly(proc_macro::Literal::$name(n))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
552 | / suffixed_numbers! {
553 | | u8_suffixed => u8,
554 | | u16_suffixed => u16,
555 | | u32_suffixed => u32,
... |
565 | | f64_suffixed => f64,
566 | | }
| |_____- in this macro invocation
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:543:34
|
543 | Literal::Nightly(proc_macro::Literal::$name(n))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
568 | / unsuffixed_integers! {
569 | | u8_unsuffixed => u8,
570 | | u16_unsuffixed => u16,
571 | | u32_unsuffixed => u32,
... |
578 | | isize_unsuffixed => isize,
579 | | }
| |_____- in this macro invocation
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:45:34
|
45 | TokenStream::Nightly(proc_macro::TokenStream::new())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:53:46
|
53 | TokenStream::Nightly(tts) => tts.is_empty(),
| ^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:123:23
|
123 | group.set_span(span.inner.unwrap_nightly());
| ^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:132:20
|
132 | op.set_span(tt.span().inner.unwrap_nightly());
| ^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:239:38
|
239 | let delim = match tt.delimiter() {
| ^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:245:74
|
245 | let stream = ::TokenStream::_new(TokenStream::Nightly(tt.stream()));
| ^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:247:58
|
247 | g.set_span(::Span::_new(Span::Nightly(tt.span())));
| ^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:251:40
|
251 | let spacing = match tt.spacing() {
| ^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:255:43
|
255 | let mut o = Punct::new(tt.as_char(), spacing);
| ^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:256:58
|
256 | o.set_span(::Span::_new(Span::Nightly(tt.span())));
| ^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:290:45
|
290 | let filename = stable::file_name(sf.path().to_string());
| ^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:304:44
|
304 | SourceFile::Nightly(a, _) => a.is_real(),
| ^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:355:69
|
355 | (Span::Nightly(a), Span::Nightly(b)) => Span::Nightly(a.resolved_at(b)),
| ^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:363:69
|
363 | (Span::Nightly(a), Span::Nightly(b)) => Span::Nightly(a.located_at(b)),
| ^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:424:55
|
424 | (Span::Nightly(a), Span::Nightly(b)) => a.eq(b),
| ^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:482:50
|
482 | Ident::Nightly(t) => Span::Nightly(t.span()),
| ^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:489:56
|
489 | (Ident::Nightly(t), Span::Nightly(s)) => t.set_span(s),
| ^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:623:56
|
623 | Literal::Nightly(lit) => Span::Nightly(lit.span()),
| ^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
--> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:630:62
|
630 | (Literal::Nightly(lit), Span::Nightly(s)) => lit.set_span(s),
| ^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
error: aborting due to 63 previous errors
For more information about this error, try `rustc --explain E0658`.
error: Could not compile `proc-macro2`.
๋ฌด์์ด ์๋ชป๋์์ ์ ์์ผ๋ฉฐ ์ด๋ป๊ฒ ๊ณ ์น ์ ์๋์ง ์๊ณ ์์ต๋๊น? ๊ฐ์ฌ ํด์!
proc-macro2
ํฌ๋ ์ดํธ์ ๊ฒฝ์ฐ @realcr cargo update
๋ฅผ ์คํํ๊ธฐ
@alexcrichton ๋๋ ๊ทธ๊ฒ์ด ์ฌ๊ธฐ์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. @realcr์ด ์ด๋ฏธ proc-macro2
์
๋ฐ์ดํธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ชจ๋ ๊ณณ์์ proc-macro2-0.4.8
๋ผ๊ณ ํ์๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฌธ์ ๋ ์ผ๊ฐ ๋ฒ์ ์ด #52081์ ํฌํจํ์ง ์๋ ๋ฒ์ ์ผ๋ก ๊ณ ์ ๋๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ์ค๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๊ณ ์ proc-macro2
๊ฐ ๋ถ ๋ฒ์ ๋ง ๋ถ๋ช์ณค๋์ง ๊ถ๊ธํ์ต๋๋ค. ๊ทธ๋ฌ๋ proc-macro2
๊ฐ ํธํ์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ ๋ชจ๋ฆ
๋๋ค.
@realcr ์ผ๊ฐ ์ปดํ์ผ๋ฌ๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋ proc-macro-2
๋ฒ์ < 0.4.8
์ ์ ์ฉํ์ญ์์ค.
@alexcrichton , @LukasKalbertodt : ๋น ๋ฅธ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค.
๋ฐฉ๊ธ ์ผ๊ฐ ์ปดํ์ผ๋ฌ๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธํ์ต๋๋ค. proc-macro-2 ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํ์ง๋ง ์๋ก์ด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ง์ด ๋ฐ์ํ์ต๋๋ค. ์์:
error[E0277]: the trait bound `impl futures::Future: std::future::Future` is not satisfied
--> src/networker/messenger/handler/handle_neighbor.rs:191:25
|
191 | let signature = await!(self.security_module_client.request_signature(failure_signature_buffer))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `impl futures::Future`
|
= note: required by `std::future::poll_in_task_cx`
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
...
error[E0627]: yield statement outside of generator literal
--> src/networker/messenger/handler/handle_neighbor.rs:403:13
|
403 | / await!(self.reply_with_failure(remote_public_key.clone(),
404 | | channel_index,
405 | | request_send_msg.clone()))?
| |_____________________________________________________________________^
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
ํ์ธํ๊ธฐ ์ํด ๋ด ํ์ฌ ๋ฒ์ ์ rustc:
rustc 1.29.0-nightly (1ecf6929d 2018-07-16)
๋ฌธ์ ์ ์์ธ์ ์ถ์ ํ๊ธฐ ์ํด futures_await ์์ ๊ธฐ๋ณธ ์์ ๋ฅผ ์ปดํ์ผํ๋ ค๊ณ ์๋ํ์ง๋ง ์๋์ ๋ฉ์ท์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋๋ก ๊ฑฐ๊ธฐ์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ๊ฒ์ ๋๋ค.
@LukasKalbertodt https://github.com/alexcrichton/proc-macro2#unstable -features
๋ถ์์ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
@realcr ๊ทํ์ ์๋ก์ด ์ปดํ์ผ ๋ฌธ์ ๋ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ณ์ํด์ ์ฃผ์ ๋ฅผ
@TeXitoi : ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐ๋๋ฉด ์์ ๋กญ๊ฒ ํธ์งํ๊ฑฐ๋ ์ ๊ฑฐํ์ญ์์ค. ๋๋ ๋น์ ์ ๋๊ธฐ ์ํด ์ต์ ์ ๋คํ์ง๋ง ์ฃผ์ ์ ๋ฌด์์ด ์๊ณ ๋ฌด์์ด ๊ทธ๋ ์ง ์์์ง ์๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. "(๋ฌธ์ #38356 ์ฐธ์กฐ)" ์ค๋ฅ ๋ฉ์์ง๊ฐ ์ ๋ฅผ ์ฌ๊ธฐ๋ก ๋ฐ๋ ค์จ ์ด์ ์ ๋๋ค.
์ปดํ์ผ๋ฌ ๋ฒ์ ์ ์ ๊ทธ๋ ์ด๋ํ๋ ค๊ณ ํ๋๋ฐ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด ์ฝ๋
#![no_std]
#![feature(proc_macro)]
#![feature(proc_macro_gen)]
#![feature(custom_attribute)]
#![feature(alloc)]
#[macro_use(eth_abi)]
extern crate pwasm_abi_derive;
#![feature(proc_macro)]
์ฌ์ฉํ์ง ์์๋ค๋ ์ค๋ฅ๊ฐ ํ์๋์ง๋ง ์ฌ์ฉํ์ต๋๋ค!
error[E0658]: attribute procedural macros are experimental (see issue #38356)
--> src\lib.rs:67:5
|
8 | #[macro_use(eth_abi)]
| ------- procedural macro imported here
...
67 | #[eth_abi(TokenEndpoint, TokenClient)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: add #![feature(proc_macro)] to the crate attributes to enable
@Pzixel #![feature(proc_macro)]
๋ฅผ #![feature(use_extern_macros)]
๋ก ์ ํํ๊ณ ์ถ์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ฉด ํธ๋ฆญ์ ์ํํด์ผ ํฉ๋๋ค.
์ ์ฐจ์ ๋งคํฌ๋ก๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. (๊ทธ๋ฆฌ๊ณ ์ต์ ์ผ๊ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ง ํ์ธํ์ญ์์ค)
@alexcrichton ๋ค, ๊ธฐ์ฌ ๋๋ถ์ ๋ฐฉ๊ธ ์์๋์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค.
error[E0433]: failed to resolve. Use of undeclared type or module `Vec`
--> src\lib.rs:66:5
|
66 | #[eth_abi(TokenEndpoint, TokenClient)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use of undeclared type or module `Vec`
error[E0412]: cannot find type `Vec` in this scope
--> src\lib.rs:66:5
|
66 | #[eth_abi(TokenEndpoint, TokenClient)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
๋งคํฌ๋ก์ ๋ํ ๊ฐ์ ธ์ค๊ธฐ ๊ท์น๋ ๋ณ๊ฒฝ๋์์ต๋๊น? ์๋๋ฉด ์ ์ฌ๊ธฐ์์ ๋ถํ์ ์์ํ๋์ง ์ ์ ์์ต๋๋ค.
์ ์ฐจ ๋งคํฌ๋ก๋ ์ปดํ์ผ๋ฌ์ ๋ฒ๊ทธ์ผ ์ ์๋ @Pzixel , ์ด์ ๋ํ ์ ์ฉ ๋ฌธ์ ๋ฅผ ์ ์ถํ ์ ์์ต๋๊น?
๊ธ์, ๋๋ ์ ์ด๋ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ก ๋ด ์ฝ๋๋ฅผ ๋จผ์ ๋ค์ ์์ฑํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. :) ์ง๊ธ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ ์ด ๊ธฐ๋ฅ์ผ๋ก ๋ง์ ๊ฒ์ ๋ฐ๊ฟจ์ต๋๋ค. ์๋ฃ๋๋ฉด BRB. ์ฌ๋ผ์ง์ง ์์ผ๋ฉด ๋ฌธ์ ๋ฅผ ๋ง๋ญ๋๋ค.
@alexcrichton
ํ ํฐ์ด ์ ์ฐจ ๋งคํฌ๋ก์ ์ ๋ฌ๋๊ธฐ ์ ์ ํ ํฐ์ ์ด๋ค "์ฌ์ ์ฒ๋ฆฌ"๊ฐ ์ ์ฉ๋๋์ง ์๊ณ ์์ต๋๊น?
ํ์ ์ํ์๋ ์
๋ ฅ ํ ํฐ์ ๋ฐ๊ธฐ ์ ์ $crate
์ ๊ฑฐ๋๊ณ cfg
ํ์ฅ๋์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค(๋ํ ๋ฌธ์์ด์ ํตํ ์๋ณต์ ์์ ํ ๋ฌด์์ค์ ์๋์ง๋ง ์์ ํ ์ ์์).
์๋ก ์์ ํ๋ ์ ์ฐจ ๋งคํฌ๋ก์์ ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ์ง ์๊ณ ์ ํํ๊ฒ ์ ๋ ฅ ํ ํฐ์ ๋ฐ๋์ง ํ์ธํด์ผ ํฉ๋๋ค(๋ชจ๋๋ก ๋ฒ๊ทธ).
@alexcrichton ์ฃ์กํฉ๋๋ค. cargo expand
๋ ์ด๋ค ์ด์ ๋ก ์ด ์์์์ ์๋ํ์ง ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ด ์ชฝ์ธ์ง ์ปดํ์ผ๋ฌ ์ชฝ์ธ์ง ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋๋ ์ด ๊ฐ๋ฅ์ฑ์ด ์์ ํ ๋ฐฐ์ ๋์ง ์์ ๋๊น์ง ๊ณ์ ๋ ์์ ์ ํํ ๊ฒ์ด๋ค.
@petrochenkov proc-macros์ ํ์ฅ์ ํ์ฌ๊น์ง ๊ฝค ์ ๊ฒ์ฆ๋์์ผ๋ฏ๋ก ์ด๋ฆ ํ์ธ ๋ถ๋ถ๋ณด๋ค ๊ทธ๊ฒ์ ๋ํด ํจ์ฌ ๋ ๊ฑฑ์ ํฉ๋๋ค. ์ ๋ ์ ์ฒ๋ฆฌ์ ๋ํด ๊ฐ์ธ์ ์ผ๋ก ์์ง ๋ชปํ์ง๋ง ํ์ ์ํ์ด ๋ง์ง๋ง์ผ๋ก ์คํ๋๊ณ cfgs๊ฐ ๋จผ์ ์คํ๋๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๋ถ๋ถ ๋ฐ๋ณต์ ์ธ ํ์ฅ ์์๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๊ฐ์ฌํ๋ ๊ฒ์ด ์ข๋ค๋ ์ ์๋ ๋์ํฉ๋๋ค!
์ด์ฉ๋ฉด ๋ด๊ฐ ๋ช ๋ฐฑํ ๊ฒ์ ๋์ณค์ ์๋ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ ์ฐจ์ ๋งคํฌ๋ก ํ์ฅ์์ proc_macro๋ฅผ ์ ์ํ๋ ํฌ๋ ์ดํธ์์ ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ ์ ํ์ ์ฌ์ฉํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ์๋์? (๋๋ proc_macro ํฌ๋ ์ดํธ, FWIW์์ ์๋ ค์ง ๋ค๋ฅธ ํฌ๋ ์ดํธ)
ํด๊ฒฐ ๋ฐฉ๋ฒ ์ด ์์ง๋ง AFAIU๋ ์ ์ฐจ ๋งคํฌ๋ก ์ฌ์ฉ์๊ฐ ํฌ๋ ์ดํธ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
@Ekleog proc-macro ํฌ๋ ์ดํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฅผ ์ฌ์ฉํ๋ ํฌ๋ ์ดํธ๋ฅผ ๊ตฌ์ถ ํ ๋ชฉ์ ์ผ๋ก๋ง ์ปดํ์ผ๋ฉ๋๋ค. ๋ฐํ์ ์ข ์์ฑ์ด ์๋๋๋ค. ์ ์ฒด proc-macro ํฌ๋ ์ดํธ๋ฅผ "์ผ๋ฐ" ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ์ผ์ข ์ ์ปดํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํนํ ํฌ๋ก์ค ์ปดํ์ผํ ๋ ๋ณผ ์ ์์ต๋๋ค. ๋น๋ ์คํฌ๋ฆฝํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก proc-๋งคํฌ๋ก๋ ๋์ ํ๋ซํผ์ด ์๋ ํธ์คํธ ํ๋ซํผ์ฉ์ผ๋ก ์ปดํ์ผ๋ฉ๋๋ค.
@SimonSapin ๋๋ ๋น์ ์๊ฒ ๋์ํ์ง๋ง proc-macro ํฌ๋ ์ดํธ๊ฐ ์๋๋๋ผ๋ ํฌ๋ ์ดํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์์
์ ์ผ๋ถ๋ฅผ ์์ํ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค(์: ์์ ๋งํฌ์์ X-derive
crate๋ X
ํฌ๋ ์ดํธ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋ก์์ ๋งคํฌ๋ก์ ์ํด ์์ฑ๋ ๋ชจ๋ ์ฝ๋๊ฐ ์์ฒด ํฌํจ๋๊ฑฐ๋ ํธ์ถ ์ฌ์ดํธ์ ์ํ๋ฅผ ๊ฐ์ ํด์ผ ํจ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฐ ๋ค์, ๋๋ Rustc๊ฐ ์์ง ์ด๋ฐ ์ข
๋ฅ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์ง ์์๋ค๋ ๊ฒ์ ์ดํดํ ์ ์์ต๋๋ค. ๊ธฐ๊ฐ ๋ก๋๋งต). ํ์ง๋ง ํ์ฌ TokenStreams
๋ง ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๊ฐ ์์ ํ๋๋ฉด ๋์ค์ ์ด ๊ธฐ๋ฅ์ ๊ฐ์กฐํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. PathToBeResolvedFromTopOfGeneratingProcMacroCrate
ํ ํฐ ์ ํ๊ณผ ๊ฐ์ ๊ฒ์ด ํ์ํ์ง ์์ต๋๊น? (๋์ค์ ์ถ๊ฐ๋๋ฉด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์
๋๋ค. afaiu)
๊ฒฐ๊ตญ์๋ ์ํฉ์ ๋ ์ ์ฐํ๊ฒ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํ ์๋ ์์ง๋ง ์ด๋ ์๋นํ ๋จผ ์ด์ผ๊ธฐ ๊ฐ์ต๋๋ค.
๊ทธ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๋ผ๋ฉด ์ ์ฐจ์ ๋งคํฌ๋ก์ฉ foo-proc-macros
๋๋ foo-derive
ํฌ๋ ์ดํธ์ ๋ฐํ์์ด ํฌํจ๋ "์ผ๋ฐ" foo
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์ฝ๋๋ฅผ ์์ฑํ ๋ฟ๋ง ์๋๋ผ ์ ์ฐจ์ ๋งคํฌ๋ก๋ฅผ ๋ค์ ๋ด๋ณด๋
๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์ ๋๋ฉด API๋ฅผ ๋จ์ผ ์์์ ๋ณด๊ดํ ์ ์์ต๋๋ค. ์ด๊ฒ์ serde
๊ฐ ํ๋ ์ผ์
๋๋ค(์ผ๋ถ ๊ตฌ์ฑ์์) https://github.com/serde-rs/serde/blob/v1.0.71/serde/src/lib.rs#L304
์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ฌ์ ํ ์ฌ์ฉ์๊ฐ ๋ฃจํธ ์์์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๋ฌธ์ (์: serde์ ์ถ์ ๋ฌธ์ )๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ค๋ ์ ์ ์ง์ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
#![feature(proc_macro)]
๋ 1.29.0 ์ดํ ์์ ํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ด๊ฒ์ ์๋๋ ๊ฒ์
๋๊น?
@Ekleog , TokenStream
๋ TokenTree
์ ์คํธ๋ฆผ์ด๊ณ ๊ฐ TokenTree
์๋ ๋ฒ์ ์ง์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ Span
๊ฐ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ํ์ฌ "ํธ์ถ ์ฌ์ดํธ"(๋๋ ๋น์ด ์์) ์ด์ธ์ ๋ค๋ฅธ ๋ฒ์์ ๋ํด Span์ ์์ฑํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ์ ์ ์ ์ธํ๊ณ . ๊ธฐ๋ณธ์ ์ผ๋ก ํน์ ํฌ๋ ์ดํธ๋ฅผ ์ฐธ์กฐํ์ฌ Span
๋ฅผ ์์ฑํ๋ ํฉ๋ฆฌ์ ์ธ ์ธ์ฒด๊ณตํ์ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
๋ด๊ฐ ๋ฌป๋ ์ด์ ๋ ํ์ธ๋์ด ์ ํ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ผ ์ฒดํฌํด์ ํด์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์์!
#![feature(proc_macro)]
์์ ํ๋๋ฉด ์ด ๋ฌธ์ ์ ๋ฌด์์ด ๋จ์ ์์ต๋๊น?
@jan-hudec ์ค, ์ด๊ธฐ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ์ด ์ญํ ์ ํ๋ Hygiene
(๋๋ ์ด์ ์ ์ฌํ ์ด๋ฆ) ๊ตฌ์กฐ์ฒด๋ฅผ ์ธ๊ธํ๊ธฐ ๋๋ฌธ์ Span
๋ ์ค๋ฅ ๋ณด๊ณ ์ฉ์ผ ๋ฟ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋๋ ์ด๊ฒ๋ค์ด ์ฌ๋ผ์ก๋ค๊ณ ์๊ฐํ๊ณ ๋ถ๋ช
ํ ํ๋ ธ๋ค. ๊ฐ์ฌ ํด์! :)
#![feature(proc_macro)]๊ฐ ์์ ํ๋๋ฉด์ ์ด ๋ฌธ์ ์ ๋ฌด์์ด ๋จ์์ต๋๊น?
์ด์์ ์ผ๋ก๋ ์์ ํ๋ ๊ธฐ๋ฅ์ด ์๋ ๋๋จธ์ง ๋ชจ๋ ๊ฐ๋ณ ๋ฌธ์ ์ ๋ํด ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ ์ถํด์ผ ํ๋ฉฐ ๊ทธ๋ฐ ๋ค์ ์ด ๋ฌธ์ ๋ฅผ ๋ซ์ ์ ์์ต๋๋ค(https://github.com/rust-lang/rust/issues/์์์ ๋์ผํ ๋ฐฉ์์ผ๋ก). 44660).
์ค, ์ด๊ธฐ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ์ด ์ญํ ์ ํ๋ Hygiene(๋๋ ์ ์ฌํ ์ด๋ฆ์) ๊ตฌ์กฐ์ฒด์ ๋ํด ์ธ๊ธํ๊ธฐ ๋๋ฌธ์ Spans๋ ์ค๋ฅ ๋ณด๊ณ ๋ง์ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋๋ ์ด๊ฒ๋ค์ด ์ฌ๋ผ์ก๋ค๊ณ ์๊ฐํ๊ณ ๋ถ๋ช ํ ํ๋ ธ๋ค. ๊ฐ์ฌ ํด์! :)
IIUC, Span์ ์์ ์ปจํ ์คํธ๋ฅผ ์ถ์ ํ๋ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ์ ๋๋ค.
@mark-im ์ผ์ข ์. ์ฌ๊ธฐ์๋ ์์ค ์ฝ๋ ์์น ์ ๋ณด(์ฌ์ฉ์ ๋๋ฉด ๋ฉ์์ง/์ง๋จ์ฉ)์ ๊ตฌ๋ฌธ ์ปจํ ์คํธ(์ฆ, ์์ ์ ๋ณด)๊ฐ ๋ชจ๋ ํฌํจ๋ฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํ ๋ก /ํธ๋ํฝ์ ์์ ๊ฐ์ํ ๋ proc_macro_diagnostic
์ ์์ฒด ์ถ์ ๋ฌธ์ ๋ก ์ด๋ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๊น? ๋๋ ๋ํ ๊ทธ ๊ธฐ๋ฅ์ ์์ ํ๋ฅผ ์ํ ์ฐจ๋จ๊ธฐ๊ฐ ๋ฌด์์ธ์ง ํ์
ํ๊ณ ๊ทธ๊ฒ์ ํต๊ณผํ ์ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค. ๋์ ค์ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ , ์ง๊ธ๊น์ง ํ๋ฅญํ์ต๋๋ค. ์์ ํ์ ์ด ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ปค๋ฎค๋ํฐ์์ compile_error!
๋ฅผ ์ฌ์ฉํ๋ syn์ ์ต์ ๋ฒ์ ๊ณผ ๊ฐ์ ํํคํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ง๋ค๊ฒ ๋์์ต๋๋ค.
@sgrif ๋๋ ๊ทธ๋ฐ ๋ฌธ์ ๋ฅผ ์ด์์ต๋๋ค: https://github.com/rust-lang/rust/issues/54140.
๊ทธ๋์ ์ ๋ Span ๋ฐ LineColumn ๊ตฌ์กฐ์ฒด์ ๋ฉ์๋๋ฅผ ์์ ํํ๋ ๋ฐ ๋์์ ์ฃผ๊ณ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์๊ฒฌ์์ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ง๋ง ๋๊ตฐ๊ฐ๊ฐ ์ด๋ณด์์๊ฒ ์ปดํ์ผ๋ฌ๋ฅผ ํน์ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฆฌํค๊ณ ์ถ๋ค๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. +1:
proc_macro_gen
๊ธฐ๋ฅ ๊ฒ์ดํธ๋ ์ฌ๊ธฐ๋ฅผ ์ง์ ํ์ง๋ง ์๋จ์ ์ฒดํฌ๋ฆฌ์คํธ์๋ ๋ค๋ฅธ ๋งคํฌ๋ก ์ ์๋ฅผ ์์ฑํ๋ (proc_) ๋งคํฌ๋ก๋ฅผ ๋ถ๋ช
ํ ์ฐธ์กฐํ๋ ํญ๋ชฉ์ด ์์ต๋๋ค. ์ด๊ฒ์ด ์ค๋ช
๋์์ต๋๊น(rustc์ ๊ธฐ๋ฅ ๊ฒ์ดํธ ์ ์ธ)?
@jjpe ์๋ง๋ ํ์ฌ๋ก์๋ ํด๋น ๊ธฐ๋ฅ ๊ฒ์ดํธ์ ๋ํ ์ ์ฉ ์ถ์ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๊ฒ์ ๋๋ค. ์ด ๋ฌธ์ ๋ ๋๋ถ๋ถ ์์ ํ์ ์ด๊ธฐ ๋ฌผ๊ฒฐ์ ์ ๋ ํ์ต๋๋ค.
@alexcrichton ๋๋ ๊ทธ๊ฒ์ ๋ํด ์๋ฒฝํ๊ฒ ๊ด์ฐฎ์ต๋๋ค. proc_macro_gen
๊ธฐ๋ฅ์ ๋ณด๋ ๊ณผ์ ์์ ์ธ๊ธํ์ง ์๋ ๊ฒ๋งํผ ์ข์ ๊ฒ์ ์ฐพ๊ธฐ ์ํด ๋๋ฅผ ์ฌ๊ธฐ๋ก ์ถ์ฒํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ์ฝ๊ฐ ์ด์ํ๋ฏ๋ก ์ ์ด๋ ์ธ๊ธํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
@xieyuheng CodeString
/ Code
๋ ์ด๋ป๊ฒ ์๊ฒผ์๊น ์? ์ฆ, ์๋ฏธ ์ฒด๊ณ๋ ์ด๋ป๊ฒ ๋ ๊น์?
TokenStream
๋ ๊ท์ฐฎ์ ํ
์คํธ๋ผ๊ธฐ๋ณด๋ค ์ผ๋ จ์ ํ ํฐ ๊ฐ์ ์ ์ธํ๊ณ ๋ ๊ทธ๋๋ก ์์ค ์ฝ๋์ ๋ถ๊ณผํฉ๋๋ค.
TokenStream
( TokenTree
)์ ๋ํ ํ์ฅ API๋ 1.29์์ ์์ ์ ์
๋๋ค. ํจ์ํ proc ๋งคํฌ๋ก ๊ฐ์ ธ์ค๊ธฐ๋ 1.30์์ ์์ ์ ์
๋๋ค.
rustc 1.30.0-nightly (63d51e89a 2018-09-28)
์ดํ๋ก ๋ ์ด์ ๋ณ๋์ ํ์ผ์์ ๋ชจ๋ ๋ด๋ถ์ ์ฝ๋๋ฅผ ์ํํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. mod module;
๋ฅผ ์ฒ๋ฆฌํ๋ฉด mod module;
, WYSIWYG๋ฅผ ํฌํจํ๋ TokenStream
๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ฒ๋ฆฌ๋ ์ฝ๋์์ ๋ฒ์, ์์ ๋ฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ํ์ํ๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๋ณ๋์ ํ์ผ์ ์๋ ๋ชจ๋์ ๋ด์ฉ์ผ๋ก ์์ ํ๋ ๋ฐฉ๋ฒ์ด ์๊ฑฐ๋ ์์ ๊ฒ์ ๋๊น? ๋ชจ๋ ๊ตฌ์ฑ์ ์ฌ์ํ ๋ฆฌํฉํ ๋ง์ผ๋ก ์ธํด ๋งคํฌ๋ก ๋์์ด ๋ณ๊ฒฝ๋ ๋ ์ต์ข ์ฌ์ฉ์์๊ฒ ์ด ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค.
์ข์, ์ด ๋ฌธ์ ๋ ๋ฐฉ๋ ํ๊ณ ๋ ์ด์ ์ด๋ ค ์๊ณ API๋ฅผ ์ถ์ ํ๋ ๊ฒ์ด ๋๋ฌด ์ ์ฉํ์ง ์๋ค๊ณ ์๊ฐํ๋ ์ง์ ์ ์ด๋ฅด๋ ์ต๋๋ค. ์ด๋ฅผ ์ํด https://github.com/rust-lang/rust/pull/54728 ์ ์ด์ด ์ด ๋ฌธ์ ๋ฅผ ๋ณด๋ค ์ธ๋ถํ๋ ์ฌ๋ฌ ์ถ์ ๋ฌธ์ ๋ก ๋๋๋๋ค.
quote!
๋งคํฌ๋กIdent::new_raw
Span::def_site
proc_macro
๋ฐ ์ง๋จproc_macro::Span
๊ฒ์ฌ์ด ์์ ์์ ๋๋ ์ด๊ฒ์ ๋ซ์ ๊ฒ์ด์ง๋ง ๋ค๋ฅธ ์ถ์ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์์ ๊ฒฝ์ฐ ์๋ ค์ฃผ์ญ์์ค! ๋๋ ํ์คํ ๋ ๋ง์ ํ์ ์กฐ์น๋ฅผ ์ด ์ ์์ต๋๋ค
@alexcrichton ์์ฑ๊ณผ ๊ฐ์ ๋งคํฌ๋ก์ ํ์ ์์ฑ์ ์ด๋ป์ต๋๊น?
https://github.com/rust-lang/rust/issues/38356#issuecomment -397095541
์ด์ ๋ํ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
@๋๋ธ ์์ค
์ด๋ฌํ ํ์ ์์ฑ์ด ๋ฐ๋์ ์ธ์ด ๊ธฐ๋ฅ์ผ ํ์๋ ์์ต๋๊น?
derive
์ ๊ฒฝ์ฐ ํ์ ๋งคํฌ๋ก๊ฐ ์
๋ ฅ์์ ์์ฑ์ ์ ๊ฑฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ์ ์ ์์ฑ ๋ฑ๋ก์ด ํ์ํฉ๋๋ค(์
๋ ฅ์ ๋ณ๊ฒฝํ ์ ์์).
์์ฑ ๋งคํฌ๋ก๋ ์
๋ ฅ์์ #[other_attribute]
์ ๊ฑฐํ ์ ์์ผ๋ฏ๋ก ์ด๋ฆ ํ์ธ์ ๋๋ฌํ์ง ์์ผ๋ฉฐ "ํ์ธ๋์ง ์์ ์์ฑ" ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ์ง ์์ต๋๋ค.
(https://github.com/rust-lang/rust/issues/38356#issuecomment-397095541์ ์ธ๊ธ๋ ๊ณ ์ ์ ์ธ ๋ ๊ฑฐ์ ๋ถ์์ ํ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ์ด์ proc ๋งคํฌ๋ก์ ํธํ๋ฉ๋๋ค.)
@petrochenkov ์, ์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ข์, ์ด ๋ฌธ์ ๋ ๋ฐฉ๋ ํ๊ณ ๋ ์ด์ ์ด๋ ค ์๊ณ API๋ฅผ ์ถ์ ํ๋ ๊ฒ์ด ๋๋ฌด ์ ์ฉํ์ง ์๋ค๊ณ ์๊ฐํ๋ ์ง์ ์ ์ด๋ฅด๋ ์ต๋๋ค. ์ด๋ฅผ ์ํด https://github.com/rust-lang/rust/pull/54728 ์ ์ด์ด ์ด ๋ฌธ์ ๋ฅผ ๋ณด๋ค ์ธ๋ถํ๋ ์ฌ๋ฌ ์ถ์ ๋ฌธ์ ๋ก ๋๋๋๋ค.
quote!
๋งคํฌ๋กIdent::new_raw
Span::def_site
proc_macro
๋ฐ ์ง๋จproc_macro::Span
๊ฒ์ฌ์ด ์์ ์์ ๋๋ ์ด๊ฒ์ ๋ซ์ ๊ฒ์ด์ง๋ง ๋ค๋ฅธ ์ถ์ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์์ ๊ฒฝ์ฐ ์๋ ค์ฃผ์ญ์์ค! ๋๋ ํ์คํ ๋ ๋ง์ ํ์ ์กฐ์น๋ฅผ ์ด ์ ์์ต๋๋ค