Loading...
Loading...
Compare original and translation side by side
mojo-syntaxmojo-gpu-fundamentalsmojo-syntaxmojo-gpu-fundamentals@__parameter@parameter*_value| Do not | Do instead |
|---|---|
| Unified |
| Make the body unified; pass it as a value |
| File-scope / normal function with an imm parameter |
| Capture list ( |
Keep | Migrate or widen that API to value-taking; do not paper over it |
capturing[_]def … capturing -> T@__parameter@__parametercapturingresidual_buf: DeviceBuffer[…]var@__parameter@parameter*_value| 禁止操作 | 替代方案 |
|---|---|
在嵌套def上使用 | 使用统一闭包 |
| 将函数体改为统一闭包格式,以值传递方式传入 |
| 使用文件级/普通函数,接收不可变参数 |
在嵌套闭包上使用 | 使用捕获列表( |
因API仍为 | 将该API迁移或扩展为传值类型;不得掩盖问题 |
capturing[_]@__parameterdef … capturing -> T@__parametercapturingresidual_buf: DeviceBuffer[…]var| Legacy | Preferred |
|---|---|
| |
Comptime param | |
Nested | Unified |
@__parametercapturing thinFuncType@__parameter| 旧版格式 | 推荐格式 |
|---|---|
| |
编译期参数 | |
嵌套 | 统一闭包格式 |
@__parametercapturing thinFuncType@__parameterrg 'api_name\[' --glob '*.mojo'rg '@__parameter|@parameter' --glob '*.mojo'api[fn](a, b)api(a, fn, b)@__parameter@parameter@__copy_capture@__parametermojo build --emit llvm <file> -o /tmp/x.llrg '@__parameter|@parameter' --glob '<touched>.mojo'rg 'api_name\[' --glob '*.mojo'rg '@__parameter|@parameter' --glob '*.mojo'api[fn](a, b)api(a, fn, b)@__parameter@parameter@__copy_capture@__parametermojo build --emit llvm <file> -o /tmp/x.llrg '@__parameter|@parameter' --glob '<touched>.mojo'| Default / symptom | Choice |
|---|---|
| Read-only use of outer state | |
Mutates some outer state; also reads | |
| Mutates several outer names | |
| Needs ownership / move | |
| Named precision only | |
| No free runtime captures | |
| Add |
| That name needs |
| Capture-all |
| Buffer captured |
| |
| |
| Capture list on an |
| Closure struct would hold fields that alias the same origin, one mut and one imm — see Aliasing below |
| |
{mut}Intmutimm{mut tt_in, imm}immmutvar{imm}TileTensor.unsafe_ptr()mut=Trueself._buf.unsafe_ptr()unsafe_mut_cast[True]()CacheBustingBuffer.offset_ptrselflit.call{mut cb_a, mut cb_b, mut cb_c, mut cb_a_scales, mut cb_b_scales, imm}unsafe_mut_cast@__parametermut| 默认场景/报错信息 | 选择方案 |
|---|---|
| 仅读取外部状态 | |
修改部分外部状态;同时读取 | |
| 修改多个外部变量 | |
| 需要所有权/转移 | |
| 仅需精确命名捕获 | |
| 无需运行时捕获 | |
| 添加 |
捕获变量出现 | 该变量需要 |
| 全捕获 |
| 缓冲区被 |
| |
| |
| 带 |
| 闭包结构体将包含指向同一源的别名字段,一个可变一个不可变——见下文别名处理 |
| 尽可能用 |
Int{mut}mutimm{mut tt_in, imm}immmutvar{imm}TileTensormut=True.unsafe_ptr()self._buf.unsafe_ptr()unsafe_mut_cast[True]()CacheBustingBuffer.offset_ptrselflit.call{mut cb_a, mut cb_b, mut cb_c, mut cb_a_scales, mut cb_b_scales, imm}unsafe_mut_cast@__parametermutDeviceBufferas_immut(){mut …}var bufbufbuf: DeviceBuffer[…]enqueue_memsetDeviceBuffer{mut buf, …}origin_of(buf){imm}bufmut buf{mut buf, imm}mut buf: …FuncType{mut buf, imm}buf.as_unsafe_any_origin()@__parameterDeviceBufferas_immut(){mut …}var bufbufbuf: DeviceBuffer[…]enqueue_memsetDeviceBuffer{mut buf, …}origin_of(buf){imm}bufmut buf{mut buf, imm}mut buf: …FuncType{mut buf, imm}buf.as_unsafe_any_origin()@__parameter{mut count}name[i] =with … as namemut@__parameter@parameter{mut count}with … as namename[i] =mut@__parameter@parameter