Julia - 使用元编程定义多个函数
Julia - Using metaprogramming to define several functions
我正在用 Julia 开发一个包,在我的包中我有几个具有相同布局的函数,但在它们使用的参数方面有一些小的变化。例如:
function MyFunction1(arg1, arg2)
do(arg1,arg2,parameter1)
end
function MyFunction2(arg1, arg2)
do(arg1,arg2,parameter2)
end
function MyFunction3(arg1, arg2)
do(arg1,arg2,parameter3)
end
现在,我想做的是创建一个规范数组,我在其中传递函数名称和参数,并使用元编程来定义此函数,例如:
spec = [["MyFunction1","parameter1"],["MyFunction2","parameter2"],["MyFunction3","parameter3"]]
如何在 Julia 中做到这一点?请注意,这是一个简化的示例,实际上我想允许更复杂的变化,否则只创建一个带有附加参数的函数而不是创建多个函数会更明智。
你应该考虑在这里完全不使用元编程,而是定义一个像这样的通用函数:
function my_general_function(arg1, arg2, parameters)
do(arg1, arg2, parameters)
end
然后您可以在一行中定义每个变体:
my_function_1(arg1, arg2) = my_general_function(arg1, arg2, parameters1)
my_function_2(arg1, arg2) = my_general_function(arg1, arg2, parameters2)
my_function_3(arg1, arg2) = my_general_function(arg1, arg2, parameters3)
如果 arg1
、arg2
部分写出来很烦人,你可以这样写一个函数生成器:
function my_function_generator(parameters)
(arg1, arg2) -> do(arg1, arg2, parameters)
end
然后像这样定义每个专用版本:
const my_function_1 = my_function_generator(parameters1)
const my_function_2 = my_function_generator(parameters2)
const my_function_3 = my_function_generator(parameters3)
这可以用宏来完成,但这里不需要它们,如果你坚持使用高阶函数(将函数作为参数的函数或 return 函数),事情通常会更简单、更清晰,而不是尽可能使用宏。
我正在用 Julia 开发一个包,在我的包中我有几个具有相同布局的函数,但在它们使用的参数方面有一些小的变化。例如:
function MyFunction1(arg1, arg2)
do(arg1,arg2,parameter1)
end
function MyFunction2(arg1, arg2)
do(arg1,arg2,parameter2)
end
function MyFunction3(arg1, arg2)
do(arg1,arg2,parameter3)
end
现在,我想做的是创建一个规范数组,我在其中传递函数名称和参数,并使用元编程来定义此函数,例如:
spec = [["MyFunction1","parameter1"],["MyFunction2","parameter2"],["MyFunction3","parameter3"]]
如何在 Julia 中做到这一点?请注意,这是一个简化的示例,实际上我想允许更复杂的变化,否则只创建一个带有附加参数的函数而不是创建多个函数会更明智。
你应该考虑在这里完全不使用元编程,而是定义一个像这样的通用函数:
function my_general_function(arg1, arg2, parameters)
do(arg1, arg2, parameters)
end
然后您可以在一行中定义每个变体:
my_function_1(arg1, arg2) = my_general_function(arg1, arg2, parameters1)
my_function_2(arg1, arg2) = my_general_function(arg1, arg2, parameters2)
my_function_3(arg1, arg2) = my_general_function(arg1, arg2, parameters3)
如果 arg1
、arg2
部分写出来很烦人,你可以这样写一个函数生成器:
function my_function_generator(parameters)
(arg1, arg2) -> do(arg1, arg2, parameters)
end
然后像这样定义每个专用版本:
const my_function_1 = my_function_generator(parameters1)
const my_function_2 = my_function_generator(parameters2)
const my_function_3 = my_function_generator(parameters3)
这可以用宏来完成,但这里不需要它们,如果你坚持使用高阶函数(将函数作为参数的函数或 return 函数),事情通常会更简单、更清晰,而不是尽可能使用宏。