good answer... I was preparing a similar response, with somewhat different syntax to stay as close as possible to the OP "spec by example". Here's my solution:
\define mymacro() <$vars webid={{!!webid}}<<mymacro_makelink>></$vars>
The approach is basically the same as yours, except I avoided passing the $web$ parameter by using a fixed literal value directly in place. I also avoided passing the id parameter by using the <$vars> widget to fetch the "{{!!webid}}" field value and set the $(webid)$ variable. Lastly, as a matter of style, I prefer to use more description naming for "worker" macros rather than simply adding a number. If there are a lot of worker macros involved, it would be hard to remember which numbered function does what! Thus, "mymacro_link()" instead of "mymacro2()".
enjoy,
-e
Eric Shulman
TiddlyTools.com: "Small Tools for Big Ideas!" (tm)
InsideTiddlyWiki: The Missing Manuals