8个版本 (4个主要版本更新)
6.0.0 | 2022年10月6日 |
---|---|
5.1.0 | 2022年10月6日 |
4.0.0 | 2022年9月23日 |
3.0.2 | 2022年6月7日 |
1.0.0 | 2022年6月7日 |
在 进程宏 中排名第 1429
每月下载量 2,399
在 kmacros 中使用
41KB
676 行
查看 tests
以获取更多示例。
kproc_macros::explain
创建一个后缀为 _explain
的函数,该函数额外接受一个回调,该回调用于函数顶级所有简单 let
绑定的语句,包括名称、表达式和值。
当使用 #[no_expr]
或返回值时,expr
为 None。
对于函数的返回值,回调使用 name == ""
和 expr == None
调用。
用于解释数学函数中的步骤。回调的使用允许在GUI渲染中使用。
use kproc_macros::explain;
#[explain]
fn foo(a: u32, b: f64) -> u32 {
let _x = a * b as u32;
#[no_expr]
let x = a * b as u32;
#[skip]
let _y = a * b as u32;
x * 3
}
struct Foo;
impl Foo {
#[explain]
fn bar(&self, a: u32, b: f64) -> u32 {
let _x = a * b as u32;
#[no_expr]
let x = a * b as u32;
#[skip]
let _y = a * b as u32;
x * 3
}
}
fn main() {
assert_eq!(6, foo(1, 2.));
assert_eq!(6, foo_explain(1, 2., |name, expr, value| {
println!("{name} {expr:?} {value}");
}));
assert_eq!(6, Foo.bar(1, 2.));
assert_eq!(6, Foo.bar_explain(1, 2., |name, expr, value| {
println!("{name} {expr:?} {value}");
}));
}
示例标准输出
STDOUT:
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
a None 1
b None 2
_x Some("a * b as u32") 2
x None 2
None 6
a None 1
b None 2
_x Some("a * b as u32") 2
x None 2
None 6
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
kproc_macros::optimized
期望一个包含两个块的函数:慢块,然后是快块。
(技术上第二个块可以只是一个表达式,但慢块 必须 是一个块)。
这将生成具有相同参数的foo_slow
和foo_check
函数,尽管_check
返回一个包含kmacros_shim::OptimizeCheckOutput
的值,该值包含一个.assert_equal()
方法,该方法可以以美观的格式打印结果,包括前一次调用的结果、参数和函数名称。
这要求参数可以在两次调用之间重复使用,因此它们是Copy
或一个&mut
引用,该引用不会被结果借用。
use kproc_macros::optimized;
#[optimized]
fn foo(a: u32, b: f64) -> u32 {
{
let mut r = 0.;
for _ in 0..a {
r += b;
}
r as u32
}
{
// a * b as u32
(a as f64 * b) as u32
}
}
fn main() {
foo_check(17, 3.1).assert_equal();
assert_eq!(foo_slow(17, 3.1), foo(17, 3.1));
}
use kproc_macros::optimized;
#[optimized]
fn foo(a: u32, b: f64) -> u32 {
{
let mut r = 0.;
for _ in 0..a {
r += b;
}
r as u32
}
(a as f64 * b) as u32
}
fn main() {
foo_check(17, 3.1).assert_equal();
assert_eq!(foo_slow(17, 3.1), foo(17, 3.1));
}
依赖项
~1.5MB
~35K SLoC