Replies: 8 comments 23 replies
-
Btw, to really see Wisp at its nicest, I recommend looking at the Guix Workflow Language tutorial. It's pretty amazing to see! |
Beta Was this translation helpful? Give feedback.
-
The name of this repo recently changed from "rhombus-brainstorming" to "rhombus-prototype". The name change reflects the fact that we're in a phase where you can install a prototype now using a development/snapshot version of Racket, and then you get a concrete example of what Rhombus might be. Use Installing gives you documentation on shrubbery notation (the reader level) and the Rhombus prototype (a language built on shrubbery notation), and the Northwestern snapshot's pkg build puts the rendered form here: https://plt.cs.northwestern.edu/pkg-build/doc/shrubbery@rhombus-prototype/index.html Those documents include updated version of #122 and #163, written in (and rendered by) Rhombus-flavored Scribble. The design rationale for shrubbery notation directly addresses some points in your message. In particular, shrubbery-level grouping limits the reach of a macro transformer, and so you get much the same kind of local reasoning in the Rhombus prototype that you get from Racket. The prototype really does run on Racket, so nothing has changed compared to Racket about the implementation model. I understand that no amount of prototyping or rationale will convince someone who believes that S-expressions are the one true way. We all agree that it's not about the parentheses, but some of us take the failure of S-expressions to catch on as an indication that something really is wrong with S-expressions — and if it's not about the parentheses, then just removing them or using a different symbol hasn't solved the problem. Reasonable people will disagree. |
Beta Was this translation helpful? Give feedback.
-
Christine Lemmer-Webber ***@***.***> writes:
This bothered me. I'm sure you didn't intend it, but that's a huge
portion of the Racket community, and it felt weirdly dismissive of
that group. I'm sure that's not intentional but I think it's worth
recognizing that this is a fairly sensitive topic.
On this I want to share that I was surprised at how little direct
opposition I got when presenting Wisp. I expected strong opposition,
because I knew that I was forgoing the parens and other projects had
gotten strong pushback, but the worst I got was along the lines of “I do
not see the improvement, but if it helps people, feel free to try”.
I think one reason for that is that Wisp was from the start defined for
interoperability in a Scheme-world. It is always easy to back out if you
realize that using wisp was an error (just call wisp2lisp file.wisp >
file.scm) and you can use any Scheme-code because inside parentheses
Wisp-parsing is disabled: Once you open a paren, you are out of Wisp and
inside regular Scheme.
This was criticized as making Wisp itself harder to understand, and
that’s true (which is why Wraith did not follow that path) but it also
made Wisp much more powerful for an environment where Scheme is already
strong. You can simply embed Scheme-code inside Wisp, and you can turn
any Wisp-code into Scheme.
In Racket part of this embedding is provided by #lang, but not in the
same detail: You can copy-paste arbitrary tree-parts of Scheme-code and
implant them in Wisp.
Best wishes,
Arne
--
Unpolitisch sein
heißt politisch sein,
ohne es zu merken.
draketo.de
|
Beta Was this translation helpful? Give feedback.
-
The documented part is in the "enforestation" document, particularly the API section for the Racket side. On the Rhombus side, the relevant compile-time function is the For the rest of the message: We have really tried to create an open an cooperative project here. (In the specific case of Wraith, I personally invited one of the Wraith authors to create a proposal here, and it didn't happen. I am aware of Wraith, but I have not seen a presentation at any Rhombus meeting.) |
Beta Was this translation helpful? Give feedback.
-
My primary concern about Rhombus from the start, and the one I still hold, is that moving away from s-expressions unleashes a lot of idiosyncratic design issues that both the language designers and the individual macro designers can otherwise blissfully avoid. It's just a lot of extra work, not only upfront, but ongoing as people write more macros and more Racket implementations. A secondary concern I have is that it usually seems like the new syntax isn't being pursued because it has particular advantages, but merely because "something really is wrong with S-expressions." If we're going to take on all these idiosyncrasies, I'd much prefer to see somewhere particularly compelling Racket is headed toward, not somewhere it's running from. When it comes to running away from s-expressions, we don't even have a very clear direction to run in: We're a bunch of s-expression users, and if we trust our own sensibilities, we might pick an endpoint that has the exact same downsides as the place we started from. And yet if we don't trust our sensibilities, we might end up with a poser of a language that's too preoccupied with external approval to bring out its own best qualities. I personally suspect the "problem" with s-expressions to be that users are asked to edit programs via editing semanticsless trees via editing semanticsless text. I suspect that makes for a more indirect experience, especially when the tooling around the second "via" falls short because it doesn't have enough semantic context to be well tailored to the code's domain. As long as we have an intermediate tree representation that matters to programmers, especially a semanticsless one, the "problem" with s-expressions will likely follow us. But if we want to have macros play a part in determining the code's semantics, what are we supposed to pass them if not something a little bit semanticsless? The problem is the macros. When it comes to "somewhere to go," I think the closest thing we have to a destination is expressed in the current draft of the State of Rhombus document (permalink, latest): Rhombus can show more people that Racket's language construction techniques can work for languages they actually want to use. Based on what I was just saying, this is a catch-22. How do we show people they can use macros without, on some level, bringing the s-expression "problem" with us? And wouldn't we have a better foothold in this outreach if we instead promoted the existing work in Groovy's AST transformations, Rust's macros, Idris's elaborator tactics language, Template Haskell, or any of the examples in prior art, rather than building something all new? If none of those is quite right to make the desired point, what about developing a framework that is? Why must it be a language at the center of the Racket ecosystem? I guess my own best answer to that is "it needs to be at the center of the ecosystem so outsiders stand a chance of being able to read the macro system docs, and so the docs can keep up with the latest developments rather than being an afterthought." But... will the macro system docs really be more readable this way, or will they be twice as big as before and full of boring minutiae due to all the new syntactic idiosyncrasies the system has to model? Anyhow, syntax changes aren't the only thing to look forward to about Rhombus. I may have serious doubts about the syntax direction and how it relates to the ostensible goals, but I still feel like I can add to other discussions (including the more shallow syntax-related ones), and I believe a slightly better Rhombus is still going to be better than a worse one. :) |
Beta Was this translation helpful? Give feedback.
-
I think the meeting clarified that Rhombus is pretty committed to the "something seems wrong with s-expressions so we're trying something else" path. It's true that Rhombus is a research project at this stage; it does sound like the key Racket leadership is intent on making it the main future though. I guess I don't find this personally very satisfying because I'm deciding what the future focus of my projects are (whether the primary implementation is in Guile or Racket; both will continue to be supported but which one is where most of the work happens?). It's good to hear that the s-expression stuff isn't going away, but I do still get the sense that there's a good chance that the sexp stuff will be considered the "legacy" part of Racket in the future, and I have bad experiences with building things on what end up being "legacy" foundations, so that does affect my decisionmaking right now. Maybe I'm wrong. At any rate, I don't mean to kill everyone else's excitement; good luck with the project. |
Beta Was this translation helpful? Give feedback.
-
This could be of interest to the Rhombus project, or other folks that agree that https://github.com/benhsz/parless I've been furiously documenting it the past few days, so hopefully it's clear/detailed enough. |
Beta Was this translation helpful? Give feedback.
-
I have a lot of concerns about the direction that Rhombus is heading. In general, it's possible for me to make good sense of something lisp-or-scheme-like, and Racket traditionally may have deviated from Scheme, but it was pretty easy to make sense of. A few years ago at RacketCon I wrote "Racket is an acceptable Python" and I felt pretty good about it, because I was feeling pretty good about Racket: Racket was the lisp you could get things done in. This was its biggest feature. It felt like we were on the verge of something big. That evening @mflatt told me about Rhombus, it was before the big announcement. Apparently aside from Matthias, I was the first one to express hesitation about this direction. Well, I'd like to expand on why.
I think Rhombus could be a great project. I don't consider lisps to be essentially parenthetical; the goal to provide a surface syntax that is non-parenthetical is a good one and probably seems like it should be Rhombus's main goal. (Secondary goals to figure out other useful additions to the language are good; I'd encourage asking how many of them could be libraries though.) I know @AlexKnauth recently presented on Wraith which I had some help with. Wraith seems like a good direction to me: it ultimately expands to something that's still syntactically delimited as trees, and is understandable as trees. The underlying language too is fairly understandable as trees. This is important for reasons I will expand on later.
I have a joke, I've been meaning to make it a blogpost: "LISP Isn't Syntactically Parenthetical". Wisp and Wraith are both good examples of this by using whitespace approaches, but Fructure is maybe the most interesting example of how far this can be taken: no parentheses, but even rethinking how we might edit code. Code shapes!
But Honu-style syntax... well, it's very hard for me to keep up with this project, I've read the Honu paper, and I'm very against that direction. My joking explanation is that I'm afraid we're "missing the trees for enforestation". I think some of my understanding of this congealed when reading an old writeup by Mark Miller: The Power of Irrelevance. Mark explains how in a security review, the E programming language held up well:
Mark points out that Scheme-without-macros is fairly ideal in this regard; scheme-with-macros, well, it can be hard to know where the macros might rearrange or interject things, but still, the tree structure gives some sense of scope and hygiene helps. I have separate thoughts on how to improve this (not important here, but I think Mark's idea of "doubly hygienic macros" are possible), but it's in the polar opposite direction that Rhombus is going, I believe. When I look at Honu's enforestation, I can't make clear sense of how things will expand just by eyeballing it. It's lost the trees for enforestation, and the power of irrelevance too.
I think Rhombus has two big and admirable goals: to expand the frontier of language design, and to increase adoption. Regarding the former, it's a good goal, but the core language should remain simple enough that it can mostly be implemented in a metacircular manner. Otherwise else I think we've departed rapidly from the space that made Racket fairly ideal for this very purpose into something much more tuned to a specific set of language design choices for one specific language representation. Keeping that tree-like is important to this goal: any surface syntax should expand into something. I support things like dot-notation:
foo.bar(baz)
could be represented as((%dot foo bar) baz)
while not departing too far from the land of core understandability and keeping a tree-like property. I worry about some of the other proposals I see though. Wherever something could be a library, it should be a library. Avoid The Tragedy of the Common Lisp (which ironically, by still allowing a macro foundation, common lisp is less bad at than most languages, but indeed we don't want a core that's as big as common lisp's).Regarding the latter goal of increasing adoption, the night that @mflatt told me about Rhombus, I expressed concern and skepticism, but also that I didn't want to provide stop energy against useful development. That's still true. But as I said then, it could be that Racket already has one of the core beautiful advantages: the ability to take the world of lisp and actually make it useful for people to get things done. As I said to Matthew then, "I've seen a lot of communities try to make a big energetic push to a new architectural idea, and all its energy gets consumed in that process, and the community ultimately dies." Dare I say, Perl is an example of this. It's amazing that Python wasn't, and it was due to enormous effort, and even then the changes from Python 2 to Python 3 were puny. It's unlikely that Racket is going to win by trying to enter the same space everyone else is already winning. What about running with the strengths of what we have and innovating where everyone isn't? Lisp, as a conceptual idea, is not essentially parenthetical, as Wisp, Wraith, and Fructure indicate. What if we ran with that?
I am not certain where Racket is going to go. I am hedging my bets: I have begun porting some of Spritely's components to Guile, which I wanted to do already, but my assumption was that Racket would remain the primary implementation. I'm not so sure anymore, but it really depends on where Rhombus goes. The Rhombus page gives an expansion pass in terms of "here's all the things we could do!" What's needed, for me, is now a compression pass: "here's the boundaries we will keep ourselves in!"
So let's say, here's the "Christine's wishlist of boundaries/guidelines":
#langs
, and separate read approaches from eval approaches, keeping trees as the foundation.foo.bar(baz)
as((%dot foo bar) baz)
, for instance.{3 + {4 * 5} + x}
, but not3 + 4 * 5 - x
.So what will Rhombus be? And, invoking the power of irrelevance: what won't Rhombus be?
Beta Was this translation helpful? Give feedback.
All reactions