Skip to content

Commit 0b5314d

Browse files
author
Jack Dunham
committed
Add @with_kwargs macro which automatically splats default_kwargs into a function call.
1 parent bd35f09 commit 0b5314d

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

src/solvers/default_kwargs.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,20 @@ function default_kwargs_macro(function_def)
9696

9797
return rv
9898
end
99+
100+
macro with_defaults(call_expr)
101+
if @capture(call_expr, (func_(args__; kwargs__)) | (func_(args__)))
102+
if isnothing(kwargs)
103+
kwargs = []
104+
end
105+
rv = quote
106+
$(esc(func))(
107+
$(esc.(args)...);
108+
default_kwargs($(esc(func)), $(esc.(args)...); $(esc.(kwargs)...))...,
109+
)
110+
end
111+
return rv
112+
else
113+
throw(ArgumentError("unable to parse function call expression, try including brackets in the macro call."))
114+
end
115+
end

test/solvers/test_default_kwargs.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using Test: @test, @testset
2-
using ITensorNetworks: AbstractProblem, default_kwargs, RegionIterator, problem, region_kwargs
2+
using ITensorNetworks: AbstractProblem, default_kwargs, RegionIterator, problem, region_kwargs, @with_defaults
33

44
module KwargsTestModule
55

@@ -37,4 +37,11 @@ end # KwargsTestModule
3737
@test KwargsTestModule.test_function(problem(our_iter); default_kwargs(KwargsTestModule.test_function, problem(our_iter); kw...)...) == (true, 1)
3838
@test KwargsTestModule.test_function(problem(not_our_iter); default_kwargs(KwargsTestModule.test_function, problem(not_our_iter); kw_not...)...) == (false, 2)
3939

40+
@test @with_defaults(KwargsTestModule.test_function(problem(our_iter))) == (true, 0)
41+
@test @with_defaults(KwargsTestModule.test_function(problem(our_iter);)) == (true, 0)
42+
@test @with_defaults(KwargsTestModule.test_function(problem(our_iter); bool = false)) == (false, 0)
43+
44+
let testval = @with_defaults KwargsTestModule.test_function(problem(our_iter); int = 3)
45+
@test testval == (true, 3)
46+
end
4047
end

0 commit comments

Comments
 (0)