Keith Vetter 2018-08-15: I've always liked
Tip 288 -- Allow "args" Anywhere in Procedure Formal Arguments. But seeing how it was proposed back in 2006, I doubt it will ever get implemented.
That being said, I thought it would be fun to try my hand at providing a tcl-only version of this tip. Also, since I've been writing a lot of Python recently and am intrigued with
@decorators, I'd thought I use that mechanism.
#
# tip288 -- decorator to allow args anywhere in the argument list
# https://core.tcl.tk/tips/doc/trunk/tip/288.md
# see also: http://chiselapp.com/user/aspect/repository/tcl-hacks/finfo?name=modules/tip288-0.tm
proc @tip288 {p pname pargs lambda} {
if {$p ne "proc"} { error "bad synax: $p != 'proc'"}
set idx [lsearch $pargs "args"]
if {$idx == -1 || $idx == [llength $pargs] - 1} {
proc $pname $pargs $lambda
return
}
set pre [lrange $pargs 0 $idx]
set post [lrange $pargs $idx+1 end]
set body "
set args \[lreverse \[lassign \[lreverse \$args\] [lreverse $post]\]\]
$lambda
"
proc $pname $pre $body
}
Here's some code to test it:
@tip288 \
proc test_@tip288_middle {a b args c d} {
puts "a: '$a' b: '$b' c: '$c' d: '$d' => args: '$args'"
}
@tip288 \
proc test_@tip288_front {args a b c d} {
puts "a: '$a' b: '$b' c: '$c' d: '$d' => args: '$args'"
}
@tip288 \
proc test_@tip288_end {a b c d args} {
puts "a: '$a' b: '$b' c: '$c' d: '$d' => args: '$args'"
}
@tip288 \
proc test_@tip288_none {a b c d} {
puts "a: '$a' b: '$b' c: '$c' d: '$d'"
}
test_@tip288_middle A B these are random arguments for testing C D
test_@tip288_front these are random arguments for testing A B C D
test_@tip288_end A B C D these are random arguments for testing
test_@tip288_none A B C D