Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revising R6RS #574

Open
mnieper opened this issue May 20, 2021 · 35 comments
Open

Revising R6RS #574

mnieper opened this issue May 20, 2021 · 35 comments
Labels

Comments

@mnieper
Copy link
Contributor

mnieper commented May 20, 2021

Since its coronation in 2007, R6RS has remained a viable dialect for Scheme, both in research and for doing practical programming. The Scheme standardization process has moved on in the form of R7RS-small and a number of SRFIs for R7RS-large, but these later standards are successors of R5RS and do not supersede R6RS, so R6RS has remained frozen from its inception.

As the R6RS has been written under the assumption that it won't be the last revision in its line of dialects, I would like to explore the willingness of the community to invest in a revision of R6RS. Thanks to the library versioning system of R6RS, such a revision can be fully compatible with R6RS by using the library versions (6 1) instead of (6) and by adding the lexical syntax #!r6.1rs analogous to #!r6rs. (I am calling the revision 6.1 in order to signal that it does not step on the toes of R7RS but will be a successor to R6RS instead.)

The goals of such a revision can be the following:

  • Incorporate the errata from www.r6rs.org into the report.
  • Add the "missing" type predicates as mentioned in Section 7.1 of Chez's user manual.
  • Signal newcomers to the Scheme language that R6RS is still alive and hasn't been superseded by R7RS.
  • Revive general interest.
  • Reduce some incompatibilities with R7RS. Depending on where R7RS-large heads, this may make a reunification around a hypothetical R8RS possible.
  • Extend the language according to experience since 2007.

Concerning language extensions, I think the following options could be discussed:

  • Syntax parameters.
  • Identifier properties.
  • Delimited Continuations.
  • Continuation Marks.
  • Promises à la SRFI 155, which don't need delay-force.
  • Datum labels in reader syntax.
  • Optional basic threading library with specified semantics when available.
  • Removal of seemingly artificial restrictions (like the order of definitions and expressions in (library) bodies).
  • Standardizing the naming convention (srfi :nnn) of SRFI 97.
  • Ellipsis and underscore as literals in syntax-case.
  • Guile's with-ellipsis in order to be able to support the syntax-rules of SRFI 46/R7RS.
  • Parameter objects as in SRFI 18/SRFI 39 with tail context guarantee of Racket.
  • Adding a few POSIX-like OS-interface procedures, like accessing of environment variables as in SRFI 98.
  • Add a new data structure like HAMTs to support purely functional "hash tables". (This can then be used for implementing the continuation marks from above.)
  • Chez's local modules and imports and Chez's meta definitions.
  • include and cond-expand (or meta-expand) expressions.
  • Make pairs in rest lists immutable.
  • Incorporate (some of) R7RS's lexical syntax for identifiers (including |...| and ..1).

What do you think? In order for such an attempt to be meaningful, it is important that the main R6RS implementations will endorse such a hypothetical R6.1RS. This includes first and foremost Chez Scheme, but also Racket should be willing to move its R6RS mode forward. We shouldn't forget about GNU Guile and the relatively new Loko either.

The first revision of R6RS does not have to be monumental. An incremental approach and relatively fast delivery seem the better choice.

Thanks!

Marc

PS Please excuse this misuse of Chez's issue tracker in order to reach an important part of the R6RS community.

@johnwcowan
Copy link

As the chair of the R7RS-large working group, I support this effort.

Here are some further suggestions for base-level R6.1RS libraries along with sample proposals:

  1. Sockets: SRFI 106. This allows portable clients (servers are not as important) both for connecting to local servers like database engines, and for accessing Internet resources. Standardizing on a simple HTTP/HTTPS client would also be a Good Thing.

  2. Standard FFI: PFFI. With this we can make Posix SRFI 170 and related proposals portable too.

I think it's very important to standardize these things; the detailed proposals are just indicative. I only wish they were so straightforward for R7RS-large.

@mnieper
Copy link
Contributor Author

mnieper commented Oct 17, 2023

I want to update you on this topic briefly: I asked the Scheme Steering Committee for their support for this endeavour. They will discuss the topic at their next meeting (probably by the end of October). I hope we get a positive reply.

@LiberalArtist
Copy link
Contributor

The behavior of / with exact 0 (see #400 and #773) seems worth adding to this list.

@mnieper
Copy link
Contributor Author

mnieper commented Dec 1, 2023

Thank you for pointing this out, @LiberalArtist.

PS The Scheme Steering Committee hasn't made up their mind yet, so I cannot tell more in this direction at the moment. While Scheme does not belong to anyone, and we are free to take any action we want, it will be better if we have broad support.

@mnieper
Copy link
Contributor Author

mnieper commented Dec 12, 2023

This is another place where a revision of R6RS can improve the standard:

https://github.com/cisco/ChezScheme/blob/main/s/enum.ss#L27

@LiberalArtist
Copy link
Contributor

Another addition to the list: #835 (comment)

@GunpowderGuy
Copy link

Provided r7rs large does get finalized, why should r6rs be revised instead of adopting the former?

@mnieper
Copy link
Contributor Author

mnieper commented Jul 26, 2024

Provided r7rs large does get finalized, why should r6rs be revised instead of adopting the former?

There are at least the following reasons:

  • R7RS-large aims for strict R7RS-small compatibility, and most people working on R7RS-large come from the tradition of R7RS-small. This reflects the design of the language, and those looking for a programming language strictly compatible with R6RS (modulo bugs) will likely not find it with R7RS-large.
  • Moreover, where R6RS and R7RS-small differ in style, R7RS-large will likely adopt the R7RS-small style (e.g. #uXXX prefixes instead of the more regular #vXXX prefixes of R6RS). (That said, there will be aspects where R7RS-large will be closer to R6RS than R7RS-small is.) Contrary to this, an R6.1RS will be a language in the tradition of R6RS, which has not been superseded by R7RS (in spite of the unfortunate numeric versions that suggest an ordering).
  • R7RS-large is a larger language than R6RS. As much as R7RS-small is not a replacement for R7RS because of its (small) size, R7RS-large won't be a replacement because of its size (large). Not every implementation that implements R6RS will be willing to implement a much larger language.
  • R7RS-large is a significant undertaking that will take a lot longer to finalize than it does to finalize an R6.1RS, especially should R7RS-large aim at the precision of the R6RS.

That said, an R6.1RS should anticipate the upcoming R7RS-large and should aim for better interoperability (compared to R6RS) where possible.

@GunpowderGuy
Copy link

GunpowderGuy commented Jul 26, 2024

Fragmentation between R6RS and R7RS has already been incredibly detrimental to Scheme. This split resulted in two competing standards and arguably contributed to languages like Racket and Gerbil becoming part of the Scheme family instead of R*RS supersets. Developing yet another incompatible standard with R6.1RS will hurt the teachability and portability of code even more. For these reasons, conserving the idiosyncrasies of R6RS is not worth the fragmentation it perpetuates.

The concerns about the size and finalization time of R7RS-large can be addressed in other ways besides continuing R6RS. One approach is developing an R7RS-medium standard. This intermediate version would provide a balance between the simplicity of R7RS-small and the comprehensiveness of R7RS-large, making it more practical for current implementations to transition and adopt.

@mnieper
Copy link
Contributor Author

mnieper commented Jul 26, 2024

Fragmentation between R6RS and R7RS has already been incredibly detrimental to Scheme. This split resulted in two competing standards and arguably contributed to languages like Racket and Gerbil becoming part of the Scheme family instead of R*RS supersets. Developing yet another incompatible standard with R6.1RS will hurt the teachability and portability of code even more. For these reasons, conserving the idiosyncrasies of R6RS is not worth the fragmentation it perpetuates.

It was R7RS that broke compatibility with the preceding standard, not R6RS. While we can regret it or blame the Steering Committee responsible for the R7RS charter, it won't change history, and we have to live with the results of this process.

When you write "conserving the idiosyncrasies of R6RS", it suggests that you would let R7RS overrule R6RS in case of differences and favour R7RS in general over R6RS. In this case, the R7RS-large project is probably to your liking.

There is no fundamental reason to rank R7RS above R6RS, though. In fact, many Schemers prefer the R6RS dialect, which is still ahead of R7RS in terms of precision, sophistication, and functionality. One of the most advanced RnRS implementations (if not the most advanced one) is an implementation of R6RS, not R7RS.

That said, a revision to R6RS does not widen the gap to R7RS but will likely narrow it. So, the only reason that speaks against an R6.1RS is ultimately political: "There shall be only one true Scheme standard, and all Schemers shall assemble behind this one and not stray. For this, every initiative concerned with a different standard must be treated as an orphan."

The problem with this maxim is that the proper scheme standard needs to be decided, i.e., whether it shall be in the tradition of R6RS or in the tradition of R7RS. The wider community does not have a consensus on the latter point. People in the R7RS subcommunity think R7RS is the better option; people in the R6RS community think R6RS is the better language. Until such a consensus is reached (R6.1RS and R7RS-large are just steps toward it), enforcing the maxim would alienate or drive away half of the combined Scheme community.

The concerns about the size and finalization time of R7RS-large can be addressed in other ways besides continuing R6RS. One approach is developing an R7RS-medium standard. This intermediate version would provide a balance between the simplicity of R7RS-small and the comprehensiveness of R7RS-large, making it more practical for current implementations to transition and adopt.

This would only solve one of my points. During my involvement with R7RS-large, I tried to lobby to base it on a subset, as you describe, which is a superset of both R6RS and R7RS-small but is neither biased towards R6RS nor R7RS-small (and is, in particular, allowed to correct R7RS-small where it went wrong). However, it was decided to base R7RS-large strictly on R7RS-small and not give R6RS and R7RS-small equal footing.

This does not mean that R7RS-large will be a worse language. Maybe it becomes a better individual language with a bias towards R7RS-small. But it does mean that R7RS-large (or any R7RS-medium) won't be a successor to R6.1RS.

In any case, I am not sure whether this issue tracker is the right place to discuss these political questions. It is certainly the right place to add items to the list that an R6.1RS should address because they are clearly bugs in R6RS or because they are sorely missing. An R6.1RS won't be a Scheme for every schemer, but those don't need to complain because, for them, there is R7RS-large, which won't go away because of an R6.1RS. On the contrary, should Chez Scheme support a future R6.1RS, this will likely be a better base for implementing an R7RS(-large) on top of Chez Scheme than R6RS would be.

@GunpowderGuy
Copy link

"This would only solve one of my points. During my involvement with R7RS-large, I tried to lobby to base it on a subset, as you describe, which is a superset of both R6RS and R7RS-smal"

I was referring to r7rs small being a subset of r7rs big, not also of r6rs.

"There is no fundamental reason to rank R7RS above R6RS, though. In fact, many Schemers prefer the R6RS dialect, which is still ahead of R7RS in terms of precision, sophistication, and functionality."

Could you explain the way people think r6rs wins in terms of precision and sophistication ? R7RS small has less functionality but that is something should be addressed by developing more R7RS big and or medium . Likewise fundamental defficiencies could and should be addressed in future standards.

@mnieper
Copy link
Contributor Author

mnieper commented Jul 27, 2024

"This would only solve one of my points. During my involvement with R7RS-large, I tried to lobby to base it on a subset, as you describe, which is a superset of both R6RS and R7RS-smal"

I was referring to r7rs small being a subset of r7rs big, not also of r6rs.

I understood. What I wanted to say was that "medium"-like dialect based on both R6RS and R7RS-small without favouring R7RS-small over R6RS could have been a way forward.

"There is no fundamental reason to rank R7RS above R6RS, though. In fact, many Schemers prefer the R6RS dialect, which is still ahead of R7RS in terms of precision, sophistication, and functionality."

Could you explain the way people think r6rs wins in terms of precision and sophistication ? R7RS small has less functionality but that is something should be addressed by developing more R7RS big and or medium . Likewise fundamental defficiencies could and should be addressed in future standards.

Just to give a few examples: R6RS has a condition system and clearly defines where, when, and what exceptions are to be raised by the system. Contrary to this, R7RS mostly speaks of "it is an error," and its exception system is mostly useless for portable code when it comes to exceptions raised by the implementation. The R6RS is very detailed about the semantics of macro expansions of library and procedure bodies, and it has found the correct semantics so that identifier syntax can define variable-like identifiers. In contrast, the R7RS forgot this lesson.

The point is not that not all of this can be added to R7RS; the point is that there is already a standardized Scheme programming language that has all these features on board and for which excellent implementations exist. It is imaginable that a language like R7RS-large would have long been finished if it were based on R6RS because this wouldn't involve reinventing many wheels.

Have you done substantial programming both in R6RS and in R7RS? When I came to Scheme about 12 years ago, R7RS was about to be finalized. I was blinded by the higher version number (and probably because there was better lobbying for R7RS), so I didn't take a look at R6RS, thinking of it as an obsolete, if not obscure version (one could find a lot of FUD about R6RS). Only when I grew older and wiser 😃, did I take a look at R6RS and look into the arguments more deeply. After I had done a lot of programming in R6RS and read the report in detail, I understood that it is a better Scheme language than R7RS, not only in theory but also when it comes to practical programming. R7RS-small should have been defined as a subset of R6RS (and superset of R5RS); it could have been a language equivalent to the current R7RS-small but without introducing a split in the Scheme community. Alas, the Steering Committee of that time thought differently. Maybe we can continue this discussion somewhere else, e.g., on r/scheme on Reddit, so as not to clutter this issue tracker further.

That said, R6RS is not perfect (only "perfect" 😉), and that's where an R6.1RS comes into play.

@ufo5260987423
Copy link

Hi, guys, I hope the committee will concern about development environment so that the next release may be able to be easily supported. Though most schemers may mainly program in text editor, easily used language server and many other tools still confirm what those newbies experience.

For example, with finned language feature supporting, these followings will be most-common-used features in real world applications:

  1. support SRFI 106, though I have already implement my own scoket. This plays an important role to call scheme program into micro-services business.
  2. implement a timer like this, so programmers can decide the next step when sockets or other things expire.
  3. bring chez's profiling procedures into r6rs, which is essential to real-world applications.

Just taking scheme-langserver as an example, which mainly appeals users by completing local identifiers within incomplete codes, it can involve high-level rules making auto-completing much more intelligent. Especially for macros, a macro out of r6rs standard will hardly have supports and a standard macro is surely to have.

@lassik
Copy link

lassik commented Jul 29, 2024

Hello,

I've been lurking this issue, trying to avoid saying anything. It's time to point out the elephant in the room:

Two competing standards, R6RS and R7RS, is a public relations disaster.

When one group ships R6RS, and another group ships R7RS, with substantial differences, it means the community has split.

If the first group ships R6.1 a decade after R7, it means the split has been solidified.

A solidified split means you have two languages, not one.

Yet both sides of the split continue to use the name Scheme.

And the core of both languages looks the same, justifying the use of the common name Scheme to refer to both.

Yet the groups still go their own ways.

The situation doesn't add up. Onlookers will (correctly) infer that schemers of any persuasion have no idea how to organize themselves, and will apparently spend decades working around petty disagreements instead of solving them.

The following are reasonable ways to solve this problem:

  • Call the two languages by different names. (Racket took this approach.)
  • Both camps agree to deprecate one standard and continue with the other.
  • Both camps agree to merge the standards.

I would like to emphasize the words both and agree. These words place people over concepts. Nobody wise cares at this point what any given schemer thinks about any given technical point, unless it helps achieve unity.

The new standard should be called R8RS to signify that the split is history.

I would strongly advise against making any other move.

@mnieper
Copy link
Contributor Author

mnieper commented Jul 29, 2024

Lassi, please don't use this issue for political discussions. I tried to bring this point across in my latest posts here, which you, being wise 😉, surely have read. It's not that these discussions should not be had, the Chez Scheme issue tracker where possible improvements over R6RS are collected is just not the place for it. There one can also discuss whether it may even be that you want to fix something that doesn't need to be fixed.

R7RS-large won't be a standard that treats R6RS on equal footing and an R8RS if it ever comes is so far in the future that it is no substitute for a small amendment like R6.1RS.

@lassik
Copy link

lassik commented Jul 29, 2024

An R6.1RS point release is inherently political.

Point releases of any RnRS report signify deep-seated problems in the standardization process.

@lassik
Copy link

lassik commented Jul 29, 2024

(To clarify: Collecting improvements to R6RS is a fine thing to do, but you should be very careful about how to label and publish them.)

@mnieper
Copy link
Contributor Author

mnieper commented Jul 29, 2024

(To clarify: Collecting improvements to R6RS is a fine thing to do, but you should be very careful about how to label and publish them.)

R6.1RS is a tentative name. While it may not be overly pretty, it works particularly well with the R6RS library versioning and makes it clear where it stands relative to R6RS.

@lassik
Copy link

lassik commented Jul 29, 2024

My main point is that nobody should call any project R6.x or R7.x. Library versioning merely underscores the problem.

It's a bad move if the Scheme Steering Committee ratifies minor versions. It's an even worse move if a group outside the Committee releases a "de facto" minor version of an official report.

It is very important for Scheme to have cohesive authority. And it is important to project an accurate image of that authority through names and numbers. Authority is to be used sparingly and decisively. The RnRS cadence has been to ship a major version every 5-10 years. Minor versions (especially for an old edition) give the impression that the top authority in the language is either fumbling around, or there is no authority at all.

@mnieper
Copy link
Contributor Author

mnieper commented Aug 28, 2024

Non-empty mantissa widths may need some more explanation, which can be decided upon and added to R6.1RS. See #866.

@dpk
Copy link

dpk commented Sep 9, 2024

  • R7RS-large aims for strict R7RS-small compatibility, and most people working on R7RS-large come from the tradition of R7RS-small. This reflects the design of the language, and those looking for a programming language strictly compatible with R6RS (modulo bugs) will likely not find it with R7RS-large.

Marc, you know that this is not true.

I know you are not happy that the WG has not accepted your proposal that every Large implementation would have to support R6RS exactly as R6RS was written. (Note, though, that it has not rejected it yet either.) But we are going out of our way to try to make it possible for implementations to support R6RS, with almost all of the error handling requirements of R6RS, alongside R7RS. The R7RS steering committee has endorsed this decision. I still intend to ship as-strict-as-possible sample implementations of the (rnrs (6)) libraries in terms of R7RS Large (whether under the aegis of the WG, or in my own private capacity).

Even taking ‘strict compatibility’ as strictly as possible, the only case I am aware of where it will likely not be possible (or at least not easy) for an R7RS Large implementation to signal an error where R6RS requires it is the case of unquoted vector literals, because there is no layer of the language at which a switch can be implemented for this behaviour which wouldn’t impede interoperation between libraries written for R6RS and libraries written for R7RS.

Please, again, stop reinforcing the belief among R6RS people that R7RS is anti-R6RS. As I have written several times, my goal is to reunite R7RS and R6RS – the communities just as much as the technologies. I can think of no worse way to undermine this goal than the comments you keep posting here in the Chez issue tracker spreading nonsense like this.

@mnieper
Copy link
Contributor Author

mnieper commented Sep 9, 2024

  • R7RS-large aims for strict R7RS-small compatibility, and most people working on R7RS-large come from the tradition of R7RS-small. This reflects the design of the language, and those looking for a programming language strictly compatible with R6RS (modulo bugs) will likely not find it with R7RS-large.

Marc, you know that this is not true.

I know you are not happy that the WG has not accepted your proposal that every Large implementation would have to support R6RS exactly as R6RS was written. (Note, though, that it has not rejected it yet either.) But we are going out of our way to try to make it possible for implementations to support R6RS, with almost all of the error handling requirements of R6RS, alongside R7RS. The R7RS steering committee has endorsed this decision. I still intend to ship as-strict-as-possible sample implementations of the (rnrs (6)) libraries in terms of R7RS Large (whether under the aegis of the WG, or in my own private capacity).

Even taking ‘strict compatibility’ as strictly as possible, the only case I am aware of where it will likely not be possible (or at least not easy) for an R7RS Large implementation to signal an error where R6RS requires it is the case of unquoted vector literals, because there is no layer of the language at which a switch can be implemented for this behaviour which wouldn’t impede interoperation between libraries written for R6RS and libraries written for R7RS.

Please, again, stop reinforcing the belief among R6RS people that R7RS is anti-R6RS. As I have written several times, my goal is to reunite R7RS and R6RS – the communities just as much as the technologies. I can think of no worse way to undermine this goal than the comments you keep posting here in the Chez issue tracker spreading nonsense like this.

I think I have to clarify a number of points I made (which will hopefully show that we are closer than we are apart).

The main point is that I have never meant that R7RS is anti-R6RS. The process (or the main forces behind it) that brought R7RS into existence was (were) presumably anti-R6RS, but as I have repeated several times, this is history, and we have moved forward since then. The R7RS-large project, especially under your aegis, is certainly reducing the split that was created in the post-R6RS era.

However, as much as R7RS is not anti-R6RS, it is not R6RS either. While R7RS-large will likely be large enough so that it can provide an R6RS compatibility layer, this does not automatically make it a successor to R6RS. (Ignoring the known deviations, this would be roughly similar to saying that C++ is a successor to C.) It could be a successor to R6RS if R6RS got the same footing as R7RS-small in the design of the large language, and an idiomatic R6RS program would as much be an idiomatic R7RS-large program as an idiomatic R7RS-small program would be. For example, in the R7RS-large WG, I also proposed developing the rnrs libraries of R6RS further in parallel to the scheme libraries of R7RS-small, but that was insofar rejected in that it was said that the fancy new stuff should appear in the scheme namespace and that no (rnrs (7)) libraries should be created. (As I have already mentioned earlier, this is a rational design decision for R7RS-large as long as it doesn't want to be unbiased with respect to R7RS-small and R6RS.)

Unless it has been revised recently, R7RS-large still aims for strict compatibility with R7RS-small. This is another bias towards R7RS-small vs. R6RS. If I remember correctly, at least on two occasions, discussions on questionable design decisions of R7RS-small were cancelled with reference to the goal of strict reference to R7RS-small.

Technically, it is certainly the case that an R6RS compatibility layer of R7RS-large can be almost strictly compatible with R6RS. However, I do not think strict technical compatibility is the main point. Equally important points are, for example, the reintegration of pair mutation into the base library, which R6RS deprecated, and the scope and the size of the whole system. Another example is that R6RS would expect, say, #vu16 vectors and not #u16 vectors. No less important is the fact that implementations would no longer be able to return zero values in the case of standard procedures without meaningful return values (unless all such procedures would come in two versions).

Even while you try to be relatively unbiased, it cannot be denied that almost all people active on R7RS-large are firstly R7RS programmers and only secondly R6RS programmers. As far as I know, this is also true for the majority of people who have participated in previous ballots. Unless I am mistaken, all the members of the Steering Committee that participated in the vote voted against R6RS. Implementers and programmers of R6RS are basically inactive on the relevant SRFI lists or in the WG for R7RS-large. It is still possible, but unlikely, that the end result of R7RS-large would look like a natural successor of R6RS.

Some people portrayed the R6.1RS proposal as an anti-R7RS-large movement. This is not the case. Instead, one of the goals of R6.1RS is to make interoperability with R7RS easier (self-evaluating vector literals are one possible example). It could become something like R7RS-large without the R7RS-small compatibility stuff and without those batteries that would not fit the size of R6RS. Moreover, R6.1RS should be rich enough so that, the other way around, a portable R7RS-large implementation on top of it should be possible. Assuming that Chez will support R6.1RS, we could then make it implement R7RS-large as well.

There is certainly the possibility to develop an R6.1RS within the R7RS-large project (which could mean to basically take a subset of R7RS-large together with some refitting into the existing R6RS namespaces and possibly some additions like a #!r6.1rs flag). I would be delighted if I could win you for this. I believe that you want to reunite R6RS and R7RS (languages and communities), but I also believe that this will ultimately only work if as many "R6RS people" drive such a project as "R7RS people" do.

The only circumstance in which the R6.1RS proposal would go against the wishes of the R7RS-large project would be if the proponents of R7RS-large insisted that future idiomatic Scheme code should abandon the tradition of R6RS (e.g., to give a trivial example, the rnrs namespace or that the language is safe in the sense of R6RS or that, say, map only takes lists of equal lengths) and should like code coming from the R7RS-small tradition. If that were the goal of the R7RS-large, it would be important to make R6RS-like programming (in the above sense) as difficult as possible, and R6.1RS would be an impediment to this goal.

@mnieper
Copy link
Contributor Author

mnieper commented Sep 29, 2024

Thank you for pointing this out, @LiberalArtist.

PS The Scheme Steering Committee hasn't made up their mind yet, so I cannot tell more in this direction at the moment. While Scheme does not belong to anyone, and we are free to take any action we want, it will be better if we have broad support.

By chance, I found this statement by the editors of the R6RS: [Scheme Steering Committee announcements] R6RS Released

As it seems, incremental improvements were already on the editors' minds; even the name R6.1RS isn't new. The editors most likely didn't think that it would take more than 17 years for this program to be implemented.

@GunpowderGuy
Copy link

GunpowderGuy commented Oct 25, 2024

Would a revised R6RS ease interop with R7RS and succesors? It would be nice if pieces of chez scheme such as new optimization passes or backends could be written in newer standards. I gather the practicality of doing so with the current R6RS backend is somewhat controversial

@jltaylor-us
Copy link
Contributor

Would a revised R6RS ease interop with R7RS and succesors?

Only if those changes were backwards incompatible with things previously in r6rs, which is a bad idea.

It would be nice if pieces of chez scheme such as new optimization passes or backends could be written in newer standards. I gather the practicality of doing so with the current R6RS backend is somewhat controversial

That would imply that newer standards were somehow better. In the case of r7rs-small that is just not true. R7rs-large is still under development (i.e., it doesn't actually exist as a standard yet), but as long as it mandates strict compatibility with r7rs-small it is building on shaky foundations that none of the Chez Scheme maintainers care to invest any time to support (at least as of the last time we polled on our opinion of r7rs support).

I propose (not entirely facetiously) that we instead create r8rs which admits that r7rs was a mistake and starts with a strict subset of Chez Scheme's current behavior as its baseline for what scheme should be. :)
Then in addition there could be a standardization effort for "scheme standard libraries" with freely-distributable reference implementations written in pure scheme that various scheme distributions could either include or choose to re-implement in some more performant "native" code.

@dpk
Copy link

dpk commented Oct 26, 2024

Would a revised R6RS ease interop with R7RS and succesors?

Only if those changes were backwards incompatible with things previously in r6rs, which is a bad idea.

This is not true, at least for any reasonable definition of ‘incompatible’.

R7rs-large is still under development (i.e., it doesn't actually exist as a standard yet), but as long as it mandates strict compatibility with r7rs-small it is building on shaky foundations that none of the Chez Scheme maintainers care to invest any time to support (at least as of the last time we polled on our opinion of r7rs support).

Why do you believe that R7 small is more problematic than R5RS? There is lots of undefined behaviour in R7 small, but no more so than R5RS. R7 large is building on R7 small in exactly the same way R6 built on R5. And indeed on R6 too. In fact, many of the really ‘problematic’ things with R5 (e.g. assignment to the bindings of imported identifiers) were already fixed in R7 small like they were in R6.

Then in addition there could be a standardization effort for "scheme standard libraries" with freely-distributable reference implementations written in pure scheme that various scheme distributions could either include or choose to re-implement in some more performant "native" code.

Guess what R7RS large is trying to do!

@dpk
Copy link

dpk commented Oct 26, 2024

Why do you believe that R7 small is more problematic than R5RS? There is lots of undefined behaviour in R7 small, but no more so than R5RS. R7 large is building on R7 small in exactly the same way R6 built on R5. And indeed on R6 too. In fact, many of the really ‘problematic’ things with R5 (e.g. assignment to the bindings of imported identifiers) were already fixed in R7 small like they were in R6.

Apologies for double-posting, but I would like to expand a little more on this.

The R6RS editors were quite open at the time about the fact that the R6RS was not a successor to the R5RS in all respects; particularly with respect to semantics suitable for implementation by a ‘pure’ interpreter. Exempli gratia. (There were other mails to this effect posted by other editors which I can’t currently find – possibly later than that particular r6rs-discuss archive currently contains.)

When those who maintain implementations which aren’t suited to full R6RS compliance got together and made something that could be called a successor to R5RS in the sense of these issues – and in so doing hewed close enough to the R6RS that they are very nearly compatible even on the level of binding names between different versions’ libraries – they get called reactionary and the spec is called nonsense.

Put frankly, I don’t understand this hostility.

WG1 made a few bad decisions (creating their own define-library instead of subsetting R6RS library is the big one i.m.o.) but these were political in nature. In its technical content, R7RS small is a sound language specification in the spirit of R5RS. R7RS large will be (I hope!) a sound language specification in the spirit of R6RS. WG2’s commitment to R7RS small compatibility is no greater hindrance to creating something in this spirit than the existence of the (rnrs r5rs) library in R6RS is. As was pointed out by R6RS advocates at the R7RS small ratification, just because our charter only formally requires R7RS small compatibility doesn’t mean we are prevented from committing ourselves informally to R6RS compatibility as well – that is exactly what WG2 has done.

If Chez’s maintainers would like to wait for the large report to come out before supporting any of R7RS, that is understandable – the large report will define the R6RS compatibility provisions (e.g. what particular condition types are raised by R7RS small procedures and syntax, especially those that weren’t in R6RS, in case of errors) and it is probably better to wait than to try to second-guess what WG2 will decide and have to correct things later. But if Chez’s maintainers have rejected any form of R7RS support before even seeing the large report, simply because it will be compatible with the small report, that seems premature and unnecessarily … well, reactionary.

@mnieper
Copy link
Contributor Author

mnieper commented Oct 26, 2024

There is no need for hostility and no need to accuse others of being hostile. We are just talking about programming language specifications. It is not up to the proponents of R7RS to lobby against other initiatives to create specifications for a Scheme language for their use, nor is it up to the proponents of non-R7RS specifications of Scheme to lobby against the R7RS-large effort. Scheme has always been inviting and open, and no group should be so cocksure of themselves to believe that their standard should also be adopted by everyone else. There will be implementations and users of R7RS as there will be implementations and users of R6.1RS. Some will like both and implement both; others will like one and won't like the other. As long as there are no deliberate obstacles to interoperability, a rich ecosystem (which includes standards) is better than a monoculture.

While R7RS-large can achieve huge compatibility with R6RS, it won't be a substitute for R6RS (and R6.1RS). It will carry a lot of compatibility baggage from R7RS-small (because that part is declared sacrosanct by the Steering Committee - understandable when we recall that four of five voted against R6RS and at least one of them lobbied strongly against R6RS), forcing compromises that R6RS does not have to make. Moreover, the language, including its standard libraries, will be a lot larger than R6RS. It was voted down when I suggested that the rnrs libraries and the R6RS syntax like #vu... should be treated on equal footing in R7RS-large, which means that an R6RS programmer will have to switch to R7RS idioms when wanting to use new features.

The best outcome will be that R6.1RS will be mostly a subset of R7RS-large with its R6RS compatibility layer and that an R6RS programmer or implementation will have to make no (bad) compromises when using R6.1RS.

I agree with @jltaylor-us about the R8RS comment. As described by @dpk, after fixing all the R7RS-small mistakes, R7RS-large will more or less be in the spirit of R6RS but in disguise of R7RS. It would, therefore, be more honest to drop the reference to R7RS in the language's name and admit that R7RS-small was a step back and is not a solid foundation to build a large language on top of it and that the semantics of R6RS will be used instead. In the course of that, a Steering Committee representing both communities (R6RS and R7RS) in equal measure should be selected, and joint work on R8RS should be started. The R6RS report, parts of Chez's documentation, and what @dpk has already written down for R7RS-large would be a great starting point.

@dpk
Copy link

dpk commented Oct 26, 2024

You are welcome to appeal to the steering committee to ask for an R8RS.

I still think that merely changing the name will not change anything meaningful; that reunification of the Scheme community is the only reasonable meaningful goal of future report efforts (to the extent that it would be better to dissolve all working groups and give up on standardization, than for competing factions to continue to put out their own incompatible reports and leave users stranded in the middle of increasing compatibility headaches); and that compatibility with R7RS small and R6RS is the only technical basis on which unity of Scheme programmers who do ‘programming in the large’ can be achieved.

@lassik
Copy link

lassik commented Oct 26, 2024

I still think that merely changing the name will not change anything meaningful;

+1

that reunification of the Scheme community is the only reasonable meaningful goal of future report efforts (to the extent that it would be better to dissolve all working groups and give up on standardization, than for competing factions to continue to put out their own incompatible reports and leave users stranded in the middle of increasing compatibility headaches)

+1000

@mnieper
Copy link
Contributor Author

mnieper commented Oct 26, 2024

You are welcome to appeal to the steering committee to ask for an R8RS.

You know even better than I do how unresponsive the Steering Committee is. I asked them more than a year ago whether it would endorse an R6.1RS, but I still haven't an answer. I consider the SC (not its members, of course!) a zombie, if not dead. We, the active implementers, programmers, and users of Sscheme, should not make our decisions based on a committee that was founded in a past era and has never spoken for half of the community.

It is your decision, @dpk, not the Steering Committee's, whether you put all your effort into creating a draft for a standard that follows the letter of a charter dictated by the SC or into creating a draft for a standard that does not have to consider R7RS-small higher than R6RS.

I still think that merely changing the name will not change anything meaningful;

Of course, a name change alone does not change anything, but this was not the main point. "R8RS" here is a paraphrase of restarting the standardisation effort for a language that does not have to be considered the large language corresponding to R7RS-small.

that reunification of the Scheme community is the only reasonable meaningful goal of future report efforts (to the extent that it would be better to dissolve all working groups and give up on standardization,

I disagree. A more important goal of a report on a Scheme language is to describe a programming language (in the Scheme family) upon which implementations, programs, and further documentation can be built. The R6RS hasn't been adopted by all existing Scheme implementations since it came out, yet it serves, for example, as a foundation for the Chez Scheme programming language implemented by Chez Scheme and is used by programmers and implementers to write programs and implementations of Scheme.

It would likely not make much sense for Chez Scheme to base its programming language and documentation on R7RS-large. For example, by a past poll, R7RS-large will include SRFI 125 "hash-tables" whose name and interface are incompatible with Chez's (which is based on R6RS's "hashtables"). Of course, Chez Scheme, the language, could include both APIs, but that would kill the elegance and relative minimality of the existing language. This is one reason why I have been proposing R6.1RS. From the view of R7RS-large, it may be a subset of it (and a compatibility layer); for an implementation like Chez Scheme, it will be a solid foundation for its semantics, its documentation and the actually implemented programming language.

The existence of R7RS does not minimise the usefulness of R6RS, nor does R6RS minimise the usefulness of R7RS (e.g. for implementers of "toy systems").

It is your choice to give up on future report efforts, but you should not dissuade groups of Scheme implementers and programmers from formally writing down a specification on which they want to base their systems and programs and which they believe could be worth adopting by other implementers and programmers as well.

than for competing factions to continue to put out their own incompatible reports and leave users stranded in the middle of increasing compatibility headaches);

"Increasing compatibility headache" is what I would call FUD. No one who is active in any standardisation idea I know of aims for increasing incompatibilities. In fact, we have been seeing converging.

Racket chose to abandon RnRS as the base of the programming language that is implemented by Racket, creating a third major Scheme language besides the existing R6RS and R7RS. It allowed Racket to venture into uncharted territory and has been, all in all, a tremendous boon for Scheme. Why would it be bad for Scheme if someone started an effort to write a standards document describing the Racket version of the Scheme language?

and that compatibility with R7RS small and R6RS is the only technical basis on which unity of Scheme programmers who do ‘programming in the large’ can be achieved.

You are excluding the Racket programmers, for example. Or the Guile programmers, who typically use everything that Guile offers, regardless of whether it is in some RnRS.

It is a misconception that Scheme programmers following different reports are unable to talk to each other or that is not possible to write code that works with different versions of the Scheme programming language.

@lassik
Copy link

lassik commented Oct 27, 2024

Publishing minor versions of RnRS reports is not politically astute. You are free to publish SRFI xyz: Improvements to R6RS.

@mnieper
Copy link
Contributor Author

mnieper commented Oct 27, 2024

Publishing minor versions of RnRS reports is not politically astute.

This is your personal opinion. The authors of R6RS don't seem to share it. See my earlier comment #574 (comment).

I would also like to point out #574 (comment).

@cisco cisco deleted a comment from lassik Oct 27, 2024
@jltaylor-us
Copy link
Contributor

Lassik, your comments about rnrs politics are neither helpful nor wanted. Stating your opinion the first time was ok, but repeating it after you've already been asked not to have political discussions here is just noise, so I'll be deleting any further such comments.

@cisco cisco deleted a comment from lassik Oct 27, 2024
@cisco cisco deleted a comment from lassik Oct 27, 2024
@cisco cisco deleted a comment from lassik Oct 27, 2024
@cisco cisco deleted a comment from lassik Oct 27, 2024
@cisco cisco deleted a comment from lassik Oct 27, 2024
@lassik
Copy link

lassik commented Oct 27, 2024

I guess that leaves the ban. What's the hold up?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants