2个版本
0.1.2 | 2023年7月24日 |
---|---|
0.1.0 | 2023年7月23日 |
#1686 in 进程宏
20KB
237 代码行
Macro GPT:Rust进程宏中的GPT
这个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