One particular tactic which doesn’t seem like it would be horrible would be to use the same symbol both to introduce the lambda and then as a sigil for its positional arguments.
There are four reasonable possibilities I can think of for this symbol, each with different potential conflicts.
Each of the below examples is equivalent to: sort_by(|x0, x1| foo(x0) > foo(x1))
sort_by(@ foo(@0) > foo(@1))
This likely conflicts with e.g. the proposed use of @ for attributes (but there are many potential uses for @).
sort_by($ foo($0) > foo($1))
This likely conflicts with macros. (I’m not super familiar with macros but I know they use $.)
sort_by(? foo(?0) > foo(?1))
This likely conflicts with the proposed postfix ? for exception propagation.
sort_by(\ foo(\0) > foo(\1))
This likely conflicts with the idea of a \foo b for infix function calls.
Potentially (at least for some of these) we could also allow just the sigil without a number, or _, in which case the numbering would be implicit based on the order they appear in the code. (Probably the two would be mutually exclusive, i.e. either all arguments have to be numbered or none.)
EDIT: Actually this would likely be ambiguous with the very idea of using the sigil to introduce the lambda… but _ would still be OK. (Unless we use that for default arguments or something.)