@All, thanks for the interesting discussion. Certainly gives me something to chew on.
Re-reading the responses, I see that, while I did sort-of say it, I didn't emphasize the point of this:
I have a PEG-syntax parser written in esrap.
I am binding at least two such parsers as reader-macros (not the normal kind of macro).
The first parser parses PEG syntax and creates an esrap program.
That esrap program, bound as a reader-macro, reads Prolog syntax and returns a bunch of lisp forms to the reader.
I have a file of code that contains both, lisp and Prolog syntax (cl-heredoc to switch between the syntaxes), e.g.
https://github.com/guitarvydas/paraphrase/blob/master/prolog.lisp
The parsers read characters, not forms.
(lisp) #{ prolog(A,B,c) :- p1(A), p2(B,c). } (morelisp)
I am making at least 2 assumptions:
1. That using different name spaces for the various parsers will help me preserve my sanity, (regression testing the PEG parser using itself brings me to the limits of my comprehension :-),
2. That a reader macro must return a single form. I actually want to return a separate 'defun' for every prolog rule in the file. (Writing this, just now, makes me ask myself why I don't just put #{ ... } around every separate rule...)
(I even started fooling around with a Python syntax).
This line of thinking was inspired by the Gambit Scheme talk at ILC2010, where they showed inline infix mathematical expressions.
Thanks for your suggestions.
pt