Я пишу реализацию Lua в Rust, и я пришел к тому, что у меня было множество определений функций, которые снова и снова были более или менее одинаковыми.Я решил попытать счастья в написании макроса, чтобы сделать работу за меня:
#![feature(macros_in_extern)]
#![feature(concat_idents)]
macro_rules! lua_func {
($name: ident, $ret: ty, $var: ident, $type: ty) => {
let fn_name = concat_idents!(lua_, $name);
pub fn fn_name (L: *mut lua_State, $var: $type) -> $ret
};
}
extern "C" {
lua_func!(toboolean, bool, idx, int);
}
Когда я сделаю это
lua_func!(toboolean, bool, idx, int);
Я ожидаю, что он расширится до
pub fn lua_toboolean (L: *mut lua_State, idx: int) -> bool;
, но при запуске rustc --pretty expanded
для проверки он очищает оперативную память моего компьютера через несколько секунд, если я не выполняю немедленно ^C
.
Я говорю, что этот макрос является причиной проблемы, потому чтокогда я удалил использование макроса, команда успешно запустилась и вывела текст со всеми развернутыми макросами.
Что я делаю не так?
rustc --version --verbose
вывод:
rustc 1.30.0-nightly (3bc2ca7e4 2018-09-20)
binary: rustc
commit-hash: 3bc2ca7e4f8507f82a4c357ee19300166bcd8099
commit-date: 2018-09-20
host: x86_64-unknown-linux-gnu
release: 1.30.0-nightly
LLVM version: 8.0
В этой версии команда rustc --pretty expanded -Z unstable-options
с файлом MCVE воспроизводит проблему на моем компьютере.