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)

如果 arg1arg2 部分写出来很烦人,你可以这样写一个函数生成器:

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 函数),事情通常会更简单、更清晰,而不是尽可能使用宏。