Aloha folks,

I had to miss RacketCon this year as we have a new 6 month old at home and 
couldn't make the trek out.

But I would love to lend my efforts to support the initiative to explore a 
Racket universe without parens. If folks out there are working on this, 
shoot me an email ([email protected] or [email protected]) and let me know 
how I can best help.

I've been working on such a research effort since 2012. I call the notation 
Tree Notation http://treenotation.org/. Basically what I propose is 
splitting things up into 2 concepts: the base Tree Notation (which is 80% 
similar to I-Expressions), and then languages on top of that (which is 
where the #lang could come in).

This syntax is less fragile (
https://twitter.com/breckyunits/status/1153016840769007616) and makes 3 
things much easier: program synthesis, data science, and visual programming.

I think dropping parens would make a big difference and would be a great 
move for "Racket2"!

-Breck



On Saturday, July 20, 2019 at 8:49:13 AM UTC-10, Matthew Flatt wrote:
>
> This message is intended as a prose form of what I said at RacketCon, 
> but it includes some extra explanation triggered by the discussion so 
> far. Where that happens, I apologize that it isn't in the form of a 
> more direct response in the original thread. 
>
> The Racket2 Idea 
> ---------------- 
>
> Racket's design and implementation is on solid ground, and from this 
> point, it can continue to evolve and improve in many ways. No matter 
> how Racket evolves, the community is committed to preserving what we 
> have achieved: today's `#lang racket` programs will run in the future, 
> and today's `#lang racket` modules can be used in future Racket 
> programs. At the same time, the current language design may be close to 
> a local maximum, and it's not in the nature of the Racket community to 
> be satisfied with a local maximum. 
>
> By starting all programs with `#lang`, we have created a path to leap 
> from one peak of design to a different, higher peak without sacrificing 
> the old one and while staying Rackety. Roughly, that's what we mean by 
> "Racket2". The name "Racket2" stands for some language that builds on 
> the current Racket technology and implementation, but that may not 
> directly accommodate the same bindings and expression forms that appear 
> in the body of a `#lang racket` module. 
>
> Although we could literally write `#lang racket2` for modules in the 
> new language, "Racket2" is normally understood as a placeholder for a 
> more distinct name. As a matter of branding, perhaps the language would 
> be called "Racket X" for some good X --- shortened to "X" in some 
> contexts --- and Racket X program would be written with `#lang X` line 
> at the top. Maybe the name depends on how different Racket2 turns out 
> to be from Racket, so it makes sense to pick a name later. 
>
> Venturing out from Racket's current peak opens a large space of 
> possibilities, so the first step is to agree on a set of goals to be 
> met by the next peak. The goals can serve as a starting point for 
> developing roadmap for deciding on technical details in a follow-up 
> process. 
>
> Possible Language Changes 
> ------------------------- 
>
> The Racket community has long discussed possibilities for Racket2. Here 
> are a few potential changes from the wish list: 
>
> * Rename functions to make the conventions more uniform, and make 
>   better use of keyword arguments to reduce names and increase 
>   consistency. 
>
> * Change structures types to have more or fewer features. 
>
> * Use generic datatypes (such as streams) pervasively, instead of 
>   writing code that expects a particular concrete representation (such 
>   as lists). 
>
> * Make strings immutable by default (e.g., result of `format` or 
>   `string-append`). 
>
> * Adjust the semantics of common syntax forms, such as raising an error 
>   on fall-through for `cond` or `match`, and change the meaning of some 
>   primitives, such as making `integer?` mean "exact integer". 
>
> * Make pattern matching more pervasive and available by default. 
>
> * Change module, evaluation, and loading callbacks (e.g., protocol for 
>   `current-module-name-resolver`) to improve errors and extensibility. 
>
> More changes have been suggested, and no doubt many other changes would 
> make sense. As a first cut, to synthesize some principles from these 
> ideas --- as a way of selecting which wishes should be tackled and how 
> --- the current wish list might be organized and summarized by two 
> overall goals: 
>
> * Make the language more consistent 
>
>   Consistency means making terminology and binding names more 
>   consistent, and it means unifying related syntactic constructs. For 
>   example, the `define` and `define-syntax` forms should perhaps be 
>   less syntactically distinct. Similarly, pattern matching and syntax 
>   matching seem closely related and could benefit from using the same 
>   pattern language. Also, pattern matching should be pervasively 
>   available among binding forms. Etc. 
>
> * Make the language constructs more generic 
>
>   In many ways, the current Racket language and libraries encourage 
>   the use of concrete data structures instead of abstract datatypes. 
>   The `map` function works on lists, for example, not arbitrary 
>   streams, and even `for` demands concrete declarations like `in-list` 
>   to provide the best performance. Refining the capabilities of 
>   structures and providing a smoother path among dictionaries, 
>   structures, and objects may also fit into this category. 
>
> There seems to be a widespread agreement/assumption among the community 
> that we could one day switch all the general documentation, such as the 
> Racket Guide, to use `#lang X`. That would preserve the ability to run 
> `#lang racket` modules and import them into `#lang X` modules, but it 
> would effectively relegate `#lang racket` to a kind of compatibility 
> mode. The Racket community has already done this a couple of times, 
> moving from `(module m mzscheme ...)` to `#lang scheme` to `#lang 
> racket`, and some of the Racket distribution is still implemented in 
> `#lang scheme`. After another switch, the constructs for `racket` would 
> remain documented and maintained, in the same way as the constructs for 
> `mzscheme` and `scheme` remain documented and maintained, but `racket` 
> and its documentation would fade to the background. 
>
> Based on the wish list, the scale of changes would likely be much 
> larger than in previous transitions. There will many more changes to 
> names and changes to the meaning of identifiers that are spell the 
> same way. The scale of those changes doesn't seem to worry the Racket 
> community. 
>
> Surface Syntax 
> -------------- 
>
> You won't find a wish for significant changes the Racket surface 
> syntax anywhere on the Racket2 wish list. Nevertheless, I've suggested 
> tacking it on. 
>
> Why now? 
>
> If we decide that a change to the surface syntax is a good move, it 
> would make sense to try that at the same time as overhauling names and 
> syntactic forms. Pattern matching, for example, seems like a place 
> where syntactic flexibility can help. Besides letting different kinds 
> of changes reinforce each other, we'd revise all of the documentation 
> just once instead of twice. 
>
> There are downsides to tackling both semantic and syntactic changes at 
> once. If a change to surface syntax is on the table, though, then we 
> should at least consider bundling the efforts. 
>
> Why at all? 
>
> Partly, I believe that a syntax with infix operators, fewer 
> parentheses, etc., would be better. That's a matter of opinion, but at 
> least it's an opinion backed by enough experience with parentheses 
> that it can't be written off as uninformed. More significantly, 
> parentheses are certainly an obstacle for some potential users of 
> Racket. Given the fact of that obstacle, it's my opinion that we 
> should try to remove or reduce the obstacle. 
>
> Syntax is not just an obstacle for potential users of Racket as a 
> programming language, but also for potential users of Racket as a 
> programming-language programming language. The idea of 
> language-oriented programming (LOP) doesn't apply only to languages 
> with parentheses, and we need to demonstrate that. Although we already 
> have tools for parsing non-parenthesis syntax into parentheses and 
> letting macros take over from there, that's not the kind of smooth 
> path from simple extension to full language building that we have in 
> the S-expression world. While these research problems may not be 
> forefront on the minds of all Racket users, keep in mind that Racket 
> exists because of research and remains supported almost entirely by 
> research. 
>
> Adjusting the syntax of Racket to accommodate more users could be 
> characterized as an effort to make Racket more popular. I don't think 
> it's helpful to characterize the idea that way. Granted, any effort to 
> reduce barriers is effectively an effort to make Racket more popular. 
> In that sense, our efforts on Racket's documentation were an attempt 
> to make Racket more popular. The work we put into building the Racket 
> distribution and making it easy to install is an attempt to make 
> Racket more popular. Creating the package system was an attempt to 
> make Racket more popular. All strictly true, I suppose, but the 
> characterization feels wrong. There's a difference between reducing 
> technical barriers for users of various stripes versus marketing to 
> make a product more popular. When I point out that parentheses can be 
> a deal-breaker to people outside the Racket community, I do not have 
> in mind that we just need a better marketing message; I have in mind 
> that the obstacle is real, it affects many people, and we should 
> address it. 
>
> Who? 
>
> From a community perspective, the rub is that the "many people" for 
> Racket syntax is a barrier are mostly people outside the community. 
> It's fair to ask who would benefit. It's difficult to ask a community 
> to tackle a problem whose solution targets a different community. 
>
> There's also a question of who really needs to participate in the 
> development of a new surface syntax. That part of the project could 
> take place in its own `#lang` and stay out of the way of `#lang 
> racket` users for years. As a practical matter, that will certainly 
> happen, even if we think that that new syntax will eventually take 
> over. We've already done some side experiments in separate `#lang`s, 
> though, and now is a time to check whether there is community buy-in 
> and participation for a more ambitious effort. 
>
> How? 
>
> Parentheses are definitely useful for Racket-style language-oriented 
> programming, and parentheses certainly helped Racket's macro system 
> get to where it is now. There would be no point to a change in syntax 
> if it meant interfering with Racket's main capability. Although a 
> macro system without parentheses is a difficult problem, I think we 
> know how to solve it. 
>
> I have in mind "Honu: Syntactic Extension for Algebraic Notation 
> through Enforestation", GPCE 2012. It shows how we can bridge the 
> relatively linear structure of non-() programs to the tree structure 
> of S-expressions. Specifically, the bridge is called "enforestation". 
> It sits roughly between the reader and the expander, but enforestation 
> needs to be interleaved with expansion to get the level of 
> expressiveness that Racketeers would expect. 
>
> You may worry that I'm putting a lot of faith in one expriment and 
> paper --- and a paper written by a PhD student and me, at that. You 
> may be right. I have only my intuition that enforestation is the key 
> to the problem of non-() syntax and extensibility. The details in the 
> paper don't seem to me exactly right for Racket2, but it's a big first 
> step toward addressing the problem, and it already seems sufficient. 
> Others may have figured out even more. I wouldn't blame anyone for 
> concluding that the difficulty of the task is too large for the size 
> of the obstacle that it removes, but that's not how I size things up. 
>
> The gap between 2012 and now reflects that Racket had more problems 
> (in my view) than just syntax, and for various reasons, those other 
> problems took precedence for my own work. This also explains my answer 
> to the "why now" question. The other problems seem to be resolved or 
> well on the way, and so syntax seems like the next thing to tackle. 
>
> How to Proceed 
> -------------- 
>
> Ideally, we would first decide on whether we want to try changing 
> surface syntax ever. Then, only if we have enough consensus that it's 
> worth a try, we could move on to setting overall goals and picking a 
> roadmap. Finally, if the planing of the roadmap succeeds, we could 
> follow it while getting into the details. 
>
> Unfortunately, it doesn't work like that. We need concrete examples to 
> discuss the possibility of changing syntax, potential roadmaps to see 
> whether there's anywhere we want to go, and so on. Some of the 
> discussion will necessarily put a cart before a horse. Delving into 
> some details may incorrectly give the impression that prerequisites 
> are a foregone conclusion. We've seen all of that already, starting 
> with my attempt to open up the discussion in the middle of RacketCon 
> and probably continuing with this message. Perhaps we can just accept 
> that this is all okay in the spirit of working together. 
>
> I originally thought that we should have a more specific process in 
> place for discussion at this point, but I think I've been proved 
> wrong. Let's just discuss, for now. I'll be posting more myself. 
>
>

-- 
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/e6e1a457-c033-4408-a940-33203a48fcc6%40googlegroups.com.

Reply via email to