Re: [GSOC][PATCH] userdiff: add support for Scheme
flat view
From: Phillip Wood <hidden>
Date: 2021-03-29 14:07:26
On 29/03/2021 14:12, Ævar Arnfjörð Bjarmason wrote:
On Mon, Mar 29 2021, Johannes Sixt wrote:quoted
Am 29.03.21 um 12:18 schrieb Phillip Wood:quoted
It would be nice to include indented define forms but including them means that any change to the body of a function is attributed to the last internal definition rather than the actual function. For example (define (f arg) (define (g x) (+ 1 x)) (some-func ...) ;;any change here will have '(define (g x)' in the hunk header, not '(define (f arg)' I don't think this can be avoided as we rely on regexs rather than parsing the source so it is probably best to only match toplevel defines.There can be two rules, one that matches '(define-' that is indented, and another one that matches all non-indented forms of definitions. If that is what you mean.Yes, but that doesn't help in these sorts of cases because what a rule like that really wants is some version of "don't match this line, but only if you can reasonably match this other rule". We can only do rule precedence on a per-line basis via the inverted matches. So for languages like cl/elisp/scheme and others where it's common to have nested function definitions (then -W would like the top-level) *OR* similarly looking nested function definitions, but the top-level isn't a function but a (setq) or whatever we're basically stuck with picking one or the other.
Exactly
I've pondered how to get around this problem in my userdiff.c hacking without resorting to supporting some general-purpose Turing machine, and have so far come up with nothing.
I think using an indentation heuristic would probably work quite well for most languages - see https://public-inbox.org/git/20200923215859.102981-1-rtzoeller@rtzoeller.com/ for a discussion from last year (from memory there were some problems with the approach in those patches but I think there are some suggestion from Peff and me later in the thread on how they could be overcome) Best Wishes Phillip
You can see lots of prior art by grepping Emacs's source code for beginning-of-defun, it solves this problem by exposing a Turing machine :)