英文:
How to use an expression in function from other function in julia
问题
当我尝试以下代码时:
function f(x)
Meta.parse("x -> x " * x) |> eval
end
function g(x)
findall(Base.invokelatest(f,x),[1,2,3]) |> println
end
g("<3")
Julia会抛出"The applicable method may be too new"错误。
如果我尝试以下代码:
function f(x)
Meta.parse("x -> x " * x) |> eval
end
findall(f("<3"),[1,2,3]) |> println
Julia会给我正确的结果:[1, 2]
如何修改第一个代码片段以在另一个函数中使用字符串生成函数,谢谢!
在Julia 1.6.7中进行测试。
英文:
When I try those code below:
function f(x)
Meta.parse("x -> x " * x) |> eval
end
function g(x)
findall(Base.invokelatest(f,x),[1,2,3]) |> println
end
g("<3")
Julia throws "The applicable method may be too new" error.
If I tried these code below:
function f(x)
Meta.parse("x -> x " * x) |> eval
end
findall(f("<3"),[1,2,3]) |> println
Julia could give me corrected result: [1, 2]
How can I modify the first codes to use an String to generate function in other function, Thx!
Test in Julia 1.6.7
答案1
得分: 3
不同之处在于你的代码中,当你写成:
```Base.invokelatest(f, x)```
时,你调用的是 `f`,但 `f` 没有被重新定义。你想要做的是调用由 `f` 返回的函数,而不是 `f` 本身。
英文:
Do
function g(x)
h = f(x)
findall(x -> Base.invokelatest(h, x) ,[1,2,3]) |> println
end
g("<3")
The difference in your code is that when you write:
Base.invokelatest(f, x)
you invoke f
, but f
is not redefined. What you want to do is invokelatest
the function that is returned by f
instead.
答案2
得分: 1
使用宏而不是函数:
macro f(expr)
Meta.parse("x -> x $expr")
end
现在你可以这样做:
julia> filter(@f("<3"), [1,2,3])
2-element Vector{Int64}:
1
2
英文:
Use a macro instead of function:
macro f(expr)
Meta.parse("x -> x " * expr)
end
Now you can just do:
julia> filter(@f("<3"), [1,2,3])
2-element Vector{Int64}:
1
2
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论