Macros 朱莉娅:如何在函数中创建与输入变量匹配的符号?

Macros 朱莉娅:如何在函数中创建与输入变量匹配的符号?,macros,julia,Macros,Julia,我有一个Julia函数,它接受一些输入参数,并使用它们执行多个操作。为了让这些操作中的一个正常工作,我需要能够计算与用户输入匹配的符号。例如,该函数如下所示: function func(arg1,arg2) symb_arg1 = ## get the symbol for input into arg1 symb_arg2 = ## get the symbol for input into arg2 println(symb_arg1) printl

我有一个Julia函数,它接受一些输入参数,并使用它们执行多个操作。为了让这些操作中的一个正常工作,我需要能够计算与用户输入匹配的符号。例如,该函数如下所示:

function func(arg1,arg2)

    symb_arg1 =  ## get the symbol for input into arg1
    symb_arg2 =  ## get the symbol for input into arg2

    println(symb_arg1)
    println(symb_arg2)

    ## Do some operations using arg1, arg2, symb_arg1, symb_arg1

end
我希望实现以下行为:

a = 25
b = rand(27,55,18)
func(a,b)  ## prints :a and :b
这里的困难在于让函数计算一个符号,该符号包含变量的实际名称,而不是变量的值。这提供了以下宏,几乎满足了我的要求:

macro mymacro(ex)
    Expr(:quote,ex) # this creates an expression that looks like :(:(x + 2))
end
此宏可以很好地执行以下操作:

a = rand(27,15)
symb_a = @mymacro(a)  ## prints :a
但是,在我的函数中使用此宏将不会产生所需的效果。具体而言,如果我将我的函数定义为:

function func_bad(arg1,arg2)

    symb_arg1 = @mymacro(arg1)
    symb_arg2 = @mymacto(arg2)

    println(symb_arg1)
    println(symb_arg2)

    ## Do some operations using arg1, arg2, symb_arg1, symb_arg1

end
然后运行以下命令:

a = 25
b = rand(27,55,18)
func_bad(a,b)  ## prints :arg1 and :arg2 (instead of the desired :a and :b)

当然,一个简单(但不是很优雅)的解决方案是为函数添加额外的输入参数,以便用户负责创建符号。然而,这更像是最后的手段。我希望该功能能够自动创建符号。关于如何修改函数或宏以实现此行为,有什么想法吗?

简单的答案是这是不可能的;存在一个抽象障碍,阻止函数查看其调用方的实现细节。它们得到的只是值,这是健壮和清晰程序的关键属性

您可以做的一件事是编写宏来转换呼叫站点:

@with_syms func(a, b)
变成

func((:a,a), (:b,b))
将符号值对传递到函数中

另一个稍有不同的设计是为所有需要此行为的函数提供宏包装,这样调用看起来就像
@func(a,b)
。您可以将参数列表转换分解为助手函数;每个宏看起来都像

macro func(args...)
    :(func($(pair_with_symbols(args)...)))
end

我怀疑这可能是不可能的。看起来我可以用你的一个替代品,谢谢!