我正在尝试构建一个函数,它将输出一个表达式,并分配给一个新的内存函数。我可能误解了元编程的功能,但我试图构建一个函数,生成一个数学系列,并将其分配给一个函数,例如:
主要的jl
function series(iter)
S = ""
for i in 1:iter
a = "x^$i + "
S = S*a
end
return chop(S, tail=3)
end
因此,这将构建模式,我暂时在repl中使用它:
julia> a = Meta.parse(series(4))
:(x ^ 1 + x ^ 2 + x ^ 3 + x ^ 4)
julia> f =eval(Meta.parse(series(4)))
120
julia> f(x) =eval(Meta.parse(series(4)))
ERROR: cannot define function f; it already has a value
显然,eval不是我在本例中要寻找的功能,但是,还有其他功能可以使用吗?或者,这难道不是在朱莉娅身上完成任务的可行方式吗?
这项任务可以通过理解来完成。我需要实时调频...
https://docs.julialang.org/en/v1/manual/arrays/#Generator-表情
另一个优雅的选择是使用Julia的多重分派机制,并根据类型而不是值分派生成的代码。
@generated function series2(p::Val{N}, x) where N
S = Expr(:call, :+)
for i in 1:N
push!(S.args, :(x ^ $i))
end
return S
end
用法
julia> series2(Val(20), 150.5)
3.5778761722367333e43
julia> series2(Val{20}(), 150.5)
3.5778761722367333e43
您得到的实际错误与元编程无关,但与您正在重新分配f
这一事实有关,该值在以下情况下被分配:
julia> f = 10
10
julia> f(x) = x + 1
ERROR: cannot define function f; it already has a value
Stacktrace:
[1] top-level scope at none:0
[2] top-level scope at REPL[2]:1
只是不喜欢那样。以不同的方式调用这两个变量中的任何一个。
现在是概念问题。首先,你在这里做的不是朱莉娅中的“正确”元编程:为什么要处理字符串和解析?你可以直接在表达式上工作:
julia> function series(N)
S = Expr(:call, :+)
for i in 1:N
push!(S.args, :(x ^ $i))
end
return S
end
series (generic function with 1 method)
julia> series(3)
:(x ^ 1 + x ^ 2 + x ^ 3)
这利用了这样一个事实,属于在重复应用程序中自动收集的表达式类。
其次,你没有在适当的地方调用ava
。我想你的意思是说“给我x
的函数,主体是系列(4)
返回的”。现在,当下面的工作:
julia> f3(x) = eval(series(4))
f3 (generic function with 1 method)
julia> f3(2)
30
这并不理想,因为每次调用函数时都要重新编译主体。如果您这样做,最好在函数定义中将代码扩展一次到主体中:
julia> @eval f2(x) = $(series(4))
f2 (generic function with 1 method)
julia> f2(2)
30
你只需要注意这里的卫生。这一切都取决于这样一个事实,即你知道生成的主体是根据x
制定的,函数参数与此相匹配。在我看来,实现你的想法的最朱利安的方式是通过一个宏:
julia> macro series(N::Int, x)
S = Expr(:call, :+)
for i in 1:N
push!(S.args, :($x ^ $i))
end
return S
end
@series (macro with 1 method)
julia> @macroexpand @series(4, 2)
:(2 ^ 1 + 2 ^ 2 + 2 ^ 3 + 2 ^ 4)
julia> @series(4, 2)
30
输出中没有剩余的自由变量。
最后,正如注释中所指出的,Base中有一个函数(以及相应的宏)evalpoly
,它概括了您的用例。请注意,此函数不使用代码生成——它使用精心设计的生成函数,与优化结合使用,生成的代码通常等于宏生成的代码。
Boost.Bind Bind是对标准库的绑定器bind1st 和 bind2nd的泛化。这个库支持使用统一的语法将参数绑定到任何类似于函数行为的东西,如函数指针、函数对象,以及成员函数指针。它还可以通过嵌套绑定器实现函数组合。这个库不要求那些对标准库绑定器的强制约束,最显著的就是不要求你的类提供typedefs result_type, first_argument_type, 和 second
我通过Julia使用GLPK,我需要反复优化同一个GLPK。Prob。每次优化之间的变化是变量的某些组合固定为0 简单的放入伪代码 当我运行这个程序时,看起来CPU1就像一个调度器,保持在9-11%的范围内,CPU3和CPU4上的负载在0和100%之间交替,尽管从来没有同时发生过。。。CPU2上的负载保持在0% 这可能需要一点时间,我想使用所有的核心 然而,使用Julia的并行功能有点麻烦,尤其是
本文向大家介绍学习Scala和函数式编程的原因,包括了学习Scala和函数式编程的原因的使用技巧和注意事项,需要的朋友参考一下 Scala是Scala,Groovy和Kotlin中最强大的Java替代品之一。Scala是一种JVM语言,是我最喜欢的程序员,您需要从Java切换到它,因为它与Java相似。 使之成为首选编程语言的最重要的事情是它同时支持函数式编程和面向对象的编程。函数式编程使其可以利
Python 提供了一个 functools 的模块,该模块为高阶函数提供支持,partial 就是其中的一个函数,该函数的形式如下: functools.partial(func[,*args][, **kwargs]) 这里先举个例子,看看它是怎么用的。 假设有如下函数: def multiply(x, y): return x * y 现在,我们想返回某个数的双倍,即: >>> mu
本文向大家介绍完全掌握C++编程中构造函数使用的超级学习教程,包括了完全掌握C++编程中构造函数使用的超级学习教程的使用技巧和注意事项,需要的朋友参考一下 构造函数是一种可初始化其类的实例的成员函数。构造函数具有与类相同的名称,没有返回值。构造函数可以具有任意数量的参数,类可以具有任意数量的重载构造函数。构造函数可以具有任何可访问性(公共、受保护或私有)。如果未定义任何构造函数,则编译器会生成不采
在将一些代码从转换为时,我注意到在中具有的基本数学运算符的奇怪行为。我想找到一个适用于的解决方案,这样我就可以将代码的输出与其当前的工作版本进行比较。 假设我有, 在中,总和和元素级总和给出一个输出矩阵,它是。我期待一个,因为总和的第一个参数具有这种类型。这同样适用于其他基本的数学运算。 我为找到了一个难看的变通方法,但对于元素明智的总和却没有。为了获得两个操作的正确类型(以及类似的-例如,),您