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

Download history 525/week @ 2024-03-07 618/week @ 2024-03-14 560/week @ 2024-03-21 411/week @ 2024-03-28 422/week @ 2024-04-04 531/week @ 2024-04-11 424/week @ 2024-04-18 413/week @ 2024-04-25 406/week @ 2024-05-02 591/week @ 2024-05-09 460/week @ 2024-05-16 567/week @ 2024-05-23 617/week @ 2024-05-30 536/week @ 2024-06-06 706/week @ 2024-06-13 396/week @ 2024-06-20

每月下载量 2,399
kmacros 中使用

MIT 许可证

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_slowfoo_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