gpt4 book ai didi

architecture - Julia:使用许多不同但相关的算法选择来构建代码

转载 作者:行者123 更新时间:2023-12-04 04:58:28 25 4
gpt4 key购买 nike

我正在寻找一种优雅的方式来重新安排我的代码。对于开发求解器,您可以有很多具有相同设置的不同选项。例如,在高层次上,代码看起来像这样:

function solver()
# Start by assigning a bunch of variables, preprocessing, etc.
...
# Choose and execute solve
if alg==1 doAlgorithm1()
elseif alg==2 doAlgorithm2()
elseif alg==3 doAlgorithm3()
end
# Postprocess and return
...
end

以前,当我快速制作原型(prototype)时,我会将求解器算法直接放在代码中。然而,随着我在越来越多的算法上做标记,这变得很困惑(尤其是当一些算法有数百行代码时),所以我想将这些调用作为一个单独的函数。但是,我希望它们本质上与将代码块放在那里是一样的:访问相同的范围、有副作用等。

我考虑过为此使用宏,但由于它们在全局范围内求值,所以这似乎是错误的解决方案。嵌套函数看起来可能是可行的,但我必须在求解器的顶部定义它们(我的意图是不这样做以保持高级算法的可读性)并且在嵌套函数中限定嵌套函数的范围存在问题(对于仅在某些算法中重复的部分!)。我可以将其定义为另一个函数,而无需尝试保持相同的范围,但是如果使用长跟踪参数(每个算法都具有相同的参数!),它会很丑陋!

组织这种代码的好方法是什么?是否有更 Julian 的方法来解决这个问题?

最佳答案

我不确定这是否比使用状态对象更好,但您可以使用宏来实现您想要的:

macro f() 
quote
b = 5
x = a * b
x # the value of a block is equal to its last statement
end
end

function foo()
a = 2
b = 3
x = @f()
x, b # (10,3)
end

请注意 Julia自动替换 bx在宏中使用唯一名称以避免副作用。如果你想有副作用,你可以使用以下方法:

macro g() 
esc(quote
b = 5
x = a * b
end)
end

function bar()
a = 2
b = 3
@g()
x, b # (10,5)
end

这相当于替换@g()代码介于 quote 之间和 end来自 g 的定义.还可以定义一个方便的小宏:

macro def(name, definition)
return quote
macro $(esc(name))()
esc($(Expr(:quote, definition)))
end
end
end

由此,g可以定义为

@def g begin
b = 5
x = a*b
end

关于architecture - Julia:使用许多不同但相关的算法选择来构建代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com