That actually solves a bunch of problems for me… but strangely, not the initial one. If, for instance, I tabify
(+ 3 4) using the tabify-all method, the line with the four gets an indentation of 2, not 8. This is definitely different from DrRacket’s behavior. Any idea how to fix this? (cc:ing racket-users without permission, hope that’s okay?) John > On Mar 20, 2020, at 12:05 PM, John Clements <[email protected]> wrote: > > Ah! That’s probably a better solution, I’ll just do that. I searched for > “indent”, should I try to add that as a search term for the “tabify-all” > method? > > Many thanks! > > (Also, sending mail to the list using “[email protected]” seems to be > broken right now for me, sigh.) > > John > >> On Mar 20, 2020, at 12:01 PM, Robby Findler <[email protected]> >> wrote: >> >> I'm not sure of the details but did you consider just inserting it >> into a racket:text% and then calling the tabify-all method? >> >> Robby >> >> On Fri, Mar 20, 2020 at 1:26 PM John Clements <[email protected]> >> wrote: >>> >>> Hmm… followup problem. If I try to indent the string “#|\nabc\n|#” (that >>> is, a block comment), the compute-racket-amount-to-indent method returns >>> #f. Is this a bug, or just undocumented behavior? >>> >>> John >>> >>>> On Mar 20, 2020, at 10:41 AM, John Clements <[email protected]> >>>> wrote: >>>> >>>> I’m writing code to help me grade exams, and one of the issues I’ve run >>>> into is that the code coming out of the LMS is all totally unindented. So, >>>> for instance, a student’s response might read: >>>> >>>> ;Closures help a function value remember what substitutions have already >>>> been applied to it. >>>> '{vars {{x {lam {x} {+ 1 x}}} >>>> {y {lam {y} {+ 3 y}}}} >>>> {+ {x 2} {y 4}}} >>>> >>>> Obviously, it would be a lot easier to grade that if it was indented. >>>> >>>> Excellent! A chance to whip up a quick-and-dirty auto-indenter, using >>>> DrRacket’s indentation framework. Specifically, the >>>> `compute-racket-amount-to-indent` method of racket:text<%>. >>>> >>>> I’m pleased to report almost total success, aside from one strange >>>> off-by-one error that I’m looking for help with. To see it, here’s the >>>> result of my auto-indenter on the prior block: >>>> >>>> '{vars {{x {lam {x} {+ 1 x}}} >>>> {y {lam {y} {+ 3 y}}}} >>>> {+ {x 2} {y 4}}} >>>> >>>> (if you’re viewing this in a proportional-width font, that’s going to look >>>> terrible, sorry.) >>>> >>>> The issue is that the final plus line isn’t lined up with the curly-brace >>>> that’s two chars after the end of `vars`… instead, it’s one character to >>>> the left. >>>> >>>> A much simpler test case is simply running on “(+ 3\n4)”. Rather than >>>> getting the 4 lined up with the 3, I get it one character to the left. >>>> >>>> And… uh oh. A more illuminating test case occurs when I run my code on “(+ >>>> 3\n4)”. That is, I put a bunch more spaces before the 3. After >>>> indentation, the 4 is still only indented by two characters. So it looks >>>> like the `compute-racket-amount-to-indent` method is not looking for the >>>> token following the first one following the paren in the prior line (which >>>> would account for all the spaces), but just adding one to the last >>>> position of the first token following the paren. This makes me wonder >>>> whether DrRacket actually uses this method to indent. >>>> >>>> Hmm. >>>> >>>> Well, here’s the code to reproduce this. Note that there’s an obvious >>>> bug/assumption in that my code doesn’t account for any existing leading >>>> spaces on a line, but none of my examples have leading spaces following >>>> newlines. >>>> >>>> Advice appreciated! >>>> >>>> John >>>> >>>> >>>> >>>> >>>> #lang racket >>>> >>>> (require framework) >>>> >>>> ;; given a string of racket text, return the corresponding indented string >>>> ;; NB: CURRENTLY ASSUMES ALL LINES START WITH ZERO SPACES. >>>> (define (string-indent text-to-indent) >>>> (define t (new racket:text%)) >>>> (send t erase) >>>> (send t insert text-to-indent 0) >>>> (define num-paragraphs (add1 (send t last-paragraph))) >>>> (define indents >>>> (for/list ([n (in-range num-paragraphs)]) >>>> (define par-start (send t paragraph-start-position n)) >>>> (list par-start >>>> (send t compute-racket-amount-to-indent >>>> par-start >>>> head-sexp-type)))) >>>> ;; NB: OBVIOUSLY WRONG, assumes all lines start with zero leading spaces: >>>> ;; act in reverse order, to avoid messing up the meaning of char posns: >>>> (for ([indent (in-list (reverse indents))]) >>>> (send t set-position (first indent)) >>>> (define space-string >>>> (list->string (for/list ([i (in-range (second indent))]) #\space))) >>>> (send t insert space-string)) >>>> (send t get-text)) >>>> >>>> ;; for now, always return 'other >>>> (define (head-sexp-type str) >>>> 'other) >>>> >>>> >>>> (define text-to-indent >>>> #<<| >>>> ;Closures help a function value remember what substitutions have already >>>> been applied to it. >>>> '{vars {{x {lam {x} {+ 1 x}}} >>>> {y {lam {y} {+ 3 y}}}} >>>> {+ {x 2} {y 4}}} >>>> | >>>> ) >>>> >>>> (displayln (string-indent text-to-indent)) >>>> >>>> >>>> (displayln (string-indent " >>>> (+ 3 >>>> 4)")) >>>> >>>> >>>> (module+ test >>>> (require rackunit) >>>> >>>> >>>> (check-equal? (string-indent " >>>> (+ 3 >>>> 4)") >>>> " >>>> (+ 3 >>>> 4)") >>>> >>>> (check-equal? (string-indent " >>>> (+ 3 >>>> 4)") >>>> " >>>> (+ 3 >>>> 4)") >>>> >>>> (check-equal? (string-indent " >>>> (+ 3 >>>> 4)") >>>> " >>>> (+ 3 >>>> 4)")) >>>> >>> >>> >>> > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/c2923531-d620-43a3-9d6c-5521425d52c9%40mtasv.net.

