On 7/27/23 21:22, Eric Blake wrote:
> On Thu, Jul 27, 2023 at 08:50:31PM +0200, Laszlo Ersek wrote:
>>> File "GoLang.ml", line 186, characters 11-71:
>>> 186 |         pr ("\t" ^ "/* %s field is ignored unless %sSet == true. 
>>> */\n")
>>>                  
>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> Error: This expression has type string but an expression was expected of 
>>> type
>>>          ('weak2 -> 'weak3 -> 'weak4, unit, string, unit) format4 =
>>>            ('weak2 -> 'weak3 -> 'weak4, unit, string, string, string, unit)
>>>            CamlinternalFormatBasics.format6
>>
>> Sigh. :/
>>
>> "pr" is declared like this [generator/utils.mli]:
>>
>>   val pr : ('a, unit, string, unit) format4 -> 'a
>>
>> The format string would normally be converted to a "format4" type, which
>> is a polymorphic type, taking one type variable ('a).
> 
> You dug even deeper than me.  Thanks, even if it didn't yield a
> trivial solution.
> 
>> Ultimately open-coding the \t escape sequences seems the least intrusive...
>>
>>>
>>> so those are non-starters.  We can get more verbose with:
>>>
>>>     +        pr "\t";
>>>     +        pr "/* %s field is ignored unless %sSet == true. */\n"
>>>                fname fname;
>>>
>>> but that may not scale as nicely.  Go's use of TAB does not specify
>>> what tabstop it prefers;
>>
>> well that I find unfathomable; how can any coding style mandate TABs for
>> indentation if it doesn't explain how wide a TAB should be? For example,
>> that makes "maximum line width" mostly impossible to define.
> 
> https://go.dev/doc/effective_go#formatting
> 
> |  Some formatting details remain. Very briefly:
> | 
> | Indentation
> |     We use tabs for indentation and gofmt emits them by default. Use spaces 
> only if you must. 
> | Line length
> |     Go has no line length limit. Don't worry about overflowing a punched 
> card. If a line feels too long, wrap it and indent with an extra tab. 
> 
> and no mention of tab width.  The Go community really expects you to
> use gofmt without questions.

I may be overly sensitive, but I don't appreciate the "punched card"
reference. For work, I use a 22" monitor (landscape orientation), I like
to place two text windows (columns) side by side, and my eyesight isn't
the greatest, so I use relatively large fonts. My preferred source code
width is therefore 80 characters.

Other developers work with 100-120 chars per line; in edk2 we've seen
200+ chars even. When I complain, the answer is "just buy a larger
monitor, or use two monitors". Well, I don't feel *comfortable* using
two monitors (I've tried), *or* with a super wide screen (I've also got
a 24" monitor and that one feels too wide to me already -- but some
people use 49-50" monitors!).

It's strange that the go coding style tries to control the spacing
around operators like "+", but ignores the line length question (and
throws a quasi-insult at people that work with narrow source code). If a
codebase is consistently written with a 128 chars/line limit, it might
very well pass "gofmt", but I'd be mostly incapable of working with it.

> 
>>
>>> our .editorconfig suggests using a tabstop of
>>> 4 (instead of the usual 8) when reading a .go file for less visual
>>> distraction, and which matches with GoLang.ml currently using 4-space
>>> indentation.
>>>
>>> Rich, do you have any ideas on any better approach to take here?
>>>
>>>>> -        pr "  %sSet bool\n" fname;
>>>>> -        pr "  %s " fname;
>>>>> +        pr "\t%sSet bool\n" fname;
>>>>> +        pr "\t%s    " fname;
>>>
>>> I also debated about splitting this patch into two (yes, more
>>> gruntwork): one to address space before '(', and the other to address
>>> leading indentation.  Lines like this would be touched by both
>>> patches if I split.
>>>
>>
>> I wouldn't insist on such a split. :)
> 
> The benefit of such a split: changing "int (r)" to "int(r)" is
> non-controversial, while changing "    line" to "\tline" could be reverted
> if we find a cleaner way to get pr to do indentation on our behalf.
> 
> There's also the idea that if the main thing that gofmt still
> complains about is 4 spaces vs. TAB, we could use coreutils'
> unexpand(1) on platforms where 'gofmt' is not installed (although I'm
> not sure unexpand is portable enough to consider it likely to be
> installed on other systems).  The more I think about this, the more
> I'm leaning towards injecting gofmt into the pipeline, especially
> since Tage has already proposed injecting rustfmt into the pipeline.
> 
> Still, cleaning up the ' (' to be consistent with language idioms
> seems worthwhile, even if I punt on the TAB issue.
> 

OK, sounds like a plan -- "separate out the space removal from before
parens, and integrate gofmt into the build process".

Regarding the new gofmt dependency: can we assume that wherever go
exists, gofmt also exists? (On RHEL9, they are both in golang-bin.) IOW,
whenever we build the go bindings, we can also format them. This seems
to have come up during the discussion, but I don't remember the verdict.

Laszlo
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to