<div dir="auto">How about —std=experimental then, if it needs to be a runtime flag due to CI constraints?</div><div dir="auto">Whether or not that flag is only exposed for nightly builds and not for release builds is another option.</div><div dir="auto">That should help with the CPP mess and CI load?</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, 3 Sep 2023 at 3:38 PM, Simon Marlow <<a href="mailto:marlowsd@gmail.com">marlowsd@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr"><div dir="ltr">On Sun, 3 Sept 2023 at 01:16, Moritz Angermann <<a href="mailto:moritz.angermann@gmail.com" target="_blank">moritz.angermann@gmail.com</a>> wrote:</div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, 2 Sep 2023 at 9:56 PM, Simon Peyton Jones <<a href="mailto:simon.peytonjones@gmail.com" target="_blank">simon.peytonjones@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr"><div style="font-family:tahoma,sans-serif">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;font-family:tahoma,sans-serif;border-left-color:rgb(204,204,204)"><div style="font-family:tahoma,sans-serif">Again, my point is that Unstable extensions should _not_ be in the Stable ghc releases, and as such anything that's in</div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;font-family:tahoma,sans-serif;border-left-color:rgb(204,204,204)"><div style="font-family:tahoma,sans-serif">the stable ghc releases should be considered stable.</div></blockquote><div style="font-family:tahoma,sans-serif"><br></div><div style="font-family:tahoma,sans-serif">I don't agree with this. To follow your plan we would have to do this:</div><div style="font-family:tahoma,sans-serif"><ul style="font-family:tahoma,sans-serif"><li style="font-family:tahoma,sans-serif">Release ghc-9.10</li><li style="font-family:tahoma,sans-serif">Release ghc-9.10-experimental<br></li><li style="font-family:tahoma,sans-serif">The two are bit-for-bit identical, except that in ghc-9.10 a bunch experimental extensions, available in ghc-9.10-experimental, are unavailable</li></ul></div></div></div></blockquote><div dir="auto">I do not consider this significantly more work it’s really just passing -DEXPERIMENTAL to the build. But we don’t even need those during our _stable_ build releases. We have nighties and we could build nightlies with -DEXPERIMENTAL. Thus everyone who wants unstable/experimental features can get them through nightly builds.</div></div></div></blockquote><div><br></div><div>This seems impractical to me. Adding a CPP macro that changes the compiler doubles the amount of CI and release builds we have to do, and CI for GHC is barely practical as it is. We discourage the use of CPP for good reasons - it's much better to use runtime switches.</div><div><br></div><div>Cheers</div></div></div><div dir="ltr"><div class="gmail_quote"><div>Simon<br></div><div> </div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div><div class="gmail_quote"><div dir="auto"><br></div><div dir="auto">This is also what other languages do. </div><div dir="auto"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr"><div style="font-family:tahoma,sans-serif"><div style="font-family:tahoma,sans-serif">You clearly feel strongly about this so I feel I am missing something important. <br></div></div></div></blockquote><div dir="auto"><br></div><div dir="auto">Yes, very much so. </div><div dir="auto"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr"><div style="font-family:tahoma,sans-serif"><div style="font-family:tahoma,sans-serif">Maybe you want -Werror=XExerimental to be the default?  So that to use an experimental feature the user would not only have to invoke it by name, but also switch off the error its use triggers.  That would cause a huge amount of transitional churn which users would hate us for, but I can see some logic in it.</div></div></div></blockquote><div dir="auto"><br></div><div dir="auto">That’s why I’m advocating for a separate build. So they don’t get any warning and can enable the features to their heats content. But if you do not use the experimental build (e.g. a nightly) you can not, not even by accident, enable those features.</div><div dir="auto"><br></div><div dir="auto">By having them in release builds you open the door to lengthy discussions of why some features a _stable_ compiler offers should _not_ be used. And then have to have reviewers be careful about which extensions and other features are enabled or not. It basically puts a lot of work on teams to reign in on accidental usage of experimental/unstable features. So then we end up building tools on-top, lingers, CI checks to run with <div dir="auto"><span style="font-family:tahoma,sans-serif;font-size:16px;font-style:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration:none;float:none;display:inline;background-color:rgba(0,0,0,0);border-color:rgb(0,0,0);color:rgb(0,0,0)">-Werror=XExerimental, … all just to ensure something which should not be there by construction.</span></div></div><div dir="auto"><br></div><div dir="auto">I simply do not believe that experimental or unstable features should be part of stable releases. What is the definition of stable at that point?</div><div dir="auto"><br></div><div dir="auto">The practice that we put experimental/unstable features into our stable releases is something this proposal seems to cement, which is why I’m so much against it in this form. I fundamentally believe that if we put experimental/unstable features into our releases we must not call them stable releases. So we are left with experimental/unstable releases only. </div><div dir="auto"><br></div><div dir="auto">We’ve had discussions around this before:</div><div dir="auto">- Michael Snoymans Boring Haskell[1]</div><div dir="auto">- Simple Haskell[2]</div><div dir="auto">- George Wilson’s talk on Cultivating an Engineering Dialect[3]</div><div dir="auto"><br></div><div dir="auto">I hope this helps clarify my stance on this proposal.</div><div dir="auto"><br></div><div dir="auto">Moritz</div><div dir="auto"><br></div><div dir="auto">—</div><div dir="auto">[1]: <div><a href="https://www.snoyman.com/blog/2019/11/boring-haskell-manifesto/" target="_blank">https://www.snoyman.com/blog/2019/11/boring-haskell-manifesto/</a></div></div><div dir="auto">[2]: <div><a href="https://www.simplehaskell.org" target="_blank">https://www.simplehaskell.org</a></div></div><div dir="auto"><div dir="auto">[3]: <a href="https://www.youtube.com/watch?v=L4h6VegK1BI" target="_blank">https://www.youtube.com/watch?v=L4h6VegK1BI</a></div><br></div><div dir="auto"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr"><div style="font-family:tahoma,sans-serif"><div style="font-family:tahoma,sans-serif" dir="auto"><span style="font-family:tahoma,sans-serif">On Sat, 2 Sept 2023 at 03:49, Moritz Angermann <</span><a href="mailto:moritz.angermann@gmail.com" target="_blank" style="font-family:tahoma,sans-serif">moritz.angermann@gmail.com</a><span style="font-family:tahoma,sans-serif">> wrote:</span><br></div></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr">This is a bit hard for me. But here it goes.<div><br></div><div>IMO _every_ extension enabled in the public release of GHC _are_ stable by definition. It's a stable release, thus</div><div>the available extensions are also those the GHC team decides to be stable. While I'm very much in favour of having</div><div>a clearer picture of what we currently consider extensions to be. I do not believe _Unstable_ extensions should</div><div>ever be part of a public stable release. I also don't think the distinction between Legacy and Deprecated is easy to</div><div>understand for the end user. Either the extension is supposed to be used, or not. Stable or Deprecated. The fact that</div><div>we'll keep some extension around for what is effectively an infinite deprecation period is a technicality in my opinion.</div><div><br></div><div>This puts my vote probably fairly square into Alternative 6.3; I don't think 6.1 is useful. Having to tell people to RTFM</div><div>comes across pretty passive aggressive all the time. Also it's the compiler's knowledge as to what is deprecated or not</div><div>and it should report this. 6.2 is even worse, as it now has two components that need to be kept in sync, while the</div><div>extensions are pretty much integral to GHC. Hence GHC has this knowledge and should report it. 6.4 and 6.5 are in</div><div>the same line as the Legacy/Deprecated extra complexity bucket to me.</div><div><br></div><div>Again, what's shipped in the stable release _is_ stable to me. And as such any _unstable_ extensions should _not_</div><div>be in stable ghc releases. Other languages have separate channels for this. I've also proposed multiple times to have</div><div>either two separate development branches: stable + experimental (stable being periodically merged into experimental),</div><div>and cutting _stable_ releases from stable, potentially offering _experimental_ releases from the experimental branch.</div><div>And alternative model is to have a single branch (as I do understand that getting stuff from the experimental branch</div><div>migrated into stable could be a bit messy), but have every _unstable_ extension behind a -DEXPERIMENTAL compile</div><div>time flag. The same flag could be used to produce experimental ghc releases for 3rd parties to consume.</div><div><br></div><div>Again, my point is that Unstable extensions should _not_ be in the Stable ghc releases, and as such anything that's in</div><div>the stable ghc releases should be considered stable. If I want to play with bleeding edge features, I should have to use</div><div>a completely separate compiler for this (again, other languages _do_ follow this approach).</div><div><br></div><div>And that leaves us with stable extensions in GHC, for which we eventually see that we have better facilities now or</div><div>learned over time that these extensions (despite being stable), have reached their end of life. In that case they should</div><div>be marked as deprecated with appropriately long deprecation cycles.</div><div><br></div><div>GHC already has a ton of flags, let's try not to add that many more to it. Ultimately someone needs to keep all of this</div><div>in their head, while also trying to get their job done. And for some this job is 9-5, five days a week only; no late night</div><div>hacking sessions, no weekend projects; but instead soccer practice, cycling, spending time with their family. If we want</div><div>to make haskell successful, we need to make sure that in that people can be effective and productive and solve real</div><div>world problems in the 40hs they have per week; and not study manuals, or flags (and if they see one of the many</div><div>unknown flags, go study those flags) more than absolutely necessary to get work done.</div><div><br></div><div>In summary, I don't see myself supporting this proposal as it adds too much complexity and sets in stone that unstable</div><div>extensions are part of a stable compiler. I'm happy to see that the "only deprecations" option is listed as an alternative</div><div>in 6.3, even though I do not agree with the assessment that we need more nuance for users. Extension in my opinion</div><div>should only be stable, or deprecated. And the end user should never see unstable extensions, unless they _explicitly_</div><div>asked for an experimental/unstable compiler.</div><div><br></div><div>Moritz<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, 2 Sept 2023 at 08:24, Eric Seidel <<a href="mailto:eric@seidel.io" target="_blank">eric@seidel.io</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">There's a non-normative and a normative component to this proposal.<br>
<br>
The non-normative piece says that there should be a categorization scheme for language extensions. That is inarguable in my opinion. The proposal also suggests an initial framework of four categories, which seems like a reasonable place to start. (Vlad says we should first figure out how to map all extensions to the categories; I disagree. We can iterate on the categories over time, as needed.)<br>
<br>
The normative piece of the proposal says that we should start warning on the use of any Deprecated, Unstable, or Legacy extensions. This seems like a reasonable ideal, but the practicality kind of hinges on the bucketing of specific extensions (and on Richard's question of how `default-language` is interpreted). The authors give some recommendations of how to bucket particular extensions, but it's not exhaustive and I also view it as the authors' desire rather than a specific commitment of the proposal.<br>
<br>
So in my view:<br>
<br>
* Yes, we should have a framework for categorizing the jungle of language extensions, and the proposal seems like a fine starting point.<br>
* Yes, we should have a set of warnings for users who would like to forbid certain categories of extensions.<br>
* We should probably defer any decisions about default enablement of warnings until we have a complete proposed categorization. And that discussion should include some analysis of the pervasiveness of "deprecated", "unstable", and "legacy" extensions so we can judge the amount of churn. Just like any other discussion about deprecation.<br>
<br>
Eric<br>
<br>
On Fri, Sep 1, 2023, at 12:56, Richard Eisenberg wrote:<br>
> I've just posted on the GitHub ticket. I remain against the proposal in <br>
> its current form, mostly because it means (if I understand correctly) <br>
> that everyone who says `default-language: Haskell2010` will get <br>
> warnings.<br>
><br>
> Richard<br>
><br>
>> On Sep 1, 2023, at 12:21 PM, Simon Marlow <<a href="mailto:marlowsd@gmail.com" target="_blank">marlowsd@gmail.com</a>> wrote:<br>
>> <br>
>> On Fri, 1 Sept 2023 at 17:17, Simon Marlow <<a href="mailto:marlowsd@gmail.com" target="_blank">marlowsd@gmail.com</a>> wrote:<br>
>>> A few things make this not a straightforward thumbs up for me, though I'm not strongly against.<br>
>>> <br>
>>> What is the interaction with GHC20xx? Presumably we want to say something like GHC20xx will never include any Deprecated or Legacy extensions? What about Unsable? if an extension transitions from Stable -> Legacy, would we remove it from the next GHC20xx?<br>
>> <br>
>> Ah, I just noticed that the proposal does say something about this:<br>
>> <br>
>>> For existing, or future, language sets such as `GHC2021` or `Haskell98`, it is expected that none of the contained extensions would be `Unstable`. However, this proposal does not seek to impose any particular policy on the inclusion of extensions into language sets - the developers and the steering committee are always in the best position to make a decision about a concrete extension and extension set.<br>
>>  <br>
>> OK.<br>
>> <br>
>> Simon<br>
>> <br>
>> <br>
>>> <br>
>>> Something doesn't feel quite right about the warning system. If a module can start with<br>
>>> <br>
>>> {-# OPTIONS_GHC -Wno-XDeprecated #-}<br>
>>> {-# LANGUAGE OverlappingInstances #-}<br>
>>> <br>
>>> and silently use an extension that the {build system, user, project} wanted to disallow, have we achieved anything? Compare this to the current situation, where the environment can say -XNoOverlappingInstances and code can override that with {-# LANGUAGE OverlappingInstances #-} - there's essentially no difference, we just added another layer of disable/override that isn't buying us anything.<br>
>>> <br>
>>> (note I'm viewing this through the spectacles of -Werror, because I've come to believe that warnings are essentially not useful unless given teeth with -Werror.)<br>
>>> <br>
>>> Cheers<br>
>>> Simon<br>
>>> <br>
>>> On Fri, 1 Sept 2023 at 13:18, Vladislav Zavialov <<a href="mailto:vlad.z.4096@gmail.com" target="_blank">vlad.z.4096@gmail.com</a>> wrote:<br>
>>>> I agree that we need a categorisation of extension language flags, but I'm not convinced that {Stable, Unstable, Deprecated, Legacy} is the right set of labels. In fact, I wouldn't want to commit to any particular categorisation before we actually go through all the extensions in GHC and see for ourselves that they can be adequately categorized according to the proposed system.<br>
>>>> <br>
>>>> The proposal says "classifications of individual language extensions will be left to a future proposal". Well, I am skeptical that this separation makes sense. I would much prefer if we were discussing a concrete categorisation proposal, not just a set of four labels whose implications I can't fully grasp.<br>
>>>> <br>
>>>> Vlad<br>
>>>> <br>
>>>> On Fri, Sep 1, 2023 at 11:37 AM Simon Peyton Jones <<a href="mailto:simon.peytonjones@gmail.com" target="_blank">simon.peytonjones@gmail.com</a>> wrote:<br>
>>>>> Dear Simon, Vlad, Eric, Chris, Moritz<br>
>>>>> <br>
>>>>> I would love to hear from you about this proposal.  *Please*. <br>
>>>>> <br>
>>>>> I plan to accept it unless I hear dissent.  But I would much rather have an explicit response from you than take silence as assent.  You are a member of the committee, after all!<br>
>>>>> <br>
>>>>> My apologies if I have missed your reply<br>
>>>>> <br>
>>>>> Simon<br>
>> _______________________________________________<br>
>> ghc-steering-committee mailing list<br>
>> <a href="mailto:ghc-steering-committee@haskell.org" target="_blank">ghc-steering-committee@haskell.org</a><br>
>> <a href="https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee" rel="noreferrer" target="_blank">https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee</a><br>
><br>
> _______________________________________________<br>
> ghc-steering-committee mailing list<br>
> <a href="mailto:ghc-steering-committee@haskell.org" target="_blank">ghc-steering-committee@haskell.org</a><br>
> <a href="https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee" rel="noreferrer" target="_blank">https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee</a><br>
_______________________________________________<br>
ghc-steering-committee mailing list<br>
<a href="mailto:ghc-steering-committee@haskell.org" target="_blank">ghc-steering-committee@haskell.org</a><br>
<a href="https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee" rel="noreferrer" target="_blank">https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee</a><br>
</blockquote></div>
_______________________________________________<br>
ghc-steering-committee mailing list<br>
<a href="mailto:ghc-steering-committee@haskell.org" target="_blank">ghc-steering-committee@haskell.org</a><br>
<a href="https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee" rel="noreferrer" target="_blank">https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee</a><br>
</blockquote></div>
</blockquote></div></div>
_______________________________________________<br>
ghc-steering-committee mailing list<br>
<a href="mailto:ghc-steering-committee@haskell.org" target="_blank">ghc-steering-committee@haskell.org</a><br>
<a href="https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee" rel="noreferrer" target="_blank">https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee</a><br>
</blockquote></div></div>
</blockquote></div></div>