现在Set我们的收藏中有一个类型了!Set由 a 支持Dict,因此它具有快速添加、删除和in 检查的功能,并且要求成员元素符合该KeyElement特征。
from collections import Set
var set = Set[Int](1, 2, 3)
print(len(set)) # 3
set.add(4)
for element in set:
print(element[])
set -= Set[Int](3, 4, 5)
print(set == Set[Int](1, 2)) # True
print(set | Set[Int](0, 1) == Set[Int](0, 1, 2)) # True
let element = set.pop()
print(len(set)) # 1
Mojo 现在支持x in y表达式作为 y.contains(x)以及 的语法糖x not in y。
Mojo 现在支持仅关键字参数。例如:
fn my_product(a: Int, b: Int = 1, *, c: Int, d: Int = 2):
print(a * b * c * d)
my_product(3, c=5) # prints '30'
my_product(3, 5, d=7) # error: missing 1 required keyword-only argument: 'c'
这包括支持声明使用可变参数和仅关键字参数/参数的签名。例如,现在可以进行以下操作:
fn prod_with_offset(*args: Int, offset: Int = 0) -> Int:
var res = 1
for i in range(len(args)):
res *= args[i]
return res + offset
print(prod_with_offset(2, 3, 4, 10)) # prints 240
print(prod_with_offset(2, 3, 4, offset=10)) # prints 34
**kwargs请注意,尚不支持仅可变参数关键字参数(例如, )。也就是说,以下行为是不允许的:
fn variadic_kw_only(a: Int, **kwargs): ...
有关更多信息,请参阅 Mojo 手册中的仅位置参数和仅关键字参数。
该print()函数现在接受仅关键字参数,这对于end 控制在打印元素后是否打印换行符很有用。默认情况下,end像以前一样默认为“\n”。
Mojo SDK 现在可以安装在 AWS Graviton 实例上。
新版本的Mojo Playground现已推出。新的 Playground 是 Mojo 代码的简单交互式编辑器,类似于 Rust Playground 或 Go Playground。基于 JupyterLab 的旧 游乐场将保持在线状态直至 3 月 20 日。
Mojo LSP 服务器现在将生成用于填充空文档字符串的修复程序:
fn foo(arg: Int):
"""""" # Unexpected empty documentation string
应用上面的修复将生成:
fn foo(arg: Int):
"""[summary].
Args:
arg: [description].
"""
添加了新*_语法,允许用户显式解除绑定任意数量的位置参数。例如:
struct StructWithDefault[a: Int, b: Int, c: Int = 8, d: Int = 9]: pass
alias all_unbound = StructWithDefault[*_]
# equivalent to
alias all_unbound = StructWithDefault[_, _, _, _]
alias first_bound = StructWithDefault[5, *_]
# equivalent to
alias first_bound = StructWithDefault[5, _, _, _]
alias last_bound = StructWithDefault[*_, 6]
# equivalent to
alias last_bound = StructWithDefault[_, _, _, 6]
alias mid_unbound = StructWithDefault[3, *_, 4]
# equivalent to
alias mid_unbound = StructWithDefault[3, _, _, 4]
如上所述,此语法可用于在操作数列表的开头、结尾或中间显式解除绑定任意数量的参数。由于必须在某些时候显式指定这些未绑定参数,因此不应用这些参数的默认值。例如:
alias last_bound = StructWithDefault[*_, 6]
# When using last_bound, you must specify a, b, and c. last_bound
# doesn't have a default value for `c`.
var s = last_bound[1, 2, 3]()
有关更多信息,请参阅 Mojo 手册中有关 部分绑定类型 和 函数自动参数化的部分。
DynamicVector现在支持迭代。迭代值是 Reference的实例,需要取消引用:
var v: DynamicVector[String]()
v.append("Alice")
v.append("Bob")
v.append("Charlie")
for x in v:
x[] = str("Hello, ") + x[]
for x in v:
print(x[])
DynamicVector现在有 reverse()和 extend()方法。
该mojo package命令现在生成与编译无关的包。不再需要或接受诸如 O0 或 --debug-level 之类的编译选项。因此,现在的包装变得更小,并且极其便携。
@register_passable现在可以(并且应该!)使用参数指定值的初始值设定项inout self,就像仅内存类型一样:
@register_passable
struct YourPair:
var a: Int
var b: Int
fn __init__(inout self):
self.a = 42
self.b = 17
fn __copyinit__(inout self, existing: Self):
self.a = existing.a
self.b = existing.b
这种形式使得语言更加一致,更类似于Python,并且更容易实现高级功能。使用这种新形式也不会对性能产生影响:编译器会自动返回寄存器中的值,而无需您担心。
-> Self:此版本仍支持旧语法,但将在后续版本中删除,因此请迁移您的代码。需要注意的一件事是:给定的结构应该使用一种样式或另一种样式,混合每种样式中的一些效果不会很好。
标准库slice类型已重命名为 Slice,并slice 引入了一个函数。这使得 Mojo 更接近 Python,并使该 Slice类型遵循其他类型(例如Int.
下标中的“切片”语法不再硬编码为内置slice 类型:它现在适用于容器getitem() 方法接受的任何类型。例如:
@value
struct UnusualSlice:
var a: Int
var b: Float64
var c: String
struct YourContainer:
fn __getitem__(self, slice: UnusualSlice) -> T: ...
YourContainer鉴于此实现,您可以为like的实例添加下标 yc[42:3.14:"🔥"],并将三个值传递给 UnusualSlice构造函数。
访问refitem()器方法现在可以返回 a Reference而不必返回 MLIR 内部引用类型。
添加了AnyPointer.move_into() 方法,用于将值从一个指针内存位置移动到另一个指针内存位置。
添加了内置hex()函数,可用于格式化任何类型将 Intable特征实现为十六进制字符串的值。
PythonObject现在实现了 isand ,isnot以便您可以使用x is y and x is not ywith形式的表达式PythonObject。
PythonObject现在符合特征 SizedRaising。这意味着内置 len()函数现在可以在PythonObject.
该os包现在包含stat() 和lstat()函数。
新的os.path包现在允许您查询路径上的属性。
该os包现在有一个 PathLike特征。PathLike结构体通过实现函数来符合特征fspath()。
现在pathlib.Path具有查询路径属性的函数。
该listdir()方法现在存在于 模块pathlib.Path中,并且也存在于模块中os 以处理PathLike结构。例如,以下示例列出了目录中的所有目录/tmp:
from pathlib import Path
fn walktree(top: Path, inout files: DynamicVector[Path]):
try:
var ls = top.listdir()
for i in range(len(ls)):
var child = top / ls[i]
if child.is_dir():
walktree(child, files)
elif child.is_file():
files.append(child)
else:
print("Skipping '" + str(child) + "'")
except:
return
fn main():
var files = DynamicVector[Path]()
walktree(Path("/tmp"), files)
for i in range(len(files)):
print(files[i])
、find()、 和 方法现在适用于字符串文字rfind()。 这意味着你可以写:count()__contains__()
if "Mojo" in "Hello Mojo":
...
现在可以使用内置函数以编程方式在代码中插入断点breakpoint()。
注意:在 Graviton 实例上,调试器在遇到此类断点后可能无法恢复。
添加了一个内置Boolable特征,用于描述可以表示为布尔值的类型。为了符合该特征,类型必须实现该bool()方法。
包内的模块现在可以使用纯粹的相对from导入:
from . import another_module
普通类型(例如 MLIR 类型和函数类型)现在可以隐式绑定到需要复制构造函数或移动构造函数的特征,例如 Movable、 Copyable和 CollectionElement。
新的魔术__lifetime_of(expr)调用将产生内存值的生命周期。我们希望并期望随着 Reference(expr).lifetime参数系统的发展,这最终将被替换,但这对于在函数签名中使用同时很重要。
新的魔术__type_of(expr)调用将产生值的类型。这允许人们引用其他变量的类型。例如:
fn my_function(x: Int, y: __type_of(x)) -> Int:
let z : __type_of(x) = y
return z
🦋
作为删除 let 声明的又一步 ,我们删除了编译器内部对 let 声明的支持。为了简化迁移,我们将let声明解析为var声明,这样您的代码就不会中断。我们对此发出警告,但请将您的代码切换为var显式使用,因为此迁移支持将在后续更新中删除。
fn test():
# treated as a var, but please update your code!
let x = 42 # warning: 'let' is being removed, please use 'var' instead
x = 9
不再可能在 自动参数化函数中显式指定隐式实参参数)。这种能力是一个疏忽,现在是一个错误:
fn autoparameterized(x: SIMD):
pass
autoparameterized[DType.int32, 1](3) # error: too many parameters
vectorize_unroll已被删除, vectorize现在有一个unroll_factor以默认值 1 命名的参数。增加unroll_factor 可能会以二进制大小为代价提高性能。有关更多详细信息,请参阅 此处的循环展开博客 。
vectorize随着闭包func移至第一个参数,签名发生了变化:
vectorize[func, width, unroll_factor = 1](size)
vectorize[func, width, size, unroll_factor = 1]()
文档字符串已更新,其中包含演示两个签名之间差异的示例。
unroll随着闭包func移至第一个参数,签名发生了变化:
unroll[func, unroll_count]()
NDBuffer和 类型的签名Buffer已更改。现在,两者都将类型作为第一个参数,不再需要形状参数。这允许您使用这些类型并具有合理的默认值。例如:
NDBuffer[DType.float32, 3]
相当于
NDBuffer[DType.float32, 3, DimList.create_unknown[3]()]
用户仍然可以为类型指定静态形状(如果已知):
NDBuffer[DType.float32, 3, DimList(128, 128, 3)]
缺少函数参数的错误消息得到了改进:callee expects at least 3 arguments, but 1 was specified现在由名称(例如 )描述缺少的参数,而不是描述参数的数量(例如missing 2 required positional arguments: 'b', 'c')。
该CollectionElement特征现在是内置特征并已从 中删除collections.vector。
构造DynamicVector(capacity: Int)函数已更改为 capacity仅使用关键字参数,以防止从 Int.
Variant.getT现在返回 Reference值而不是副本。
方法String和已重命名tolower() 为和。toupper()str.lower()str.upper()
和ref标识符mutref不再保留为 Mojo 关键字。我们最初考虑将它们用作语言糖以供参考,但我们相信通用语言功能与 Reference类型相结合将提供良好的体验,而无需专用糖。
🛠️
#435 具有 Self 类型的结构并不总是有效。
#1540 寄存器_可传递的自引用结构崩溃。
#1664 - 改进StaticTuple使用负数大小的元素数量构造时的错误消息。
#1679 - 零元素 SIMD 崩溃。
无效代码导致的各种崩溃: #1230、 #1699、 #1708
#1223 - 当参数函数作为(运行时)参数传递时崩溃。现在解析器会出错。
#1530 - 在参数推导失败的诊断发射期间崩溃。
#1538和#1607 - 返回类型值而不是预期类型的实例时崩溃。这是一个常见的错误,该错误现在包含向用户指出问题的提示。
#1613 - 由于特征方法声明中的参数类型不正确,类型名称错误self。
#1670 - 全局变量声明中的隐式转换崩溃。
#1741 - Mojo 文档生成不会在可变参数上显示inout/ 。owned
#1621 - VS Code 不会在函数类型表达式中突出显示raises和。capturing
#1617fn - VS Code在特定上下文中不突出显示。
#1740 - 当鼠标悬停在结构上时,LSP 显示不相关的信息。
#1238 - 文件阴影 Mojo 包路径。
#1429 - 使用嵌套导入语句时崩溃。
#1322 - 当可变参数中缺少类型时崩溃。
#1314 - 将别名绑定到具有默认参数的参数函数时出现类型检查错误。
#1248 - 从与搜索路径中的另一个文件同名的文件导入时发生崩溃。
#1354 - 从本地包导入时崩溃。
#1488 - 设置通用元素字段时崩溃。
#1476 - 在参数上下文中调用函数时解释器崩溃。
#1537 - 复制参数值时崩溃。
#1546 - 修改嵌套向量元素会使解析器崩溃。
#1558 - 无效导入导致解析器崩溃。
#1562 - 调用参数类型成员函数时崩溃。
#1577 - 使用未解析的包作为变量时崩溃。
#1579 - 成员访问类型实例会导致崩溃。
#1602 - 在编译时构造字符串时解释器失败。
#1696 - 修复了导致语法突出显示偶尔失败的问题。
#1549SIMD.shift_left - 修复了和中移位量超出范围时的问题SIMD.shift_right。