code logs -> 2017 -> Thu, 09 Feb 2017< code.20170208.log - code.20170210.log >
--- Log opened Thu Feb 09 00:00:39 2017
00:45 LadyOfLight` [catalyst@Nightstar-o0v30k.dab.02.net] has joined #code
00:45 LadyOfLight [catalyst@Nightstar-bt5k4h.81.in-addr.arpa] has quit [[NS] Quit: Leaving]
00:49 Derakon[AFK] is now known as Derakon
00:52 LadyOfLight` is now known as LadyOfLight
01:03 AverageJoe [evil1@Nightstar-lc3.hbj.189.210.IP] has joined #code
01:34 * ToxicFrog gets sucked into writing install scripts for Oblivion mods
01:36 AverageJoe [evil1@Nightstar-lc3.hbj.189.210.IP] has quit [Operation timed out]
01:37
<&ToxicFrog>
things I had not previously seen: languages with case sensitive mixed case keywords and extremely permissive parsers
01:37
<&ToxicFrog>
So, for example, this is valid: If <condition> Return EndIf <all the rest of your code>
01:37
<&ToxicFrog>
And this is also valid, but will never run your code: If <condition> Return Endif <all the rest of your code>
01:38
<&ToxicFrog>
Because if the condition is true, it returns, and if the condition is false, it reaches end-of-file looking for an EndIf (note case) and, not finding one, goes "oh, I guess that's the end then" and proceeds as if the script had exited normally.
01:39
<~Vornicus>
Um.
01:39
<&ToxicFrog>
I would bet cash money that this is a bespoke language the Wrye Bash author hacked together in an afternoon
01:42
<&ToxicFrog>
Anyways. Got the install script for the MB addons/patches working, that's probably enough hacking on it for one night.
01:43
<&ToxicFrog>
(my goal here is to make it easy -- or at least, less hard -- to install Morroblivion)
01:44 Alek [Alek@Nightstar-cltq0r.il.comcast.net] has quit [Connection closed]
01:48 AverageJoe [evil1@Nightstar-lc3.hbj.189.210.IP] has joined #code
01:49 Alek [Alek@Nightstar-cltq0r.il.comcast.net] has joined #code
01:49 mode/#code [+o Alek] by ChanServ
02:11 AverageJoe [evil1@Nightstar-lc3.hbj.189.210.IP] has quit [Ping timeout: 121 seconds]
02:49
<&[R]>
I don't get why you wouldn't just use LUA or something else already written now-a-days.
02:56 AverageJoe [evil1@Nightstar-lc3.hbj.189.210.IP] has joined #code
03:51 AverageJoe [evil1@Nightstar-lc3.hbj.189.210.IP] has quit [[NS] Quit: Leaving]
05:05 Derakon is now known as Derakon[AFK]
06:02 LadyOfLight` [catalyst@Nightstar-je4.159.132.82.IP] has joined #code
06:05 LadyOfLight [catalyst@Nightstar-o0v30k.dab.02.net] has quit [Ping timeout: 121 seconds]
06:14
<@macdjord|slep>
ToxicFrog: .... AHHHHHHHHHHHHHHHHHHHHHH!
07:13 celticminstrel is now known as celmin-of-nod
07:20 Kindamoody[zZz] is now known as Kindamoody
07:34 LadyOfLight` is now known as LadyOfLight
08:15 himi-cat [sjjf@Nightstar-v37cpe.internode.on.net] has quit [Ping timeout: 121 seconds]
08:22 Kindamoody is now known as Kindamoody|afk
08:32 himi [sjjf@Nightstar-v37cpe.internode.on.net] has joined #code
08:32 mode/#code [+o himi] by ChanServ
08:38 LadyOfLight` [catalyst@Nightstar-je4.159.132.82.IP] has joined #code
08:38 LadyOfLight [catalyst@Nightstar-je4.159.132.82.IP] has quit [The TLS connection was non-properly terminated.]
08:39 LadyOfLight` is now known as LadyOfLight
08:46 ion [Owner@Nightstar-6grqph.vs.shawcable.net] has quit [Ping timeout: 121 seconds]
08:49 ion [Owner@Nightstar-6grqph.vs.shawcable.net] has joined #code
08:49 mode/#code [+o ion] by ChanServ
09:13 ion [Owner@Nightstar-6grqph.vs.shawcable.net] has quit [Ping timeout: 121 seconds]
09:16 ion [Owner@Nightstar-6grqph.vs.shawcable.net] has joined #code
09:16 mode/#code [+o ion] by ChanServ
09:39 ion [Owner@Nightstar-6grqph.vs.shawcable.net] has quit [Ping timeout: 121 seconds]
09:41 ion [Owner@Nightstar-6grqph.vs.shawcable.net] has joined #code
09:41 mode/#code [+o ion] by ChanServ
09:52 himi [sjjf@Nightstar-v37cpe.internode.on.net] has quit [Ping timeout: 121 seconds]
09:53 himi [sjjf@Nightstar-v37cpe.internode.on.net] has joined #code
09:53 mode/#code [+o himi] by ChanServ
10:35 Vornicus [Vorn@ServerAdministrator.Nightstar.Net] has quit [Operation timed out]
12:32 LadyOfLight` [catalyst@Nightstar-tra4ap.dab.02.net] has joined #code
12:35 LadyOfLight [catalyst@Nightstar-je4.159.132.82.IP] has quit [Ping timeout: 121 seconds]
12:48 LadyOfLight` is now known as LadyOfLight
13:11 himi [sjjf@Nightstar-v37cpe.internode.on.net] has quit [Ping timeout: 121 seconds]
13:46 Alek [Alek@Nightstar-cltq0r.il.comcast.net] has quit [Ping timeout: 121 seconds]
13:50 Alek [Alek@Nightstar-cltq0r.il.comcast.net] has joined #code
13:50 mode/#code [+o Alek] by ChanServ
15:38 macdjord|slep is now known as macdjord|wurk
17:43
< LadyOfLight>
...I am coding C++ in a Reduct-ive style now
17:43
< LadyOfLight>
Hm
17:44
< LadyOfLight>
Oh shit I should go get ready for soccer
17:46
< LadyOfLight>
Also so far as I can tell, it is similar to idiomatic python
17:49 celmin-of-nod is now known as celticminstrel
18:23 Vornicus [Vorn@ServerAdministrator.Nightstar.Net] has joined #code
18:23 mode/#code [+qo Vornicus Vornicus] by ChanServ
19:03 LadyOfLight` [catalyst@Nightstar-c96k85.dab.02.net] has joined #code
19:05 LadyOfLight [catalyst@Nightstar-tra4ap.dab.02.net] has quit [Ping timeout: 121 seconds]
19:32
<&McMartin>
https://github.com/ksimka/go-is-not-good
19:32
<&McMartin>
Some of these are pettier than others
19:45
< LadyOfLight`>
IMO Go has a neat implementation of concurrency primitives and seems alright as a server scripting language
19:45
<&McMartin>
"High-performance reference implementations of experimental network protocol servers" does seem to be the niche it excels at the most
19:46
< LadyOfLight`>
But I wouldn't describe it as revolutionary (and to be fair neither do they)
19:46
<&McMartin>
Yeah, the issue I have on that isn't so much "not revolutionary" and more...
19:46
<&McMartin>
... well, like someone had woken up from a 45-year coma and decided to make a modern programming language after attending a one-hour seminar on What They Missed In Language Design
19:48
< LadyOfLight`>
That's largely because rpike can't let Plan 9 go x)
19:49
<&McMartin>
I do note a category of objection here is "pseudointellectual arrogance of Rob Pike and everything he stands for"
20:07 LadyOfLight [catalyst@Nightstar-c96k85.dab.02.net] has joined #code
20:07 LadyOfLight` [catalyst@Nightstar-c96k85.dab.02.net] has quit [The TLS connection was non-properly terminated.]
20:20 LadyOfLight` [catalyst@Nightstar-bt5k4h.81.in-addr.arpa] has joined #code
20:24
<@Namegduf>
Would there be a way for someone to approach the idea of trying a different direction of development diverging from an earlier point to the one most languages took which wouldn't appear arrogant to you, or is the general idea of trying an alternative path unacceptable?
20:27 * Namegduf can pretty well get why someone might think PHP, Python, and Ruby's gains to productivity might be better attempted in other ways, and isn't fond of the idea that the only reason anyone could have for trying that would be ignorance, especially since it pretty clearly wasn't actually literal ignorance.
20:29
<@Namegduf>
I don't like what seems to be a lot of hostility to experimentation by people who have always been fastidiously polite
20:30
<&jerith>
Namegduf: Very few people are objecting to experimentation or alternative paths.
20:30
<@Namegduf>
McMartin appears to be one of those people
20:30
<@Namegduf>
Unless there is some way they could have accomplished their experimentation that wouldn't have been arrogant and offensive
20:31
<&jerith>
Most of the serious, well reasoned objections to Go are based on things that we have already learned are not very good ideas.
20:32
<@Namegduf>
To be honest I've never seen any of those serious well reasoned objections be any better than "no metaprogramming lol", and I think accusing someone who disagrees with reasoning on that level of being arrogant for disagreeing is a bit uncalled for.
20:32
<@Namegduf>
They've not gone on long tirades about how everyone else is stupid.
20:32
<&jerith>
There's a very big difference between taking an alternative path and taking a path that we have been down before and decided to turn away from.
20:33
<~Vornicus>
Which is to say that the problem with Go isn' that it's different per se, but that it's different in ways that people who actually study language design know are bad plans
20:33
<@Namegduf>
I don't think you can plausibly argue that Go was not developed by people who actually study language design.
20:33
<&jerith>
Take, for example, the lack of proper generics in the type system.
20:34
<@Namegduf>
I've also not seen anywhere near this kind of hostility directed at people who clearly /do/ actually ignore all taste and good sense, like e.g. the PHP devs.
20:34
<&jerith>
It makes it *impossible* to safely write a whole category of functions.
20:35
<@Namegduf>
They disagree as to the importance of that. Is that intolerably arrogant such that anyone making a language with those traits should be accused of psuedointellectual arrogance for that alone?
20:36
<@Namegduf>
I mean, languages /without type safety at all/ don't get that treatment, and they can't safely write /any/ functions (by that standard of safety)
20:36
<&jerith>
Implicit signature-based interfaces are an horrendous idea, as demonstrated by some awful APIs in the standard library.
20:37
<&jerith>
Namegduf: Languages without type safety are all are typically languages that have been around for decades.
20:37
<@Namegduf>
Ruby?
20:37
<@Namegduf>
Python?
20:37
<&jerith>
Those are dynamically typed, which is a completely different thing.
20:37
<~Vornicus>
(python has, for the record, been around since 1993, which is just short of 2.5 decades)
20:38
<@Namegduf>
They still can't safely write those same functions (or any others).
20:38
<@TheWatcher>
(and Ruby since 95)
20:38
<&jerith>
If I want to write a map() function in Go, I either have to write it for a specific type or I have to perform unsafe casts that the compiler warns me about.
20:39
<@Namegduf>
Untrue; the compiler warns about nothing.
20:39
<&jerith>
Namegduf: Counter-untrue, unless that has changed in the several months since I attempted to do this very thing.
20:40
<&jerith>
It wasn't *quite* as trivial a function as map(), but it was in that ballpark.
20:40
<@Namegduf>
Go has no compiler warnings *at all*
20:40
<@Namegduf>
It was a philosophical choice they made.
20:40
<@Namegduf>
It either errors or builds.
20:40
<@Namegduf>
Because people ignore warnings.
20:41
<@Namegduf>
This is a popular point of complaint, actually; https://golang.org/doc/faq#unused_variables_and_imports
20:44
<&jerith>
Maybe it was a linter that complained, then.
20:44
<@Namegduf>
Could be.
20:45
<&jerith>
Either way, I had to write code that static analysis cannot prove to be safe.
20:45
<@Namegduf>
Sure.
20:46
<&jerith>
https://golang.org/pkg/os/#Signal
20:46
<@Namegduf>
But I'm pretty sure there is not actually a superconsensus amongst all People Who Know Anything About Language Design that one should never ever have to write code that cannot be proven correct by static analysis such that anyone who dared profane that order is clearly an arrogant fool.
20:47
<@Namegduf>
Otherwise no one would be using dynamically typed languages, let alone /developing/ them.
20:47
<&jerith>
Namegduf: That's very much not the point.
20:47
<&jerith>
The point is that the static type system doesn't actually do the job a static type system should do.
20:48
<@Namegduf>
Not under all circumstances, no.
20:48
<&jerith>
And that's okay in a language from the 80s when compiling was expensive.
20:48
<@Namegduf>
Frankly I'd trade that for the non-nilable strings; I think you'd come out on top in terms of correctness for that alone.
20:48
<&jerith>
But we've had type systems that can provide those guarantees for *decades*.
20:48
<@Namegduf>
Because that's a way more common problem in e.g. Java.
20:48
<&jerith>
Ah, nil.
20:49
<@Namegduf>
Someone forgetting a null check.
20:49
<&jerith>
Another thing that a proper type system can get rid of.
20:49
<&jerith>
Rust is a great example of a language that plays in the same space as Go and Does This Right.
20:50
<@Namegduf>
Well, it will once it's finished.
20:50
<@Namegduf>
Right now it doesn't have access to epoll, apparently.
20:50
<&jerith>
It's finished enough to write useful software in.
20:50
<@Namegduf>
So you don't exactly want to be writing servers in it.
20:50
<&jerith>
It's still growing libraries.
20:52
<@Namegduf>
Rust only got as solidified as it is- which isn't very- much, much after Go. I don't think they're incredibly arrogant for lacking the ability to time travel, and I wouldn't think they were incredibly arrogant for trying to make a simple to grok language as an alternative approach even if Rust had been around at the time.
20:52
<&jerith>
But either way, parametric polymorphism has been around for over 30 years.
20:53
<@Namegduf>
Sure. They were unhappy with available forms of it, having seen how badly C++ templates turned out in practice. I think that's something that can reasonably be disagreed with and even be reasonably thought stupid, but "psuedointellectual arrogance", really?
20:54
<@Namegduf>
When the competing languages at the time it was developed were mostly "kitchen sink of features" dynamically typed messes?
20:54
<@Namegduf>
(And Java)
20:54
< LadyOfLight`>
(Which is just a mess~)
20:54
<&jerith>
C++ templates are very much not parametric polymorphism.
20:55
<@Namegduf>
Specifically, they were unhappy with expansion at compile time, and the versions which didn't require that had other tradeoffs they were unhappy with.
20:55
<&jerith>
You can make nulls go away just by introducing an option type.
20:56
<&ToxicFrog>
"I've also not seen anywhere near this kind of hostility directed at people who clearly /do/ actually ignore all taste and good sense, like e.g. the PHP devs."
20:56
<@Namegduf>
Is every other language developer who failed to eliminate null a psuedointellectual arrogant person?
20:56
<&ToxicFrog>
(a) you haven't been paying attention, then
20:57
<&ToxicFrog>
and (b) at this point, no-one expects the PHP devs to know any better; people hold Rob Pike to a higher standard
20:58
<&ToxicFrog>
Namegduf: what other high-profile languages released in the past decade and claiming to be The Solution To C++ did?
20:58
<@Namegduf>
To be honest it looks more like "A person in low standing disagreeing isn't a problem, a person in high standing disagreeing that language feature X is important needs to be loudly knocked down for it"
20:58
<&ToxicFrog>
I've used Go at work a bunch, and honestly McM's description of it as "like someone had woken up from a 45-year coma and decided to make a modern programming language after attending a one-hour seminar on What They Missed In Language Design" rings pretty true to me
20:59
<@Namegduf>
I don't remember seeing "The Solution To C++" anywhere. If anything it was aiming to be the solution to Java, but it didn't arrogantly proclaim that, either. I think it's questionable when people need to make up quotes to justify their position.
20:59
<&ToxicFrog>
Go was explicitly intended to replace the use of C++ and Java in google production.
21:00
<&ToxicFrog>
It has done neither, but it has ushered in a new clusterfuck of language noninteroperability by being hard to call C++ from and impossible to call into from C++.
21:01
<&ToxicFrog>
(my team needs to interoperate with another team that does as much as they can get away with in Go, while we are responsible for a huge legacy C++ codebase. This is extremely painful.)
21:01
<&ToxicFrog>
(also, their Go code has reams and reams of repeated boilerplate made necessary by the lack of generics)
21:02
<&ToxicFrog>
Like, would I rather use Go than C++ or Java? Absolutely. Would I rather use a mix of Go, C++, and/or Java rather than any one of those languages individually? No. Would I rather use Go than Clojure, Rust, Scala, or Haskell? Hell no.
21:02
<@Namegduf>
Mixes are painful, yes.
21:03
<@Namegduf>
Rust isn't really viable for most of what Go is used for I think, because of its unsuitability yet for network servers.
21:03
<&ToxicFrog>
(do I actually find programming in any of those three languages enjoyable? no)
21:05
<@Namegduf>
Unless that came along very recently.
21:05 Kindamoody|afk is now known as Kindamoody
21:06
<&McMartin>
Rust and Go are not directly competing, becuase Go has an interrupting GC and Rust does not
21:06
<&McMartin>
That's just a design decision
21:06
<&McMartin>
But Go's polymorphism can be summarized as "OO is bollocks, let's throw it out and then reimplement half of it poorly"
21:06
<&ToxicFrog>
Sadly most of the Go code I need to work on is not servers but stand-alone tools used to take the protobufs from one place and put them in another place
21:07
<&McMartin>
This offends the people that know only OOP, but even if you don't, Go ripped out OOP from its design and then didn't fill the hole with something good enough to do the same tricks.
21:07
<&McMartin>
Then there's the automatic-semicolons thing, which is sufficiently awful that yes, they're getting more flak than PHP devs
21:07
<&McMartin>
Because when Pike and Kernighan design the language they are expected to know better than that
21:08 Reiv [NSwebIRC@Nightstar-ih0uis.global-gateway.net.nz] has quit [Ping timeout: 121 seconds]
21:08
<@Namegduf>
The other thing is that compared to pretty much all these languages it was taking a shot at minimalism-without-needing-you-to-build-a-not-actually-minimal-DSL-on-it, and I think that kind of inherently involves throwing out and being reluctant to readd a lot of conventional features, and I don't like the idea that attempting to do that is apparently to be shunned.
21:08
<@Namegduf>
Because Everyone Knows you need a 100 page laundry list of OO semantics.
21:08
<&McMartin>
You don't
21:09
<&McMartin>
I can do things in non-OO languages that are OO-y and I could do them without tripping as much as I did in Go
21:09
<&McMartin>
Becuase the way interface implementation works is kind of wonky and interacts with its type inference in an awkward way
21:09
<@Namegduf>
Even if Go was a /bad/ attempt at that idea, I'd like people to make a better one
21:09
<@Namegduf>
Which isn't really compatible with the fundamental idea of trying it to be deemed heretical
21:10
<&McMartin>
The problem with Go is not that it is *heretical*
21:10
<&McMartin>
It sounds like you missed the actual point of my intended metaphor
21:10
<&McMartin>
Which is that you take some people who were last *really* up on things many years ago
21:10
<&McMartin>
And then the world evolved in ways distasteful to them
21:11
<@Namegduf>
With Java and dynamic languages dominating, I think that was understandable
21:11
<&McMartin>
And with two exceptions, one of which is *very important*, the things that Go has that C doesn't feel... half-hearted
21:11
<&McMartin>
They threw out exceptions, but then they didn't *actually* throw out exceptions
21:11
<&McMartin>
They made it easier to return an error code but then they made it just as easy to disastrously ignore it
21:12
<&McMartin>
(The two exceptions are low-level access to coroutines, which is why it excels where it *does* excel, and the channel abstraction for cross-"thread" communication, which is A Very Big Deal)
21:13
<&McMartin>
Rust also tried to not have exceptions and found that they had to have exceptions after all, but they could minimize their use
21:13
<&McMartin>
Rust also did error codes The Correct Way
21:14
<@Namegduf>
Rust is a bit of a PITA to do anything with, though, as one of its tradeoffs
21:15
<@Namegduf>
I hear they've made it /less/ horribly verbose since last I looked
21:15
<&McMartin>
The last anti-Rust rant I heard was actually anti-Builder-Pattern
21:15
<&McMartin>
Rust being a PITA to do anything with is actually sold as a feature~
21:16
<&ToxicFrog>
I find that with Rust I spend more time arguing with the compiler but still less time programming overall, because I spend less time arguing with the *language* and have to write less boilerplate
21:16
<@Namegduf>
I'm not anti-Rust, I find "complicated and admittedly painful to setup type safety that enforces correctness" to be an interesting approach
21:17
<@Namegduf>
I just don't see the hostility to people who tried a simpler approach and especially the attitude that doing anything less than exactly what Rust did, all features and complexity included, made them obvious idiots
21:17
<&ToxicFrog>
McMartin: in re channels, I agree that they're important but I'm not sure that the fact that Go specifically has them is as much of A Big Deal as you make it sound, since they've been around as a language feature elsewhere for at least 30 years (and around as C/++ libraries on top of other threading models for at least 20)
21:18
<&jerith>
I haven't done very much Rust yet, but I haven't had to fight the type system at all.
21:18
<&McMartin>
OK, so, in case this isn't clear, my objections to Go aren't "it doesn't include the features of my favored paradigms" and more "What did you do this like that, you know better than that"
21:18 * ToxicFrog departs for hair adjustment and cricket acquisition
21:18
<&McMartin>
jerith: You can't implement at trait on Vec<T> yet, which is pretty devastating
21:19
<&McMartin>
ToxicFrog: It's important because it locked people in so people actually frickin' used it
21:19
<&jerith>
I *have* had some arguments with the borrow checker, but that's something a GC language wouldn't need.
21:20
<&McMartin>
When I lest stepped away from Rust I was trying to make myself understood to the macro system, and that didn't end well
21:21
<&McMartin>
But I wasn't familiar enough with the system to be confident that the problem wasn't with me, or with macros generally
21:34
<&jerith>
Is Rust's lifetime and ownership stuff a genuinely novel language feature?
21:34
<&jerith>
Or has some other language already done that?
21:35
<&McMartin>
Compilers for other languages included those notions by trying to infer it
21:35
<&McMartin>
Which was always a bit frought
21:35
<&McMartin>
One of Rust's immediate inspirations was the C dialect Cyclone, which I believe included the lifetime stuff
21:36
<&McMartin>
Ownership has been a memory management discipline in C and C++ for as long as I've been a formally trained programmer at the very least
21:36 himi [sjjf@Nightstar-v37cpe.internode.on.net] has joined #code
21:36 mode/#code [+o himi] by ChanServ
21:36
<&McMartin>
I've always liked the formal definition of "ownership", too
21:36
<&McMartin>
A owns B if A destroys B in every possible run of the program.
21:36
<&McMartin>
pwn3d
21:37
<&jerith>
By "memory management discipline", do you mean "something the programmer has to manage by hand"?
21:37
<&McMartin>
Correct
21:37
<&McMartin>
You would do this instead of implementing your own reference counter
21:37
<&McMartin>
(Which would then need to call lock/unlock or retain/release or whatever by hand, aka The Traditional ObjC approach)
21:39
<&jerith>
I think this makes it the first actually novel language feature I've seen in any language I've actually written code in.
21:39
<&jerith>
(Unless there are others that I don't notice because they're so derivative of everything that came after them.)
21:39
<&McMartin>
Heh
21:39
<&McMartin>
Well
21:40
<&McMartin>
It's a generalization of a C++ idiom involving constructor and destructor order
21:40
<&McMartin>
Where you enforce lifetimes via inclusion as a field or declaration on a stack
21:43
<&McMartin>
There are some places where Rust does the "half-hearted" thing, but those are messy enough that I'm not sure how much of it is because of implementation assumptions baked into the more general cases
21:44
<&McMartin>
The thing that Rust has that I've seen nowhere else is "move semantics everywhere by default"
21:46
<&jerith>
It's also the first primarily imperative language I've seen with immutable-by-default.
21:47
< LadyOfLight`>
Rust is a language that I would characterise as 'C++ but with the correct defaults'
21:47
<&McMartin>
I have come around to that view
21:47
< LadyOfLight`>
McMartin: I've started writing C++ with move semantics by default
21:47
<&McMartin>
I first learned Rust when my experience with C++ was all of the C++98 variety
21:47
< LadyOfLight`>
I wrote a number of classes yesterday that just casually took vector<Thing>&& in their constructors
21:47
<&McMartin>
So my experience with idiomatic C++11 was "oh, now it is Rust, but the training wheels are off"
21:48 * LadyOfLight` nods
21:48
<&McMartin>
There are a few other things. Rust doesn't have "true" objects, and it's noticed that that's a problem
21:48
<&McMartin>
(It turns out that variadic types are only a complete replacement for single inheritance in proofs of equivalence~)
21:48
< LadyOfLight`>
I like Rust, but I worry that a) it's still the wrong fundamental approach and b) it's not better enough than C++ (though it is certainly better at that than D)
21:49
<&McMartin>
I would consider Rust to have fully succeeded if it ends up as well-established as, oh, Erlang
21:49
<&McMartin>
Which is a taller order than it might sound, but also where I'd be surprised if it gets further than that
21:50
<&jerith>
LadyOfLight`: I'm curious about your (a).
21:50
<&McMartin>
jerith: If you aren't counting Wacky Academic Languages, JavaScript should meet your requirement~
21:50
< LadyOfLight`>
jerith: that will takea while :)
21:51
<&McMartin>
Actually, jerith is one of the people I should also ask this: are there any published studies of OCaml development in the large?
21:51
<&McMartin>
(As in, we had this great big problem, so here's how we decomposed it)
21:52
<&jerith>
McMartin: Does Jane Street Capital count?
21:52
<&jerith>
They've given a bunch of talks about things.
21:52
<&McMartin>
Possibly
21:52
<&McMartin>
I'm looking for something like "OK, you've got struct and functor. Here's how we broke down a non-toy problem into those"
21:53
<&jerith>
https://www.youtube.com/watch?v=G6a5G5i4gQU seems to be what you're after.
21:53
<&McMartin>
Thank you, filed
21:53
<&McMartin>
Lunch is wrapping up, I'll watch it after work
21:55
<&jerith>
I recall it being more focused on design and such than practical implementation, but they did implement the thing several times before they got it right.
21:57
<&jerith>
Yaron Minsky's talks often have a general theme of "OCaml is a very flexible language, don't ignore bits of it because they're not 'functional' enough".
21:58
<&jerith>
With an occasional "except the object system, even the guy who designed it doesn't use it".
22:05
<&McMartin>
Heh
22:05 * McMartin pulls down that one and also the one labeled "Effective ML"
22:06
<&McMartin>
This Incr type looks a hell of a lot like Monad
22:13
<&McMartin>
Ah, 15 minutes in he points that out, OK~
22:28
<&McMartin>
"So that seems a little bad, until you think about it and realize that it's *horrifically* bad"
22:36
<&McMartin>
"bind-infested code"
22:36
<&McMartin>
This isn't what I was looking for, but it *is* fun.
22:52 * Vornicus discovers that there are 15 different symmetries for a black & white square
22:54
<&McMartin>
Heh. the rant here about closures is basically "encapsulation is bad"
22:54 * Vornicus sets about drawing them nicely, for future reference
22:55 * Vornicus needs to pull the basketball stuff into a different blog or something. wonders how easy that is.
22:55
<&McMartin>
???
22:57
<~Vornicus>
I have a blog, which is currently used exclusively for NCAA basketball bracket tournament announcements
22:58
<~Vornicus>
But now I have a lovely piece of analysis and I don't really feel like putting the tournament stuff "out in the world" next to the programming stuff
22:59
<~Vornicus>
As for the more directly on topic thing
23:00
<~Vornicus>
Consider a black & white square, that you can rotate, reflect about the midline, and swap colors on
23:01
<&McMartin>
Aha, OK
23:01
<&McMartin>
You're classifying kinds of possible symmetries any b&w square could have
23:03
<~Vornicus>
Of which there are 15 types.
23:03
<&McMartin>
I had first parsed this as "A-HA, I have constructed a B&W square that has 15 different kinds of symmetry"
23:05
<~Vornicus>
which is a little different
23:05
<~Vornicus>
derp, correction, 14 types. :(
23:34
<&ToxicFrog>
&McMartin | ToxicFrog: It's important because it locked people in so people actually frickin' used it -- possibly my concurrency experience is atypical, then, because both in school and in industry it was very heavy on CSP-style channel usage and not so much about shared memory and locking
23:35
<&McMartin>
Yeah, I spent a soul-crushing amount of time in the semaphore mines
23:35
<&McMartin>
(Which is actually any amount more than three months)
23:37
<&ToxicFrog>
Yeah, my experience with shared-memory concurrency was basically one course in second year
23:37
<&ToxicFrog>
And everything else was either Erlang, MPI/Pilot (C, but you use channels because you have no guarantee your workers are all in the same process or even on the same machine)
23:38
<&ToxicFrog>
CacheOS (C++ with no memory protection, and you use channels because to do otherwise invites horrifying madness, and also it turns out that when you're writing the entire OS from scratch you can make them very, very fast)
23:38
<&McMartin>
For me, it's UQM (which used SDL_thread, which was a very thin wrapper around pthreads or something equivalent) and C++98 with acceptable libraries (built around mutexes)
23:39
<&ToxicFrog>
Bash might count, since any highly concurrent bash script is probably using pipes all over the place
23:39
<&McMartin>
I'm still kind of in that state even now, but since this code is architected in a "series of asynchrous tasks" kind of style, I can often ensure that important bits of memory are never shared
23:40
<&ToxicFrog>
Or IMAP5, where you're programming in asm or a custom C subset and you're still using channels because that's how the chip hardware is actually laid out
23:41
<&ToxicFrog>
And that's basically all of high school and university there, and now that I'm at Google it's either goroutines or C++ concurrency libraries that look an awful lot like processes communicating over typed channels.
23:41
<&McMartin>
Which is good times, yes.
23:41
<&ToxicFrog>
So my exposure to pthreads was basically "this is kind of cool but it's clearly not something anyone uses in production these days"
23:41
<&McMartin>
Yeah, not so much. :/
23:42
<&ToxicFrog>
And then implementing a toy CSP library for Lua on top of pthreads, where each thread gets its own isolated lua VM.
23:42
<&ToxicFrog>
Which was actually a lot of fun.
23:42
<&McMartin>
Yeah
23:42
<&ToxicFrog>
(I believe I called it Surtr, for reasons which I no longer remember)
23:42
<&McMartin>
AFAICT all of these things are ultimately built on top of pthreads
23:44
<&McMartin>
The entire Java and ObjC multithreading systems are built around recursive mutexes
23:44
<&ToxicFrog>
C++ producers probably are, MPI definitely is, Pilot is built on top of MPI
23:44
<&ToxicFrog>
CacheOS definitely was not because we built the entire OS from the ground up and it wasn't even libc89 compliant, let alone POSIX
23:44
<&McMartin>
heh heh
23:45
<&McMartin>
Yes, that does not count.
23:45
<&ToxicFrog>
And bash is fork/exec :P
23:45
<&ToxicFrog>
(and IMAP5 was an embedded system)
23:45
<&McMartin>
bash is not shared-memory multiprogramming, IIRC
23:46
<&McMartin>
Except as a possible implementation detail (memory being copy-on-write and never written)
23:46
<&ToxicFrog>
(I guess the caches were technically "embedded systems" as well but when it's amd64 architecture and has more beef than my gaming rig it doesn't really feel like it)
23:46
<&ToxicFrog>
It's not, no, but as mentioned earlier highly concurrent bash scripts using pipes for communication end up looking pretty CSPish.
23:46
<&ToxicFrog>
(whether doing this in bash is at all advisable is a different question)
23:46
<&McMartin>
Heh
23:46
<&McMartin>
Yeah, I think my thesis here is that CSP code I'm familiar with is rather pointed about not obviously sharing memory
23:47
<&McMartin>
And, well
23:47
<&McMartin>
A lot of my retrocoding is interrupt-driven
23:47
<&McMartin>
That's not awesome but it turns out that it's easier to reason about than threading/mutexes
23:47
<&McMartin>
Anyway, yeah
23:48
<&McMartin>
I have basically never in my career gotten to use CSPs beyond toy problems
23:48
<&McMartin>
This has a great deal to do with what my software has had to work with
23:49
<&ToxicFrog>
Right, whereas I have never really done retrocoding
23:50
<&ToxicFrog>
And even my embedded system experience was on a funky architecture where the concurrency primitives were "activate a core and run this function on it", "send a message to a core" and "wait for a message from another core"
23:50
<&McMartin>
Right, but, well, 1998 isn't that retro~
23:50
<&ToxicFrog>
And the cores had total memory isolation from each other
23:50
<&McMartin>
But there was a lot of "OK, create a thread pool to do work on" -> "schedule work to run on those threads"
23:50
<&McMartin>
Which is the default mechanism for pretty much everything in desktop and mobile GUI applications
23:50
<&ToxicFrog>
So even my embedded work ends up being message-passing rather than shared-memory.
23:51
<&McMartin>
And then there's "Hi, you're interfering with Windows NT or something POSIX-compliant and need to handle other people running code that uses pthreads"
23:51
<&McMartin>
Well, so, the first thing you do when you have to work with threads and shared memory is share some memory for use as your message queue~
23:52
<&McMartin>
That's where which retro you are gets wacky
23:52
<&McMartin>
If you don't have long-running background tasks, your Desktop GUI application (or your iOS application; I'm not sure about Android) is single-threaded.
23:53
<&ToxicFrog>
I did use pthreads in school, I know the basics :P
23:53
<&McMartin>
Well, so
23:53
<&McMartin>
People *do* do things like have effectively global data structures that *aren't* message queues and then control access to them with locks
23:53
<&McMartin>
This is pretty common for, like, Java collection classes
23:54
<&McMartin>
And it's something of a tragedy when you have to
23:56
<&McMartin>
UQM's thread structure basically smashes everything into three threads
23:56
<&McMartin>
There's the one that reads input and renders graphics
23:56
<&McMartin>
There's one that does OGG and MOD decoding
23:56
<&McMartin>
And then there's "everything else"
23:56
<&ToxicFrog>
Why are input and graphics in the same thread?
23:57
<&McMartin>
Because that's how X11, Windows, and macOS all work, more or less
23:57
<&McMartin>
All of them use a single event queue for "the user pressed/released a key" and "you need to redraw this window"
23:57
<&McMartin>
In macOS specifically, event processing and UI update operations are always constrained to the thread that has main() in it
23:58
<&McMartin>
In Windows this is merely Highly Recommended.
23:58
<&McMartin>
I've only used two X11 toolkits extensively (SDL and Qt4) and both also impose this requirement.
--- Log closed Fri Feb 10 00:00:37 2017
code logs -> 2017 -> Thu, 09 Feb 2017< code.20170208.log - code.20170210.log >

[ Latest log file ]