First, I want to make sure I understand what you're saying. I think you're saying you'd like to be able to add (for instance) a curly-brace-java-like syntax, and intermingle this with the parenthesized syntax, is that right? So, to be very specific, it appears to me that you would definitely not be happy with the parenthesized version of this:
(class Selfofly
(method doCoolStuff ([int x] [int y])
(+ x y)))
(Selfofly doCoolStuff 2 2)
If I'm incorrect, then please disregard the following. If I'm right, though, then let me ask: would you like (in the system you're proposing) to also be able to build a system where the close brace on the class is omitted? That is, would you like to be able to make this a legal program?
class Selfofly {
method doCoolStuff(int x, int y) {
(+ x y)
}
(Selfofly.doCoolStuff 2 2)
?
If I'm understanding you correctly, the challenge in building a system such as the one you describe comes when trying to mix together the various syntactic extensions; it's very easy to design an ambiguous system, where there are many different legal parsings of the same text. Consider, for instance, a system where indentation is significant, intermixed with one where it's not. Things get interesting quickly.
I think you might be interested in reading more about rhombus and about shrubbery; in my opinion, one of the key syntactic insights of the last fifty years, and one that's not yet widely understood, is the separation between "reader" and "parser"; that is, that intermingling of macros defined in separate places is made plausible by the initial agreement upon a common set of "shape" rules. In lisp-like languages, for instance, this common shape is defined by parenthesizing everything. In languages such as Python and Rhombus, by contrast, you see things like indented blocks preceded by a line ending with a colon, parenthesized lists with elements separated by commas, et cetera.
One compelling piece of negative evidence comes from early versions of Rust, which I got to work on back in 2011 or so; the macro system there was initially designed to allow macros to specify their own internal parsers, that would consume tokens until they decided that they were done. In my opinion, this made for a clunky and difficult-to-use system, where any macro-designer had to be sensitive to the structure of the internal set of AST nodes, and made macro hygiene nearly impossible.
This is not to say that you can't build such a system, though! Racket is totally set up to allow you to define your own #lang, and give it its own reader and parser; you can define the way in which code is parsed, right down to the character level; Rhombus is a perfect example of this.
John