🔥
Mojo 标准库现已开源!查看 自述文件 ,了解入门所需的一切。
现在允许结构和其他名义类型隐式符合特征。如果结构实现了特征的所有要求,则它隐式地符合该特征。例如,任何隐 str()式实现该方法的结构都符合Stringable,并且可与str()内置函数一起使用。
@value
struct Foo:
fn __str__(self) -> String:
return "foo!"
fn main():
print(str(Foo())) # prints 'foo!'
我们仍然强烈鼓励您在可能的情况下明确列出结构符合的特征:
@value
struct Foo(Stringable): ...
这不仅对于文档和沟通意图有用,而且在未来,显式一致性对于默认方法和扩展等功能也将很有用。
Mojo 的 Python 互操作性现在支持将关键字参数传递给 Python 函数:
from python import Python
def main():
plt = Python.import_module("matplotlib.pyplot")
plt.plot((5, 10), (10, 15), color="red")
plt.show()
语言
⭐️
Mojo 现在支持可变关键字参数,通常称为 **kwargs.这意味着您现在可以声明和调用如下函数:
fn print_nicely(**kwargs: Int) raises:
for key in kwargs.keys():
print(key[], "=", kwargs[key[]])
# prints:
# `a = 7`
# `y = 8`
print_nicely(a=7, y=8)
有关更多详细信息(以及当前限制的列表),请参阅Mojo 手册中的Variadic 关键字参数。
🦋 更改或
let声明现在会产生编译时错误而不是警告,这是我们删除 let 声明的下一步。编译器let目前仍然可以识别该关键字,以便生成良好的错误消息,但在后续版本中将删除该关键字。
Mojo 现在会警告def和声明中未使用的值,而不是完全禁用sfn中的警告。def它从不警告未使用的object或PythonObject值,将警告与这些类型而不是它们未使用的函数类型联系起来。这将有助于捕获defs 中的 API 使用错误,并使导入的 Python API 在fns 中更符合人体工程学。
目前,该语言将禁用动态类型值。例如,以下内容现在将失败并出现错误:
var t = Int # dynamic type values not allowed
struct SomeType: ...
takes_type(SomeType) # dynamic type values not allowed
我们想退一步并(重新)设计类型值变量、存在性和其他动态特征。这不会影响类型值 参数,因此以下内容像以前一样工作:
alias t = Int # still 🔥
struct SomeType: ...
takes_type[SomeType]() # already 🔥
>fn uses_trait[T: SomeTrait](value: T): ... # still 🔥
现在要求参数表达式中的表达式出现在位置参数列表的末尾,而不是允许出现在中间。
# No longer supported
alias FirstUnbound = SomeStruct[*_, 42]
alias MidUnbound = SomeStruct[7, *_, 6]
# Still supported
alias LastUnbound = SomeStruct[42, *_]
我们缩小了范围,因为我们希望鼓励类型设计者获得正确的参数顺序,并希望*_在将来扩展以支持关键字参数。
标准库⭐️
DynamicVector已重命名为 List,并已从 collections.vector模块移至collections.list模块。此外:
您现在可以List从可变数量的值构造 a 。例如:
var numbers = List[Int](1, 2, 3)
List和 InlinedFixedVector 类型现在支持负索引。这意味着您可以编写vec[-1] 相当于vec[len(vec)-1].
List.push_back()已被删除。请改用该append()功能。
该print()函数现在采用sep和 end关键字参数。这意味着你可以写:
print("Hello", "Mojo", sep=", ", end="!!!\n") # prints Hello, Mojo!!!
sep默认为空字符串,end默认为“\n”。
此外,该print_no_newline()功能已被删除。请改用 print(end="")。
该FloatLiteral类型现在是无限精度的不可实现的类型。这意味着您可以使用FloatLiteral无舍入错误进行编译时计算。在运行时具体化时,FloatLiteral值将转换为 Float64.
# third is an infinite-precision FloatLiteral value
alias third = 1.0 / 3.0
# t is a Float64
var t = third
字符串类型都符合该 IntableRaising特征。这意味着您现在可以调用int("123")来获取整数123。如果无法从字符串中解析整数,则会引发错误。
该Tensor类型现在具有计算最大值或最小值位置的函数argmax()。 argmin()注意:这应该返回 a Tensor[Int] ,但当前输出张量与输入张量的类型相同。这将在未来版本中修复。
添加了一种新 collections.OptionalReg 类型,一种可通过寄存器传递的替代 Optional.
该ulp()功能已添加到 math模块中。这允许您获取浮点值的最小精度单位(或最后一位单位)。
🦋
simd_load()、simd_store()、和上的、 、 aligned_simd_load()和 aligned_simd_store()方法 已合并为一组更具表现力的和方法,仅包含关键字 和参数:DTypePointerBufferNDBufferload()store()widthalignment
# Doesn't work
my_simd = my_buffer.simd_load[simd_width](index)
# Works
my_simd = my_buffer.load[width=simd_width](index)
# Doesn't work
my_buffer.aligned_simd_store[width, alignment](my_simd)
# Works
my_buffer.store[width=width, alignment=alignment](my_simd)
除了以前所需的方法之外,该 EqualityComparable 特征现在还需要一致性方法。ne()eq()
现在许多类型都声明符合EqualityComparable特质。
StaticTuple参数顺序已更改为与类似集合类型StaticTuple[type, size]保持一致。SIMD
函数的签名 elementwise()已更改。新的顺序是 是function、simd_width、 然后rank。结果,现在可以推断出排名参数,并且 elementwise()无需它即可调用:
elementwise[func, simd_width](shape)
PythonObject现在可以注册了。
PythonObject.iter()现在可以在更多类型的可迭代 Python 对象上正常工作。尝试迭代不可迭代的对象现在将引发异常,而不是像迭代空序列一样。 iter()现在也借用self而不是要求inout,允许这样的代码:
for value in my_dict.values():
...
🚚
当我们经历 Mojo 标准库的开源过程时,我们借此机会将一些模块重新放置到正确的包中。具体来说,以下是一些值得关注的重大变化。请相应更新您的进口声明。
Buffer、 NDBuffer、 和朋友已从memory包中移至新buffer包中。
from buffer import Buffer, NDBuffer
utils.list,包括Dim和 DimList类型,已移至buffer包中。
from buffer import Dim, DimList
该parallel_memcpy() 函数已从memory包移至包中buffer。
from buffer import parallel_memcpy
包中 返回 a 的rand()和 函数已移至该包。请注意,写入 a 的重载保留在包中。
randn()randomTensortensorDTypePointerrandom
如果您碰巧在同一个源文件中使用这两个版本,则可以使用以下import as语法导入它们:
from tensor import rand
from random import rand as rand_dt
该trap()函数已重命名为 abort().它也从一个debug 模块转移到了另一个os模块。
from os import abort
isinf()和 方法isfinite()已从 模块math.limits中移出math。
from math import ininf, isfinite
工具⭐️
文档字符串代码块现在可以用来%#隐藏文档生成中的代码行。
例如:
var value = 5
%# print(value)
将生成以下形式的文档:
var value = 5
在测试执行期间,隐藏行的处理方式就像正常代码行一样。这允许在文档字符串示例中编写附加代码,该代码仅用于确保示例可运行/可测试。
Mojo LSP 服务器现在允许您指定在解析文档中导入的模块时要使用的其他搜索路径。您可以使用 选项在命令行上指定搜索路径-I,也可以将它们添加到 mojo.lsp.includeDirsVS Code 扩展中的设置中。
其他
❌
魔法__get_address_as_lvalue功能已被删除。现在,您可以使用解引用运算符 ( ) 从Pointeror获取 LValue :
var ptr: Pointer[MyRecord]
...
# Doesn't work
__get_address_as_lvalue(ptr.value) = MyRecord(3, 5)
# Works
ptr[] = MyRecord(3, 5)
memcpy现在可以自动推断函数的类型参数。这意味着对memcpy表单的调用memcpyDtype.xyz将不再有效,用户必须将代码更改为memcpy(...).
memcpy()适用于类型的重载 已Buffer被删除,只支持Pointerand 的 重载DTypePointer:
# Doesn't work
memcpy(destBuffer, srcBuffer, count)
# Works
memcpy(destBuffer.data, srcBuffer.data, count)
这些功能max_or_inf()已从min_or_neginf()中删除 math.limit。这些函数仅由 SIMD 类型使用。
如前所述,该print_no_newline()功能已被删除。请改用print(end="")。
🛠️
#1362 - 参数推断现在递归匹配函数类型。
#951async - 既错误又@always_inline错误的函数。
#1858 - 使用参数方法回归的特征。
#1892 - 禁止特征上不受支持的装饰器。
#1735 - 特征类型的值被错误地认为是相等的。
#1909 - 由于无法访问的块中的嵌套导入而导致崩溃。
#1921 - 解析器使对带有子类型生命周期的左值的绑定引用崩溃。
#1945 -Optional[T].or_else() 应该返回T而不是Optional[T].
#1940 - 限制math.copysign 为浮点或整数类型。
#1838 -print 指定时可变参数不起作用end=""
#1826 - 这些SIMD.reduce方法正确处理边缘情况size_out >= size。