Live CEOing Ep 692: Language Design in Wolfram Language [Echo functions and More]

Stephen Wolfram and his team review design improvements for Wolfram Language, tackling problems with data set display, graphics padding, and echo functions. They work through concrete technical issues and debate solutions in real time.
Chapters
Okay. Hello, everyone. Welcome to another Wolfram language design review, part of our Language Completeness and Consistency series. So it looks like we have a super simple agenda today. What's that?
I was just saying. Ha, ha, ha, ha.
Right, let's try and tackle this one first because I think it might be quick.
Right.
So. Right, there's this extra space at the bottom of a data set, which was.
Annoying me when I was trying to put the data set in a notebook and so on.
Right. And the reason it's there is. Right, there's this hover which gives you the keys. Right. So if you hover over demos, then you will see that drop down there.
Right.
So that's all Mars.
I know.
Et cetera, et cetera.
Now, we kind of annoying to have to. Have to leave that space for this. What about this area up here? No, that's not necessarily unused.
Hold on.
What's the problem with leaving that space? I mean, it seems like.
I think when you put these things in a column or when I had them in a notebook where you have text above and below them, it's annoyingly.
You know, I would argue that putting them in a column you should not. Like, data sets are not designed to be in columns. I think data sets are designed to be kind of on their own in a cell.
Yeah. But even when they're on their own in a cell, the cell below them is further away than the cell above them.
Right.
So, you know, at one. At one point, I. I'm not sure we ever put this in a shipping version, but certainly at one. One point. Right. We had this dotted frame around the whole data set, and then it was very clear what was there.
That was even more bizarre because it had that big empty space at the bottom.
Right. Yeah. I mean, I suppose the.
We have anybody from graphic design here.
Oh, but I can ask.
So I don't recall having been involved in discussions about this, but there are definitely other forms of notifications that could happen. I mean, it could go in the status bar for the notebook. It could go in an attached cell that floats over other content.
Right. And I do. I do mention that.
Right.
We cannot reserve the space, of course. Then it might crash into whatever is beneath it, which maybe we don't care because it'll disappear as soon as you move the mouse. And you just. We just give it a white background or something. Right. We give it an appropriate background.
Having it overlay what's below it is a perfectly good idea.
I mean, it's. It's not unlike what we do with you know, with like image cells, for example, where you. In that case, it's a click, not a hover. But, you know, we're okay with the click producing a, you know, tool which can overlap content below it.
How do I make an image?
1 comma.
And. Well, it's 1 comma dimensions.
Yeah, 1 comma dimensions. And so now if you click the image, see, that's allowed to overlap and that's okay.
That's just fine. I don't see a problem with that. I mean, sometimes annoys me, but I know how to get out of it. I think that's what we should do for dataset. Go there and it extrudes a thing that. That sort of floats over what the content below. I'm okay with that.
What sort of stuff is getting put in that space at the bottom?
It's the key that gives you that element. Right, so. So float over the massive Phobos or demos, whichever. Right. So that's Right. It's giving you Mars moons, Phobos. If you click over the mass, it gives you mass and you'll see that input right below it. I have data set of Mars moons, Phobos mass and it.
Right.
So it's giving you the parts that will allow you to extract that thing programmatically. I'm. Which I get. I mean, that's useful especially. Right. Like if you scroll down and, you know, click on the moons of Jupiter. So. So you actually be in a nested thing. Right. It is sort of useful. Right. So if you click on the more or wherever there is the number, there's 62 total.
Yeah, that's. That's useful to be able to see that breadcrumb quite wide, has a space before Jupiter. I don't know.
Oh, this is another argument for it being an overlay is that. What if this thing is too narrow for the path?
Yes.
Yeah. And in fact, it's. Yeah, yeah. It's. The size is actively changing. I would rather the size didn't change.
Look at that. All right.
I think I was just wondering if you want something that's at the bottom or if you want something that's closer to the element that you're inspecting.
Well, the problem is most of what you can do interactively is with a right click. So if you had a tooltip or something, that would be. I, I know. I guess you could have it click through and. But it would be a little weird, I think. Maybe not. Jose, you're our biggest user of data sets here. Do you. Do you have an opinion on that? Point?
Not really, no. I think we should just do the extrusion overlay thing.
Okay.
I.
Okay, before we go go on to echo functions, I did have a question which is. So go back to. So like click on moons there. Right. And so. Right. I created this with max items. Goes to four. So we only saw four planets at a time. But now that I clicked on it, I expected to see four moons with a scroll bar, but instead I see this is wrong. Okay.
In my opinion, if you said max items, it's because you, you know, you want to see that number of items. Yeah.
Does anybody disagree or have a different take? I mean, I just wanted to make. Make sure that this isn't some quote unquote feature that I don't understand because I'm not a heavy data set user. But I found this very surprising.
Seems surprising to me. I got a comment here that we might have graphic design. Take another look at these icons. They just have an awful. That has an awful sense of, you know, exclusive aurism.
Something tells me you. You are, I think, quite unusual. Not necessarily in mistaking it for something else, but in mistaking it for exclusive or you're quite unusual.
I've even got it wrong also.
I think that the one on the right would be. The Xor would.
Yeah, yeah, yeah, right, exactly.
That's got the bar on the wrong side. But yeah, I wouldn't look at that icon. Say, why is there an exclusive or button on my data set?
I mean, heck, I came through in computer engineering and I'm thinking, is he mistaking it maybe for a cloud floating on top of a mountain?
Actually, it'd be nice to pick up the motif of these rows here and have something where this is overlaid on top of a bunch of sort of rows. I think that might make it clearer. What's going on here?
Overlaid over a bunch of rows. I'm not. I didn't quite follow that.
Well, so what I mean is you have an arrow up, but it is somehow the background is somehow this thing that shows that it is going up by rows somehow. Just a suggestion for design. Okay, I want to raise another thing which I'm sorry, we haven't got on the agenda today, and that is my graphics padding summit. Brett, do you. I mean, let me clarify, you know what I mean by the graphics padding summit.
I know parts of it at least, but.
And we've had versions of it, so. But I wasn't. And we made some decisions, but I wasn't aware that there were new.
I mean, I think, you know, the last you were interested in, like, you know, the, you know, every possible source of padding that goes into graphics and that sort of thing. Excuse me.
Just in padding theorems, so to speak. In other words, if you combine this with that, there will be no space. There'll always be a fixed space. What will there be? See what I'm saying? Which I think right now is a mess. And I think it's a mess because the theorem, you know, the theorem might include, oh, you can have a font there and it will do this, and so on and so on and so on. But, you know, we just need this very precise way of talking about all these things that make sense because we have these things where there's an amount of padding that's left because, oh, there might be a font on this side. We don't know how big it is. It's rendered, it's determined at rendering time, blah, blah, blah. And this is relevant because with native graphics coming to the cloud, there's yet another redo of all these kinds of things. And they're copying every design featurette.
Indeed.
I mean, I think the case where I'm get most annoyed is in graphics grids where things are just like ridiculous amounts of space are getting left and I don't know why. I mean, if I pick, if I make a. Something like this. Okay, so I say graphics of rectangle and then I say image size, arrow, random, real. Let's say.
That's okay.
Okay, now, okay, so I don't even understand. What the hell's that? Oh, that's a. Oh, that's because it's a rectangle of that shape. Okay, so that's padded.
You need to add frames to these. It's impossible to tell whether they're reasonable without them.
Okay.
Right. Because you're, you're not changing the aspect ratio. Right. So if you did, aspect ratio goes to automatic, then it would be tight around the rectangle. But then they'd all be identical, I suppose.
No, I think you need background.
You may need to say framed around the outside. I don't think that frame is going.
Where you think it is.
Yeah, I agree.
Change the frame to background light blue.
Okay. All right, now let me put these in a graphics grid.
Well, but, but okay, I mean, are there any of these that you're complaining about?
The initial ones, whatever the background went.
Yeah, that was going to be my question.
That's really weird.
That is weird.
Oh, but I see a background. I see blue right around here.
Yeah, there's Just a hint of blue.
So something goofed up here. But also, I mean, this just isn't right. Look at this. I mean, if I say. I mean, if I say.
Right. They're all the same. Right? They're all the same size. Right.
Where did the blues come from just now?
Well, he's using grid rather than graphic.
I see.
Okay. Right.
So, I mean, right, if you hop away, the background, which is going around, right. The spacings are basically the same between those two. Maybe it's a bit smaller in the grid.
So why has it got extra stuff in the graphics grid?
There isn't. It's just that.
It's just.
Well, there. No, no, there is a little bit.
Right.
I mean, if you. If we. If we measured the number of pixels between, you know, the bottom left square and the square right above it, then.
But Stephen also resized the graphic.
Oh, he did, didn't he?
Yeah.
Okay, so. Well, what the hell's going on here? Why does.
Wait, some of the plot ranges are changing too. When you rescale it.
Like.
Like if you rescale it. Look at the very first one, top left. You can see the blue region changes size.
Oh, gosh.
Well, I think. I think that's just aspect ratio, right? It all. It has an aspect ratio. And then. So the blue is, you know, it's preserving.
Trimmed, Right. It's getting trimmed down. And look in the theorem, so to speak, the frame is gone. So our, you know, open interval, closed interval, you know, something went wrong and the frame has gone now, which is wrong. Right. We agree it's wrong that the frame disappears in this case, right?
Yes.
Okay. So somewhere, something, you know, so what happened that caused that to occur? This is why I want.
As soon as you start having stuff outside of graphics.
Yeah. This is a very difficult case to reason about. The wrapping of the frame around it, that makes it very hard to reason about.
But it still should work. I mean, give me a reason why it shouldn't work.
So, I mean, it's like you did graphics grid of a table of strings.
Yes. And why wouldn't that work?
What does it mean?
Yeah, what does it mean? Right. We have to make a choice of how to convert those strings into graphics and blah, blah, blah.
And oftentimes, you know, string and strings have absolute sizing components.
Sure.
Right. The head of the head, the output of a graphics grid is a grid. Sorry, Is a graphics, is what I was actually trying to say. Not a grid. Which means these things that don't write strings don't naturally live I mean, I suppose you can wrap them in text and give them coordinates and then they naturally live in graphics, but they don't in and of themselves naturally live inside of graphics expression. So choices have to be made about how to embed them.
And in our graphics, by default, even when they are in graphics expressions, they're sized. Absolutely. Unless you do something to change that.
Okay, so now what are we seeing here? So, yeah, so that they're in traditional form.
So. So the single ones are italicized.
Okay, but so now.
So what you have done by wrapping framed around the individual graphics is certainly created some overlap with this example.
Okay, so wait a second. So what happened here? Why did that funk out? Oh, because it's a line wrap.
Yeah.
Yes.
Yeah.
And it's. And it's. Right, it's forcing a size.
So, you know, it made some choice about how wide things are gonna. It thinks they're gonna be. And then you made them smaller. So something.
Why did this not resize the grid to be able to fit it?
What does that mean?
It's.
It's absolutely sized text. You didn't do anything to change.
Oh, I see. So if I make the grid small. Absolutely smaller, I'm toast. Yeah. Okay, but so, so explain to me again why is this getting cut off? Do you know? I mean.
I mean, what, what I'm saying is it's. It's actually pretty hard to reason about.
Right.
So it's hard to give a definitive answer.
Short answer. It's getting cut off because it's going outside the edges of the inset that was constructed for it.
Yes.
Why exactly? I don't know.
Okay, but you think that's a bug? I think that's a bug.
Not necessarily.
Not necessarily. I mean, because there is a frame box sitting in between there. It's not a pure graphic anymore.
Experientially, it's a bug.
It's. It's of the same order of thing as if you did square root of the graphic or X + the graphic or something like that. If it were a pure graphic, there would be more consistent levers that we could control. But when you throw it into the 2D typesetting world, you know, 2D typesetting does not want to be resized in that way.
Right. It's like. Right. I mean, if you, if you use the frame option, which obviously will behave very differently, that's something that lives inside of the graphics, which is different from framed of graphic, which puts a thing around the whole graphics.
Why didn't this do what I Expected it to do.
Well, that is square root defined for image.
Oh, oh. It might be applying it to the elements. And the elements are all. But they're not all zeros or ones. Right, right. We do have a such a thing as image arithmetic.
Yeah, we do.
So I, I presume it's applying now what I can't tell you. I mean, I can understand why zeros are right. If you only had white and black.
Yeah. Then it would.
Oh, well, it might be that these are RGB all in RGB and they're all zeros and ones.
I think that's right. I think that that's the problem. Yeah. Amusing. How do I get a function which.
Doesn'T map well, you know, add a half to it. Right. That should work.
Absolutely. Okay, cool. Okay. In any case, back to this. I'm still coming back to experientially, this is a bug, right.
So what happens is when you evaluate graphics grid, especially in this case where you have framed of graphics, it measures in some sense what the size of that is. And then I think this was the one that you resized, right?
I'm sure I did.
Cause the clipping.
Well, let's, let's see it at a. Okay, let's see what happens if I give it an absolute image size.
Now what exactly are you claiming is.
The bug this is missing? Yeah.
Okay. Which may be.
Does that have a half of a frame edge on the.
Right, Right, right. That, that also could possibly be an aliasing issue. Right. That, you know.
I mean, the fact that all the clippings are right on the frame edge suggests to me that there could be a second issue at play here which is not, which, which is not interesting for purposes of this discussion.
But you think it's just a bug? Because I don't think it's necessarily a bug.
Possibly.
I think it's a complicated question. I think that's why we need theorems about padding, because I think it's a question of, you know, an open interval, a closed interval. Do you include the boundary? Those kinds of things?
Well, I mean, this is the kind of thing that we have to deal with all the time in the front end. We deal with this kind of stuff all the time. It's part of our bread and butter. But we have a history of.
In.
Some cases doing some arithmetical rounding to get things to line up on the pixel grid. And that was a great thing to do when everybody's monitors looked the same in the 90s and the aughts. But now we no longer have A reliable pixel grid that we can snap to, and it's not. We can't even assume that a pixel grid on the same machine is consistent. It might be different from monitor to monitor. And so, yes, all three of my.
Monitors are quite different in that respect.
Yeah. So we're actually in the process of extricating ourselves from that mess that we spent decades getting into.
Um, okay, so do you think this will. I mean, this is a bug, so we've got to figure out.
So, so. So if what we're seeing here is just of the nature of it just trimmed the very edges and that's it, then I think it might be that kind of bug.
Okay, but.
But. But the bigger issue you were raising is you resize, and it does, you know, kind of really fundamentally different things. That's. That's the different question, which is interesting.
Okay, but I also have another point. There's too much space here. Why is there so much space here and not so much space here?
I think. Well, I think because the. All the squares are sized the same, and so because that row only has not very tall things in it, you don't.
That's not how grid works. Grid doesn't do that.
No, but nothing else. Just look at the widest element in each column, you know, and the tallest element in each row. And every element in each row and column has to, you know, be at least that big.
I know, but. But there's nothing. There's no descender here that goes into the white space. There's a big gutter here with no descender going into it. Why is there such a gutter?
Right.
I mean, the literal reason is that all the rows are the same height. That's one of the differences between graphics grid and normal grid, isn't it?
I don't know. It's not supposed to be.
Brett. I mean, that's what I've. How I've been interpreting what I see, but I. And I assumed that was intended.
I don't remember off the top of my head and.
All Right, well, because there's like. I mean, and I would claim. I would claim that, right? If you. If you look at a grid of, you know, at like a gallery icon or a gallery icon, an icon gallery or. Or some sort. Any sort of image gallery, typically. It's certainly very common. And I would claim the usual case is that, you know, all. It's. All the rows and columns are the same height and width, and, you know, the icon takes up however much space in that that it wants. Right? So if If I presume you can do like dividers goes to all in graphics grid. Is that something you can.
Yes.
Right. And then we would see that, you know, we have exactly the same behavior of a standard image gallery where they're all the same height.
No, they're not. Well, look at these. Some of these lines are thicker than others, if I'm not mistaken. I don't.
They're not drawn that way. So, I mean, if they're rendering that way, that's.
There is some confusing stuff though, because, like, look at the first top left. 2. Why are they not taller?
Oh, that's what I'm wondering right now is why.
Okay, so I just came across something interesting. Let me throw a couple of examples in chat for you to evaluate. Sorry. No, no, no, not that.
That.
There. So that. And then compare to the same thing with dividers all. Now, now, now, now just, just, just copy down, but add dividers all to the graphics grid. There is an interesting difference here which I had not at all expected.
Weird. Weird, right? It's leaving space above the top row things. Brett, I think they're just bugs here. I'm telling you, we need theories.
I agree, there are bugs. I halfway tracked down some for, you know, graphics row, you know, a bit ago and haven't been able to, you know, haven't come back around to pick it up again.
But.
All right, I will. Yes, I will. I mean, I will also submit the thought that, you know, the theorems you are searching for may. You know, we might take us 350 pages to prove that one plus one equals two. Right. I mean, dir.
Dur.
What do you mean? I mean, the theorem I'm looking for is a statement that, for example, there will never be more space left than needs to be left in this situation. There will always be enough space to render the boundary. Those kinds of things.
I.
And my assertion that defining in this situation may take you as long. You know, what could potentially take us as long as it took Hilbert to prove that one plus one equals two.
I think not Hilbert.
That was.
That was. That was a yes.
Yes. I meant. Russell.
That was just them showing off. But anyway, never mind that. The. Okay, well, you might.
My experience with that is that you're gonna spend a lot of time on those last pixels getting those Right.
Right. Well, okay, but I mean, we gotta have some axiomatic claims. Like, for example, probably this violates an axiomatic claim like adding dividers shouldn't change the, you know, the range of the graphic adding a phrase.
Are you saying that Right.
So. So we're saying. So those two inputs are the same except for the dividers. Goes to all, is what you're telling us. And, and we're getting very different. Yes. I think we can all agree that's a bug. I know maybe Brett will disagree with.
Me, but, I mean, I, I'm, I'm. I can't promise, but I have a strong feeling that I was told that, you know, spacing above the element, you know, depends on that top frame edge, you know, so the question is, which one is the bug? You know, if, if, you know, the claim is that it's a bug.
Well, the other question is why is there so much space around these things to begin with? Why are they not further down here?
That I'm not sure about? I mean, I think that comes back to. For whatever reason, graphics grid is making all the things the same height.
I don't think it is. I don't think that's generally true.
Well, it's been true in every example we've seen.
What's the default alignment?
Center.
Center. Okay. In which case, I feel like that's a bug, that, that the top one is a bug. If the default alignment is center and not something like automatic or whatever, then I, I don't see how you can, you know, reasonably claim that, you know, that. That top, square and circle are, Are center. I mean, what are they? Center. Right. Both of those things can't be centered, is my claim. Those two, Both of those rows can't be centered. So if the default alignment is centered, then that is a bug, is my claim.
Right.
But I will also claim. Right. I mean, you know, if we think about all the different things that we're sticking into these graphics grids. Right, right. There's image margins, you know, padding, frame margins, shrink wrap, goes to true or false. You know, There are probably 17 different options, and I'm not even sure that that's an exaggeration that are all, all potentially interacting with each other here. And so proving a theorem when you have those many options is going to be quite difficult.
Okay, but the question of what there's no equal. In the case of grid, there's an option called equal equal elements or something. What's it called?
I have no idea what you're talking about, to be honest.
I do, but I'm just not remembering.
There used to be a columns equal and rows equal. It is now instead a setting for item size.
Yeah, but I can't remember what the setting is.
It's documented.
All.
Okay, well, so is There a corresponding thing for graphics?
I don't think there is. For graphics grid. Maybe that will help.
There's no item size.
All right.
Anyway, I'm telling you there's some things wrong here and we could.
I'm not disputing that.
Um, okay.
He's saying he doesn't want to work on it because it's really painful.
I know.
Well, okay. And you know, now you're going to run out of time for all the good echo stuff.
But anyway, let's go back to good echo. Okay, let's turn to echo. What was. All right, Echo. Echo was some character in Greek mythology. I don't remember.
Yes. I thought you meant like a glyph character.
Wasn't it Echo and Narcissus or something.
Could be.
Right. So, you know, we propose, you know, at some meeting which may well be like four months ago now, given the number of times this agenda item has been delayed. Right. We provisionally came up. Right. But we're not going to skip straight ahead to the goals this time. We're going to actually go into thinking about some of the details. Right. So we came up with, you know, a bunch of these things, which I think is probably a few too many. But also we should think through about what it is we actually want out of some of these. So, for example, echo limit was a request from Christopher, which was to have something like dollar output size limit for Echo.
Yes.
And I mean, my first claim is that this has to be called Echo size limit or nobody will understand what it is. But and then a, you know, there, there, there's a conceptual question of should just this be the same output size limit? But there's also sort of a deeper philosophical issue is that output size limit works inherently by the fact that everything is assigned to out. Right. If you, if, if you have.
Right.
If dollar history length is zero output size. I mean, I suppose the output size limiter will fire and you'll see a short thing, but you'll never be able to do anything with it. Is that correct, Lou? I guess I should have tried that before this meeting, that that's what should happen.
Yes.
Right. And so, you know, all this functionality depends on the fact that it can ref all the nice things other than the fact that it's short depend on the fact that that expression is still stored somewhere, namely in outstand. And so then the question is.
What.
Do we do for Echo? And that we have sort of a similar issue with just print. And you know, maybe we say print is low level and we don't care about it. But echo, I feel like, you know.
Okay, so I've got a suggestion. Okay. In the output size limiter, there is an interactive way to get everything. You're saying it's very nice that you don't need the interactive way to get everything because you still bound it to something. But echo.
No, no, no, no, no.
It's more than that. It couldn't actually be implemented to get everything if it weren't there in the down value.
I got it, I got it, I got it. But I mean, so my claim is. Okay, so your point is that when echo comes out, it's transmitting in the blind, so to speak, and it doesn't have any. It's not, it's not. There's nothing. There's no there. There's no thing there. It's just splitting out this message and forgetting it.
It's ephemeral. Yeah.
Yep. It's no.
Right.
It's no different than if you did, you know, cell print of, you know, five or expression cell of five. Right.
That.
That creates a cell that has five, but the five isn't stored anywhere. You know, that the. That the kernel.
Exactly. Yeah. What's an analogy to this? I mean, it's clearly useful to have an echo size. What, what is the print. What, what is the analogous thing for printing? What is it called? What is the limiter called? What's the thing that determines the default limit?
There is no analogous thing for printing.
You mean dollar message preprint or.
No, no, no, no. I mean the thing what determines when you get a too big thing in printing and, and just regular or, or.
You mean an output.
An output.
Right. So there, there's. Right. There's a hook in dollar preprint that checks if the, you know, if the expression is big, which is again, which is also a very complicated. And, and you know something, we could spend just as we could have a whole summit about the definition of big there. But. Okay, fine, if, if it, if it determines that it's too big, rather than allowing it to just format normally, it formats this output size limiter which shows you sort of the short version of it with all the extra buttons to.
Okay, I get it. But there's no dollar output size limit option that you can set.
Well, there is. It's called dollar output size limit. Oh, and you know, you can send, set, set it in the front end preferences, even.
Okay, so dollar echo size limit would refer to the same thing. Maximum size in bytes, blah, blah, blah.
Right.
But the thing that you're commenting on is that in an output size limit? There's still. The stuff is still there. Is this a modern output size? No, that.
Is that something that should be regenerated and. Yeah, it's probably not long. Oh, yeah, that. That shortened output size limiter in the previous input. If you look at it right. So you.
I see, I see, I see, I see, I see. Yeah, okay, fine. For God's sake. Well, I'm sure I can get it to limit at some point. Why isn't that limiting?
Huh?
That's baboom limited. Yeah. Okay. By the way, that's a thing to feed to Brian and the documentation team. The fact that that wasn't caught as a thing that had to be regenerated.
Yep, got it.
The. Okay, so the question is if we do the corresponding thing for echo, we could have some kind of, you know, this has been shortened type indicator, but we can't have a show more.
Correct.
Well, I still think it's worthwhile.
It's very similar to what we're doing with error handling right now. I mean, if we. Or message handling. I should be more specific.
The message just doesn't come out. It's more than the third message.
And if you were hoping to see the messages beyond that, you literally have no choice but to reevaluate the input.
Yeah, fine, fine. So dollar ECHO size limit seems like it's quite sensible and should be set to. And the only thing is the visual question of what it looks like.
And does it also apply. Does it apply to the sum of the bytes of the label and the thing that was printed?
Oh, con. I don't know. I would say just the thing that's printed.
Yeah, I mean, that's my instinct as well. For one thing, A, labels are expected to be small. B, you have full control over that.
So, okay, what should it do? What should it look like? Should it do this lozenge type thing or what should it do?
I'm not sure we have something much better than that.
Well, fine, but we might as well use something that's consistent with this. We'll need a lightweight version of these things without the footer.
Right.
Okay. All right, let's move on here. Okay, we got that.
Yep.
Echo, temporary and limit echo.
Right.
And you know, my. I mean, we would need to do some implementation work, but I think rather than having, you know, a limit echo and the $max echo limit and all that. Right. We already have Echo. Quiet, quiet. A quiet echo. Yes. So if we implemented hold all sub values, which is something we've talked about wanting, we could just turn quiet echo into an operator form and with like I show in that input there. And I think that's probably a better direction than adding several similarly named symbols that are slightly different.
I, I, I think let's just see whether we can reduce the number of symbols that we care about to a small number.
Okay.
Okay.
So what are the. Okay, so how do you want to go about thinking about that?
Well, I think that this, I think what's important is this concept here. I think that's more important than this concept here. But it's a little annoying that you would have to say. So I'm saying, I mean this is when you're putting in the echo, you're thinking, oh, I want to show this while it's evaluating. And then I want it to go away.
In fact, what is the difference between, now that I'm looking at this again, what's the difference between echo temporary and cleanup echo?
Okay, Echo temporary means this echo that I am generating right here will be.
A limit, actually is an echo, but it's a temporary one.
Right, Right.
Okay.
Clean up echo is there were echoes, there will be echoes made here, but when this is finished evaluating, get rid of them.
Right. Yes. Now I remember and remember I prepared this agenda item and I still got it confused, which is why I'm saying there are too many symbols.
So for cleanup echo, would that clean up echoes that were pre existing the call into cleanup echo or just echoes.
Generated within the clean inside the cleanup echo.
Right. So somehow it would tag, you know, the guys that are inside the, the, the ones that come from expert will need to somehow tag themselves as we came from exper. So that when cleanup echo runs, Cleanup.
Echo could simply do a lexical replacement of every, every echo is replaced by.
Echo should just block some variable that then each echo function.
Yeah, I'm, I mean, I guess I didn't mean that literally. I wasn't trying to get into there. Right. We can all think of at least four different possible implementations, which I don't, I don't think is the important point. The point I was trying to stress is that yes, the cleanup echo specifically looks for the echoes that are associated with the expression inside of it.
So you could, you know, let's talk use cases. Okay. Echo temporary I see as being something that I would routinely put into code just as a, an el cheapo progress monitor.
Mm.
Right. And you know, by necessity it would sort of have to, you know, apply to an entire shift in or evaluation.
Yes.
Well, maybe I mean that, that that, that. That. That is a. That is a question. Right?
The.
Right. Presumably Echo temporary removes things when, you know, when the current line is finished, you know, when they're currently.
Although it could be made. It could have an option for, you know, allowed Echoes type option where Echo temporary just looks at the echoes in sequence and starts removing them. You know, keeps only the most recent N echoes. So that it really looks. Is it like a progress monitor? But maybe that's better to be done with the panel. Maybe it's better to be done by something that looks like our progress framework. I mean, okay, how do you get. Okay, you're writing a function and you want a progress dialog.
Well, I mean, nothing, Nothing like that can be done with just Echo, right? I mean, you will have to enter and I mean, that's true for our progress monitors, and that will be true for your.
For.
For your quick and dirty progress monitor, you will need to have a variable that tracks the state, and your progress monitor, however you implement it, will need to, you know, print spit out values from that monitored variable or variables.
Well, except that I'd really love to have a monitor for Map, for example, even though I don't have a. You know, I think we talked about this before, having a version of monitor which has one argument.
Yes. And we was there, and we have a branch that does it possibly in the prototype build. And I'm trying to remember why it's not finished. Lou, was there some tech. I mean, there was some problem around message. You know what happens with bad arguments?
That's the one that I remember. Julio. Was it Julio or Carlo?
It was Julio mentioning.
Yeah.
Well, maybe we can look at that again. We look at that again because it seems like a very worthwhile thing to have. All right, let's just.
Right. But, but, but, but I will. I will point out that, you know, that doesn't just magically work. Right. Monitor needs to be given the knowledge to recognize. Oh, this is map. So let me track this thing. Which is why I'm saying echo is not a progress monitor. Right. It will need to echo. It can potentially echo things that are monitoring progress, but in and of itself, it is.
No, I realize that. Okay, fair enough. So the only question is when it echoes. Okay, so let's think about what happens. Usually Echo is just extruding stuff up on the screen, right? Yep. So one thing we might want to do is to panelize that stuff. That is, for example, that echo is producing something that is kind of like a limited size scroll on the screen.
Yep. I believe that was the thing of the horrible. The idea of the horribly named panel echo.
Right. But an alternative to that would be that there is an echo temporary that you call it echo temporary, but it has a second argument which is the number of echoes or something. That's not quite the right thing. That's not the right thing. It has to be global. It's. Well, okay, that's not quite the right thing. Something has to be right.
I mean, that could be like a second argument to clean up echo, right? That like, you know, running max equal goes to 10 or something. Right. It'll clean up everything at the end. But you. Right, by default it'll show everything and then clean everything up at the end. But you could say, you know, running maximum is 10.
And I like that. I like that. That seems sensible to me. And that gets rid of the need for the panel echo thing. So then we have the notion of echo temporary. Well, the question is, do we need.
To get rid of the need for.
Limit echo and $max echo limit? If it's just the second argument to.
Clean up echo, what's limit echo.
Supposed to be? You know, basically turn on quiet echo after a certain number.
I mean, I think that there's a small corner case, quiet echo, which is limit echo, would work like messages do, where that particular message gets three strikes and it's out. You see what I'm saying? Whereas cleanup echo by default would not distinguish different echo sources. So it will just clean up. You know, let's say you give it a depth of five. Whatever those echoes are. It'll. It'll, you know, it'll only have five total echoes. Do you see what I'm saying? I'm not sure that distinction is important.
Well, that's certainly not what. What that putative documentation says. Right? It says limit echo will evaluate expert without letting echo and related functions print more than max number of times.
Yeah. Okay, so it's wrong. But I mean, but you understand what I'm saying? You could limit it by this particular piece of code can only generate some number of. Of, you know, if this piece of code is in a loop, this particular echo can only appear more than n times, less than n times.
Right?
So, okay, so you want something that, that, you know, basically it. Rather than limiting the number that are kept, it just stops echoing after.
Yeah. This particular echo becomes impotent, so to speak, after that number of echoes.
Right.
Which, and this would need to be lexical, right. The echo needs to literally appear as a sub expression of the expert.
I mean, right?
I don't know. But I mean, this could certainly go into echo temporary, this concept of a maximum number, if anybody cares about it, the maximum number per echo, actually.
Or it could go into quiet echo. Right. You know, once we either write as an another option to quiet echo, which we, you know.
Right.
Even if we don't.
I don't know what. Does anybody else have an opinion like Christopher, do you have an opinion about this? Is this a corner case or is this case one cares about? I think it might be a case one cares about because it might be. I don't know, it's a corner case. I mean, so you say, I want 10 echo, a 10 date deep echo stack, so to speak. And then you say, oh my gosh, I missed all the ones like that. I mean, the mechanism that we've had for the last 35 years for messages is reasonably sensible, I think. You know, three instances of one message and then you see if there's something very different happening. You see what I'm saying?
Notice though that that's not three instances of the same message call.
I see, I see, I see Three instances of the same. The same named message, although its source might have been different, lexically different.
Right.
Which I believe somebody suggested using the label, the optional label for echo as the. As that basically like a message tag.
One could. I don't know.
In general, I kind of think that echoes are not meant for, you know, I don't know. I would kind of argue that echoes are less meant for building up giant systems and more just for. I'm debugging this or I need to add some logging here or something like that.
Exactly. But the first thing is when, when there is something absolutely irrelevant, you put an echo in a loop and it's scrolling off the screen with crud. But then every so often there's an echo you really care about and you lose it because the irrelevant inner loop echo is drowning everything.
Right. But you will, right? I mean, that'll happen no matter which way you limit it. That's going to happen.
No, it isn't. No, it isn't. If you limit by echo instance, then the inner loop echo can be limited to five things and then it limits out. And then you see the thing that is important coming up later.
Yeah, but, but by. At that point, my claim is at that point that's more trouble than it's worth. You'll run it once, you'll see that it gets drowned out. You'll remove the thing that's drowning out in favor of the thing that you actually care about. And then.
Yeah, possibly.
So. Yeah, I mean, I don't, you know, I. You know, I think we should focus on. On things that we're reasonably convinced we need. So I think we're reasonably convinced that we want a dollar echo size limit.
Yeah, we're convinced that we want an echo temporary because that's just annoying to see the echo, you know, because that way you can have that in a notebook. I routinely, like when I run a notebook overnight, for example. Okay. And I put an echo in there just so I can, you know. You know, so I can see roughly what's happening. Right. And I let it run for another five hours. And the thing is just like gobs and gobs of pages of echoes, which I really just don't want once it's finished. I just want them all cleaned up.
Right.
Now. The only difference in echo temporary and cleanup echo is that I like to be able to have something where I can just at the point where I'm adding it to the code, say it's a temporary echo rather than having to wrap cleanup echo around the whole thing.
You could do cleanup echo around an entire input line, and it would effectively replace all of the echoes with echo temporary.
Yeah, exactly. But. But I think it's useful to have the echo temporary to begin with.
I.
Well, I guess I'm. I'm going to disagree with that, because how often will you want both echoes and echo temporaries.
And most never.
Right. In which case, why not just have a slash, slash cleanup echo at the end and then all of your, you know, you can use all of the four types of echoes that we have.
That's not unreasonable. I don't disagree with that, by the.
Way, just as a provisional workaround, and maybe you're already doing this, but I'll remind you that you can option click an echo cell and that will select all the echo cells in the notebook.
I didn't think of that. I never remember that. We've had that feature 35 years and I never remember it.
That's helpful.
Does anybody else know that? Anybody else know that trick?
I know that I didn't.
I use it daily on echoes.
I'm not sure how many people use it on echoes, but I just checked and it works fine on, at least on the standard echo outputs. I don't know if there are exotic echo cells.
I think that will.
Yeah, there's echo timing and there's echo evaluation. Have different kinds of echo cells.
By the way, the fact that there are those different species of echo is a Great reason why echo temporary is a bad idea. So, all right, so maybe it's cleanup echo, although I'm not so keen on the name. And that's the one function we keep from this whole collection.
Yeah.
And.
Okay.
Yeah. So dollar echo size limit and cleanup echo or echo cleanup. Is that better? Not sure.
Cleanup is not better.
Yeah. As soon as I said. As soon as I said it out.
Loud, I realized what is with cleanup. How analogous is this to with cleanup?
Marginally.
Yeah. Marginally.
Right.
With cleanup.
Can we think of another word than cleanup? I mean, it really is basically just deleting echoes at the end, Right?
It's temporarize echo, but could just be.
It could just be remove echo because it's running at the end. What.
What would be the function for this? Like notebook delete to delete a cell.
Yes.
Yes.
Right. Right. And yeah, I mean, I started to raise this question before. Does it do the cleanup when the cleanup echo or whatever we call it the remove cleanup when it returns or when the shift enter evaluation returns?
Because I think it's when it returns, I think it's much more useful. It's when it returns. Because you could have multiple blocks of stuff.
Okay.
And do this in between. But let's. Let's think about this name for a second. Okay.
Okay.
Let'S see. Thesaurus here. Purge echo. I mean, Unfortunately, you know, we don't really have a concept. I mean, notebook delete is obviously the same kind of concept.
But this idea.
I think the problem is that cleanup, like vad is a noun. Right. I mean, if we really want it to be a verb, that it should be a camel case to clean up.
Yeah. And that's really ridiculously confusing. Let me see, what would it be like delete echo.
I think delete echo. Remove echo.
Yeah, I think.
I think that's more like delete. Right. Because then remove. I mean, we typically use remove for, you know, like we remove symbols, we remove.
If we could get away with delete echoes, I think that would be somewhat clear.
Would that be confusing with quiet echo? Why isn't it quiet echoes?
Yeah. Okay. What's some other words for delete? I mean, it's trim.
Truncate.
Oh, I like trim.
Yeah. Trim echo. Because what I was also wondering, singular is. It's a bit confusing with. Go ahead. What were you going to say?
What I was going to say. So Itai was talking earlier about this having an option to, you know, how many it keeps around. You know, then I'm, you know, wondering sort of how flexible is that bit of functionality, you know, does it have the ability to allow the first three Echoes and then drop everything after? Or, you know, as well as keep the last three, you know, while it's displaying.
Yeah, I think it probably does have.
You know, you know, and can it be something where, you know, you know, there's some set, you know, that it deletes, you know, it allows things to build up while it's running and then, you know, keeps the last three or something even after it's gone?
I was thinking the same thing. I think. I think whatever. If this is a option for Cleanup Echo, we should have the same option for Quiet Echo. And that should be the thing that. That keeps them in the novel.
Right. And Quiet Echo could not completely quiet it. It could be, you know, quiet with some escapees. All right, let's think about this word. I mean, we got. Okay, what word indicates we're going to. How about this? How about erase Echo. Seems better than any of the previous ones. It's somewhat clear that it's a different kind of action. Is there any sound related word hush or something? We've already got quiet. What were you saying? Sorry? What were you saying, Jose? I was trying to find other sound related.
Given that echo has this immediate connection with sound.
Like mute.
Yeah, except mute would be better for quiet. I mean. Yeah, but it isn't really the same thing. It's after the fact. You see, it isn't really a thing for sound because in sound I went yak, yak, yak, but I can't un yack my yaks, so to speak. Once heard, it cannot be unheard, but once written, it could be erased. I like erase Echo.
It's interesting that we have never used any form of erase in a system symbol before.
Yeah, it is interesting.
Well, why.
Why would we use erase and not delete?
Good question.
Because we don't want to sound like we're supporting Cybermen.
What?
These Cybermen, I remember when they were.
First on television on Doctor who.
Yeah.
And they're the ver.
No, I saw them when they actually. When they actually were airing.
They. They like to delete their enemies.
Yeah.
The new Doctor who series, they've like Daleks, they now have a word they've latched onto, which is delete.
Oh, I don't know. They had that in 1965.
They did not have it in the original series. That's new to the.
To the.
To the 2000 series.
I see. Well, Delete Echo is not obviously bad. I think we should go with that now. Let's talk options for a minute.
I was gonna say, John. So we've never had a race, but we had clean slate. Which.
When did we have clean slate?
I don't think that that was never in the system context though.
No, it was a package, you know, that's, you know, basically, you know, reset your global state and everything and.
Yeah, that went back to Babylonian times. Do they have slates in Babylonia? I don't know. Did they have slates or they just have clay tablets? I don't know. When slate was in.
In Roman times, they liked their wax. Their wax tablets.
This isn't like block echo.
Interesting question. That's an interesting question. I don't think so. I think it's more. If it's any of those things. It's. I mean it's kind of like dynamic. What's that?
Is it sort of like block random?
Yeah, but it's not block random in the sense that it's like a dynamic module where it returns because it's a visible thing on the screen. Is deleting really the only operation we want to support here? Might you want to copy all your echoes somewhere else as the. As a cheap logging. Let's talk about this. Let's talk about this.
Right. That is one of the things under goals of, you know, of. Do we want to redirect echoes?
Yes, let's talk about that.
Because that's another support like Print Action.
Well, we could call it Control Echo. Sounds a bit like Quiet Echo. But let's talk about what to do with the redirection. Because we do want to have some mechanism for just sending all the echoes. Somewhere. Where did we want to send them? To a file. That's the primary place. There is just nullify.
I think it would probably be some subset of the things that are supported by Print Action.
What is supported by Print Action?
Not sure.
Messages window, I think.
What the heck is it?
It's front end option. I. It's one that I have an updated documentation for.
Look at something. I was just doing a live stream and somebody asked when this was. Oh, I said 20 years and I'm wrong. It's. It's only 13. Okay. Anyway. Okay. What do we really want this to do if. I mean, basically it's. It's a logging function and I'm not sure that we should have. The problem is we don't want all the echoes. We got so many different echoes. We might have a different function called log echo. I don't think it's quite the same thing. Cleaning it up and logging it unless you say it should know. Because we don't want to display first and only put it to the file later, if you get what I'm saying.
I mean, I think logging is something different. I don't think it should be tied up with Echo.
Except that the actions that we have at Echo, like echo evaluation and things like this, this seem very useful for logging.
Can you look at the options for print action in the global preferences?
Which global preferences option inspector, command shift, O. Where is the option?
It's the format. It's right there, middle. Change the scope to global. And pop open the menu. But these are all very notebook oriented though.
I mean, to me this is more like the deployment of a form notebook or something thing.
Right.
What could you do? Okay, what could you do with the log? You could log to a. Okay, where can you log? You could log to local object. You could log to a data bin, maybe could log to a cloud object. You'd log to a file, could just log to memory. How do you retrieve it? All right. Or you could log to.
Well, I mean it's, it's, it's, you know, I mean, it's, it's like a so reap sort of thing. Right.
Why aren't you using SO and reap? If you want to actually split out an expression, use so on. Reap.
Could be a time.
Right.
And like going into some global association with timestamps as keys. That would be a way to. Yes, to log to memory.
Could be pretty messy.
Vulnerable to aborts.
Compared to someone.
Yeah, so whoever was just speaking was.
Sorry, my mic was down.
Jeremy. Okay.
Yeah, my mic was up. Sorry. I was saying that using an association is less vulnerable to aborts than using SO and reap.
That's a good point. Right, question. Okay, so I have to say that I think the Echo framework is a pretty reasonable framework for saying what you put in a log file. But maybe I'm wrong. I mean, otherwise how would we log evaluations, for example, or timings? Or would we have a. Actually there's another possibility. Like event handlers. We could have or handler functions. We could have something which basically logs. There's all kinds of keys available for the logger. So I mean we could have a thing which says. Log evaluate or something. What's the right word? I mean, log obviously is taken. So the concept would be it's a logging of EPA comma, and then a bunch of keys, and then it logs those keys.
Sorry, I got disconnected.
Right. It logs those attributes. So it could be for example, logging, you know, it could be timestamp time, evaluation time. It could be input, held input or something. This is a better idea, by the way. Output, etc. Memory. Well, I mean, the other thing one could do is just log when it gives an arbitrary expression to specify what to log. So it could either be the now you can log the now. It's not so easy to log the evaluation time because that requires something that sort of spans the expert. But I mean, then this would be basically, this would be some kind of default logging. Okay, what would one do here? What would one do? One log by session. One could log by session to a local object. One could log in a directory. I mean, that's what a lot of applications might do, log into a directory with a uuid. Guys.
Sorry, can you repeat the question?
Where does it log by default? Do you have to specify the logging location every time or does it simply log? You know, is there a dollar logging location which is simply set globally where you expect that all logging in a session goes to the same place? Do you understand what I'm saying?
I mean, one possibility, you know, at least on, you know, depending on the platform is, you know, wherever the global system log is.
Yes, all that.
Well, of. Well, yeah, assuming there are user logs. Maybe there are user logs on all platforms now. I mean, right. It can't be the global system one because that won't normally be writable by the user.
Right, right. Whichever one on Mac OS that I, you know. Yeah, the one random apps log to it.
Yeah, the one that's until they. The one that's. Until they library logs rather than slash library logs.
On the other hand, the question is, do we want a computable log that would be more like a data bin? I mean, if it was a data bin, it would be a computable log. It's just a piece of text. It's not a computable log in and of itself.
Well, okay, I guess one potential difference between echo and logging is that echo, you're probably interested in the results of a computation, whereas logging, you're probably just as likely to be interested in what the input was.
Sure, I know. That's why I think we need these keys.
Yeah.
Well, I think also. Right. I mean, I feel like with Echo, you. Right. Echo is typically not something you want to keep around. Right. Whereas logging is probably some. Maybe something you do want to keep around.
Yes. It's not totally obvious you don't want to keep echo around. I've seen plenty of use cases where you do Look, I think we should implement delete echo with a second argument, which will also be its sub value, you know, also its operator form that is account of some kind.
And what does account on the. And that's the running total.
That's the number that you. The number of survivors. So the default will be zero.
I see. Okay. Right. So then you say. Right, so that allows you to see.
The last five, which is an argument for calling it prune echo, Maybe. How do people feel about prune versus delete?
I think I prefer a little bit.
What's that?
I think I prefer delete.
We can implement this delete. Let's see what that feels like. So you'd say delete echo 5 and that would show you. That would leave as residue in the notebook the last five echoes. Right.
So were you thinking the second argument.
Is I think it should be delete echo of expert comma n. Or the sub value would be delete echo of n of expert.
Okay, so that would require.
Does that. Wait a minute, does that work? Or is that impossible because of no held sub values?
Exactly. We need hold all sub values to.
Do the sub value case. Yeah. So you know, what we can implement immediately is delete echo.
And also I think it might be nicer to have Delete echo of exper1 argument. Just have a reasonable.
No, I think it should delete everything. That should get rid of everything.
Same as quiet echo, basically.
Yeah, yeah. It's a quiet at the end. It's a see it, but, you know, see it, but delete it.
Which I think this is why. Yeah, I think this is why. Itay suggested for. This is similar to the quiet echo suggestion Ittai had, but it was an option so that you didn't have that. You could still have a one argument form and a hold all subvalue.
Right.
I see what you're saying. I see what you're saying. Yeah, you're not entirely wrong there. Oh, boy. Okay. Yeah, I agree.
There's even. There's even the whole notion of, you know, logging levels. And I don't know if that would even. Could should even become echo levels where it's, you know, the. It's always there, but it's only enabled when you want debugging level as opposed to error level or something like that.
That's more for quiet echo. The echoes are there, but they're quieted. I mean, that's something I do reasonably often. You have echoes in the code, but you do quiet echo.
Right, but the point is that you don't want to quiet all the echoes.
No, I got it, I got it, I got it. So you have tags and the echoes and you say quiet.
Yeah.
I can see that being useful, but I mean, this is. Look, this is in the department of error handling, basically, of similar kinds of things, of some amount of code automation. All right, look, I think we've got some path forward here. I agree. Those are some ideas that we should consider. But let's. I mean, having tags on echoes is a whole nother thing. Which reminds me of tags on messages. Right. It's like the verbosity level story, Which unfortunately, as we've seen many times, one person's. You know, I don't care about that message is another person's golden message making sense.
But I liked your idea about echo label because that's. That basically means that now the logging levels are user or echo levels are user defined instead of.
What was the idea? Wait a minute.
Well, you mentioned echo label after I was talking about levels, and so the idea ends up. So I interpreted that as an idea of quiet echo taking an optional second argument where you give it the pattern that should be quieted, and then if your echoes are actually echo labels, then the pattern matches the label.
I see. I didn't think of that. But, yes, that wasn't what I was thinking of. But it's a good idea. You're suggesting quiet echo takes a pattern, And so then it's up to you to make a convention for how you quiet things. You want to quiet.
Exactly.
It's not a crazy idea. What does quiet echo do right now in terms of that?
Just one argument.
Could take a pattern, And one day it could take a pattern. All right, so look, that's an interesting solution to that problem. We've still got the logging thing, which I think is probably for a separate discussion.
A subtle question. So it's for echo evaluation. Each echo evaluation prints twice. So does that count as one or two echoes? For things that take a number of echoes?
I think it's one echo. Think it's every echo call. Not every.
I was gonna argue it should be. Well, okay.
It's a little complicated.
I was gonna argue two because when you set sort of your limit, what you're really trying to set is how much space it's gonna take up on your screen.
Yes. But on the other hand, if you like one problem with.
Right, right.
If you.
If you tell it, you know, I have, you know, I can only have five echoes on my screen, then it's kind of unclear what to do.
Yeah. I think it has to Be at one lump. Because otherwise you can't limit it. You can't limit in half, you know, echo pairs.
I don't think it would be too tragic. I mean, it's just like if you have a log file and you're only looking at a window in it, it's fine that you're missing some pieces, but.
Well, okay, so then we have to have a visual indicator that we've missing something. A vertical or something like that. How would we do that? How would we do that? And what happens if you've got a print followed by echoes to the echoes just vanish. So your notebook. So if you have print, echo, echo, echo, print, echo, echo, echo. And then some of the earlier echoes expire.
Then they disappear, Right? They think, right, you're deleting the echoes and prints live in their own place. Right?
Yeah. Okay, fine. So they just disappear in the notebook scrolls.
Yep, yep.
Okay. And then, then you're claiming that the disappearance of echoes, it leaves no residue.
Correct.
Yeah, I think you're right. It's a little odd because, you know, in the print world, in the. In the message world, the final thing waves a flag and says, I'm. Is there any grin of the Cheshire cat that should be left, so to speak.
I mean, the first one. One, right. The first echo, or I guess the third echo, you know, the. The last echo that prints could also say something like, hey, I'm not going to be printing anymore.
I mean, I think a difference between the two cases is that in the case of messages, you don't necessarily know where they're coming from, whereas in the case of echoes, it's much more likely that you're in control of them. And you know that you've done delete echo and that things may be pruned.
Right.
It's very rare that I don't know where an echo is coming from. And if I'm in a situation where I'm confused to use echo label or some such, so then I know exactly where each echo is coming from.
Well, that's because you're assuming echo is a local debugging loop, not something that somebody's put into a piece of production code.
Nobody should ever put echo into production code.
I was gonna say, can I start putting echoes in production code?
Right. Okay, fine. So the other, the other issue is that the prints, the message stuff, deletes from the end, whereas the echo stuff deletes from the beginning. Right. The echo thing is a stack, basically, or something. It's a stack, but something where. No, it's A, It's a, you know, least recently used, you know, removes the things that haven't been recently used. Right. So what you'll see is that it will eat itself from the top.
So you're thinking delete echo with five specified will have five of the most recent things.
Yes, absolutely. That's the most useful thing for it to do. Anybody object to that?
No. I mean. Right. And this is why, I mean, we, I, I guess we've moved away, away from this suggestion. Right. But I did suggest an option of like running max or something where it. Right. It lops off where you see the five most recent or the 10 most recent ones.
I mean, we could have minus five be the last be the tail and five with the head, you know.
Well, I mean that, you know, introduces another possible name of, you know, tail echo or something.
The tail is gone, the animal left the building, you know.
No, I mean, you're talking about, you know, in terms of like, you know, UNIX command line head and tail.
No, I understand that, I understand that. My point is that at the end of it. Wait a minute. Tail. Well, I guess you don't end tail. If the process exits, is there a tail left over?
Well, I mean, that's a meaningless question, right? Whatever the process wrote to, you know, tails input stream, the last five things will be shown.
Okay, so the tail, the animal did not leave the building is what I'm saying. But there's a piece of tail left over at the end.
Correct.
Whereas the default case of Delete echo, there is no tail left over.
Correct.
Everything's gone.
Yes.
Should Quiet Echo also be the same?
I mean, I'm wondering if this really want to be options rather than optional arguments. Right? It's like keep. And we could, we could have like two options, right? Keep from beginning and keep from end.
So really cruddy. I think we should use plus and minus for that because we've got such so many commands.
Right. So then what's the name of the option?
Why does it have to be an option? Why isn't it an argument?
Well, I. Because I. Well, well, I guess my belief is that it's more common that you'd want to the last five than you'd want the first five. In which case it's weird. It's weird if the default is to use negative values, but it's also weird if we reverse the sense of positive and negative.
Sure. We can't reverse the sets.
Also, I think delete echo of exper one argument using zero as the default is, is better.
Well, I think, I think we all agree on that point. The, the question is how do you specify five?
How would it then work? Was minus five. You couldn't do that.
What if. Okay, so delete echo your option or argument or whatever takes span syntax of what it's going to trim out.
What does zero mean? What does it, Is it all? If it trims everything.
All.
All is terms, everything. You know, colon, colon minus five.
That's incredibly obscure.
I mean, semicolon, Semicolon minus five would mean everything up to. Yeah.
I guess. What is the notation of audio trim? You know, if we wanted to use the trim name, we should at least make sure we know what the.
I think the original one was really.
Image trim rather than audio time. Audio is taking forever to run.
Okay, so audio trim. Well, I guess, I guess I, I like audio trim as a better template because it's, I think of it as linear, unlike image trim.
But.
Right. So audio trim, I mean, right, if we called it right. And the default is to trim everything at the end and. Yeah, I think audio trim with a second argu audio trim, echo trim with a second argument actually makes a fair amount of sense.
Sorry, echo trim with what? Trim echo. Why is it or trim.
What's that?
Well, trim echo. What are you suggesting?
Right. I'm saying that trim echo with a second argument, you know, make makes sense. Which is the right. Whether to keep anything from the beginning or end.
Also, what is it from the end?
We would not have the hold all sub value in that case, right?
Yeah, I guess that's true. I mean, that, that is right. If it's not an option, then we can't have the operator form.
The whole thing is if it's, it.
Is an option, the operator form is still wonky because that's assuming you never want to echo blah, arrow, blah. You've got a question.
We have plenty of precedent for things where, you know, where, where options. You know, the rules. The rules that are valid. Option names are treated especially.
I know this is a slightly awkward case because I think echo is a somewhat general function. I think there are other cases where it's really un, you know, undangerous.
You mean like string, string functions where you have, you know, string arguments. It's I, I, I don't buy that argument. We, we have plenty of, or, you know, plenty of cases. The, the and you know, right arguments. Options. Right. Has an option to control the behavior this way of whether.
Fair enough.
So it's common enough we automated it.
Yeah. Okay. I have to run in a second here. Well, let me see.
I'll confess that I'm a little bit confused about which function or functions we've decided to keep. Or maybe we haven't decided yet.
No, we decided we're keeping Delete Echo or some version of Delete Echo Trim Echo.
Okay.
And that's the only one other than the other than dollar Echo.
Size limit.
Size limit. The only two we're keeping. And we know the functionality we want for Delete Echo. We just don't know quite how to achieve it. That is, we want keep the first five, you know, the last five, I don't think we want. And the question of exactly how we sub value, you know, whatever it is still open. And we also need a separate discussion about logging.
Okay.
And that, I think, is it okay to run.
Right.
So see you guys. Thanks.
More from Guy

Cheryl Strauss Einhorn | The Human Edge: Smarter Decisions in the Age of AI | Talks at Google

Rachel Glennerster | Innovation and the Center for Global Development | Talks at Google

Rebecca Winthrop | Rethinking the Purpose of Education in the Age of AI | Talks at Google

Dr. Robert Wachter | A Giant Leap: How AI Is Transforming Healthcare... | Talks at Google






