gpt4 book ai didi

function - Julia Do 函数的语法是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 12:19:16 27 4
gpt4 key购买 nike

我见过here那个do语法可以用作更方便的书写方式 map()功能,但我不明白如何例如在链接的 julia 文档中显示的示例中:

open("outfile", "w") do io
write(io, data)
end
它适用于“打开”的以下函数定义
function open(f::Function, args...)
io = open(args...)
try
f(io)
finally
close(io)
end
end
do世界上怎么做的?通过 iowrite(io,data)open的实际功能和 f(io) ?是否具有 do 的功能块必须具有相同的名称/为 do 多分派(dispatch)阻止工作?

最佳答案

这是一个纯粹的句法转换。

func(x) do y
body
end
相当于
func(y -> body, x)
或者
tmp = y -> body
func(tmp, x)
如果你愿意,即 do block 定义了一个匿名函数,作为第一个参数传递。当然,要使其工作,需要存在 func 的方法。具有匹配签名,例如 func(f::Function, ...) = ... (或简单地 func(f, ...) = ... )。

您可以使用 Meta.@lower 来检查真正发生的事情。 :
julia> Meta.@lower func(x) do y
print(y)
end
:($(Expr(:thunk, CodeInfo(
@ none within `top-level scope'
1 ─ $(Expr(:thunk, CodeInfo(
@ none within `top-level scope'
1 ─ global var"#1#2"
│ const var"#1#2"
│ %3 = Core._structtype(Main, Symbol("#1#2"), Core.svec(), Core.svec(), false, 0)
│ var"#1#2" = %3
│ Core._setsuper!(var"#1#2", Core.Function)
│ Core._typebody!(var"#1#2", Core.svec())
└── return nothing
)))
│ %2 = Core.svec(var"#1#2", Core.Any)
│ %3 = Core.svec()
│ %4 = Core.svec(%2, %3, $(QuoteNode(:(#= REPL[1]:2 =#))))
│ $(Expr(:method, false, :(%4), CodeInfo(
@ REPL[1]:2 within `none'
1 ─ %1 = print(y)
└── return %1
)))
│ #1 = %new(var"#1#2")
│ %7 = #1
│ %8 = func(%7, x)
└── return %8
))))
不幸的是,输出与匿名函数的实现细节混淆:代码定义了一个新结构( %3 ),使用 %4 的主体使其可调用( do )块,创建它的一个实例( %7 ),最后调用 func(%7, x) .

关于function - Julia Do 函数的语法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67519111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com