#proc-macro #gpt #ChatGPT #generate #macro #ai

macro-gpt

这是一个简单的进程宏,它使用ChatGPT在编译时根据提示生成Rust代码,还有一个不那么简单的宏,可以直接将提示结果注入到你的编辑器中!

2个版本

0.1.2 2023年7月24日
0.1.0 2023年7月23日

#1686 in 进程宏

MIT许可证

20KB
237 代码行

Macro GPT:Rust进程宏中的GPT

Crates.io docs.rs MIT License

这个crate一半是梗,一半是认真的。

gpt!

gpt!宏是一个有趣的实验性概念,让你可以做这样的事情

use macro_gpt::*;

struct MyStruct;
gpt!("implement PartialEq for an existing struct called MyStruct");

fn main() {
    assert!(MyStruct {} == MyStruct {});
}

GPT4会尽力将gpt!宏扩展成基于你的提示编译的代码。这个宏并不知道你的文件内容,除非你在提示中告诉它。生成的源代码在编译时打印到控制台,这也是你获取它的唯一方式,因为它在下次编译时可能完全不同。

gpt_inject!

另一方面,gpt_inject!宏实际上是有用的。它调用方式与gpt!宏类似,即你将一个字符串字面量提示传递给名为gpt_inject!的进程宏。从这里开始,相似之处开始消失。

特别是,gpt_inject!

  • 可以访问你的整个Rust文件,并将这些信息作为上下文信息提供给GPT4
  • 让GPT4想出可以正确编译且满足你提示中要求的Rust代码,用以替换你的宏调用。

当你编译时,你的gpt_inject!宏调用将被GPT4生成的代码替换,并且会提供一个注释行(你可以取消注释并进一步调整,如果需要的话),其中包含用于生成当前扩展的原始提示。

以下是一个示例

use macro_gpt::*;

struct Something;
gpt_inject!("Make a trait defining a method called `foo` that prints hello world to the console and have `Something` implement it");

当你编译这个时,文件将直接在你的编辑器中重写,看起来像这样

use macro_gpt::*;

struct Something;

// generated by: gpt_inject!("Make a trait defining a method called `foo` that prints hello world to the console and have `Something` implement it")
trait HelloWorld {
    fn foo(&self);
}

impl HelloWorld for Something {
    fn foo(&self) {
        println!("Hello, world!");
    }
}
// end of generated code

要求

要使这两个宏中的任何一个工作,您必须在编译时设置并使 cargo/rustc 可访问一个有效的 OPENAI_API_KEY 环境变量。

依赖项

~9–22MB
~337K SLoC