00:04:18 <oerjan> must... resist... tempation... to ban... canaima@*.*
00:05:11 <lambdabot> boily said 1h 28m 58s ago: with raw onions, on some tunnbröd, and an ounce of aquavit.
00:05:38 <oerjan> @tell boily tunnbröd is swedish not danish hth
00:06:40 <oerjan> @tell boily you might substitute fladbrød instead hth
00:14:11 <oerjan> @tell b_jonas <b_jonas> oerjan: yes, that's what mad said too. <-- some context would have been nice. thanks for the reminder about DST though, i keep being confused about which month it is since it got moved to october in the autumn.
00:14:12 -!- lleu has quit (Quit: That's what she said).
00:14:35 -!- lleu has joined.
00:15:32 -!- Lilly_Goodman has quit (Ping timeout: 260 seconds).
00:19:13 <tswett> izabera: actually solving the cube? Don't be ridiculous.
00:19:23 <oerjan> <izabera> is walric even a word <coppro> it is now <coppro> welcome to English <izabera> that's not how it works <coppro> yes it is <-- english seems to have a weird relationship with the idea of a word being "real".
00:20:12 <oerjan> so i thought izabera was right here, but might not have been if it were another language.
00:20:24 -!- jaboja64 has quit (Ping timeout: 276 seconds).
00:20:34 <tswett> A word is real if people outside a particular community regularly use it with its supposed meaning.
00:20:51 <tswett> Examples of real words are "irregardless" and "pseudopseudohypoparathyroidism".
00:21:12 <tswett> Examples of non-real words are "ghoti" and "pneumonoultramicroscopicsilicovolcanoconiosis".
00:21:27 <oerjan> tswett: are you sure that the "outside a particular community" test works for no. 2 there
00:22:42 <tswett> "The medical community" isn't really a community. It's not a community if there's some property that allegedly automatically makes you part of it.
00:22:53 <tswett> Or something like that.
00:23:32 <tswett> All right. For some reason, I really dislike the sequence that I currently have for solving this situation: https://www.speedsolving.com/wiki/index.php/Special:MediawikiAlgDB?mode=view&view=default&puzzle=2&group=CLL&cid=40
00:24:16 <tswett> (2x2. First layer is solved, second layer is oriented correctly, but two adjacent pieces are exchanged.)
00:24:44 <tswett> This one looks pretty interesting: L R U2 R' U' R U2 L' U R'
00:25:48 <tswett> This one too: R U2 R' U' R U2 L' U R' U' L
00:26:00 <oerjan> `le/rn ghoti/"Ghoti" is a very fishy spelling.
00:26:21 <tswett> The hell just happened? My 2x2 was solved a little while ago, and I did nothing to it whatsoever and now it's scrambled.
00:26:36 <tswett> It's been here at my side the whole time. Nobody else has come and scrambled it.
00:26:47 <tswett> There are no other nearby objects which could have somehow contacted and scrambled the cube.
00:27:19 <tswett> The only explanation is that it spontaneously self-scrambled without making any sound or appearing to move noticeably.
00:27:34 -!- Vorpal has quit (Ping timeout: 260 seconds).
00:27:36 <tswett> (Or I scrambled it so absent-mindedly that I was left with no memories of doing so.)
00:27:51 <oerjan> have you slept in the meantime?
00:28:08 <HackEgo> tswett is livin' it up with the penguins. He's a title under the cruxite in the lathe.
00:28:44 <tswett> I've been sitting here for at least the last ten minutes.
00:28:58 <tswett> The spontaneous self-scrambling (SSS) event happened within those ten minutes.
00:29:57 <oerjan> does this happen to other things than cubes?
00:30:12 <tswett> Not that I've noticed in the past.
00:30:43 <oerjan> maybe you just switched to another universe where you didn't solve it.
00:30:56 -!- jaboja64 has joined.
00:31:41 <HackEgo> /cat: : No such file or directory
00:32:13 <hppavilion[1]> tswett: Have I informed you that I'm writing a compiler or two?
00:32:19 <tswett> The L R U2 sequence needs U' appended to it, I think.
00:32:47 -!- Vorpal has joined.
00:33:11 <oerjan> `` grep -r berenst wisdom
00:33:52 <tswett> Okay, I like the second sequence there better. Again: R U2 R' U' R U2 L' U R' U' L
00:34:04 <hppavilion[1]> tswett: I'm trying to figure out how to compile a temporal logic programming language
00:34:14 <tswett> There's at least one way of writing that decently concisely...
00:34:27 <tswett> R U'^(U2 R') R'^(L' U)
00:35:37 -!- Lilly_Goodman has joined.
00:37:52 <tswett> hppavilion[1]: I'm solving the 2x2x2 Rubik's cube.
00:37:56 <hppavilion[1]> Lilly_Goodman: Dios mío. ¿Tiene algún interés en la programación esotérica?
00:38:21 <tswett> Which has only a teeny tiny bit to do with the Banach-Tarski theorem.
00:38:25 <\oren\> you should report this glitch to reddit
00:39:05 <hppavilion[1]> Lilly_Goodman: Traductor Google no va a traducir esa correctamente.
00:39:18 <tswett> hppavilion[1]: pienso que significa "like what??"
00:39:52 <oerjan> tswett: maybe your scrambled cube was due to a use of banach-tarski, look for the other cube.
00:39:55 -!- J_Arcane_ has joined.
00:40:48 <hppavilion[1]> De alguna manera alienado todos (o al menos yo) la primera vez que vino aquí, y no parece tener ningún interés en el tema del canal, así que por qué estás aquí?
00:40:50 -!- J_Arcane has quit (Ping timeout: 244 seconds).
00:40:53 <tswett> El bienvenido obligatorio...
00:40:58 <tswett> `bienvenido Lilly_Goodman
00:41:01 <HackEgo> Lilly_Goodman: ¡Bienvenido al centro internacional para el diseño y despliegue de lenguajes de programación esotéricos! Por desgracia, la mayoría de nosotros no hablamos español. Para obtener más información, echa un vistazo a nuestro wiki: http://esolangs.org/. (Para el otro tipo de esoterismo, prueba #esoteric en EFnet o DALnet.)
00:41:04 -!- J_Arcane_ has changed nick to J_Arcane.
00:42:04 <tswett> hppavilion[1]: I can't quite figure out what the first half of that is supposed to be. "In some way everyone alienated (or at least me) the first time I came here"?
00:42:52 <hppavilion[1]> tswett: "You managed to alienate everybody...", IIRC
00:43:32 <hppavilion[1]> Estoy tratando de averiguar por qué sigues viniendo aquí. Usted no parece que se preocupan por el propósito del canal, pero que siguen regresando.
00:43:34 <tswett> In fact nosotros sí discutimos la programación esotérica de vez en cuando.
00:44:24 <tswett> oerjan: I don't think my cube has infinitely many pieces.
00:44:45 <hppavilion[1]> Lilly_Goodman: Somos un canal de programación frikis surrealistas. Parece que han mostrado ningún conocimiento o interés en la programación. ¿Qué estás buscando en este canal?
00:46:58 <tswett> Spanish with its funky... use of lots of negatives everywhere.
00:47:21 <tswett> In Spanish, you don't say "you have shown no interest in this or that"; you say "you haven't shown no interest in this nor that".
00:47:47 <Lilly_Goodman> hppavilion[1]: como puedo instalar juegos a la canaima?
00:48:26 <tswett> Lilly_Goodman: tal vez quieres hablar en #canaima.
00:48:42 <tswett> Nosotros no conocemos nada de la Canaima.
00:48:59 <hppavilion[1]> Por favor. Encontrar un canal que se adapte a sus intereses y pasar el rato allí. Esto claramente no es el lugar para usted.
00:51:45 <hppavilion[1]> ¿Como que? Estoy tratando de decir que este no es el canal que parece estar buscando, y que debería encontrar algo mejor se adapte a sus intereses. Esto no es ese lugar.
00:52:12 <tswett> hppavilion[1]: *shrug* It's not necessary for us to try to convince them to do anything.
00:52:50 <hppavilion[1]> tswett: Should we, the people of #esoteric, try to make an actual, useful programming language?
00:53:43 <Lilly_Goodman> hppavilion[1]: pero no sabe como descargar aplicaciones a la computadora canaima?
00:53:51 <tswett> I'm already doing that; by all means you can help!
00:54:15 <tswett> Lilly_Goodman: ¿lo has preguntado en #canaima?
00:54:50 <hppavilion[1]> NOSOTROS NO HACEMOS CANAIMA. YO AN NO S LO QUE ES. TRATE DE HABLAR CON PERSONAS EN UN CANAL ALREDEDOR DEL CANAIMA, EN VEZ DE AQU.
00:55:16 <tswett> C#. I guess I'd call it interpreted.
00:55:21 <tswett> It's a query language, not really a programming language.
00:55:38 <hppavilion[1]> (Sorry for ~yelling, but Lilly_Goodman does not seem to be getting the message)
00:55:52 <hppavilion[1]> tswett: OK, but does it have programming features?
00:55:53 <tswett> Lilly_Goodman: lo siento de que no te podemos ayudar.
00:56:17 <tswett> hppavilion[1]: not really. It has, like... addition.
00:56:31 <tswett> It might be Turing-complete somehow.
00:56:37 <tswett> Yeah, definitely like SQL.
00:56:58 <tswett> Uhh, I guess kind of a cross between relational and object-oriented.
00:57:10 <tswett> It's supposed to be useful as a language for querying existing SQL databases.
00:58:09 <hppavilion[1]> Nosotros no podemos ayudar. Por favor, encontrar a alguien que pueda hacerlo. Usted no va a encontrar en este link.
00:58:13 <tswett> Uhh, lemme see. There's no spec at the moment.
00:58:23 <tswett> But yeah, example code.
00:58:34 <tswett> I should make, like, a list of features, and number them.
00:58:40 <tswett> First, feature number A.
00:58:44 <tswett> (They're numbered with letters.)
00:58:55 <hppavilion[1]> tswett: What happens when you have a letter overflow?
00:59:11 <tswett> I'll start using doubled letters and whatnot.
00:59:17 <tswett> After Z comes AA, then AB, ...
00:59:30 <Lilly_Goodman> hppavilion[1]: que preguntas puedo hacer en este anal??
00:59:37 <Lilly_Goodman> hppavilion[1]: que preguntas puedo hacer en este canal??
00:59:52 <tswett> Lilly_Goodman: ¿conoces la programación?
01:00:07 <tswett> hppavilion[1]: remember also that it's perfectly fine to just totally ignore a question.
01:00:22 <tswett> So, there are at least two sorts of types in this language: scalar types and non-scalar types.
01:00:29 <hppavilion[1]> Nada, en realidad. Somos más de un canal de chat-sobre-el-cosas que un canal de pedir-us-preguntas.
01:00:29 <tswett> Scalar types are things that can fit into a table cell.
01:01:03 <tswett> Some examples: unit, integer, double, string.
01:01:28 <tswett> Non-scalar types are anything else.
01:01:32 <tswett> And boy, they're a doozy.
01:01:36 <tswett> I'm not going to explain them at all.
01:01:51 <hppavilion[1]> tswett: You don't understand them yourself, do you?
01:02:06 <tswett> So, the first revision of the language is going to be read-only.
01:02:19 <tswett> Like, there's not going to be any way to change the data in a database.
01:02:27 <tswett> And I've managed to say a lot without really communicating anything.
01:02:35 <tswett> Suppose you've got a table called "cats".
01:02:40 <tswett> You can get all of the data out of it using this query:
01:03:21 <Lilly_Goodman> hppavilion[1]: no entendi bien a que te refieres con que es un chat-sobre-el-cosas que un canal de pedir-us-preguntas???
01:03:45 <tswett> Google did a rather hilarious job with "pedir-us-preguntas" and whatnot.
01:03:58 <tswett> Lilly_Goodman: "pedir-us-preguntas" = "pedirnos preguntas"
01:04:33 -!- nooga has quit (Ping timeout: 246 seconds).
01:04:47 <tswett> Note that "struct" types are probably going to be scalar.
01:05:02 <tswett> And I'm not sure what you mean by digraphs.
01:05:02 <hppavilion[1]> tswett: And they'll get stuck in a massive data type?
01:05:30 <tswett> Yeah, tables can reference each other and whatnot.
01:05:43 <tswett> I thought you meant "sequences of two symbols", the other meaning of "digraph".
01:05:59 <tswett> If there's a table called "cats", then there's a type called Reference<cats> or something, which refers to rows in that table.
01:07:15 <tswett> There are struct types. Let's say that there's a struct called, I dunno, CatInfo, with two fields: name, which is a string, and friendliness, which is an integer.
01:08:12 <tswett> There's a certain extremely important operator, which is:
01:08:17 <tswett> The projection operator.
01:08:30 <tswett> Suppose "ci" is a particular CatInfo value. Then you can do this:
01:08:35 <tswett> That'll give you the cat's name.
01:08:45 <tswett> Now, the way this works is a little complicated.
01:09:06 <tswett> In most programming languages, the thing on the left is an expression, and the thing on the right is an identifier, naming one of the fields of the thing on the left.
01:09:42 <tswett> In this language (it's called Quendle, by the way), the thing on the right is also an expression, and it's evaluated in the "projective context" of the thing on the left.
01:09:54 <tswett> Now, projective contexts (or just contexts) are something I haven't totally worked out yet.
01:10:35 <tswett> You can evaluate something in the projective context of a struct type.
01:11:04 <tswett> If you evaluate a field of that struct in that context, you end up with... the value of that field.
01:11:51 <hppavilion[1]> tswett: And can the expression be something other than an identifier? I would doubt it, but it might be possible
01:12:08 <hppavilion[1]> And if a struct st has attributes a and b (both ints), will st.(a+b) return their sum?
01:12:13 -!- Phantom_Hoover has quit (Read error: Connection reset by peer).
01:13:17 <tswett> As for making custom contexts: kinda... there are features producing various kinds of contexts.
01:13:27 <tswett> I'll explain a little further a little later.
01:13:34 <hppavilion[1]> tswett: Does Quendle support Prologian knowledge bases? Perhaps there are operators to treat a table as a knowledge base in some subset format?
01:13:34 <tswett> As for st.(a+b): yes, absolutely.
01:13:58 <lifthrasiir> heh, I don't know Spanish but that was hilarious
01:14:21 -!- ais523 has joined.
01:14:27 <tswett> There are no logic programming features.
01:15:05 <hppavilion[1]> If so, I might just have to make a logic programming library ;)
01:15:08 <tswett> Tables have row set types.
01:15:31 <tswett> The "cats" table will probably have a type like "set of CatInfo rows".
01:16:34 <tswett> And the nice thing about row set types is that the projection operator passes through them, so to speak.
01:16:45 <tswett> Which is to say, you can do this:
01:16:59 <tswett> And that will give you all of the cat-names.
01:17:30 <tswett> Now, there's another really important operator: "where".
01:17:44 <tswett> cats where friendliness >= 6
01:18:02 <tswett> Which... is... kind of self-explanatory, but kind of not.
01:18:05 <hppavilion[1]> tswett: Is this language intended to be ultra-readable?
01:18:22 <tswett> I wouldn't say that. It's designed to be usable, like... a lot of languages are.
01:18:47 <hppavilion[1]> where could equal .. if that isn't already used. .. looks nice for where (reminds me of "such that")
01:19:09 <tswett> That expression there essentially looks at every cat c, and evaluates the expression "c.(friendliness >= 6)".
01:19:15 <tswett> All right. I'll continue monologuing.
01:19:27 <hppavilion[1]> I would prefer if you just waited until I was back :P
01:20:00 <Lilly_Goodman> tswett: como puedo descargar programas a una computadora?
01:21:06 <tswett> For those rows where it's true, you get that row as part of the result set. Where it's false, the rows are eliminated.
01:22:29 <tswett> Now, you can also take the cartesian product of two row sets.
01:22:40 <tswett> If you want to get the set of all pairs of cats, you can do something like this:
01:23:37 <tswett> Next, suppose "cats" has a "name" column, and "humans" also has a "name" column. For whatever reason, you want to get the set of all pairs of cat and human such that the cat and the human have the same name.
01:23:49 <tswett> This won't work, for obvious reasons:
01:23:54 <tswett> cats * humans where name = name
01:25:24 <tswett> So what can you do instead?
01:25:32 <tswett> c: cats * h: humans where c.name = h.name
01:26:18 -!- Lilly_Goodman has quit (Ping timeout: 244 seconds).
01:27:31 <tswett> Now, the exact mechanism behind this, I'm not totally sure of.
01:27:40 <tswett> Let me offer a quick proposal.
01:28:00 <tswett> "Proposal" is kind of a funny word for it, since I'm the one who makes the decision.
01:28:55 <tswett> (c: cats * h: humans) has a type like "set of rows: (struct with field "c" of type (CatInfo), field "h" of type (HumanInfo))"
01:29:33 <tswett> So on the right, you simply compose fields appropriately.
01:30:35 <tswett> Now, I think there's a problem with this.
01:30:39 <tswett> Let me try to remember what the problem is.
01:32:47 <tswett> I'm not totally sure that there is a problem, so at the moment, I'm going to assume that there is no problem.
01:34:07 <tswett> And, uh... sheesh... I think that's the bulk of the language, right there.
01:34:19 <tswett> Maybe I should say the core of the language.
01:35:47 -!- Lilly_Goodman has joined.
01:39:39 <tswett> The top-level scope is always accessible.
01:39:57 <tswett> Assuming I know what you mean.
01:40:12 <tswett> Like, you can't explicitly ask for the global projective context.
01:40:19 <hppavilion[1]> Say you have an integer "i", a struct "st", and st has attributes num and i
01:40:33 <tswett> That raises a question.
01:40:59 <hppavilion[1]> Is st.(num+i) the sum of all st.num and all st.i, or the sum of all st.num and i?
01:41:35 <hppavilion[1]> I would say you need a global projective context nullary operator, unless you already have this figured out
01:41:58 <tswett> Note, by the way, that if you do something like cats.(name + name), if you have cats named "Dorothy" and "Ann", you'll get the results "DorothyDorothy" and "AnnAnn", but not "AnnDorothy" or "DorothyAnn".
01:42:02 <tswett> If you wanted those, you'd have to do...
01:42:17 <tswett> (c1: cats * c2: cats).(c1.name + c2.name)
01:42:46 <tswett> So, right. How am I going to get around this issue...
01:43:15 <tswett> Yup. You wouldn't be able to do "where" on them if they didn't have a projective context.
01:43:56 <tswett> So, the first half of it, "c1: cats * c2: cats" has a type something like this:
01:44:01 * Lilly_Goodman les dice a todos en este momento que Cristo te ama mas de lo que te puedes imaginar :-)
01:44:31 <tswett> "ad-hoc struct with fields c1 of type CatInfo and c2 of type CatInfo"
01:44:44 <tswett> And that generates a projective context.
01:45:06 <tswett> And the two most notable things in this context are c1, of type CatInfo, and c2, also of type CatInfo.
01:45:32 <hppavilion[1]> tswett: So what's the problem that's giving you trouble?
01:45:51 <tswett> You mean besides the st.(num+i) thing you brought up?
01:46:25 <hppavilion[1]> tswett: Though how you plan to overcome st.(num+i) would also be of interest
01:46:28 <tswett> I'm not totally sure if that problem really existed.
01:46:35 <tswett> Though this problem is one of those win-win problems...
01:46:40 <tswett> Either I'll run into it or I won't.
01:47:01 <tswett> If I run into it, perfect—I can figure out how to fix it. If I don't run into it, perfect—the problem doesn't exist.
01:47:11 <hppavilion[1]> tswett: You have product types (*), but do you have sum types?
01:47:58 <tswett> But I want to work out the core language here before adding anything onto it.
01:48:02 <hppavilion[1]> tswett: Any other features of interest? And is this on GitHub?
01:48:15 <tswett> It'll be on Bitbucket.
01:48:55 <tswett> Other features of interest... oh yeah, there's one cool thing I want to do.
01:49:14 <tswett> Suppose you've got a database where every table has this one column, say "Region".
01:49:57 <tswett> You can get to a "slice database"—one where the Region columns are no longer visible, and all inter-table references automatically stay within the one Region.
01:50:10 <tswett> If you ask something like "how many rows are in this table", you'll get one answer for each Region.
01:50:24 <tswett> Sort of like the database has been sliced into a bunch of little databases, one for each Region.
01:50:32 <tswett> And all with identical schemas.
01:51:07 * Lilly_Goodman les dice a todos en este momento que Cristo te ama mas de lo que te puedes imaginar :-)
01:53:13 <hppavilion[1]> OK, give me a minute to reread that a few times xD
01:54:50 <tswett> Uhhhhh I feel like there's something I'm missing right this moment.
01:55:13 <hppavilion[1]> tswett: Check your 2x2x2. Maybe it's in its shift state
01:55:24 <tswett> The half of it which I can see appears solved.
01:55:41 <tswett> I flipped it around to look at the other half. Once again, the half of it which I can see appears solved.
01:56:03 -!- lambda-11235 has joined.
01:56:18 <tswett> But I cannot look at the whole thing at once.
01:56:26 <tswett> Nyow. About that global thing.
01:56:43 <tswett> You know, you might be totally right.
01:57:14 <tswett> Maybe there does need to be a thing called "global" you can use to explicitly request the global scope.
01:57:38 <hppavilion[1]> tswett: Finite presence; if you are not omnipresent, you are limipresent
01:58:51 <hppavilion[1]> tswett: You could also have a "one level up" operator that isn't global, but it's the scope containing the current scope
01:59:07 <tswett> That one I don't like.
01:59:18 -!- XorSwap has joined.
01:59:20 <hppavilion[1]> I don't really either, but I like sharing ideas xP
01:59:48 <tswett> So lemme see. Have we totally figured out the core language here?
02:00:13 <tswett> By using features I haven't come up with yet.
02:00:31 <tswett> Let's try to think of some really complicated queries or something.
02:00:52 <hppavilion[1]> tswett: Select the last item in the table that has some property
02:01:17 -!- bender| has joined.
02:01:18 <tswett> Also something I haven't come up with yet. So far, all row sets are orderless.
02:01:38 -!- XorSwap has quit (Client Quit).
02:01:43 <tswett> That's exactly relational.
02:01:57 <hppavilion[1]> tswett: Though I think if you give every table a row# item, you can accomplish that
02:02:12 <hppavilion[1]> tswett: Perhaps you should also have a unary . operator, that produces an expression that can be applied to extract a value?
02:02:22 <tswett> What do you mean by that?
02:02:25 <hppavilion[1]> .(x+y) can be applied to anything with attributes x and y
02:03:06 <hppavilion[1]> tswett: But for what sc- OH! can you have unevaluatable expression you can later evaluate?
02:03:29 <tswett> You know how if you have a cat Furissa of friendliness 8, and you evaluate furissa.(name + to_string(friendliness)), you get "Furissa8"?
02:03:37 <tswett> You can do something like this:
02:03:45 -!- Lilly_Goodman has quit (Ping timeout: 276 seconds).
02:04:09 <tswett> "Let the name_with_friendliness of a CatInfo be name + to_string(friendliness)."
02:04:20 <tswett> Then you can do furissa.name_with_friendliness.
02:04:34 <tswett> Or: cats where length(name_with_friendliness) <= 7
02:05:13 <tswett> By the way, this lets you do some awful stuff that I hope nobody will ever do.
02:05:15 <hppavilion[1]> (ci: CatInfo).name_with_friendliness = ci.name + to_string(ci.friendliness)
02:05:20 <tswett> And it's a futile hope, because someone will definitely do this.
02:05:52 <tswett> You could say something like: "Let the one_more of an integer x be x + 1."
02:06:06 <tswett> And then you could do something like this: (3).(one_more + one_more)
02:06:09 <hppavilion[1]> Where the lhs of = returns a reference instead of a value
02:06:16 -!- lambda-11235 has quit (Max SendQ exceeded).
02:06:28 <tswett> Well, I'm using = for equality comparison, not assignment.
02:06:53 -!- lambda-11235 has joined.
02:07:14 <hppavilion[1]> So am I correct to guess that :='s lhs is evaluated to produce a reference?
02:07:17 <tswett> I'm not sure what the syntax would be, but it might be more like this:
02:07:33 <tswett> (CatInfo).name_with_friendliness := name + to_string(friendliness)
02:07:40 <tswett> Well... the short answer is no.
02:07:52 <tswett> The LHS is just an identifier, or a type with an identifier after it like that.
02:08:02 <tswett> It's not really an expression you can evaluate.
02:08:11 <tswett> But I do hope to do something kind of along those lines later.
02:08:26 <hppavilion[1]> Because x+1 := 3 is a pain to evaluate (it would, in theory, set x to 2)
02:08:43 <tswett> Not to mention that that's sometimes uncomputable.
02:08:59 <hppavilion[1]> And uncomputability is itself uncomputable oftentimes
02:09:01 <tswett> But: make it so that if a query returns some rows that come from a table, you can, like, set the output of the query.
02:09:49 <tswett> update (cats where name = "Furissa").name := "Furrison"
02:10:22 -!- Lilly_Goodman has joined.
02:10:30 <tswett> It'll undoubtedly be kind of weird.
02:10:33 <hppavilion[1]> Does that modify the result of a query for cats where name = "Furissa"?
02:11:25 <tswett> Essentially, it performs the query 'cats where name = "Furissa"' to come up with a list of rows of the table "cats".
02:11:43 <tswett> Then it applies the "name" projection to that to come up with a list of table cells containing strings.
02:11:54 <tswett> And one of the things you can do with a table cell containing a string is to change what that string is.
02:12:11 <tswett> So really, "cats" has a type like...
02:12:24 <tswett> UpdatableInsertableDeletableRowset<CatInfo>
02:12:49 <tswett> Then you do "where name = "Furissa"" on it, getting an...
02:12:55 <tswett> UpdatableDeletableRowset<CatInfo>
02:13:04 <tswett> Then you do ".name" on that, giving you an...
02:13:10 <tswett> UpdatableDeletableRowset<String>
02:16:49 <tswett> Now, you know how I mentioned I want this to be usable as a front-end to a SQL database?
02:17:53 <tswett> I guess that might actually initially be the *only* way to do it.
02:18:08 <tswett> Lemme think what that might look like.
02:19:19 <oerjan> <tswett> You know how if you have a cat Furissa [...] <-- then you shouldn't be trusted around cats hth
02:22:07 <tswett> Table CallTicket := SqlTable(cts_call_ticket) { integer IdNumber := "ticket_id" primarykey; string Description := "ticket_desc" }
02:23:52 <tswett> Table TicketEvent := SqlTable(cts_ticket_event) { reference<CallTicket> Ticket := "ticket_id"; string Description := "event_desc"; datetime Datetime := "event_datetime" }
02:24:12 <tswett> And then you can do stuff like...
02:24:36 <tswett> (TicketEvent where Ticket.Description = "Oh no! Everything's on fire!").Datetime
02:24:50 <tswett> Which would be a SQL query something like...
02:25:38 <tswett> SELECT event.event_datetime FROM cts_call_ticket ticket, cts_ticket_event event WHERE ticket.ticket_id = event.ticket_id AND ticket.ticket_desc = 'Oh no! Everything''s on fire!'
02:25:46 -!- lambda-11235 has quit (Ping timeout: 252 seconds).
02:31:56 -!- lambda-11235 has joined.
02:43:27 <hppavilion[1]> tswett: Oh, here's a possibly-core language feature you might want to look into
02:44:28 -!- lambda-11235 has quit (Max SendQ exceeded).
02:45:34 -!- lambda-11235 has joined.
03:12:20 <oerjan> that would be x -> Void, wouldn't it? so negation.
03:12:28 <hppavilion[1]> shachaf: Weren't you the one who knew about A^B earlier?
03:12:44 <shachaf> I don't know what zeration is.
03:12:46 <oerjan> or just Void for zero itself.
03:13:00 <hppavilion[1]> shachaf: Successor, basically, but with two arguments. The basic hyperoperation
03:13:13 <oerjan> i assumed it's the operation of turning something into zero.
03:14:10 <shachaf> @google "look for a ...ic transporter"
03:14:11 <lambdabot> http://nethack.wikia.com/wiki/Wizard_quest
03:14:11 <lambdabot> Title: Wizard quest - Wikihack - Wikia
03:16:55 <oerjan> hppavilion[1]: it sounds like it would need to be a function that ignores one of its arguments
03:17:48 <oerjan> @djinn a -> b -> Maybe b
03:18:15 <oerjan> lambdabot: maybe a bit confusing variable choice there
03:19:23 <shachaf> oerjan: did you find your swatter yet twh
03:19:23 <oerjan> i think i'm mixing levels up there
03:19:42 <oerjan> shachaf: my swatter was never missing
03:19:55 <shachaf> i guess that wasn't really swatworthy
03:19:56 <oerjan> it was my saucepan that had been absconded
03:20:40 * oerjan hits shachaf with a damp straw ----
03:20:50 <shachaf> do you ever cook with the saucepan
03:21:22 <ski> hppavilion[1],shachaf : `exp t' is the type of bags of inhabitants of `t', at least for finite `t'
03:21:57 <shachaf> ski: That would be (-> Nat)
03:22:15 <hppavilion[1]> I just realized that kleene algebra and type theory work well together
03:22:30 <shachaf> Hmm, I remember thinking about this and coming to some conclusion but it was years ago.
03:22:34 <hppavilion[1]> + in kleene algebra = + in type theory, * in kleene algebra is like * in type theory
03:23:11 <ski> shachaf : at least judging from the expansion `exp t = sum_{i : |N} t^i / i!'
03:23:15 <oerjan> hppavilion[1]: on second thought, i don't think zeration and successor can be distinguished at this level
03:24:48 <hppavilion[1]> The successor of a string is that string OR the null string
03:25:02 <oerjan> ski: shachaf: _finite_ bags
03:25:26 <oerjan> so (-> Nat) is excluded if it's infinite...
03:25:47 <ski> oerjan : "at least for finite `t'" -- but, yes, also finite multiplicity, so you're correct
03:26:42 <oerjan> hppavilion[1]: no, i mean, this arithmetic <-> type correspondence doesn't have a notion of unused arguments, since you don't have functions, but expressions on the left side
03:30:45 <oerjan> ski: wait, does this mean Nat is e? >:)
03:32:19 <oerjan> ski: oh. i think i see what's going wrong. the x^n/n! <-> n-bag of x correspondence breaks down because of tuples with repeated elements.
03:32:24 -!- lambda-11235 has quit (Ping timeout: 244 seconds).
03:32:54 <shachaf> Oh, repeated elements, that's it.
03:33:08 <shachaf> I remembered there was an issue like that, but I thought it was about unordered tuple.
03:33:56 <ski> oerjan : breaks down how ?
03:33:59 <oerjan> shachaf: well sure, bags are unordered tuples
03:35:32 <shachaf> If x is Bool, then there are three 2-bags of x.
03:37:34 -!- Lilly_Goodman has quit (Ping timeout: 244 seconds).
03:38:02 <oerjan> looked at differently: x^n/n! is rarely an integer.
03:38:13 -!- Lilly_Goodman has joined.
03:42:25 * ski doesn't see a problem
03:43:59 <oerjan> ski: X^n represents n-tuples of X. to divide by n!, there have to n! tuples that identify because they're the same bag. but that only happens for tuples that have all elements distinct and are permutations of each other.
03:44:05 <ski> `t^i / i!' isn't to be viewed as a type divided by another type. but rather a type "divided" by a quotient (/factor) type of that type
03:44:07 <HackEgo> /home/hackbot/hackbot.hg/multibot_cmds/lib/limits: line 5: exec: t^i: not found
03:44:36 <oerjan> ski: yes, but not all equivalence classes have size i!
03:44:52 <ski> is that a problem ?
03:45:21 -!- lambda-11235 has joined.
03:45:56 <shachaf> ski: Why do you think it's not a problem?
03:46:04 <oerjan> if you don't have that (t^i / i!)
03:46:38 <oerjan> if you don't have that (t^i / i!) * i! == t^i then it's not a very good correspondence with arithmetic.
03:46:48 <ski> shachaf : only because i can't see it
03:47:49 <ski> oerjan : if you accept my ".. isn't .. rather ..", then that `*' isn't an ordinary cartesian product of two sets
03:48:34 <ski> so while we want (finite) sets/types to correspond with naturals here, i don't see why we should expect factor/quotient dittos to also correspond with naturals
03:48:53 <ski> (perhaps there's still a problem. but i don't see it atm)
03:49:16 -!- lambdabot has quit (Remote host closed the connection).
03:49:28 <oerjan> ski: * is already well-established as cartesian product.
03:49:47 <ski> yes, for normal uses of it
03:49:52 <oerjan> like + is disjoint/tagged union
03:50:36 <oerjan> i'm saying any extension to the correspondence which doesn't fit in with those isn't particularly interesting.
03:51:16 <ski> however, viewing `t^i / i!' as being about quotients, it's not clear (to me) that it ought to satisfy a relation like `(t^i / i!) * i! = t^i', relating it to a more restricted cartesian product
03:52:00 <ski> (because, a quotient thing corresponding to cartesian product requires each equivalence class to have the same size. but that's exactly what's not the case here with our `t^i / i!')
03:52:42 -!- lambdabot has joined.
03:52:44 <oerjan> let me rephrase that: _i_ don't find such an extension interesting unless it has some other property to make up for it.
03:54:32 <shachaf> this seems like a p. awkward way to write in point-free style: http://metatree.xyz/treeprover/
03:59:49 -!- tromp has joined.
04:00:45 -!- nooga has joined.
04:03:05 -!- Lilly_Goodman has quit (Ping timeout: 248 seconds).
04:03:43 -!- Lilly_Goodman has joined.
04:05:18 -!- nooga has quit (Ping timeout: 276 seconds).
04:09:52 -!- Lilly_Goodman has quit (Ping timeout: 268 seconds).
04:12:44 -!- Lilly_Goodman has joined.
04:19:47 -!- Lilly_Goodman has quit (Ping timeout: 248 seconds).
04:24:22 -!- treaki__ has joined.
04:25:04 -!- MoALTz has quit (Ping timeout: 244 seconds).
04:27:24 -!- treaki_ has quit (Ping timeout: 276 seconds).
05:13:39 -!- MoALTz has joined.
05:29:15 -!- hppavilion[1] has quit (Ping timeout: 264 seconds).
05:49:22 -!- lambda-11235 has quit (Quit: Bye).
05:57:03 -!- jaboja64 has quit (Remote host closed the connection).
06:15:02 -!- me2 has joined.
06:40:52 -!- Sgeo__ has joined.
06:49:15 <coppro> principle/principal are the worst homophones
06:49:44 <coppro> they're just common enough that people use them regularly, but uncommon and long enough that they don't know the difference
06:49:51 <coppro> it's the principal of the thing, really
07:29:45 <oerjan> coppro: surely the principle issue is understanding what's meant
07:45:00 -!- nooga has joined.
07:56:13 -!- ais523 has quit.
07:58:00 <int-e> there must be room for a unified spelling here... principale?
08:10:43 * oerjan wanted to make a "beyond the pale" pun but instead learned what "the pale" actually meant
08:17:48 -!- ais523 has joined.
08:38:30 -!- nooga has quit (Ping timeout: 246 seconds).
08:39:31 -!- nooga has joined.
08:53:02 <int-e> . o O ( the mopale )
09:05:34 -!- nooga has quit (Ping timeout: 260 seconds).
09:11:50 -!- bender| has quit (Quit: [restarting]).
09:18:28 -!- bender| has joined.
09:25:26 -!- oerjan has quit (Quit: Nite).
09:28:52 -!- J_Arcane has quit (Ping timeout: 244 seconds).
09:35:35 -!- me2 has quit (Read error: Connection reset by peer).
09:36:36 -!- me2 has joined.
10:07:46 -!- impomatic_ has quit (Quit: http://corewar.co.uk).
10:10:13 -!- AnotherTest has joined.
10:15:57 -!- lleu has quit (Quit: That's what she said).
10:16:15 -!- lleu has joined.
10:17:26 -!- boily has joined.
10:46:58 <ais523> huh, I just realised that there's an easy way to construct hash collisions: SHA-256(512×(2²⁵⁶+(2²⁵⁶)!) zeroes) = SHA-256(512×2²⁵⁶ zeroes)
10:47:07 <ais523> let me know if there's anything wrong with my reasoning
10:47:20 <ais523> of course, 2²⁵⁶ factorial is way too large for the collision to be useful at all
10:47:27 <ais523> and we don't know what the actual hash value is
10:47:32 <ais523> but I don't see any reason why this method wouldn't work
10:54:37 <lifthrasiir> ais523: the input of SHA-256 is limited to 2^512-1 bits due to the preprocessing step.
10:54:47 <lifthrasiir> > append length of message (without the '1' bit or padding), in bits, as 64-bit big-endian integer
10:54:49 <lambdabot> <hint>:1:15: parse error on input ‘of’
10:56:30 <ais523> I guess you just append a zero? assuming two's complement
10:58:19 <lifthrasiir> ais523: I meant that there is no standard way to handle more than 2^512-1 bits of input with SHA-256
10:58:36 <lifthrasiir> so well, SHA-256(512*2^256 zeroes) is not well defined
10:58:58 <ais523> perhaps it's intentional to stop this sort of attack
11:01:00 <lifthrasiir> ais523: probably more about preventing an extension attack?
11:01:26 <ais523> this reminds me of an extension attack
11:03:26 <ais523> hmm, I think it works for SHA-3, though (although the description on Wikipedia is unclear)
11:04:13 <izabera> one in the airport and one in the subway
11:08:55 <lambdabot> oerjan said 11h 3m 17s ago: tunnbröd is swedish not danish hth
11:08:55 <lambdabot> oerjan said 11h 2m 15s ago: you might substitute fladbrød instead hth
11:10:17 <lifthrasiir> ais523: probably the role of hashing function has been reduced since the introduction of MD5/SHA-1/2.
11:10:43 <ais523> well they're used for all sorts of things, requiring different levels of security
11:11:01 <lifthrasiir> yeah, but now we distinguish MACs from hash functions
11:11:04 <ais523> there's even an argument for using cryptohashes for hash tables
11:11:15 <ais523> lifthrasiir: I was actually always wondering what the distinction was
11:12:25 <izabera> https://www.reddit.com/live/wmk50bsm9vt3
11:13:42 <lifthrasiir> ais523: IIUC hash functions ensure the data integrity (that is, it is not tampered since the beginning of transfer) but not the authenticity (that is, it came from who we can or learned to trust before)
11:14:06 <lifthrasiir> MAC has an additional parameter for keys for that reason
11:30:51 -!- boily has quit (Quit: POOL CHICKEN).
12:05:56 <tswett> @tell hppavilion[1] The core language pretty much only has two features: products and "where". Everything else is going to be an extension.
12:20:19 -!- AnotherTest has quit (Ping timeout: 248 seconds).
12:30:08 -!- lleu has quit (Quit: That's what she said).
12:44:18 <b_jonas> argh! this stupid build system
12:52:43 -!- ais523 has quit.
12:52:58 -!- vanila has joined.
12:53:30 -!- Sgeo__ has quit (Ping timeout: 244 seconds).
12:55:24 <vanila> @tell zzo38 i cant load your gopher :(
13:10:29 -!- lynn has joined.
13:40:01 <izabera> idea: using the git commit hash as the version
13:40:04 -!- lleu has joined.
13:40:04 -!- lleu has quit (Changing host).
13:40:04 -!- lleu has joined.
13:40:12 <vanila> izabera, bad idea not sortable
13:40:35 -!- nycs has joined.
13:49:34 -!- AnotherTest has joined.
13:54:48 -!- lambda-11235 has joined.
14:01:47 <b_jonas> vanila: use the http access instead, at http://zzo38computer.org/textfile/miscellaneous/
14:01:57 <b_jonas> unless you can't use http either that is
14:05:06 <b_jonas> what's the error if you try to access the gopher?
14:10:38 -!- XorSwap has joined.
14:25:48 -!- jaboja has joined.
14:50:13 -!- XorSwap has quit (Quit: Leaving).
15:02:28 -!- lambda-11235 has quit (Quit: Bye).
15:03:38 -!- p34k has joined.
15:14:01 -!- jaboja has quit (Remote host closed the connection).
15:46:04 -!- earendel has quit (Ping timeout: 244 seconds).
15:46:38 <b_jonas> According to http://magic.wizards.com/en/articles/archive/card-preview/basic-lands-shadows-over-innistrad-2016-03-21 , Shadows over Innistrad will have three arts for each basic land. Isn't it supposed to have four arts each, since it's a large set?
15:59:23 <int-e> hmm, the third island seems too colorful
16:02:08 -!- bender| has quit (Quit: Leaving).
16:17:49 <b_jonas> there's been some colorful islands already.
16:46:57 -!- me2 has quit (Read error: Connection reset by peer).
16:50:28 -!- me2 has joined.
17:17:16 -!- lambda-11235 has joined.
17:33:46 -!- mihow has joined.
17:55:27 -!- nooga has joined.
18:09:40 -!- jaboja has joined.
18:11:49 -!- hppavilion[1] has joined.
18:20:16 <hppavilion[1]> A hybrid between a proof assistant and a practical programming language
18:20:27 <lambdabot> tswett said 6h 14m 30s ago: The core language pretty much only has two features: products and "where". Everything else is going to be an extension.
18:23:33 -!- lambda-11235 has quit (Ping timeout: 240 seconds).
18:28:25 -!- lambda-11235 has joined.
18:30:27 -!- nooga has quit (Ping timeout: 264 seconds).
18:33:03 -!- lambda-11235 has quit (Ping timeout: 276 seconds).
18:40:22 -!- jaboja has quit (Ping timeout: 252 seconds).
18:50:16 -!- hppavilion[1] has quit (Ping timeout: 264 seconds).
18:55:24 -!- earendel has joined.
18:56:50 -!- hppavilion[1] has joined.
18:58:20 <HackEgo> [wiki] [[LABEL]] N https://esolangs.org/w/index.php?oldid=46631 * FricativeMelon * (+2751) Created page with "'''LABEL''' is a programming language based on goto-like jumps and loops and whose memory consists entirely of how many jumps have been made. == Syntax == {| class="wikitabl..."
18:59:25 -!- nycs has quit (Quit: This computer has gone to sleep).
19:01:37 -!- I has joined.
19:02:00 -!- I has changed nick to Guest11109.
19:14:07 -!- Guest11109 has quit (Quit: This computer has gone to sleep).
19:14:46 -!- nycs has joined.
19:20:25 -!- jaboja has joined.
19:26:50 -!- nooga has joined.
19:31:29 -!- nooga has quit (Ping timeout: 260 seconds).
19:37:22 <HackEgo> [wiki] [[Talk:Seed]] N https://esolangs.org/w/index.php?oldid=46632 * Dittoslash * (+123) Created page with "possible seed that produces seed? ~~~~"
19:44:03 -!- lambda-11235 has joined.
19:45:09 -!- J_Arcane has joined.
19:50:01 -!- Lilly_Goodman has joined.
19:53:12 -!- int-e has changed nick to int-e_.
19:53:18 -!- int-e_ has changed nick to int-e.
19:56:36 -!- lleu has quit (Read error: Connection reset by peer).
19:58:20 -!- aloril_ has quit (Ping timeout: 260 seconds).
19:58:54 -!- tswett has quit (Ping timeout: 260 seconds).
19:58:54 -!- cnr has quit (Ping timeout: 260 seconds).
20:00:00 -!- Warrigal has joined.
20:03:42 -!- cnr has joined.
20:03:44 -!- cnr has quit (Changing host).
20:03:44 -!- cnr has joined.
20:05:32 -!- nooga has joined.
20:05:40 -!- lambda-11235 has quit (Quit: Bye).
20:12:02 -!- aloril_ has joined.
20:14:29 -!- Taneb has changed nick to nvd.
20:34:46 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
20:47:47 -!- Phantom_Hoover has joined.
20:50:06 -!- nooga has quit (Ping timeout: 268 seconds).
20:50:39 -!- Lilly_Goodman has quit (Read error: Connection reset by peer).
20:51:17 -!- Lilly_Goodman has joined.
20:58:10 <nvd> Phantom_Hoover, you can't just ask someone if they're from Venezuala
20:58:43 <nvd> We also get a lot of people from Finland
20:59:02 <HackEgo> [wiki] [[LABEL]] https://esolangs.org/w/index.php?diff=46633&oldid=46631 * FricativeMelon * (+213)
20:59:19 <nvd> We've in the past had a statistically improbably number of people from a small town in south west Northumberland!
21:01:45 -!- nycs has quit (Quit: This computer has gone to sleep).
21:02:09 -!- hppavilion[1] has joined.
21:05:09 -!- nooga has joined.
21:11:24 -!- nooga has quit (Read error: Connection reset by peer).
21:14:37 -!- nooga has joined.
21:17:19 -!- I has joined.
21:17:39 -!- I has changed nick to Guest25470.
21:38:25 -!- p34k has quit.
21:42:31 -!- Guest25470 has quit (Ping timeout: 268 seconds).
21:45:08 <hppavilion[1]> @ask tswett Wait, aren't functions going to be in the core of Quendle? They should be.
21:52:59 <Warrigal> User-definable functions... yeah, those will probably be in the core.
21:53:02 -!- Warrigal has changed nick to tswett.
21:53:12 <tswett> I wonder if I have any new messages.
21:53:36 <tswett> Probably not. After all, lambdabot would have told me, out loud, in the channel, if that were the case.
21:54:42 <hppavilion[1]> I'm writing a mockup DiGraph library for Quendle based on my limited knowledge
21:54:52 <lambdabot> I'd rather not; tswett looks rather dangerous.
21:55:24 <tswett> Yeah, that'll be one of the operators.
21:55:48 -!- p34k has joined.
21:57:44 <hppavilion[1]> tswett: I'm trying to define subset of in my mockup, but I'm assuming Quendle is fully declarative. Does it have Haskell-style list building?
21:58:03 <tswett> So far there are no lists, only sets.
21:58:44 <tswett> The features I've already described are kind of like Haskell-style set building.
21:59:12 <hppavilion[1]> tswett: I presume Quendle has unicode support as an alternate to ASCII?
21:59:28 <hppavilion[1]> So I can, if I please, literally use ∈ in my code?
21:59:31 -!- Lilly_Goodman has quit (Quit: (saliendo)).
21:59:38 <tswett> Quendle doesn't even support ASCII as such.
21:59:47 <tswett> There's no way to say "I don't want the rest of Unicode".
21:59:58 -!- Lilly_Goodman has joined.
22:00:20 <hppavilion[1]> tswett: Do you mean you can't exclude data to unicode strings, or that untypable characters are required to use the language?
22:00:42 <tswett> Something like the former.
22:01:07 <hppavilion[1]> tswett: Given sets a, b, would a ∈ b return one of {True}, {False}, or {False, True} based on whether all items of a are in b?
22:01:32 <tswett> I'll probably make that invalid for the time being.
22:02:02 <tswett> I accidentally got my 2x2 in a certain interesting configuration. I went to this solver site to see if there was a particularly interesting algorithm to produce this configuration.
22:02:24 <tswett> I guess there's going to be an operator called "subset" or something.
22:02:53 <tswett> Turns out that yes, there's definitely a particularly interesting algorithm for this configuration. Namely: U F2 U2 R2 U
22:03:03 <tswett> hppavilion[1]: yup, I suppose that would also work.
22:03:24 <hppavilion[1]> tswett: See, if the element-of operator works over sets (as mentioned above), you can do (non-strict) subset with !(False ∈ (a ∈ b))
22:04:19 <tswett> Which is why there's a subset operator—otherwise you'd have to do something like that. :)
22:05:05 <tswett> Reduce, what would that be?
22:05:33 <tswett> There are gonna have to be "all" and "any" operators that work on sets of booleans.
22:06:23 -!- AnotherTest has quit (Quit: ZNC - http://znc.in).
22:07:12 <izabera> !bf ,[>>+>>,]<<[[<<]>>[-[<]>>[.<<->]>+>>]<<]!foo1234bar
22:07:18 <tswett> Turns out the sequence I just gave is self-inverse. Let me investigate why that is. The sequence can also be written as (F2 U2 R2 U2)^U.
22:07:39 <tswett> F2 U2 R2 U2 is also self-inverse.
22:09:25 -!- hppavilion[1] has quit (Ping timeout: 244 seconds).
22:15:28 <tswett> Let's see. Double that, you get F2 U2 R2 U2 F2 U2 R2 U2, which is, of course, R2^(F2 U2) R2^(U2).
22:20:06 -!- boily has joined.
22:26:48 -!- Sgeo__ has joined.
22:28:13 <HackEgo> ii/Ii is a municipality in Finland, no matter what you do. Except for speaking Swedish.
22:31:57 <shachaf> nvd: whoa whoa whoa, who's that in -lens?
22:36:01 <boily> hellochaf. you would've liked yesterday's Douteux. special pooches.
22:36:15 <boily> pooches everywhere. pooches everytime. always pooches.
22:42:15 -!- lynn_ has joined.
22:44:36 <tswett> I guess another way of saying that is: the involutions F2 and R2^U2 commute.
22:45:57 -!- lynn has quit (Ping timeout: 260 seconds).
22:46:20 <tswett> Which is not surprising: the effect of R2^U2 on the F layer is to swap two of its pieces.
22:47:18 -!- hppavilion[1] has joined.
22:48:38 <tswett> Lemme look at algorithms for the opposite corner swap now.
22:52:13 <tswett> Okay, this one looks pretty interesting: R U' R' U' F2 U' R U R' U F2
22:53:38 <tswett> It can also be written as: (U' F2 U')^(U'^R) U F2
22:54:42 <tswett> Swaps UBL and UFR. Never moves DBL.
22:57:55 <tswett> Oh, but there's also another way of writing it.
23:02:12 <vanila> is there a bash program to print the nth command line argument out?
23:02:28 <vanila> like pi 3 a b c d would print c
23:02:53 <tswett> Couldn't be hard to write a shell script to do that.
23:03:12 <vanila> thats not what im asking
23:03:50 <tswett> What do you mean by "a bash program"? You mean a program that you can run from bash?
23:05:36 -!- Lilly_Goodman has quit (Read error: Connection reset by peer).
23:05:40 -!- mad has joined.
23:05:40 <hppavilion[1]> vanila: But my point stands; pi 3 a b c should print b, not c
23:06:27 -!- Lilly_Goodman has joined.
23:06:59 <tswett> Did it. hppavilion[1]'s version.
23:07:07 <tswett> eval 'echo "${'"$1"'}"'
23:07:08 -!- ais523 has joined.
23:07:19 <hppavilion[1]> tswett: I thougt it'd be something like that, with $$
23:07:34 <tswett> I thought it'd involve $@ or whatever.
23:07:49 <tswett> I looked at this: http://stackoverflow.com/questions/1497811/how-to-get-the-nth-positional-argument-in-bash
23:07:56 <tswett> I decided I liked the "eval" solution the best.
23:08:34 <ais523> I thought it was Perl but $$ and $@ are unrelated in Perl
23:08:36 -!- jaboja has quit (Ping timeout: 246 seconds).
23:09:00 <mad> http://www.agner.org/optimize/instructionset.pdf "Proposal for an open standard instruction set" What do you guys think of this?
23:09:01 <ais523> other than that they're both punctuation variables
23:10:11 <vanila> its a nice hack but not safe
23:10:50 <ais523> it's still assuming that processors work much like today's processors :-(
23:11:13 <ais523> I don't like that assumption; I think we'd have moved on to different processor architectures long ago if not for backwards compatibility
23:12:35 <mad> what do you think processors would look like if they weren't stuck with backwards compatibility?
23:12:37 <tswett> What's wrong with x86 and ARM?
23:13:03 <mad> x86's worst sin IMHO is byte-sized instruction size granularity
23:13:20 -!- jaboja has joined.
23:13:24 <mad> with very complex determination of instruction length due to prefixes etc
23:14:13 <ais523> mad: I think they'd allow for more dynamic parallelism and aliasing behaviour
23:14:43 -!- nooga has quit (Ping timeout: 248 seconds).
23:14:46 <tswett> Proposal: all instructions are encoded as UTF-8.
23:14:48 -!- nooga_ has joined.
23:15:48 <ais523> that only goes up to 31 (32?) bits even if generalized, though
23:15:50 <mad> ais523 : that means that they wouldn't have strictly ordered memory loads/stores?
23:15:52 <ais523> and dos so quite inefficiently
23:16:07 <ais523> mad: most processors don't even now, x86 is weird in that regard
23:16:23 <mad> I mean strictly ordered from the view of a single thread
23:17:01 <mad> Ie irl it's out-of-order but from the view of the instruction sequence, loads/stores happen in-order
23:17:59 <ais523> well, I think threads need to be /really/ cheap
23:18:19 <ais523> so that if you write "a = 1; b = 2" you can run those in separate threads to gain a little performance
23:18:25 <ais523> assuming a and b don't alias
23:18:39 <mad> hmm, that's interesting
23:18:46 <mad> how would you do it?
23:20:03 <mad> completely change how OS's schedule threads? (considering that right now, schedulers are basically hostile to short lived threads)
23:20:13 -!- Lilly_Goodman has quit (Ping timeout: 244 seconds).
23:20:28 <ais523> you'd need some lightweight method of specifying fork/join directly in the asm
23:20:34 <ais523> there are a few possibilities
23:20:58 <ais523> I believe the processor would schedule threads in hardware on a small scale, and ask the OS for help only when there were too many to fit on the processor
23:21:19 <ais523> swapping in and out entire processes if possible, and groups of threads if the processes didn't fit
23:21:29 <tswett> I was thinking about threads while I was doing that OS in Rust.
23:21:46 <mad> ais523 : hmmm
23:22:06 -!- Lilly_Goodman has joined.
23:23:00 <tswett> I had a thread-switching method (which I never tested) that was pretty simple.
23:23:07 <mad> ais523 : maybe you could have inactive cores be placed in a pool that can be instantly allocated by the currently running "most important process" (presumably, the process 'on front' in a windows-style scheduler that priorizes GUI programs)
23:23:27 <tswett> Push all registers. Change the stack pointer to something else. Pop all registers.
23:23:36 <mad> and if it has available cores in that pool, the "asm fork/join" is fast
23:24:00 <b_jonas> ais523: well, the cpu already *sort of* does that, as long as you're content with the threads using the same register set, it runs the threads in parallel only if there's no unpredicted branch or other difficult instruction in them, and on x86 the memory access instructions between those threads aren't reordered.
23:24:02 <tswett> Here's a thought. Make it so you can pretty much have an unlimited number of threads going at once.
23:24:24 <ais523> b_jonas: yes, x86 internal design is moving in the direction of trying to convert code into that form automatically via static analysis
23:24:38 <ais523> which is one of the reasons that x86es are so hellishly complicated
23:25:14 <mad> ais523 : that being said, if programs are going to expose parallelism through threading, there are already good designs oriented around that (current generation of SPARCs heavily bank on this)
23:25:19 -!- oerjan has joined.
23:25:31 <tswett> There's a thread queue. The processor repeatedly grabs the first 16 of those threads, executes a bit, and puts them all back on the queue.
23:25:56 <ais523> tswett: probably it should grab the first 16 runnable threads
23:25:58 <b_jonas> ais523: I imagine a cpu could have "hint" style thread fork and join instructions, which try to run a jump in a separate lightweight thread if it can, otherwise just run them one after the other. sort of like how the x86 transactional instructions are "hint" style: there's an easy mapping to trivial instructions the cpu can always fall back to in difficult cases.
23:26:01 <ais523> using some sort of method to determine runnability
23:26:11 <b_jonas> ais523: as in, these instructions would be jumps, not nops.
23:26:48 <tswett> I think it's weird how CPUs go to a humongous amount of effort to execute each instruction.
23:27:19 <b_jonas> although they'd have to be very careful about what happens to the registers
23:27:40 <mad> like, if you know your typical workload is going to have >10 threads, you can basically give up the current generation of CPUs, go towards something simple like an early ARM (in-order 1 or 2 instructions per cycle), add hyperthreading and lots of cores
23:28:13 <tswett> It seems like it would be better to move the complexity from the CPU into the compiler.
23:28:15 <mad> and then your main design problem becomes cache line coherency between 10's of cores
23:28:50 <b_jonas> ais523: "x86 internal design is moving in the direction of trying to convert code into that form automatically via static analysis" -- it's not really static analysis, it happens mostly dynamically a few instructions ahead I think. also, it's not only x86 that's doing that, but some other modern cpus like arm
23:29:11 <tswett> Like, maybe you could make it so that each CPU has its own instruction set, and there's just a small common core supported by the entire family.
23:30:02 <b_jonas> "It seems like it would be better to move the complexity from the CPU into the compiler." => that was the idea of ia64. it failed because business only wants a cpu that can run the software they write NOW faster, rather than a cpu that will run the software you develop 8 years in the future faster.
23:30:20 <mad> tswett : main problems with that is that it's hard for a compiler to guess which memory loads will land in L1 cache and which ones are going to land in L2 cache
23:30:21 <ais523> mad: this is why aliasing needs to be efficient too
23:30:29 <ais523> b_jonas: we've discussed this before in #esoteric
23:30:33 <b_jonas> (that's why x86 and arm are so bundled with historical compatibility.)
23:30:40 <ais523> other theories as to why it failed include "the concept was a good idea, but the actual implementation was insane"
23:30:51 * APic thought Itanium was the Approach with static Analysis.
23:30:59 <ais523> and "it was released before someone had produced a good compiler for it"
23:31:05 <b_jonas> ais523: I don't know, luckily I don't know much about ia64. it might have failed for other reasons too.
23:31:06 <mad> I don't think itanium failed because lack of x86 compatibility
23:31:19 <ais523> apparently, many compiler vendors put out a "minimum that works" compiler rather than one that did the analysis properly
23:31:35 <ais523> that was excessively cautious to the point of absurdity
23:31:36 <tswett> Then each CPU also has some machine-readable description of its instruction set (good luck with that) which compilers can use to produce something actually, like, fast and good.
23:32:02 <mad> what really killed itanium is that they could never get it to really be faster than x86
23:32:29 -!- lambda-11235 has joined.
23:32:39 <mad> except maybe for floating point but itanium was mainly used in servers so good floating point perf was useless in that setting
23:33:04 <ais523> floating point on servers isn't unheard of, but they tend to be pretty specialized servers
23:33:10 <ais523> often computation-as-a-service
23:33:26 <b_jonas> ais523: did ia64 have a cpu software architecture (that is, instruction set) that made sense now but would not have made sense 6 years later, like the delay slots in MIPS?
23:33:28 <mad> if you're going to run code that's not numerically heavy, then there are really only 2 designs
23:33:39 -!- Lilly_Goodman has quit (Ping timeout: 244 seconds).
23:33:44 <ais523> b_jonas: I don't think it made sense even at the time
23:34:02 <mad> (1) the load is threadable: SPARC (as many simple cores as possible on a chip)
23:34:03 <hppavilion[1]> ais523: Why not have a programming language with one instruction: Upload the following string to a server via HTTP and execute it in some minimal language
23:34:33 <hppavilion[1]> (No one bring up RSSB or SUBLEQ, as those aren't RISCs)
23:34:53 <ais523> hppavilion[1]: Last ReSort?
23:35:13 <mad> (2) the load is not threadable: humongously complex out-of-order cpu in the style of the Haswell and all PentiumPro descendents. This is what intel is good at, and what x86 is less disadvantaged at (basically, intel wins).
23:35:36 <myname> so that language is basically another language
23:35:38 <ais523> one instruction that takes no arguments, unknown TCness
23:35:44 <hppavilion[1]> I want to make a language that looks like an ASM, but has subtle high-level mathematical features
23:36:21 <mad> Itanium failed because it can't delay part of the instruction stream if one load falls into L2 instead of L1
23:36:31 <ais523> mad: well the situation nowadays is that most loads /are/ threadable but people don't thread them because it wouldn't gain on x86
23:36:54 <ais523> for example, in general, there's no reason why a compiler can't optimize all functions in parallel, but I'm not aware of any compiler that does
23:37:00 <mad> if they are threadable, they WOULD gain on x86 no?
23:37:08 <ais523> not by enough for people to care
23:37:37 <coppro> mad: when you say "delay part of the instruction stream" you mean to skip ahead to executing non-dependent instructions?
23:37:47 <mad> I think there are plenty of reasons why a compuiler can't optimize all functions in parallel
23:37:50 <ais523> (fwiw, Last ReSort's instruction is "p = (*p)++")
23:37:56 <mad> coppro : basically yes
23:38:12 <ais523> coppro: there are various ways to view the same thing, that's one way to explain it
23:38:28 <ais523> incidentally, this is also an operation that GPUs are good at
23:38:28 -!- Lilly_Goodman has joined.
23:38:41 <ais523> in GPU programming, reading/writing main memory is something you do explicitly, normally in a multithreaded way
23:38:48 <ais523> and the threads get suspended while they're waiting for the value to turn up
23:38:49 <mad> in a PentiumPro-descended cpu, each cycle it finds the earliest instructions in the instruction stream that are "ready to execute"
23:39:05 <ais523> (main GPU memory, that is; the alternative is block memory, which is basically your cache)
23:39:14 <ais523> (except it's managed explicitly)
23:39:22 <mad> if you have one load that unexpectedly falls in L2 or RAM or has a TLB miss then it keeps doing pretty much everything that doesn't depend on that load
23:39:22 <b_jonas> ais523: that's the good situation. the bad situation is when people care too much about threading, and prematurely implement all their small functions to use threads, when they will actually want to run so many of the whole high level processes at the same time anyway that just the non-idle high level processes alone are enough for as much threading as the hardware can do, and the low-level threading just makes everything slower.
23:39:40 <b_jonas> \ when they will actually want to run so many of the whole high level processes at the same time anyway that just the non-idle high level processes alone are enough for as much threading as the hardware can do, and the low-level threading just makes everything slower.
23:40:00 <ais523> b_jonas: well the extreme case is that you use reconfigurable hardware, and quickly throw up a hardware implementation of your low-level code that has all the forks as literal forking wires
23:40:08 <ais523> (this is basically what my day job is about)
23:40:32 <b_jonas> ais523: as in an FPGA array?
23:40:35 <mad> considering that chips have more and more dark silicon, a scenario similar to this will probably play out
23:40:47 <b_jonas> ais523: that's definitely not what _my_ dayjob is about
23:40:59 <ais523> mad: "dark silicon" = components that aren't being used for anything at that moment?
23:41:02 <b_jonas> I may use ordinary threading for my dayjob, when it's necessary, but no FPGA stuff
23:41:05 <mad> ARMs already have cheap in-order cores and expensive out-of-order cores on the same chip
23:41:15 <boily> meh. would've been nice.
23:41:19 <mad> ais523 : sections of the chip that are literally powered down
23:41:41 <mad> ais523 : because the chip can only output so much heat so it dynamically selects which parts to power down
23:42:04 <ais523> that's one way to deal with heat dissipation issues, I guess
23:42:53 <b_jonas> ais523: a specific case I met is ffmpeg automatically choosing to encode a video using about as many parallel threads as the machine has hardware threads, which was like 24 on a server, and I was running about 16 video encoders in parallel,
23:43:07 <mad> you could have a cpu with one complex out-of-order core, and tons of simple in-order cores
23:43:18 <mad> if your load is threaded it uses the in-order cores
23:43:23 <b_jonas> so not only did the threading now speed up the encoding, it also ran out of memory because using multiple threads in the encoder requires more memory.
23:43:23 <ais523> mad: that's basically whta a CPU+GPU combination is
23:43:39 <ais523> b_jonas: why not just run them in series?
23:43:52 <mad> ais523 : well, gpu is a different thing
23:44:05 <b_jonas> This was a silent bug on the workstation I tested, because that computer had only like 4 cpus, so it was unexpected on the server.
23:44:18 <b_jonas> ais523: the incoming data was generated in parallel
23:44:19 <mad> gpu is used for very different things than sparc-style "tons of in-order cores"
23:44:23 -!- nooga_ has quit (Read error: Connection reset by peer).
23:44:45 <ais523> anyway, I think FPGA implementations of C-like software typically have less heat output per transistor than CPU implementations
23:44:48 <b_jonas> Once I realized what was wrong, it's easy to solve: there's an option to explicitly tell the number of threads to use.
23:44:58 <ais523> because which parts of the chip are in use depend on the instruction pointer
23:45:03 <mad> GPUs work because they run very numerical code that does tons of floating point multiplications
23:45:29 <b_jonas> ais523: sure, but such implementations are more difficult to create
23:45:30 <mad> and also GPUs work because the memory writing patterns are known beforehand
23:45:48 -!- Lilly_Goodman has quit (Excess Flood).
23:46:18 <mad> ais523 : oh? I've never seen stuff like that actually
23:46:24 -!- Lilly_Goodman has joined.
23:46:33 <oerjan> <b_jonas> \ when they will [...] <-- none of that actually got cut off in the first place hth
23:47:31 <b_jonas> oerjan: I can't count bytes together with irc headers in my head then
23:47:32 -!- Lilly_Goodman has quit (Excess Flood).
23:48:06 -!- Lilly_Goodman has joined.
23:49:50 -!- nooga has joined.
23:51:25 <mad> I think that if you designed a cpu for running standard single-threaded C++ code, it would probably be very similar to a MIPS even now
23:51:50 -!- digitalcold has quit (Quit: Reconnecting).
23:51:57 -!- digitalcold has joined.
23:52:54 <b_jonas> mad: that was backwards. cpus were like MIPS when C was born, and C was designed to be easy to compile so originally C contained only such operations as builtins that the cpu can do easily.
23:53:29 <mad> possibly with some concessions to either CISC (ie something like an AMD Athlon but without the x86 encoding insanity), or some concessions to VLIW, or concessions to both (ARM is basically a mix of all 3 philosophies)
23:54:26 -!- p34k has quit.
23:54:28 <b_jonas> (That's before C gained support to copy struct values.)
23:55:14 <mad> b_jonas : cpus were more like x86 when C was born no?
23:55:23 <mad> rather than mips
23:55:43 <b_jonas> mad: same thing at that level. consider the 8086, not the modern x86.
23:56:54 <mad> dunno, I think the 8086 has lots of weird stuff that doesn't translate well to C
23:56:59 <mad> like segment registers
23:57:22 <mad> multiple aliases of the same register with different sizes (AL, AH, AX, later EAX)
23:57:31 <mad> weird instructions like XLAT
23:57:41 <mad> string manipulation instructions
23:59:19 <mad> if you look at other architectures of the time, they're even less C-like
23:59:26 <mad> like the 6502 or the z80
23:59:39 <mad> if C was made for those, it would have a zero page
23:59:44 <b_jonas> mad: but those cpus aren't what C was ran on