←2011-12-15 2011-12-16 2011-12-17→ ↑2011 ↑all
00:00:08 * elliott gives up
00:01:27 <ais523> elliott: the reason I'm describing this semantically is that the key is not well-founded
00:01:44 <ais523> let's see… I suppose the way it works in practice is that the key is (x, y, unique identifier for level)
00:01:47 <elliott> you're doing the opposite of describing it semantically; you're unable to tell me what the semantics are
00:01:56 <kallisti> awww yeah backup time.
00:02:02 <ais523> where the unique identifier is currently the level's refaddr, but semantically could be anything that uniquely identifies the level
00:02:03 <kallisti> zooooooooom rsync spam.
00:02:16 <elliott> my particular blend of zealotry tells me that you, therefore, have no idea what your program does or is meant to do, and you should just type random keys instead
00:02:30 <elliott> ais523: you haven't been able to tell me what a level is, though
00:02:38 <elliott> if it's not identified by a location, how do you know what makes any given level not another level?
00:02:43 <elliott> how is it done?
00:02:48 <ais523> elliott: badly
00:02:50 <elliott> where do level objects come from? how are they created?
00:03:03 <ais523> basically, TAEB always knows whether or not it's on the same level as it was last step
00:03:11 <ais523> if it isn't, it checks all the existing level objects to see if it matches what it sees
00:03:19 <ais523> and if it doesn't, creates a new level object and assigns all the tiles it can see to that one
00:03:53 <elliott> ais523: OK, then the closest semantics I can think of a level for a hash key is the number it was created in
00:03:58 <elliott> as in, first level created is 0, second is 1, ...
00:04:02 <elliott> you'll notice that this is terrible
00:04:07 <elliott> that's because your program is terrible :)
00:04:21 <ais523> elliott: as I said, "unique identifier for level"
00:04:35 <elliott> it takes a special kind of program to bake in how its imperative semantics run to the /behaviour/
00:04:38 <elliott> although I suppose most programs do that :(
00:05:07 <ais523> elliott: it's not imperative semantics, really
00:05:19 <ais523> or can't "arbitrary identifier for X" be used in functional programs ever?
00:06:14 <elliott> ais523: it is, because it's based on the order things are executed
00:06:17 <elliott> <ais523> basically, TAEB always knows whether or not it's on the same level as it was last step
00:06:17 <elliott> <ais523> if it isn't, it checks all the existing level objects to see if it matches what it sees
00:06:17 <elliott> <ais523> and if it doesn't, creates a new level object and assigns all the tiles it can see to that one
00:06:30 <elliott> the only thing involved here is time, basically
00:06:43 <ais523> elliott: I mean NetHack game step
00:06:47 <elliott> yes
00:06:53 <elliott> imperative programs don't care if their time is real time...
00:06:54 <elliott> it's about sequencing
00:06:56 <elliott> however, I can think of a better way to model it that behaves the same /way/
00:07:08 <ais523> elliott: what TAEB can detect is whether the level has changed or not
00:07:16 <elliott> you're basically keying on the /equivalence class/ of "close enough to X"
00:07:19 <elliott> where X is a tile pattern
00:07:26 <elliott> ("if it matches what it sees")
00:07:29 -!- Vorpal has quit (Ping timeout: 240 seconds).
00:07:54 <elliott> so your keys are just taking the setoid of maps (= 2D ASCII pictures) with the relation being however it defines "close enough"
00:07:57 <elliott> Q.E.Z.
00:08:01 <ais523> elliott: well, if a command it sends to the game leaves the level unchanged, it knows; likewise, if it changes it, it knows
00:08:30 <ais523> but it can't compare two views from different times to see if they're the same level (it has many ways to rule it out, but no way to prove it for certain)
00:08:32 <elliott> ais523: what you're saying doesn't make any sense at all, so I'm assuming you just didn't notice me swerving at some point
00:09:05 <kallisti> mmmm organic compounds.
00:09:14 <ais523> elliott: I don't see why it makes no sense
00:09:21 <elliott> oh, they're probably true statements
00:09:22 <ais523> if you like, we're trying to key on insufficient data
00:09:32 <elliott> but you seem to be implying that they're relevant responses to things I've recently said
00:09:47 <elliott> I'm saying that
00:09:51 <ais523> elliott: I'm trying to say you're wrong about what my keys are
00:09:56 <elliott> (a) the semantics you've described are terrible,
00:10:07 <elliott> (b) but there's a reasonable way to express them without changing behaviour or relying on imperative sequencing
00:10:23 <ais523> elliott: it's not relying on imperative sequencing
00:10:30 <elliott> ais523: unfortunately what I said was completely true; i.e. you could replace the keys in your program with the keys I mentioned and TAEB would work identically
00:10:33 <ais523> because the information it gets from the game has timestamps
00:10:40 <elliott> ais523: you don't understand what imperative means
00:10:53 <elliott> it is fundamentally based on order of operations, not declarative semantics, Q.E.Z.
00:11:08 <ais523> elliott: are you under the impression that I'm saying that the way TAEB does levels is fundamentally impossible to express in a functional language?
00:11:14 <ais523> because I'm not trying to argue that at all
00:11:14 <elliott> <elliott> (b) but there's a reasonable way to express them without changing behaviour or relying on imperative sequencing
00:11:20 <elliott> obviously not, because I just told you the real semantics
00:11:34 <ais523> elliott: what exactly are you taking issue with?
00:11:37 <ais523> or are you agreeing with me?
00:11:38 <elliott> i.e. the semantics you want and /really mean/, not how you reverse engineer them from the actual behaviour
00:12:02 <elliott> ais523: I'm disagreeing that your description of the semantics is reasonable, and I'm disagreeing with any implicit statement that TAEB's way of doing this is at all reasonable and that it isn't completely structurally unsound
00:12:45 <elliott> but mostly I consider my point proven, since you've had to resort to mentally simulating the software to figure out what it means :)
00:13:24 <ais523> elliott: OK, the semantics I want is to key on x-coordinate, y-coordinate, and which level the tile is belongs to; but we don't know what level the tile belongs to
00:13:51 <elliott> that's impossible, so it's not semantics
00:14:37 <elliott> <elliott> you're basically keying on the /equivalence class/ of "close enough to X"
00:14:37 <elliott> <elliott> where X is a tile pattern
00:14:37 <elliott> <elliott> ("if it matches what it sees")
00:14:37 <elliott> <elliott> so your keys are just taking the setoid of maps (= 2D ASCII pictures) with the relation being however it defines "close enough"
00:14:37 <elliott> <elliott> Q.E.Z.
00:14:47 <elliott> that's the best description of the semantics you /have/
00:14:53 <ais523> elliott: I agree that the semantics I want are impossible
00:14:55 <elliott> whether it's what you want depends on how much you like your level-matching algorithm
00:15:14 <ais523> and it's the best we have; the level-matching algorithm could do with improvement, really
00:15:30 <ais523> it works well mostly, but goes haywire if it gets half a level due to lag
00:15:31 <elliott> well, to clarify:
00:15:35 <elliott> whether it's what you want depends on how much you like the very idea of the level-matching algorithm
00:16:17 <ais523> elliott: anyway, you're missing an important point; we can match the maps either on physical appearance, or on knowledge that two maps are the same because they were on consecutive steps without a level change
00:16:20 <elliott> ais523: to unpack what I'm saying into something more like conventional programmerspeak, I'm saying that you want to want to form a new type that's identical to 2D level maps, except that all maps that match are considered equal
00:17:00 <ais523> so what we're actually doing is taking equivalence classes on (map, timestamp) pairs by quotienting them on a "look similar or have consecutive timestamps without a change" equivalence relation
00:17:12 <ais523> (in other words, I didn't need the unpacking…)
00:17:19 <ais523> (that's not what the problem was)
00:17:24 <elliott> ais523: I didn't expect you needed the unpacking
00:17:28 <elliott> ais523: I was just relating it pack to hash tables
00:17:34 <elliott> *back
00:17:42 <ais523> ah, I see
00:17:54 <elliott> actually, what I was really doing is just trying to restate it, but it happened that I ended up restating it in a more dumbed-down fashion, so I added that to the front :)
00:17:55 <ais523> elliott: anyway, the main reason these are refaddrs is so that they can be calculated quickly
00:18:00 <elliott> ais523: right
00:18:07 <elliott> ais523: well, in case it isn't clear, I think TAEB's design is terrible :)
00:18:58 <elliott> ais523: but if you designed it in @, it'd probably be perfect.
00:19:20 <ais523> elliott: how would you solve the problem, incidentally?
00:19:27 <ais523> you don't need to use the same semantics as TAEB
00:20:09 <elliott> ais523: well, if you're asking "how would I, when presented with this problem in practice, solve it", the answer would probably be to complain on #esoteric about how terrible TAEB is, and then rethink everything about the entire problem of playing nethack from scratch
00:20:25 <ais523> elliott: anyway, there's a situation where this approach leads to huge measurable problems in TAEB
00:20:32 <elliott> but on a smaller scale, I'd probably try and figure out whether you can precisely determine level
00:20:37 <elliott> rather than just relying on heuristics
00:20:39 <elliott> by logging more about what happens
00:20:42 <ais523> which is that it has trouble working out when two items are the same
00:20:45 <ais523> and even more so, of monsters
00:20:51 <kallisti> elliott: imagine you have a finite amount of time to live. Now imagine that what you're doing right now prevents you from doing other things in the sum of all events in your life.
00:20:58 <kallisti> elliott: what would you rather be doing right now?
00:21:11 <ais523> I'm sure elliott enjoys talking on IRC
00:21:12 <elliott> kallisti: "Imagine" I have a finite amount of time to live?
00:21:19 <elliott> That seems fairly likely to me.
00:21:24 <elliott> It's not terribly difficult to imagine.
00:21:44 <kallisti> that's promising.
00:21:53 <elliott> "Now imagine that what you're doing right now prevents you from doing other things in the sum of all events in your life." ;; is this not equivalent to "Now imagine that what you're doing now is not doing other things."
00:22:17 -!- pikhq has joined.
00:22:34 <elliott> anyway, my answer is nothing, because I'm feeling fairly lazy, it's after midnight, and it's winter
00:22:41 <kallisti> elliott: sure, it still interferes with the sequencing and duration of events.
00:22:49 <elliott> so there's not really a huge amount of things to do.
00:22:54 <elliott> now why are you asking?
00:23:06 <kallisti> I don't really have a reason.
00:23:13 <elliott> what would _you_ rather be doing?
00:23:24 <elliott> ais523: I'm about to do something nobody has ever done before in the history of prorgamming
00:23:27 <kallisti> skydiving in a wingsuit.
00:23:38 <ais523> elliott: has anyone attempted before?
00:23:43 <elliott> kallisti: why aren't you doing it?
00:23:46 <elliott> ais523: nobody's even considered it!
00:23:52 <ais523> OK
00:24:07 <kallisti> elliott: no it's my point, you're not allowed to steal it!
00:24:16 <elliott> kallisti: so what is your point, exactly?
00:24:26 <elliott> if you think talking about IRC on programming is pointless,
00:24:28 * elliott holds up mirror
00:24:30 <kallisti> elliott: that this conversation is silly. :P
00:24:37 <elliott> good, don't participate in it
00:24:40 <ais523> hmm, I prefer elliott's subject
00:24:41 <ais523> elliott: go on
00:24:57 <elliott> ais523: I'm going to grep for every occurrence of TODO|FIXME in a codebase, and /actually fix them/.
00:25:01 <elliott> SORRY IF YOU EXPECTED IT TO BE EXCITING
00:25:10 <ais523> elliott: haha
00:25:21 <ais523> that is actually pretty exciting, also insightful
00:25:27 <ais523> I'm sure I've at least considered it, before now
00:25:54 -!- pikhq_ has quit (Ping timeout: 248 seconds).
00:26:52 <elliott> $ egrep -r 'TODO|FIXME' *.c *.h | wc -l
00:26:52 <elliott> 26
00:27:02 <elliott> oh, that's a pleasant surprise
00:27:06 <elliott> considering I write about fifty per day
00:28:16 <elliott> ais523: anyway, why can't you decide levels exactly in TAEB?
00:28:41 <elliott> I can't think of any situation in NetHack where you would (a) end up on an unknown level and (b) not be able to determine it exactly, through e.g. the level name/identifier/whatever you call it or otherwise.
00:28:50 <ais523> elliott: suppose you go down a set of stairs on Dungones:2; you could arrive on Mines:3 or Dungeons:3
00:29:00 <ais523> and the view could look exactly the same for each
00:29:19 <elliott> ais523: OK, but you still known the dlvl number, right?
00:29:21 <ais523> (in particular, you could be in a dark area with no adjacent walls in either)
00:29:24 <ais523> yep, you know the numbre
00:29:26 <ais523> *Dungeons
00:29:29 <ais523> just not the branch
00:29:34 <elliott> ais523: why not just key on that?
00:29:36 <ais523> checking number is one of the most obvious things the level comparer does
00:29:44 <ais523> elliott: because then you'd get mines:3 and dungeons:3 muddled?
00:29:48 <elliott> "what branch it's in" is just another piece of information you haven't yet found out
00:29:54 <elliott> ais523: oh, right
00:30:08 <elliott> ais523: well, hmm
00:30:26 <elliott> ais523: I know what I'd do; I'd store tile information in a tree
00:30:36 <elliott> ais523: mines:3 and dungeons:3 would be distinguished by the path in the tree to get there, which would be spatial
00:30:46 <elliott> they'd just both be on level 3, that's all
00:30:59 <elliott> that is, I'd store tile information inside level information
00:31:02 <ais523> elliott: except that you can /also/ fall through a trapdoor on dungeons:1, and land on dungeons:3
00:31:11 <ais523> (well, possibly not with those exact numbers, but translated downwards)
00:31:17 <elliott> ais523: OK, and?
00:31:25 <ais523> now, how do you know if you're on the level reached via set-of-stairs 1, or the level reached by set-of-stairs 2?
00:31:33 <elliott> ais523: *dungeons:3/mines:3, then
00:31:45 <elliott> (presumably)
00:31:49 <ais523> what I mean is, "path to get there" isn't always known
00:31:57 <elliott> ais523: well, sure it is
00:32:01 <elliott> it's just a graph instead of a tree
00:32:03 <elliott> there's two paths
00:32:18 <ais523> elliott: OK, I'll buy that; but it's a graph where you don't know if two edges lead to the same vertex or not
00:32:21 <ais523> so it's not a /known/ graph
00:32:34 <elliott> ais523: OK, what do you think of this: "current level" should be stored separately to "known levels"
00:32:45 <elliott> and it should only become "tied" to a known level if you can decide for /sure/ that it's a known level
00:32:51 <elliott> most of the time, you can do that immediately
00:33:02 <elliott> e.g., you went down some downstairs in a non-forking place
00:33:12 <elliott> which would be one kind of proof
00:33:17 <ais523> yep
00:33:24 <ais523> one kind of proof that TAEB currently doesn't use, interestingly
00:33:26 <elliott> that /is/ based on time, but it's not in the model
00:33:35 <elliott> it's something you /give/ to the model
00:34:03 <elliott> ais523: so, the worst-case is, you fall down a trapdoor to a previously seen level, and never prove it's one or the other branch
00:34:18 <elliott> ais523: but as soon as you go up the upstairs, you'll be in an unambiguous location again
00:34:22 <elliott> because there's only one dlvl 2, or whatever
00:34:42 <elliott> ais523: or if you go down, and find minetown, you know all the levels on the way were in the mines
00:34:47 <ais523> elliott: how would the API for this information look to the AI?
00:35:30 <elliott> ais523: well, beats me, I'm thinking in terms of @, which basically involves pretending the world is as declarative as possible and you have infinite powers of abstraction available to you
00:35:32 <elliott> let me think...
00:35:58 <ais523> also, how does an AI do "route to <map location>"?
00:37:40 <elliott> one sec
00:38:30 <elliott> -- Path is a tree path (forget the graph) with the "canonical path"
00:38:30 <elliott> -- to a level, i.e. "through stairs" most of the time
00:38:30 <elliott> getKnownLevel :: Path -> M Level
00:38:30 <elliott> getCurrentLevel :: M Level
00:38:30 <elliott> unifyLevel :: Level -> Unification -> M ()
00:38:31 <elliott> -- Unification basically proves that a level is the level at
00:38:33 <elliott> -- a certain path; its exact definition would depend on all
00:38:35 <elliott> -- the ways you can prove a level is another, which is basically
00:38:37 <elliott> -- an AI issue. There is almost certainly a more general definition
00:38:39 <elliott> -- that lets you implement such ways decoupled from the definition
00:38:41 <elliott> -- of the actual data-type, but I'm not being paid enough to try
00:38:43 <elliott> -- and think of it.
00:38:51 <elliott> ais523: and the usual way, assuming you the current level is known
00:39:05 <elliott> ais523: but you can have paths from unknown levels to known ones
00:39:14 <elliott> ais523: if you're on dlvl 3, and dlvl 2 is unambiguous (i.e. there is only one), and there's an upstairs...
00:39:35 <ais523> heh at that comment
00:39:52 <ais523> and presumably, if you're on dlvl 3 and don't know where the stairs to dlvl 2 are, you tell the AI "that's your problem"
00:39:59 <elliott> yep :)
00:40:17 <elliott> ais523: just like if you're on dlvl 1 and can't see anything and want to get to the amulet
00:40:31 <ais523> indeed
00:40:46 <elliott> nbt.c:char old[3] = { data[-3], data[-2], data[-1] }; /* TODO this is horrible, HORRIBLE */
00:40:46 <ais523> I have to go home, anyway
00:40:47 <elliott> oh dear
00:40:50 <ais523> bye everyone
00:40:54 <elliott> ais523: bye
00:40:55 -!- ais523 has quit (Remote host closed the connection).
00:41:06 <elliott> wait, at /twenty to one/?
00:41:47 <elliott> kallisti: so what's the vastly-better conversation you would have rather had?
00:42:21 <kallisti> there isn't one.
00:42:43 <elliott> great!
00:42:45 <elliott> so silence then?
00:47:58 -!- kmc has quit (Quit: Leaving).
00:50:32 <oerjan> ^def test ul (::SSS)
00:50:32 <fungot> Defined.
00:50:43 <oerjan> ^test (hm? )~^
00:50:48 <oerjan> bah
00:51:26 <oerjan> ^test (hm? )S
00:53:08 <elliott> oerjan: wat
00:53:58 <oerjan> trying to see if ^def ... ul ... does anything useful with added input
00:54:46 <oerjan> ^def test ul ^
00:54:47 <fungot> Defined.
00:54:55 <elliott> oerjan: it doesn't
00:54:57 <oerjan> ^test ((hm...)S)
00:54:57 <fungot> ...out of stack!
00:55:02 <elliott> to my knowledge.
00:55:06 <oerjan> :(
00:55:10 <elliott> ^def test ul S
00:55:10 <fungot> Defined.
00:55:15 <elliott> ^test (easy way to find out)
00:55:15 <fungot> ...out of stack!
00:59:23 <oerjan> ^def test ul (You fail!)S
00:59:23 <fungot> Defined.
00:59:37 * oerjan whistles innocently
01:00:09 * kallisti considers using Persistent::Hash for his IRC bot
01:00:17 <kallisti> I notice there's no Persistent::List though.
01:00:27 <kallisti> I'd want one of those too, preferably
01:00:50 <oerjan> is there a Persistent::Nuisance?
01:01:05 <kallisti> don't think so.
01:01:05 <elliott> kallisti: um
01:01:10 <elliott> kallisti: can't you just use Dumper
01:01:12 <elliott> + tie
01:01:18 <kallisti> elliott: that's what I currently do minus the tie.
01:01:18 <elliott> wait not dumper
01:01:20 <elliott> what's the binary form
01:01:28 <kallisti> um...
01:01:29 <elliott> Storable
01:01:38 <elliott> hey look, it even does tying for you
01:01:42 <elliott> http://perldoc.perl.org/Storable.html#NAME
01:01:43 <elliott> use that.
01:02:17 <kallisti> good choice.
01:02:27 <kallisti> I keep forgetting about all of these modules
01:02:29 <kallisti> that like...
01:02:30 <kallisti> do things
01:02:33 <kallisti> that I want.
01:03:15 * kallisti thinks 'use' should just automatically install things from CPAN. :P
01:03:39 <elliott> Yes, it should.
01:03:48 <elliott> (This is a sincere statement.)
01:03:53 <kallisti> (yes no doubt)
01:04:22 <elliott> (No, it actually is.)
01:04:37 <kallisti> I could see some issues with it, but otherwise it would be very convenient.
01:04:56 <kallisti> particularly does it also /update/ old packages? because that could break things very easily.
01:05:17 <elliott> There's the security issue, but that's mitigated by proper sandboxing e.g. in a capability language, and mitigated further by a tests/rating/review system which CPAN already has.
01:05:43 <kallisti> also possible security issues if a maintainer decides he wants his package to suddenly become a virus or something. :P
01:05:44 <elliott> kallisti: I don't see why it would.
01:05:52 <elliott> <kallisti> also possible security issues if a maintainer decides he wants his package to suddenly become a virus or something. :P
01:05:53 <elliott> <elliott> There's the security issue, but that's mitigated by proper sandboxing e.g. in a capability language, and mitigated further by a tests/rating/review system which CPAN already has.
01:06:02 <elliott> It's a serious concern; without solving that it shouldn't be implemented.
01:06:07 <elliott> And Unix isn't a very tenable platform to solve it on,.
01:06:09 <elliott> *.
01:06:49 <kallisti> I presume C@AN will have these features.
01:07:12 <elliott> Crap @ Asshole Naptime.
01:07:21 <elliott> The best name for a package source, I can assure you.
01:07:54 <kallisti> hey look Storable isn't even a dependency because it's standard.
01:08:08 <pikhq> The proper sandboxing would be inherent in @.
01:08:25 <oerjan> don't i vaguely recall someone mentioning there is a package in CPAN for making use install from CPAN
01:08:50 <fizzie> You can use FreezeThaw instead if you want to introduce a non-core dependency.
01:09:02 <elliott> oerjan: that sounds familiar
01:09:20 <kallisti> fizzie: benefits?
01:10:11 <kallisti> I'm not entirely sure how you could hack use to do that though...
01:10:23 <elliott> Source filter, @INC hacking.
01:10:24 <kallisti> ah wait I know.
01:10:26 <kallisti> yes
01:10:28 <kallisti> @INC hacking.
01:10:28 <lambdabot> Unknown command, try @list
01:10:28 <elliott> Which?
01:10:30 <elliott> Right.
01:10:40 <elliott> http://search.cpan.org/~jjore/Acme-Anything-0.04/lib/Acme/Anything.pm does similar things.
01:10:46 <elliott> push @main::INC, \ &handler_of_last_resort;
01:10:46 <elliott> sub handler_of_last_resort {
01:10:46 <elliott> my $fake_source_code = '1';
01:10:46 <elliott> open my ($fh), '<', \ $fake_source_code;
01:10:46 <elliott> return $fh;
01:10:47 <elliott> };
01:10:58 <oerjan> that rings a bell
01:12:00 <elliott> That's not it, though.
01:12:09 * elliott is just going through every single Acme module.
01:12:11 <elliott> To find it.
01:12:23 <fizzie> None that I know of. Well, it's pure-Perl as opposed to Storable's C. I guess it might not break regex objects like Storable, though not sure about that.
01:12:27 <elliott> oerjan: http://search.cpan.org/~adamk/Acme-Everything-1.01/lib/Acme/Everything.pm
01:12:52 <elliott> That's close.
01:12:57 <elliott> kallisti: ^
01:13:37 <oerjan> ah that must be it
01:13:48 <kallisti> doing BEGIN { eval { require(Module); Module->import(LIST)} warn $@ if $@; } is much more sensible than that handler_of_last_resort thing.
01:14:04 <kallisti> fizzie: "pure perl" such a benefit.
01:14:34 <fizzie> Well uh maybe your religion prohibits C code in Perl modules?
01:14:37 <oerjan> fizzie: ALSO WE WANT ^def ... ul ... TO CONCATENATE COMMAND ARGUMENTS TO THE COMMAND, OKTHXBYE
01:14:38 <elliott> <kallisti> doing BEGIN { eval { require(Module); Module->import(LIST)} warn $@ if $@; } is much more sensible than that handler_of_last_resort thing.
01:14:42 <elliott> um that doesn't load from cpan.
01:14:48 <elliott> oerjan: i really don't think we do
01:14:50 <kallisti> elliott: correct
01:14:54 <elliott> that's a rather bad implementation of underload io
01:14:55 <kallisti> neither does handler_of_last_resort does it?
01:14:59 <elliott> kallisti: oh
01:15:03 <elliott> I was talking about Acme::Everything
01:15:07 <kallisti> yes I know.
01:15:13 <kallisti> I AM NOT ALWAYS TALKING ABOUT THE SAME THING YOU ARE.
01:15:18 <elliott> <kallisti> doing BEGIN { eval { require(Module); Module->import(LIST)} warn $@ if $@; } is much more sensible than that handler_of_last_resort thing.
01:15:23 <elliott> kallisti: that's why it's an Acme module...
01:15:38 <oerjan> elliott: but it's the only thing which doesn't require an ad-hoc input encoding :(
01:15:44 * kallisti is tempted to use Acme::Everything
01:15:52 <elliott> oerjan: well...
01:15:59 <fizzie> oerjan: I think ^ul input was talked about, but there were some Opinions on what sort of smunglings it should encode the input in.
01:16:05 <elliott> oerjan: surely just pushing the argument as the first element on the stack would be better than /that/
01:16:06 <kallisti> With one 'use' line, you effectively load all 20,000,000 odd lines of code in CPAN.
01:16:09 <kallisti> oh god.
01:16:24 <elliott> kallisti: it's lazy though :P
01:16:28 <kallisti> oh okay.
01:16:30 <kallisti> whew.
01:16:32 <elliott> but it shouldn't be!!!
01:16:35 <kallisti> I AGREE
01:16:42 <oerjan> elliott: um ok. i guess that's more general.
01:17:11 <elliott> oerjan: well what would yours do exactly
01:17:35 <kallisti> elliott: it would be nice if it didn't have any restrictions.
01:17:47 <kallisti> elliott: I could just put use Acme::Everything; in my source, run it once, and then remove the line.
01:17:54 <kallisti> instead of manually installing packages. :P
01:18:05 <elliott> kallisti: with Acme::Everything you don't need the use statement, though
01:18:17 <kallisti> yes but it has to be a method call.
01:18:36 <elliott> well i mean you couldn't just remove the use staetment
01:19:14 <kallisti> oh it doesn't actually install anything.
01:19:24 <elliott> ...
01:19:24 <oerjan> <fizzie> Well uh maybe your religion prohibits C code in Perl modules? <-- well i recall jewish rules forbid mixing different cloth fabrics, so why not...
01:19:33 <elliott> kallisti: no, it's just that you don't need "use" statements to use modules with it
01:19:38 <Sgeo> http://www.stationv3.com/d/20111214.html
01:19:38 <elliott> and use is normally required to use perl modules, no?
01:19:59 <kallisti> elliott: yes. that's not what I'm talking about though.
01:20:05 <monqy> hi
01:21:17 <Gregor> oerjan: That's a Christian rule.
01:21:20 <oerjan> elliott: well i considered actually running the input (preferrably first), but putting it on the stack is more flexible as long as you can still use ^ on it
01:21:25 <kallisti> "In other words, if you use Acme as the base, your class will be the summit."
01:21:27 * kallisti facepalms
01:21:37 <Gregor> Well, I mean, it's Judeochristian rule.
01:21:42 <elliott> oerjan: *preferably
01:21:53 <Gregor> Since it's from the small part of Jewish orthodoxy that made it into the Old Testament.
01:22:02 <elliott> oerjan: anyway I guess that works, but it seems weird compared to just pushing it
01:22:06 <oerjan> Gregor: you know perfectly well christians don't follow all the old testament rules
01:22:10 <elliott> oerjan: otoh that lets you push multiple stack elements. but i think that's actually a _bad_ idea
01:22:18 <elliott> as no program can process a variable number of stack elements like that
01:22:22 <elliott> so it's useless to do that
01:22:24 <Gregor> oerjan: Sure they do, when they happen to correspond to their biases.
01:22:34 <oerjan> Gregor: well naturally.
01:22:55 <elliott> Gregor: Yeah, but the Old Testament laws were specifically overturned.
01:23:09 <kallisti> elliott: are you familiar with File::chdir
01:23:16 <elliott> kallisti: why
01:23:24 <elliott> Sgeo: why did you link that
01:23:27 <kallisti> elliott: I was just recollecting on how awesome it is.
01:23:35 <kallisti> yes
01:23:37 <kallisti> recollecting.
01:23:42 <elliott> kallisti: what does it do.
01:24:17 <Sgeo> elliott, because
01:24:36 <elliott> Sgeo: it isn't funny though
01:24:56 <Sgeo> It isn't?!
01:25:06 <monqy> it isn't funny
01:25:09 <monqy> sorry sgeo
01:25:17 <kallisti> elliott: it gives you a $CWD as well as a @CWD that you can use to change the cwd. you can push and pop directories to @CWD and you can also use local $CWD to define a temporary cwd.
01:26:23 <kallisti> it's an interesting use for local I found.
01:26:40 <elliott> Sgeo: are you serious
01:27:07 <Sgeo> I think the author just needs to ... fix his joke structure, or something, then it would be good
01:27:12 <Sgeo> As opposed to almost good
01:27:27 <Sgeo> As it is, the jokes are a bit too predictable
01:27:29 <elliott> no
01:27:32 <elliott> it wouldn't
01:27:36 <elliott> this guy is one of the least funny people possibl
01:27:36 <elliott> e
01:27:37 <kallisti> as opposed to the opposite of good.
01:27:45 <elliott> like
01:27:48 <elliott> every human could be made funny
01:27:52 <elliott> by "restructuring" how they make jokes
01:27:54 <elliott> the structure
01:27:57 <elliott> is the difference between a funny person
01:28:00 <elliott> and an unfunny person
01:28:03 <elliott> and this person is /worse/
01:28:20 <kallisti> elliott: not me. my jokes are already perfect. Any restructuring would simply imperfect them.
01:28:47 <kallisti> or produce an equivalently perfect joke.
01:28:56 <kallisti> oerjan and I are in the this perfect joke tier together.
01:29:47 <monqy> putting jokerey to a tier structure is bad
01:29:54 <Sgeo> http://www.stationv3.com/d/20111215.html this isn't that bad
01:30:06 <elliott> yes
01:30:07 <elliott> it is
01:30:09 <monqy> yes it is
01:30:21 <elliott> http://www.stationv3.com/d/20111215.html#comment-387439621 though this person is worse
01:30:50 <kallisti> as far as I can tell stationv's "humor" is based on character traits.
01:30:59 <kallisti> the punchline is always based on implied character traits.
01:31:21 <monqy> are any of the characters anything but shallow
01:31:25 <elliott> kallisti: how much better can you do when one of your characters is literally "alternate [other character]"
01:31:26 <kallisti> "I did this thing but then IMPLIED CHARACTER TRAIT HAHAHAHAHAHAHAHAHA"
01:31:38 <elliott> i mean like
01:31:46 <elliott> i can't tell whether alternate floyd is the opposite of
01:31:49 <elliott> or entirely unrelated to floyd
01:31:52 <elliott> either way it's bad
01:32:02 <elliott> even star trek goatee alternates are similar in some ways and opposite in others
01:32:08 <elliott> and generally differently nuanced in general
01:32:13 <elliott> because star trek is not as bad as station v3
01:32:27 <kallisti> elliott: brilliant observation.
01:32:58 <elliott> quite.
01:33:17 <Sgeo> elliott, from the alternate universe
01:33:23 <elliott> yes
01:33:26 <elliott> how is that relevant
01:33:45 <elliott> how is alternate floyd distinguishable from an entirely unrelated character who just happens to be called floyd
01:33:57 <Sgeo> http://www.stationv3.com/d/20030804.html
01:34:03 <kallisti> elliott: he's from the alternate universe!
01:34:09 <kallisti> duh!
01:34:16 <Sgeo> elliott, he's the robot manager of the station in the alternate universe, presumably
01:34:19 <elliott> Sgeo: you appear to be unable to understand my simple point
01:34:26 <elliott> characters have to have attributes to make them interesting
01:34:30 <elliott> attributes and backgrounds
01:34:36 <Sgeo> Regular Floyd errors a lot
01:34:44 <elliott> alternate floyd, near as i can tell, has none of these
01:34:49 <elliott> there is no "floydianness" about his personality
01:34:53 <elliott> he just has a correspondign role
01:34:56 <elliott> and is otherwise unrelated
01:34:58 <elliott> that is not good writing.
01:34:59 <Gregor> elliott: But he's AAAAAAAAAAAAAAAAAAAAAALTERNATE
01:35:18 <elliott> basically this strip seems to be trying to be ~wacky~ by introducing random alternate universes and resetting the universe and shit
01:35:19 <Sgeo> http://www.stationv3.com/d/20030806.html
01:35:25 <elliott> now
01:35:30 <elliott> one cannot maintain a decent strip
01:35:33 <elliott> with just "wackiness"
01:35:36 <elliott> and no writing ability
01:35:37 <elliott> for 8 years
01:35:46 <Sgeo> ^^linky
01:36:04 <elliott> Sgeo: yes, I clicked it.
01:36:06 <elliott> it was irrelevant.
01:37:44 <kallisti> elliott: YOU'RE irreverent
01:37:48 <Sgeo> http://www.stationv3.com/d/20030817.html wtf
01:38:12 <elliott> Sgeo: "wtf"? the attempt at a joke is as obvious there as its falling flat
01:38:41 <kallisti> HA HA IT'S A PLANT THING IT CAN'T MOVE OR PLAY TAG HA
01:38:42 <monqy> sgeo was hide and seek deprived as a child
01:39:51 <kallisti> why do we keep talking about stationv3. is it even a popular webcomic?
01:40:32 <pikhq> elliott: Star Trek is probably sometimes worse than Station v3.
01:40:45 <pikhq> It's probably the single most inconsistent series out there.
01:40:59 <elliott> pikhq: *Maybe* TOS.
01:41:01 <elliott> And *maybe* Threshold.
01:41:07 <elliott> But even season 1 TNG is more enjoyable than this.
01:41:15 <elliott> kallisti: because Sgeo can't bring himself to accept that it's not terrible
01:41:17 <pikhq> elliott: Threshold wasn't *exceptionally* worse than other Voyager stinkers.
01:41:17 <elliott> and so keeps linking it.
01:41:25 <pikhq> It was just a little bit worse.
01:41:54 <Sgeo> elliott, did you just admit that it's not terrible and that I'm unable to accept that?
01:42:17 <elliott> Sgeo: it was an obvious typo, since you seem to have no issue accepting that it's not terrible
01:43:03 <pikhq> elliott: Also, Enterprise.
01:43:18 <elliott> pikhq: Have you /seen/ Station V3?
01:43:25 <pikhq> elliott: No, I try to avoid shit.
01:43:27 <kallisti> elliott: which P language is the best? PHP, Perl, Python, Pascal, Prolog, or... hmmm... Postscript?
01:43:42 <pikhq> Oh, wait, right, that one.
01:43:46 <monqy> are there no other p languages
01:43:49 <pikhq> I have seen it.
01:44:05 <pikhq> And I didn't read much of it because it had antihumor.
01:44:24 <pikhq> It sucked badly enough that it stole a laugh from something else.
01:44:26 <kallisti> monqy: there are.
01:44:26 <elliott> kallisti: Pail.
01:44:36 <pikhq> kallisti: Plof!
01:44:51 <kallisti> monqy: http://en.wikipedia.org/wiki/List_of_programming_languages#P
01:44:59 <kallisti> oh Piet as well
01:45:15 <kallisti> elliott: I've never heard of Pail.
01:45:22 <Sgeo> Does no one besides me think that Station V3 can be good?
01:45:28 <elliott> Sgeo: No.
01:45:41 <elliott> kallisti: http://catseye.tc/projects/pail/
01:45:41 <monqy> station v3 has fans, doesn't it
01:45:48 <kallisti> Sgeo: yes
01:46:43 -!- augur has quit (Remote host closed the connection).
01:48:13 <kallisti> > let in 5
01:48:14 <lambdabot> 5
01:48:16 <kallisti> lol
01:48:30 * kallisti learns something new everyday.
01:49:00 <oerjan> Phortran
01:49:03 <elliott> kallisti: why are you reading Pail.lhs
01:49:08 <elliott> http://catseye.tc/projects/pail/tests/Pail.falderal is the specification
01:49:19 <elliott> oh, hmm
01:49:27 <elliott> that was before he started writing specs in Falderal, I guess
01:49:47 <kallisti> > let 2 + 2 = 5 in 2 + 2
01:49:47 <lambdabot> 5
01:49:52 <kallisti> lololololol
01:50:07 <monqy> ;_;
01:50:18 <oerjan> it's like watching toddlers learn to walk
01:51:52 <elliott> :D
01:52:20 <kallisti> > let in 2 + let in 3
01:52:20 <lambdabot> 5
01:52:31 <kallisti> > do let in 2 + let in 3
01:52:31 <lambdabot> 5
01:52:53 <monqy> bad
01:54:00 <oerjan> > let in 1 - let in 2 - let in 3
01:54:01 <lambdabot> 2
01:54:11 * oerjan whistles innocently
01:54:12 <Sgeo> Falderal?
01:54:23 <monqy> falderal.
01:54:35 <kallisti> oerjan: hmmm...
01:55:06 <Sgeo> 1 - (2 - 3) = 1--1=2
01:55:08 <Sgeo> Yay
01:55:16 -!- itidus21 has quit (Ping timeout: 245 seconds).
01:55:21 <kallisti> oh it's right associative.
01:55:38 <kallisti> > 1 - 2 - 3
01:55:39 <lambdabot> -4
01:56:03 <elliott> Sgeo: http://catseye.tc/projects/falderal/
01:57:09 <elliott> ha ha oh boy
01:57:27 <elliott> i think i have a problem
01:57:43 <kallisti> heroin?
01:57:46 <elliott> yes
01:59:08 <Gregor> Heroine?
01:59:39 <elliott> yese
02:00:19 <kallisti> hairowin?
02:00:34 <monqy> harlequin?
02:00:43 <kallisti> hair o' win
02:01:17 -!- zzo38 has joined.
02:03:02 <pikhq> heirouīnn?
02:03:51 <elliott> yes
02:05:38 <Gregor> Smack?
02:07:05 <elliott> yes
02:07:12 <elliott> *yack
02:09:02 <Gregor> Uhh, in that case, heroack?
02:09:05 <kallisti> strangely enough mueval on my computer occasionally times out on very tivial inputs.
02:09:15 <kallisti> like the let 2 + 2 = 5 in 2 + 2
02:09:17 <kallisti> it timed out once
02:10:04 <kallisti> s/on my computer/when called by my IRC bot/
02:10:06 <elliott> Gregor: Yes. Heroack.
02:10:08 <elliott> You got it.
02:10:12 <elliott> kallisti: lambdabot does that too.
02:10:16 <kallisti> we're all winners!
02:10:56 <Sgeo> Oh, I see how it works
02:11:34 <monqy> how does what work
02:11:41 <Sgeo> let 2 + 2 = 5 in 2 + 2
02:12:10 <kallisti> yes it uses this function thing
02:12:14 <kallisti> it's pretty crazy magic.
02:12:55 <Sgeo> > let 2 + 2 = 5 in 2 + 1
02:12:56 <lambdabot> *Exception: <interactive>:3:4-12: Non-exhaustive patterns in function +
02:20:48 <elliott> NO!! STOP UPVOTING THAT ANSWER!!!!
02:20:59 <kallisti> > let don't = "stop believing" in don't
02:21:00 <lambdabot> "stop believing"
02:21:01 <elliott> IT HAS ENOUGH VOTES! I'M GETTING TOO MUCH REPUTATION YOU BASTARDS :(
02:21:05 <elliott> kallisti: No stop that is the worst song.
02:21:09 <kallisti> elliott: link
02:21:21 <elliott> kallisti: You can't downvote it, you'd have to register and get enough reputation and shit.
02:21:24 <kallisti> elliott: for some reason I thought ' was only valid at the end of identifiers
02:21:33 <kallisti> because that's where it's commonly placed.
02:21:39 <elliott> (I assume that's why you asked.)
02:22:01 <kallisti> elliott: no I want to see what you said/
02:22:16 <elliott> OK fine http://stackoverflow.com/questions/8524801/determining-function-behavior-from-the-type-of-the-function.
02:22:22 <elliott> (It's the top answer.)
02:22:55 -!- kmc has joined.
02:26:05 <kallisti> elliott: oh sure, you'll write an awesome explanation for some random person on the internet.
02:26:12 <kallisti> but then when I ask you a question.
02:26:16 <kallisti> NOPE. QUIT BEING STUPID.
02:26:26 <elliott> kallisti: See, the thing is, you're not giving me smack for the pain.
02:26:46 <kallisti> smack for the pain what does that even mean
02:26:52 <kallisti> DO YOU WANT DRUGS?
02:27:06 <kallisti> I don't think I will have much luck smuggling drugs internationally.
02:27:07 <elliott> Yes, I want DRUGS in return for the pain caused by having to answer your inane questions.
02:27:15 <elliott> DRUGS, MAN.
02:27:38 <kallisti> elliott is all about that smack
02:28:55 <kallisti> elliott: I found the note about polymorphism being important a good point.
02:29:06 <kallisti> I hadn't really specifically thought about that being essential.
02:29:10 <kallisti> but, of course, it makes sense.
02:29:27 <elliott> That's where the name "parametricity" comes from: parametric polymorphism.
02:30:56 <kallisti> an (a,b) -> Int could return any constant integer or any int that can be formed from a, b, (a,b), and some function or chain of functions.
02:31:20 <elliott> @free f :: (a,b) -> Int
02:31:21 <lambdabot> f = f . $map_Pair g h
02:31:27 <kallisti> a "chain of functions" also being "a function" of course.
02:31:33 <kallisti> elliott: oh? what is this?
02:31:40 <elliott> "any int that can be formed from a, b, (a,b), and some function or chain of functions."
02:31:42 <elliott> This is mistaken.
02:31:55 <elliott> There are no operations (a -> Int) or (b -> Int) that are not constant:
02:31:58 <elliott> @free f :: a -> Int
02:31:58 <lambdabot> f = f . g
02:31:59 <kallisti> well I mean
02:32:02 <elliott> @free g :: a -> Int
02:32:02 <lambdabot> g = g . f
02:32:11 <kallisti> assuming a and b are not universally quantified.
02:32:16 <elliott> Say A and B then.
02:32:21 <kallisti> they're just variables for monomorphic types .
02:32:22 <kallisti> okay.
02:32:24 <elliott> When talking about parametricity, quantification will tend to be assumed. :p
02:32:29 <elliott> Maybe $A and $B if you want to be ULTRA PRECISE.
02:32:45 <kallisti> why the $? is parametricity discussed in terms of Perl?
02:33:06 <elliott> Do you have a better character?
02:33:10 <kallisti> (notice my amazing perfect deadpan humor
02:33:11 <monqy> a
02:33:13 <kallisti> A and B work well.
02:33:14 <monqy> i mean q
02:33:16 <monqy> i typoed
02:33:49 <kallisti> elliott: I was just wondering what is more ULRA PRECISE about $A over A
02:33:55 <kallisti> ulra
02:34:08 <elliott> Because it shows that you're talking about every type A, not just some specific type A.
02:34:20 <elliott> As in, given any specific type A, ($A -> ...) follows certain rules.
02:34:32 <kallisti> is this a specific notation that is commonly accepted or?
02:35:36 <kallisti> in other words, I'm asking, if I ever use $A in this context will people cringe at me or will they be like "oh yes -beard scratch-". :P
02:35:49 <kallisti> this is important.
02:36:17 <kallisti> I want the beard to be a prominent feature of the conversation.
02:36:22 <kallisti> I want to fucking rustle that shit.
02:36:57 <cswords_> Hmmm
02:36:57 <cswords_> So
02:37:05 -!- augur has joined.
02:37:09 <cswords_> I just finished my first semester of grad schoo.
02:37:14 <cswords_> I need something to do this break.
02:37:28 <elliott> Grad schoo is the best kind of schoo.
02:37:37 <cswords_> So far, the list is read TAPL and a handful of PL papers, implement something to convert Schem to Scala. Anyone have any other suggestions?
02:37:40 <augur> cswords_: what you should do is
02:37:42 <augur> realize that itll only get harder
02:37:42 <kallisti> cswords_: drugs. elliott can probably land you some smack, if you know what I mean.
02:37:48 <pikhq> cswords_: @
02:37:54 <kallisti> cswords_: get drunk
02:37:55 <elliott> cswords_: Ignore augur, he's a linguist.
02:37:56 <kallisti> celebrate.
02:37:58 <cswords_> I did plent of drugs in my time.
02:37:59 <elliott> Ignore kallisti, he's an idiot.
02:38:07 <pikhq> Step 1, merge your mind with elliott's.
02:38:07 <cswords_> They're old news.
02:38:08 <augur> hahaha
02:38:19 <cswords_> Getting drunk is for tonight.
02:38:20 <elliott> cswords_: You've just finished grad schoo, are going to convert Scheme to Scala, and did plent of drugs in your time.
02:38:25 <elliott> I diagnose you with a hungry spacebar.
02:38:27 <cswords_> I need something fun to do.
02:38:28 <elliott> It keeps eating the previous letters.
02:38:34 <augur> cswords_: youre in grad school
02:38:37 <augur> getting drunk is for every night
02:38:45 <pikhq> elliott vejn'
02:38:50 <elliott> kallisti: They will probably have no idea what you're talking about because normal people write things out with explicit quantifiers.
02:38:59 <cswords_> augur, I have way too much work to do for that.
02:39:25 <pikhq> cswords_: You're the mythical "responsible" grad student, aren't you?
02:39:35 <augur> pikhq: first semester.
02:39:43 <kallisti> elliott: well, if I were talking with Haskell programmers, A and B are pretty reasonably assumed to be an existential quantification (not the Haskell kind, the usual kind).
02:39:44 <augur> he'll come along once hes into his second semester
02:39:45 <pikhq> augur: Ah, right.
02:39:45 <augur> no worries
02:40:05 <cswords_> No, but rt5fv/'[;..pol, kmojiu 4m;, cm, tr7m,-0kopm/,. olpoi,l. 89u0bim, 8um, -0p/. ,mvbnmj,.vgfghjkl;'tyuiop[]
02:40:14 <kallisti> elliott: because there's no type normally called A or B, and the uppercase signifies that it's not polymorphic, and anything you can say about A and B, not knowing anything about their constructors, you could reasonably say about any other type.
02:40:26 <cswords_> Er, I mean, I like getting work done.
02:40:28 <cswords_> Feels good, man.
02:40:40 <elliott> kallisti: I would assume you were talking about some arbitrary type A or B invented for the discussion.
02:40:47 <elliott> cswords_: Personally I think thsdfiojaspae, efmsdg' sd'cvb h][ erte \we't5
02:40:47 <kallisti> elliott: yes.
02:40:53 <elliott> kallisti: Which is not the case here.
02:42:26 <pikhq> Personally I think 亜↓不フぃへ久ぃ御語奴9ヴぃ御蛇ゑンこ;ン場差23位15ウ89がファ;おい;握ぇ食いだ
02:43:00 <elliott> Uhh, dude./
02:43:04 <elliott> Clearly q|";..pol, kmojiu 4m;, cm, tr7m,-0kopm/,. olpoi,l. 89u0bim, 8um, -0p/. ,mvbnmj,.vgfghjkl;'tyuiop[]
02:43:04 <elliott> <kallisti> elliott: because there's no type normally called A or B, and the uppercase signifies that it's not polymorphic, and anything you can say about A and B, not knowing anything about their constructors, you could reasonably say about any other type.
02:43:05 <elliott> <cswords_> Er, I mean, I like getting work done.
02:43:07 <elliott> <cswords_> Feels good, man.
02:43:08 <zzo38> I thought of something in Haskell, is make a class in case you want to make a type parameter have a value of a type. Such as, class ValuedType x y | y -> x where { makeTheValue :: y; accessTheValue :: y -> x; }; newtype V_errorMessage = V_errorMessage String; instance ValuedType String V_errorMessage where { makeTheValue = V_errorMessage "Error: (generic error message)."; accessTheValue (V_errorMessage x) = x; };
02:43:09 <elliott> <elliott> kallisti: I would assume you were talking about some arbitrary type A or B invented for the discussion.
02:43:12 <elliott> <elliott> cswords_: Personally I think thsdfiojaspae, efmsdg' sd'cvb h][ erte \we't5
02:43:14 <elliott> <kallisti> elliott: yes.
02:43:16 <elliott> <elliott> kallisti: Which is not the case here.
02:43:18 <elliott> <pikhq> Personally I think 亜↓不フぃへ久ぃ御語奴9ヴぃ御蛇ゑンこ;ン場差23位15ウ89がファ;おい;握ぇ食いだ
02:44:01 <Sgeo> elliott, kallisti update
02:44:11 <Sgeo> @seen Phantom_Hoover
02:44:11 <lambdabot> Unknown command, try @list
02:44:14 <Sgeo> @list
02:44:14 <lambdabot> http://code.haskell.org/lambdabot/COMMANDS
02:44:44 <Sgeo> ...Thing claims that seen exists
02:44:46 <Sgeo> @users
02:44:46 <lambdabot> Unknown command, try @list
02:45:10 <elliott> @seen hi
02:45:10 <lambdabot> Unknown command, try @list
02:45:15 <monqy> @hi
02:45:27 <oerjan> it used to
02:45:56 <oerjan> i suppose someone considered it stalking
02:46:15 <kallisti> most IRC networks have some kind of seen service anyway, so...
02:46:45 <oerjan> lambdabot's @seen told you which channels they were in, too
02:46:53 <kallisti> ah
02:46:54 <oerjan> well in common with lambdabot
02:47:04 <kallisti> well, most networks allow that also. or the ones I've been to, except freenode.
02:47:24 <oerjan> there's a flag for that, or used to be
02:47:27 <elliott> Hmm, how do you reperform a match in Perl on the rest of the line
02:47:33 <elliott> Or alternatively get all matches of a regexp on a line in list context
02:47:42 <elliott> oerjan: preflex has it, though
02:47:48 <elliott> but preflex isn't in here any more
02:48:05 <oerjan> wtf is preflex
02:48:47 <Sgeo> I should shout update when there's no MSPA update but only a Station V3 update
02:48:48 <Sgeo> >:D
02:49:27 <elliott> oerjan: mauke's bot in #haskell
02:50:15 <kallisti> elliott: mauke. that's the guy who tries to solve my XY problem when I join #perl to ask questions. :P
02:50:21 <kallisti> I never let him, of course.
02:50:28 <elliott> he's a #haskell op.
02:50:40 <elliott> and I believe you've already complained about him when you turned out to be doing something really stupid
02:51:13 <kallisti> eh, no complaints. he's doing a fine job.
02:51:31 <oerjan> elliott: \G assertion
02:51:44 <elliott> oerjan: hm how does that work, or should i just google it
02:51:58 <kallisti> google perlre ctrl+f \G
02:52:12 <elliott> kallisti: "google" haha PERLDOC MAN ahem
02:52:23 <oerjan> well i'm just looking at man perlre
02:53:03 <kallisti> elliott: I always use the web docs because typically I have a fully maximized Chrome instance in the background at all times.
02:53:16 <elliott> kallisti: but not a terminal? when /programming/?
02:53:28 <kallisti> I don't maximize terminals..
02:53:32 <kallisti> but yes I use those too.
02:53:35 <elliott> so it's not readily accessible? weird.
02:53:44 <kallisti> not at all.
02:53:48 <elliott> oerjan: ah, thanks. is there really no way to get all matches in a list context?
02:53:49 <kallisti> also habit
02:54:00 <kallisti> elliott: wait what.
02:54:11 <elliott> kallisti: i want to get all matches of a regexp on a string in a list
02:54:15 <kallisti> @matches = /.../g #like this?
02:54:15 <lambdabot> Unknown command, try @list
02:54:16 <elliott> (with one group)
02:54:18 <elliott> oh that works?
02:54:19 <elliott> neat.
02:54:21 <elliott> what's inside the list
02:54:28 <kallisti> each... match
02:54:31 <kallisti> everything you'd get
02:54:34 <kallisti> from a while loop
02:54:36 <kallisti> with the /g option
02:54:39 <elliott> kallisti: but I only want one group
02:54:44 <kallisti> oh.
02:54:46 <kallisti> well..
02:54:55 <kallisti> map {$1} /.../g #maybe?
02:55:05 <elliott> um
02:55:10 <elliott> I don't think this feature can possibly work as you describe
02:55:20 <elliott> unless match results are first class objects that somehow rebind $<num> when they are $_
02:55:49 <kallisti> ah right.
02:56:18 <kallisti> I'd just... use a while loop?
02:56:31 <kallisti> while(/.../g) { print $1; }
02:56:45 <elliott> that would work, yes.
02:56:52 <elliott> well, I'll check before saying that
02:56:58 <kallisti> it does.
02:57:06 * kallisti has used such things before.
02:57:43 <oerjan> elliott: oh wait, "In scalar context, each execution of "m//g" finds the next match, ..."
02:57:50 <elliott> oerjan: right
02:57:52 <oerjan> so \G may not be needed
02:57:55 <kallisti> !perl $_ = "a a a a a"; print map {$1} /(a)/g;
02:57:55 <elliott> next unless /^ /; print "$1\n" while /(0x[0-9a-zA-Z]+)/g
02:57:56 <elliott> there we go
02:57:57 <EgoBot> aaaaa
02:58:01 <kallisti> ...lol
02:58:02 <kallisti> not helpful
02:58:02 <elliott> (any shorter way to write that? :p)
02:58:13 <kallisti> !perl $_ = "a b c d e"; print map {$1} /(\S)/g;
02:58:13 <EgoBot> eeeee
02:58:19 <kallisti> yeah..
02:58:44 <kallisti> elliott: well if you use feature 'say' you can just type say $1
02:59:09 <kallisti> say is equivalent to print with a \n
02:59:10 <elliott> that would so shorten the code
02:59:12 <elliott> and i know what say is
02:59:22 <kallisti> elliott: assuming you need to use say a lot, yes it would.
02:59:32 <elliott> <elliott> next unless /^ /; print "$1\n" while /(0x[0-9a-zA-Z]+)/g
02:59:34 <elliott> that is the complete code
02:59:49 <kallisti> then no, that's already pretty short.
03:00:03 <kallisti> I'm guessing you're using -n?
03:00:21 <kallisti> otherwise you're nexting into nothing. :P
03:00:49 <elliott> yes
03:01:43 <kallisti> you could instead remove the parens around the regex, use -p, and replace the print ... while /.../g with /.../g
03:02:29 <kallisti> *use -p instead of -n
03:02:44 <kallisti> er, no.
03:02:52 -!- itidus21 has joined.
03:03:21 <kallisti> yes that would work I believe.
03:03:30 -!- copumpkin has joined.
03:03:40 <kallisti> elliott: since you just put parentheses around the whole regex there's no need to specifically grab the first capture group
03:04:02 <elliott> oh, indeed
03:06:47 <oerjan> except $_ doesn't contain the resulting match afterwards, so -p would print the wrong thing?
03:07:15 <kallisti> does -p print $_
03:07:19 <elliott> I'm using -n
03:07:20 <kallisti> I thought it printed the last line.
03:07:30 <kallisti> oh
03:07:30 <elliott> kallisti: it would be pretty pointless if it didn't print $_
03:07:30 <kallisti> okay.
03:07:36 <kallisti> yeah I suppose so.
03:07:45 <oerjan> it's $& which contains the whole match
03:07:57 <kallisti> not needed with /.../g though
03:08:01 <kallisti> just print /.../g
03:08:31 <kallisti> because HAHAHAHA FUNCTION ARGUMENTS ARE LIST CONTEXT
03:08:54 <oerjan> !perl $_ = "test"; print /.*/;
03:08:54 <EgoBot> 1
03:09:01 <oerjan> I DON'T THINK SO
03:09:07 <oerjan> or wait
03:09:11 <oerjan> !perl $_ = "test"; print /.*/g;
03:09:12 <EgoBot> test
03:09:40 <oerjan> it won't get \n between, though
03:10:00 <oerjan> !perl $_ = "test"; print /[^e]/g;
03:10:01 <EgoBot> tst
03:11:23 <kallisti> oh, yes.
03:11:31 <kallisti> map {print "$_\n";} /.../h
03:11:36 <kallisti> s/h/g/
03:11:42 <kallisti> or for
03:11:43 <kallisti> your preference
03:11:46 <kallisti> I like map for some reason.
03:12:00 <kallisti> so... basically the same amount of code. :P
03:12:19 <kallisti> print join('\n', /.../g) also
03:12:58 <kallisti> "\n" rather
03:13:09 <kallisti> oh, also $, = "\n"; print /.../g;
03:15:36 <elliott> also how do I loop through every line of a string like while (my $foo = <>)
03:15:42 <elliott> im bad at perle
03:15:49 <kallisti> split /\n/, $_
03:15:59 <kallisti> then loop away.
03:16:24 <kallisti> there may be some kind of fancy iterative way to do it though.
03:16:51 <elliott> foreach my $line (split /\n/, $foo) is good enough I guess
03:17:14 * kallisti pretty much never uses foreach.
03:17:29 <kallisti> since it's equivalent to for but requires more typing.
03:18:33 <kallisti> elliott: are you in a perl golfing mood? :P
03:19:05 <oerjan> i hope there will be an explanation for today's freefall...
03:20:56 <oerjan> oh wait i think i get it.
03:22:24 <kallisti> elliott: I think it would make a reasonable amount of sense that <> did the same it does for filehandles on strings.
03:23:25 <kallisti> oh look it does.
03:23:31 <kallisti> I don't think that's documented.
03:23:52 <kallisti> !perl print <"test\ntest">
03:23:53 <EgoBot> test
03:24:10 <kallisti> !perl @x = <"test\ntest">; print $x[1]
03:24:14 <kallisti> >_>
03:24:29 <kallisti> or maybe not.
03:25:15 <oerjan> !perl while (<"test\ntest">) { print $_ . "-"; }
03:25:16 <EgoBot> test
03:25:33 <oerjan> ah no, it's only one match
03:25:38 <kallisti> yeah.
03:26:05 <kallisti> !perl @x = <"test\ntest">; print $x[0]
03:26:06 <EgoBot> test
03:26:09 <kallisti> that's really weird.
03:26:50 <elliott> @pl \x y -> f (g x) (h y)
03:26:50 <lambdabot> (. h) . f . g
03:26:53 <elliott> ugh, right
03:27:08 <kallisti> oerjan: well...
03:27:14 <elliott> oerjan: is there a nice way to write that, again?
03:27:15 <kallisti> oerjan: you have to chomp as well.
03:27:32 <kallisti> elliott: maybe if you use .: ?
03:27:45 <kallisti> !perl while(<"test\ntest">) { chomp; print $_ . "-"}
03:27:46 <EgoBot> test
03:27:49 <kallisti> hmmm, nope.
03:28:27 <kallisti> !perl for($_ = <"test\ntest">) { chomp; print "$_-"}
03:28:28 <EgoBot> test
03:28:37 <kallisti> no clue why the - is still there despite chomping
03:28:52 <kallisti> *isn't
03:29:09 <kallisti> !perl for($_ = <"test\na">) { chomp; print "$_-"}
03:29:10 <EgoBot> test
03:29:17 <kallisti> !perl while($_ = <"test\na">) { chomp; print "$_-"}
03:29:18 <EgoBot> test
03:29:20 <kallisti> ?????
03:29:35 <kallisti> it should say test-
03:29:48 <kallisti> assuming sanity
03:29:58 <kallisti> maybe this is what happens when you use undocumented language features.
03:30:22 <kallisti> !perl while($_ = <"test\na">) { s/\n//; print "$_-"}
03:30:22 <EgoBot> testa-
03:30:32 <kallisti> oh...
03:30:39 <kallisti> so <> does... nothing?
03:30:42 <kallisti> on strings?
03:30:43 <kallisti> good to know.
03:30:48 <zzo38> Do you know if there is any Haskell programs similar to the ValuedType class I described earlier?
03:33:39 <kallisti> zzo38: so basically it describes a function from a -> b, and provides you with an a if you don't have one?
03:34:54 <kallisti> a derived function would be f :: b; f = accessTheValue makeTheValue
03:35:01 <zzo38> kallisti: Yes, mostly in case you need to put a value of such a type inside of a type parameter. (Although there are some other ways too)
03:35:08 <zzo38> kallisti: Yes, except that is ambiguous.
03:35:18 <kallisti> er right
03:35:23 <kallisti> insert relevant typeclass :P
03:36:05 <kallisti> but then it's still ambiguous isn't it?
03:36:30 <kallisti> oh wait fundep.
03:36:32 <oerjan> :t curry $ uncurry ?f . (?g *** ?h)
03:36:33 <lambdabot> forall a b a1 b1 c. (?f::a1 -> b1 -> c, ?g::a -> a1, ?h::b -> b1) => a -> b -> c
03:36:36 <kallisti> f :: (ValuedType a b) => b
03:36:49 <kallisti> that should work because of the fundep, yes?
03:37:50 <oerjan> zzo38: it slightly reminds me of the reflection package
03:38:05 <kallisti> zzo38: my bad. f :: (ValuedType a b) => a
03:38:08 <kallisti> based on your original definition
03:39:00 <kallisti> you could call f "accessTheValueThatWasMade"
03:39:07 <kallisti> and have possibly the worst named functions ever.
03:39:21 <zzo38> Might it need scoped typed variables to be used?
03:39:32 <kallisti> er more accurately "accessTheValueFromTheMadeValue"
03:40:12 -!- kmc has quit (Quit: Leaving).
03:40:25 <oerjan> zzo38: that is also intended to get a value into a typeclass instance
03:40:43 <kallisti> zzo38: if I understand functional depedencies correctly it should work as I wrote it?
03:40:51 <kallisti> but maybe a forall b. is needed, yes.
03:41:12 <elliott> http://esoteric.voxelperfect.net/wiki/Antimated_Chat_Rooms
03:41:15 <elliott> antimated, I tell you!!!
03:41:30 <oerjan> chat rooms go *BOOM* with gamma rays
03:42:07 <elliott> oerjan: hmm, so if Gamma-Ray Burst is Sgeo's favourite band
03:42:10 <kallisti> elliott: antimated... so like, they try to kill each other to see who wins?
03:42:15 <elliott> maybe "animated chat rooms" means his VR game things
03:42:21 <elliott> *antimated
03:42:23 <elliott> RUINED THE JOKE OOPS
03:42:24 <kallisti> elliott: or do they pair up to kill fetal chatrooms?
03:42:35 <kallisti> how does one antimate?
03:43:02 <elliott> badly
03:43:07 <zzo38> Another way could be to pass undefined of a type to a class method (some classes used that), but I maybe the way I specified allow combinations made in other way? I don't know, really
03:43:25 <oerjan> first you do the antiboogie
03:43:49 <oerjan> no wait, first you need antipasta
03:45:14 <kallisti> oerjan shares his dating secrets indirectly.
03:45:23 <kallisti> first you eat pasta, then you dance, then you fuck.
03:45:38 <kallisti> proven results.
03:46:21 <oerjan> well you have to raise the anticipation
03:47:24 <oerjan> zzo38: reflection uses the Proxy type, i think.
03:47:54 <oerjan> which is nicer than passing undefined, but alas not in base
03:48:08 <elliott> oerjan: how surprising, edwardk using his own package :P
03:48:24 <elliott> huh, it's actually
03:48:25 <elliott> class ReifiesNum s whereSource
03:48:25 <elliott> Methods
03:48:25 <elliott> reflectNum :: Num a => proxy s -> a
03:48:33 <elliott> presumably the tagged package dependency is to call them with Proxy
03:48:40 <oerjan> elliott: i'm sure i saw a relevant quote recently
03:49:02 <zzo38> Yes, I read about the Proxy type and I like that one too
03:49:14 <kallisti> elliott: help how does proxy appear from nothing.
03:49:22 <elliott> kallisti: are you fucking serious...
03:49:27 <shachaf> elliott: You know about huge pages, right?
03:49:32 <kallisti> elliott: I don't even it scoped anywhere.
03:49:36 <elliott> shachaf: You mean the x86 concept? Yes.
03:49:39 <elliott> kallisti: id :: a -> a
03:49:42 <elliott> help how does a appear from nothing
03:50:04 <kallisti> elliott: that's not particularly helpful. ghci can tell me that.
03:50:19 <elliott> oerjan: kallisti's either stupid or trolling, so kick him :P
03:50:32 <kallisti> was proxy defined somewhere and I'm missing it?
03:50:42 <shachaf> elliott: I mean why turning on *one* huge page is causing ridiculous amounts of swapping and slowing my computer down.
03:50:46 <kallisti> I just see a single-argument typeclass, with this "proxy" that magically appears with no scope.
03:50:50 <shachaf> And then turning on another one repeats the process.
03:50:57 <elliott> shachaf: How huge is it?
03:50:59 <oerjan> elliott: um did you get the capitalization right?
03:51:02 <elliott> oerjan: yes
03:51:05 <elliott> that's why I quoted it.
03:51:07 <elliott> <elliott> presumably the tagged package dependency is to call them with Proxy
03:51:09 <elliott> kallisti:
03:51:11 <shachaf> elliott: The default on amd64, which I assume is 2MB?
03:51:12 <elliott> id :: proxy -> proxy
03:51:16 <elliott> class Foo a where bar :: b -> a
03:51:19 <elliott> class Foo a where bar :: boop -> a
03:51:20 <zzo38> Reifies is the class like that I look for
03:51:29 <kallisti> elliott: oh, hmmm
03:51:45 <kallisti> elliott: right. I'm not accustomed to seeing a polymorphic variable used that way.
03:51:50 <Sgeo> I should read about that
03:51:51 <kallisti> usually it's the parameter.
03:52:00 <shachaf> elliott: Yes, the only size available in /sys is 2MB.
03:52:15 <shachaf> elliott: But turning one on seems to cause ~500MB of swapping.
03:52:47 <elliott> shachaf: I quote from the master:
03:52:47 <elliott> 11:16:00: <augur> hey oklopol
03:52:48 <elliott> 11:16:04: <augur> do you know how to respond to disk-sectors being unable to be read?
03:52:48 <elliott> 11:16:32: <oklopol> yes!
03:52:48 <elliott> 11:16:39: <oklopol> i have a perfect response
03:52:48 <elliott> 11:16:45: <oklopol> buy a new computer
03:52:49 <elliott> 11:17:07: <oklopol> be sure they install all the programs at the shop because that shit can be complicated
03:52:56 <kallisti> elliott: but what useful things can you do with a proxy s, when you know absolutely nothing about proxy? You need some function a s -> s
03:53:05 <augur> elliott: i will murder you
03:53:12 <elliott> kallisti: it's just to make the types work out.
03:53:24 <zzo38> kallisti: I think the only thing is depend on the type.
03:53:30 <kallisti> oh okay.l
03:53:31 <elliott> kallisti: because otherwise the "s" wouldn't appear in the type
03:53:39 <elliott> class Reifies s a | s -> a where
03:53:39 <elliott> reflect :: proxy s -> a
03:53:45 <elliott> and it must, because that's the rule for typeclasses
03:53:50 <kallisti> so there's no actual computation going on there other than resolving types at compile-time.
03:54:00 <elliott> augur: hi
03:54:10 <shachaf> elliott: :-(
03:54:16 <elliott> kallisti: of course there's computation, it's a constant "a" value
03:54:18 <elliott> depending on the type s
03:54:22 <kallisti> elliott: well, yes.
03:54:24 <shachaf> elliott: It's being complicated.
03:54:27 <kallisti> elliott: that's what I meant.
03:54:28 <Sgeo> elliott, can I just read the .pdf instead of this channel?
03:54:33 <elliott> shachaf: I thought the kernel automatically managed huge pages these days, anyway.
03:54:38 <elliott> Sgeo: What?
03:54:45 <kallisti> elliott: I don't typically think of a constant as being a computation, but okay, that's perfectly sensible to say.
03:54:50 <Sgeo> elliott, there's a pdf about this reflect stuff, right?
03:55:00 <elliott> kallisti: yes, for example my program that prints out pi is not a computation
03:55:01 <elliott> beacuse it's constant
03:55:03 <elliott> Sgeo: i'm sure there is
03:55:10 <elliott> the reflect stuff is irrelevant to what kallisti's talking about though
03:55:21 <shachaf> elliott: That's if you want transparent huge pages.
03:55:25 <shachaf> I don't.
03:55:29 <elliott> shachaf: Opaquity is for losers!
03:55:56 <shachaf> elliott: Look, I just want to allocate 4KB subpages inside it.
03:55:59 <kallisti> elliott: well, no, that's a computation and also constant. I was thinking of things like f a = 5. is 5 computed here?
03:56:03 <elliott> shachaf: That's immoral
03:56:05 <elliott> *!
03:56:23 <elliott> shachaf: But seriously, start spamming lkml at greater and greater frequencies yelling about how much Linux sucks because it swaps with one measly huge page.
03:56:32 <elliott> Eventually someone will get sick of you and give you the solution.
03:56:49 <elliott> kallisti: OK, so because some constants aren't computations (because you consider them too trivial), constants aren't computations in general?
03:56:55 <oerjan> > let asTypeIn :: x -> f x -> x; asTypeIn = const in 1 `asTypeIn` [1.0]
03:56:56 <lambdabot> 1.0
03:56:56 <elliott> For instance programs don't compute because some programs are trivial.
03:56:57 <kallisti> elliott: no that's not what I meant to say.
03:57:06 <oerjan> > let asTypeIn :: x -> f x -> x; asTypeIn = const in 1 `asTypeIn` Just 1.0
03:57:07 <lambdabot> 1.0
03:57:08 <shachaf> elliott: When you say "But seriously", I assume you mean "But the opposite of seriously".
03:57:14 <kallisti> elliott: it was an actual question not a point-prover.
03:57:18 <elliott> shachaf: Yes. Correct.
03:57:29 <oerjan> kallisti: ^ f is like proxy there
03:57:54 <kallisti> hm, okay.
03:58:34 <elliott> oerjan: if ScopedTypeVariables didn't exist to make this trivial, I'd think we need a family of composable functions whose implementations are const or flip const or (const .) or whatever :P
03:58:48 <elliott> to build up arbitrarily complex unifications
03:58:50 <oerjan> heh
03:59:00 <kallisti> elliott: I would think it's unlikely in this case that the constant is computed though, right? Depending on the types I guess.
03:59:14 <kallisti> elliott: I'm not really sure what reify is doing.
03:59:20 <elliott> kallisti: maybe you should read the paper
03:59:29 <kallisti> er reflect
03:59:35 <kallisti> elliott: not a bad idea.
04:00:08 <zzo38> Why would you need to read the report to understand these things? To me it is obvious.
04:00:25 <elliott> unfortunately not everyone is gifted with omniscience
04:00:40 <kallisti> zzo38: I only have the information that has appeared on this channel
04:00:42 <zzo38> Neither am I.
04:00:48 <kallisti> I've looked at nothing else. out of laziness.
04:01:17 <shachaf> elliott: Do you know about huge pages, the POWER concept?
04:01:35 <elliott> shachaf: No. Maybe?
04:01:38 <elliott> Help.
04:01:42 <shachaf> It's a lot like the x86 concept.
04:01:50 <shachaf> Except the architecture is POWER.
04:02:04 <zzo38> kallisti: But it is basically like what I wrote but with a proxy instead. data Proxy t = Proxy; Now you can make a proxy for any type. If you need proxy for other kinds I supppose you can do that too by indicating explicit kinds.
04:02:13 <shachaf> Apparently they support 16GB pages.
04:02:15 <shachaf> Now *that's* a page.
04:03:03 <kallisti> zzo38: how is t determined?
04:03:18 <zzo38> But, there should be one kind such as & to specify class/instance/constraint so you can make: data ClassProxy (t :: * -> &) = ClassProxy;
04:03:32 <zzo38> kallisti: By the type signature.
04:04:48 <kallisti> ah more fundeps
04:05:18 <kallisti> :t reflect
04:05:19 <lambdabot> forall a (m :: * -> *). (MonadLogic m) => Maybe (a, m a) -> m a
04:05:21 <kallisti> awwwww
04:05:42 <zzo38> Wrong module!
04:07:19 <elliott> zzo38: That already exists, and it's not called &.
04:07:26 <elliott> It's in GHC HEAD already to be releasd with 7.4, IIRC.
04:07:47 <kallisti> I think if I were to buy a console I'd get a ps3
04:07:54 <oerjan> kallisti: reflect and friends really compute the type _from_ the value, at runtime.
04:08:07 <kallisti> oerjan: hmmm, okay.
04:08:33 <elliott> oerjan: that talk's a bit too socially mobile for Haskell folk :P
04:08:36 <pikhq> shachaf: x86 isn't quite that hardcore.
04:08:44 * kallisti would get a ps3 for the simple reason that Demons' Souls and Dark Souls are only for ps3.
04:08:48 <oerjan> elliott: wat
04:08:51 <pikhq> "Only" up to 1 GiB pages.
04:09:07 <kallisti> but, instead, I'm going to with a gaming desktop, because... it makes way more sense.
04:09:12 <elliott> oerjan: I was referencing a McBride quip that I know forget. :/
04:09:24 <elliott> Ah, it's from http://strictlypositive.org/winging-jpgs/.
04:10:01 <kallisti> oerjan: it seems kind of determined by type. For example, reflect Proxy, using zzo38's Proxy a type.
04:11:05 <oerjan> kallisti: the idea is to take a value, encode it into a type, and then use that type to get a typeclass instance which contains the original value.
04:11:12 <zzo38> elliott: O, well, even if it exist in GHC HEAD but it is not in current version I have
04:11:47 <oerjan> this is tricky because haskell doesn't actually allow creating instances at runtime...
04:12:28 <elliott> zzo38: Yeah, but it'll be coming in a few months as Constraint.
04:13:38 <zzo38> I don't really like that name for it, for a few reasons, but, OK
04:14:20 <kallisti> oerjan: so then w is the instance you want at runtime?
04:14:29 <kallisti> in the Reifies typeclass.
04:14:33 <kallisti> er
04:14:37 <kallisti> in the reify function I mean.
04:14:47 <kallisti> ...does that statement even make sense.
04:14:51 <elliott> kallisti: rtfpaper
04:15:08 <kallisti> elliott: MAYBE I CAN GLEAN IT FROM TYPES.
04:15:10 <kallisti> INSTEAD.
04:15:21 <elliott> that would require a brGAK
04:15:44 <kallisti> what does that even mean.
04:17:37 * kallisti thinks, "maybe if I look at the source of reify I can figure it out!!"
04:17:40 * kallisti opens the source
04:17:44 <kallisti> unsafePerformIO. :(
04:18:07 <elliott> kallisti: yo in a foreach how to I skip the next line
04:18:13 <elliott> but actually, discard this line and give me the next one
04:18:16 <elliott> within nested control structures
04:18:20 <oerjan> kallisti: no, w is the value you are trying to compute, a is the type of the value you are trying to get into a type class, and s is the type encoding that value
04:18:22 <kallisti> elliott: uh what.
04:18:29 <elliott> as i expected; oerjan?
04:18:30 <kallisti> elliott: you want to skip to the next line in the outer loop right?
04:18:42 <elliott> kallisti: no
04:18:52 <elliott> example:
04:19:21 <elliott> foreach my $foo (split /\n/, $bar) { if ($foo =~ /treat_next_line_specially/) { my $quux = next_line_somehow; } else ... }
04:19:32 <kallisti> elliott: lol wat.
04:19:35 <kallisti> hold on
04:19:36 <elliott> ensuring that the line put in $quux WON'T be considered next iteration, instead it'll go on to the one after
04:19:39 <elliott> this is my replacing a while (<>) look
04:19:39 <elliott> loop
04:19:42 <elliott> with an iteration over a string
04:19:43 <elliott> so I can't do
04:19:44 <elliott> <>
04:19:46 <elliott> in the body of the loop
04:20:18 <kallisti> oh...
04:20:21 <kallisti> hmmmmmmmm
04:20:22 <kallisti> uh
04:20:36 <kallisti> there MIGHT be a way to do that? but otherwise you may want to use a C-style for loop instead.
04:21:36 <kallisti> elliott: oh hmm, there's the continue block, which is always executed before the loop condition is evaluated again.
04:21:47 <kallisti> so if you next in the loop body it'll go to the continue block.
04:21:55 <kallisti> before going back to the main loop
04:21:58 <kallisti> is that helpful?
04:22:18 <kallisti> (note that the continue is /always/ executed on each iteration, but the main body can be skipped via next)
04:22:39 <elliott> no
04:23:06 <elliott> oh well, I'll just restructure
04:23:11 <elliott> ls
04:23:12 <elliott> oops
04:23:13 <elliott> wrong window
04:24:51 <kallisti> yeah I think you just want something besides a foreach loop
04:24:52 <Sgeo> elliott, kallisti update
04:24:57 <kallisti> either that or use gross state variables.
04:25:04 <kallisti> but I dunno what you're trying to do.
04:25:10 <kallisti> so there might be an entirely easier way to do it.
04:25:11 <elliott> I love it when kallisti is updated.
04:25:14 <elliott> He gets very slightly less stupid.
04:25:27 <kallisti> lolwat
04:25:30 <kallisti> I do?
04:26:06 <elliott> Well.
04:26:07 <elliott> No.
04:26:10 <elliott> I was trying to make you feel better.
04:26:36 <kallisti> instead you just confused me.
04:26:41 <elliott> Hahaha, this guy has been around for 3 years and he only has 504 reputation, I've been around 2 days and I have 528 BOW BEFORE YOUR NEW GOD, PEON!!!!!!!!
04:26:56 <kallisti> I do not need to be made feeling better.
04:27:15 <elliott> kallisti: I guess past a certain point of stupid you just live in this kind of blizzful daze.
04:27:23 <elliott> Daze? Haze.
04:27:26 -!- Jafet has quit (Quit: Leaving.).
04:28:29 <kallisti> JOHN: last time i saw her, she looked really grim.
04:28:30 <kallisti> JOHN: and also, dark.
04:29:53 <kallisti> elliott: not quite, but lately I've just been in a completely content but meaningless state of mind.
04:29:59 <kallisti> if that makes sense.
04:30:10 <elliott> Commonly referred to as the "kallisti state".
04:30:22 <kallisti> oh no! sometimes I'm sad! even happy!
04:30:31 <kallisti> there are so many different emotions to feel.
04:30:32 <elliott> Yes, but always meaningless.
04:30:34 <kallisti> sad. neutral. happy.
04:30:52 <kallisti> elliott: life is meaningless, bro. -_;;
04:32:39 -!- oerjan has quit (Quit: Good night).
04:33:21 <kallisti> elliott: but yes you could use a state variable to signify that the next line is special.
04:33:30 <kallisti> if nothing else is nicer.
04:34:58 <elliott> That's what I love in programming: being forced to manually convert my problem to a state machine.
04:35:03 <kallisti> yep.
04:35:10 <kallisti> elliott: well a different looping construct would be nicer.
04:35:40 <elliott> I'd bet Perl is weird enough to let you implement this for foreach loops without patching the interpreter.
04:35:43 <elliott> It'd probably be slow, though.
04:35:52 <kallisti> other alternatives: implement continuation monad in perl
04:36:51 <kallisti> elliott: hmmm... maybe? I don't think so.
04:37:04 <kallisti> nothing simple would work.
04:37:20 <kallisti> you could override <> with an object but that sounds really boring and tedious.
04:37:39 <kallisti> but then you'd be switching to a while loop
04:38:13 <elliott> WHY IS NOBODY UPVOTING MY ANSWER THIS MUST BE A BAD TIME TO MAKE ANSWERS I MUST ADJUST MY SLEEP SCHEDULE FOR MEANINGLESS INTERNET POINTS
04:38:36 <kallisti> lolwat
04:38:41 <kallisti> stackoverflow: the game
04:41:21 <elliott> > (f <*> g <*> h) x
04:41:21 <lambdabot> Ambiguous type variable `a' in the constraints:
04:41:22 <lambdabot> `SimpleReflect.FromExpr ...
04:41:22 <elliott> > (f <*> g <*> h) x :: Expr
04:41:23 <lambdabot> Ambiguous type variable `a' in the constraints:
04:41:23 <lambdabot> `SimpleReflect.FromExpr ...
04:41:25 <elliott> what
04:41:27 <kallisti> while (my ($line, $str) = split(/\n/, $str, 2)) { ... }
04:41:37 <kallisti> elliott: $line is the current line, $str is the rest of the string.
04:41:41 <elliott> kallisti: help ^
04:41:50 <kallisti> oh... yeah..
04:41:56 <kallisti> you have to give one of them a specific type
04:41:57 <kallisti> I think
04:41:59 <kallisti> or something
04:42:02 <elliott> > ((f :: Expr -> Expr -> Expr) <*> g <*> h) x :: Expr
04:42:03 <lambdabot> Couldn't match expected type `a -> SimpleReflect.Expr'
04:42:03 <lambdabot> against infe...
04:42:04 <elliott> > ((f :: Expr -> Expr -> Expr) <*> g <*> h) x
04:42:05 <lambdabot> Couldn't match expected type `a -> b'
04:42:05 <lambdabot> against inferred type `Simple...
04:42:12 <elliott> > (f <*> (g :: Expr -> Expr) <*> h) x
04:42:12 <lambdabot> Ambiguous type variable `a' in the constraints:
04:42:13 <lambdabot> `SimpleReflect.FromExpr ...
04:42:15 <elliott> :t (f <*> (g :: Expr -> Expr) <*> h) x
04:42:15 <lambdabot> Ambiguous type variable `a' in the constraints:
04:42:15 <lambdabot> `SimpleReflect.FromExpr a'
04:42:16 <lambdabot> arising from a use of `h' at <interactive>:1:31
04:42:18 <elliott> > (f <*> (g :: Expr -> Expr) <*> h) x :: Expr
04:42:19 <lambdabot> Ambiguous type variable `a' in the constraints:
04:42:19 <lambdabot> `SimpleReflect.FromExpr ...
04:42:23 <kallisti> ummmm...
04:42:30 <elliott> fuck it
04:42:36 <elliott> oh wait
04:42:38 <elliott> > (f <> (g :: Expr -> Expr) <*> h) x :: Expr
04:42:39 <lambdabot> Couldn't match expected type `Text.PrettyPrint.HughesPJ.Doc'
04:42:39 <lambdabot> agains...
04:42:40 <elliott> > (f <$> (g :: Expr -> Expr) <*> h) x :: Expr
04:42:41 <lambdabot> Ambiguous type variable `a' in the constraints:
04:42:41 <lambdabot> `SimpleReflect.FromExpr ...
04:42:43 <elliott> >_<
04:42:48 <kallisti> yeah it's frustrating...
04:43:04 <kallisti> :t f
04:43:05 <lambdabot> forall a. (SimpleReflect.FromExpr a) => a
04:43:12 <elliott> > (("f $ " ++) <$> ((++")") . ("(g " ++)) <*> ((++")") . ("(h " ++)) x
04:43:13 <lambdabot> <no location info>: parse error (possibly incorrect indentation)
04:43:15 <elliott> > ((("f $ " ++) <$> ((++")") . ("(g " ++)) <*> ((++")") . ("(h " ++))) x
04:43:16 <lambdabot> <no location info>: parse error (possibly incorrect indentation)
04:43:17 <elliott> fuck
04:43:24 <kallisti> :t f <*> g <*> <h> :: Expr -> Expr
04:43:25 <lambdabot> parse error on input `<'
04:43:30 <kallisti> lol
04:43:34 <kallisti> :t f <*> g <*> h :: Expr -> Expr
04:43:34 <lambdabot> Ambiguous type variable `a' in the constraints:
04:43:35 <lambdabot> `SimpleReflect.FromExpr a'
04:43:35 <lambdabot> arising from a use of `g' at <interactive>:1:6
04:43:39 <elliott> > (("f $ " ++) <$> ((++")") . ("(g " ++)) <*> ((++")") . ("(h " ++))) x
04:43:39 <lambdabot> Couldn't match expected type `a -> b'
04:43:40 <lambdabot> against inferred type `[GHC.T...
04:43:43 <elliott> :t (("f $ " ++) <$> ((++")") . ("(g " ++)) <*> ((++")") . ("(h " ++))) x
04:43:43 <lambdabot> Couldn't match expected type `a -> b'
04:43:44 <lambdabot> against inferred type `[Char]'
04:43:44 <lambdabot> In the first argument of `(<$>)', namely `("f $ " ++)'
04:43:48 <elliott> > (("f $ " ++) <$> ((++")") . ("(g " ++)) <*> ((++")") . ("(h " ++))) "x"
04:43:49 <lambdabot> Couldn't match expected type `a -> b'
04:43:49 <lambdabot> against inferred type `[GHC.T...
04:44:15 <elliott> > let fuck name x = "(" ++ name ++ " " ++ x ++ ")" in (("f $ " ++) <$> fuck "f" <*> fuck "g") "x"
04:44:15 <lambdabot> Couldn't match expected type `a -> b'
04:44:16 <lambdabot> against inferred type `[GHC.T...
04:44:17 <elliott> FML
04:44:21 <kallisti> lol
04:44:37 <kallisti> @unpl f <*> g <*> h
04:44:37 <lambdabot> ((f <*> g) <*> h)
04:44:39 <elliott> > ((,) <$> f <*> g) 42
04:44:39 <lambdabot> Ambiguous type variable `a' in the constraints:
04:44:40 <lambdabot> `SimpleReflect.FromExpr ...
04:44:45 <elliott> > ((,) <$> f <*> g) 42 :: (Expr,Expr)
04:44:46 <lambdabot> (f 42,g 42)
04:44:48 <elliott> FINALLY
04:45:16 <kallisti> what does that tell you?
04:45:22 <elliott> > join (liftA2 (,)) f 42 :: (Expr,ExpR)
04:45:23 <lambdabot> Not in scope: type constructor or class `ExpR'
04:45:23 <elliott> > join (liftA2 (,)) f 42 :: (Expr,Expr)
04:45:24 <lambdabot> (f 42,f 42)
04:46:07 <elliott> > (flip ($) <$> 42 <*> 43) pred
04:46:08 <lambdabot> Ambiguous type variable `a' in the constraint:
04:46:08 <lambdabot> `GHC.Enum.Enum a'
04:46:08 <lambdabot> ar...
04:46:10 <elliott> :t (flip ($) <$> 42 <*> 43)
04:46:11 <lambdabot> forall a b (f :: * -> *). (Num (f a), Applicative f, Num (f (a -> b))) => f b
04:46:11 <kallisti> elliott: is that loop construct helpful?
04:46:16 <elliott> :t (flip ($) <$> 42)
04:46:17 <lambdabot> forall a b (f :: * -> *). (Num (f a), Functor f) => f ((a -> b) -> b)
04:46:20 <kallisti> while (my ($line, $str) = split(/\n/, $str, 2)) { ... }
04:46:32 <elliott> kallisti: nope, when I said I was gonna restructure it I meant I gave up
04:46:36 <elliott> but I'll probably incorporate that next time, tahnks
04:46:37 <elliott> thanks
04:46:39 <kallisti> ah.
04:46:41 <elliott> :P
04:46:45 <elliott> :t (($) <$> 42)
04:46:45 <lambdabot> forall a b (f :: * -> *). (Num (f (a -> b)), Functor f) => f (a -> b)
04:46:57 <Sgeo> I'm looking at the ReifiesNum thingy
04:46:59 <Sgeo> I see Pred and Succ
04:47:01 <elliott> :t ((\x f -> f x) <8> 42)
04:47:02 <lambdabot> Precedence parsing error
04:47:02 <lambdabot> cannot mix `<' [infix 4] and `>' [infix 4] in the same infix expression
04:47:03 <elliott> :t ((\x f -> f x) <*> 42)
04:47:04 <lambdabot> forall t b. (Num (t -> t -> b), Applicative ((->) t)) => t -> b
04:47:09 <elliott> gah
04:47:10 <Sgeo> But ... Twice? I guess that makes it more efficient to reify some numbers?
04:47:15 <elliott> Sgeo: binary
04:47:16 <kallisti> elliott: if you wanted two lines at a time you could also do
04:47:19 <Sgeo> I still don't know what is meant by Reify
04:47:26 <kallisti> while (my ($line1, $line2, $str) = split(/\n/, $str, 3)) { ... }
04:47:28 <elliott> :t fmap (\x f -> f x)
04:47:28 <kallisti> and stuff like that.
04:47:29 <lambdabot> forall a t (f :: * -> *). (Functor f) => f a -> f ((a -> t) -> t)
04:47:31 <kallisti> but that's probably not what you want.
04:47:41 <elliott> (c -> a) -> (c -> (a -> t) -> t)
04:47:41 <elliott> hmm
04:47:58 <elliott> > fmap (flip ($)) (const 42) (+) 43
04:47:59 <lambdabot> 43
04:48:02 <elliott> aha
04:48:05 <elliott> :t liftA2 (\x f -> f x)
04:48:06 <lambdabot> forall a c (f :: * -> *). (Applicative f) => f a -> f (a -> c) -> f c
04:48:19 <kallisti> ....what the hell.
04:48:20 <elliott> ohd uh
04:48:22 <elliott> *oh duh
04:48:41 * elliott is trying to point-free: f x y z = g (h x) (h y) (h z)
04:48:45 <elliott> *free of points:
04:48:55 <kallisti> hm
04:49:21 <kallisti> sounds, difficult.
04:49:25 <elliott> it looks like the reader monad but it isn't :P
04:49:26 <kallisti> you probably won't get a good solution.
04:49:41 <elliott> i think i can, but who knows
04:50:41 <kallisti> elliott: is @pl cheating? :P
04:50:48 <elliott> good luck
04:51:06 <elliott> @pl \g h x y z -> g (h x) (h y) (h z)
04:51:06 <lambdabot> join . ((flip . ((flip . ((.) .)) .)) .) . join . ((flip . ((.) .)) .) . (.)
04:51:10 <elliott> @pl \x y z -> g (h x) (h y) (h z)
04:51:11 <lambdabot> flip flip h . ((.) .) . (. h) . g . h
04:51:13 <elliott> yeah.
04:51:17 <elliott> (flip flip h?)
04:51:17 <Sgeo> elliott, is this thing commonly used in Haskell projects? It looks cool
04:51:23 <elliott> Sgeo: What thing?
04:51:23 <elliott> :t flip flip h . ((.) .) . (. h) . g . h
04:51:24 <lambdabot> forall (f :: * -> *) a b (f1 :: * -> *) a1 a2 (f2 :: * -> *). (Functor f, SimpleReflect.FromExpr (f1 a), Functor f1, SimpleReflect.FromExpr (f a1), Show a2, Show a1, Show a, SimpleReflect.FromExpr b,
04:51:24 <lambdabot> SimpleReflect.FromExpr (f2 a2), Functor f2) => f2 (f (f1 b))
04:51:28 <elliott> :t \g h -> flip flip h . ((.) .) . (. h) . g . h
04:51:29 <lambdabot> forall a b (f :: * -> *). (Functor f) => (a -> a -> a -> b) -> f a -> f (f (f b))
04:51:32 <elliott> :t \g h -> h . ((.) .) . (. h) . g . h
04:51:33 <lambdabot> Occurs check: cannot construct the infinite type:
04:51:33 <lambdabot> f = (->) (f (f1 a -> f1 b))
04:51:33 <lambdabot> Probable cause: `h' is applied to too few arguments
04:51:34 <Sgeo> elliott, "Functional Pearl: Implicit Configurations"
04:51:36 <elliott> oh
04:52:11 <elliott> Sgeo: not that commonly afaik. I think it's being used in the mpfr binding copumpkin and edwardk are working on
04:52:17 -!- Darth_Cliche has joined.
04:52:32 <copumpkin> I promised edwardk I'd get it in a working state before the end of the year
04:53:11 <Sgeo> elliott, there's no reason I shouldn't use it instead of, say, Reader, right?
04:53:22 <Sgeo> Or are they entirely separate concepts
04:53:37 <elliott> Here, copumpkin said something; he's the official representative for the reflection package.
04:53:41 <elliott> Enjoy!
04:53:52 <copumpkin> wat
04:53:54 <copumpkin> I was talking about mpfr
04:53:59 <kallisti> lol
04:54:00 <elliott> Yes, but it is too late now.
04:54:02 <elliott> Your fate is sealed.
04:54:02 <copumpkin> oh okay
04:54:07 <copumpkin> I like reflection too
04:54:13 <kallisti> elliott: this may be one of those situations
04:54:37 <kallisti> elliott: where, without additional standard higher-order functions, attempting to write a point-free function is not going to be fruitful?
04:54:53 -!- Darth_Cliche has changed nick to Klisz.
04:55:12 <kallisti> elliott: though perhaps by attempting these puzzles, you can devise combinators that would be useful for writing pointfree code?
04:55:29 -!- DCliche has quit (Ping timeout: 252 seconds).
04:55:44 <elliott> kallisti: hi.
04:55:52 <elliott> copumpkin: Good, tell Sgeo all about it and how it differs from the reader monad.
04:56:03 <copumpkin> Sgeo: like, totally, man
04:56:08 <copumpkin> duuude
04:56:40 <Sgeo> "We rely on type classes, higher-rank polymorphism, and—in ad-
04:56:40 <Sgeo> vanced cases—the foreign function interface.
04:56:40 <Sgeo> "
04:56:44 <Sgeo> o.O at ffi involvement
04:58:04 <elliott> Sgeo: It uses the FFI to store a value at a pointer, and then serialises that pointer to type-level naturals, and then deserialises it with unsafePerformIO to read the pointer.
04:58:12 <elliott> I now predict that Sgeo will never use the reflection package.
04:58:55 <Sgeo> I haven't used much Haskell libraries thus far..
04:59:44 <kallisti> elliott: didn't I make f (g x ) (g y) or something?
04:59:48 <kallisti> I don't remember what it was.
05:00:17 <elliott> Sgeo: I would also predict that you will never use the base package.
05:00:29 <kallisti> oooooh wicked burn.
05:01:15 <kallisti> elliott: surely Sgeo has imported Control.Applicative.
05:01:37 -!- azaq23 has joined.
05:01:43 <kallisti> or Data.List even/
05:01:46 <elliott> kallisti: I predict that Sgeo has never written a program not strictly intended to learn Haskell by writing a one-file program with no real use (like hello world or fizzbuzz, etc.).
05:01:47 -!- azaq23 has quit (Max SendQ exceeded).
05:01:49 <elliott> Prelude is in base too.
05:01:58 <kallisti> oh
05:02:17 -!- azaq23 has joined.
05:02:25 <Sgeo> elliott, what does my BF interpreter count as?
05:03:17 <elliott> OK, "to achieve a purpose other than rehashing a standard program skeleton to learn Haskell".
05:03:33 <kallisti> elliott: be careful. you might accidentally imply that bf has no real use.
05:03:34 <kallisti> oh okay.
05:03:37 <kallisti> you didn't
05:04:05 <Sgeo> I've never written a BF interpreter before
05:07:17 <elliott> Gee golly gosh.
05:08:13 <kallisti> Sgeo: it's okay I've never written anything substantial in Haskell and I'm still awesome. :)
05:10:33 <kallisti> elliott: find is an awesome program
05:10:38 <kallisti> now that I know how to properly use -exec
05:10:41 <elliott> It's not.
05:10:49 <kallisti> are there better alternatives?
05:11:02 <itidus21> burn
05:11:02 <elliott> Certainly; you won't be interested in any of them though.
05:11:12 <elliott> Also that's irrelevant to the question of whether it's awesome or not.
05:11:13 <kallisti> why not? what are they? go on.
05:11:32 <kallisti> elliott: it's slightly relevant. It fills a niche and that's why it's awesome.
05:11:35 <kallisti> if other things do it better
05:11:38 <elliott> It doesn't.
05:11:40 <kallisti> then it is less awesome than I initially thought.
05:11:41 <elliott> It fills about five thousand niches.
05:11:55 <elliott> It has a mini implementation of about 50 Unix commands in there and it doesn't compose well at all.
05:12:08 <elliott> Plan 9 gets along just fine without a find, for instance, mostly by disallowing pesky control characters in filenames so that line-based IO works fine.
05:12:22 <shachaf> pikhq: Can you get 1 GiB on amd64?
05:12:47 <pikhq> shachaf: Yes.
05:13:00 <kallisti> elliott: right but I use find to run commands on a whole directory tree at once. how does plan 9 do this?
05:13:17 <shachaf> Hah:
05:13:52 <shachaf> i386 | Page Size: 4KB | Huge Page Size: 4M (2M in PAE mode) | Large Page Size: 1GB
05:14:11 <elliott> kallisti: By listing the entire directory tree and piping it through e.g. grep to filter out the commands you don't want, then passing it to xargs.
05:14:20 <pikhq> shachaf: Sorry, I use "x86" to refer to x86_64 anymore, because seriously 32-bit x86 is an archaicism anymore.
05:14:49 <elliott> kallisti: To quote the Plan 9 wiki:
05:14:49 <elliott> find du -a | grep pattern
05:14:49 <elliott> grep pattern `{du -a root}
05:14:50 <elliott> -name du -a root | grep name
05:14:50 <elliott> pattern in a file grep -n pattern `{du -a root | awk '{print $2}'}
05:14:50 <elliott> -exec cp '{}' x ';' cp `{ du -a | grep pattern } x
05:14:52 <shachaf> I didn't see it listed in /sys, but I suppose that doesn't constitute trying very hard.
05:14:54 <elliott> (View in a monospaced font.)
05:15:03 <kallisti> elliott: I've done similar things with find before I realized I could use -exec
05:15:14 <elliott> kallisti: It's unsafe with Unix because filenames can contain anything apart from NUL bytes.
05:15:20 <elliott> You have to use -print0 and | xargs -0 and it's a gigantic mess.
05:15:34 <shachaf> find -print0 | xargs -0 > find -exec
05:17:32 <Sgeo> "The fourth approach to the configurations problem is to use a
05:17:32 <Sgeo> reader monad [3]. Its drawback is that any code that uses configu-
05:17:32 <Sgeo> ration data (even only indirectly, by calling other functions that do)
05:17:32 <Sgeo> must be sequenced into monadic style—even if it does not other-
05:17:32 <Sgeo> wise have to be.
05:17:32 <Sgeo> "
05:19:01 <kallisti> elliott: so your basic argument against find, despite it doing everything it needs to do to work in Unix, is a) unix filenames b) it goes against Unix philosophy
05:19:30 <elliott> kallisti: Many things work. I use find all the time. That does not mean I think it worthy of being called out as "awesome".
05:19:42 <elliott> kallisti: Have I mentioned that its calling convention is completely unlike almost all Unix software?
05:19:44 <elliott> Only dd is worse in that regard.
05:19:54 <elliott> (And that's because dd was ported from another system, IIRC.)
05:19:54 <kallisti> yes it's unique in that regard.
05:20:01 <shachaf> elliott: What's the gigantic mess exactly?
05:20:10 <elliott> shachaf: Context?
05:20:14 <shachaf> You just typed out the entire solution to the problem.
05:20:19 <shachaf> <elliott> You have to use -print0 and | xargs -0 and it's a gigantic mess.
05:20:39 <elliott> shachaf: Well, yes, but it's a gigantic mess because Unix is based around line-based IO, not \0-based.
05:20:45 <elliott> You can't really grep the result of that, etc.
05:20:54 <shachaf> UNIX is based around byte-based I/O.
05:20:55 <elliott> Yes, you don't need to because find can filter filenames itself, but that's kind of my point, it isn't modular.
05:21:11 <elliott> shachaf: If you don't think the Unix shell and its tools are line-oriented, then you're delusional...
05:21:19 -!- DCliche has joined.
05:21:32 <kallisti> elliott: whitespace-oriented, even. in some cases.
05:21:38 <shachaf> Also, the way that UNIX tools are meant to be both machine-usable and human-usable doesn't really work, as was pointed out to me recently.
05:21:56 <kallisti> "machine-usable"?
05:21:57 <elliott> Unix's design doesn't really work in general.
05:22:05 <elliott> Have I mentioned @ yet?
05:22:18 <elliott> ...but still, I'd rather a Unix system adhere to its philosophy, at least in broad strokes.
05:22:18 <kallisti> http://www.johndcook.com/blog/2010/06/30/where-the-unix-philosophy-breaks-down/
05:22:21 <kallisti> this guy hasn't heard of @
05:22:27 <elliott> A consistent crappy system beats an inconsistent crappy system.
05:23:12 <shachaf> elliott: @? What a weird name for an operating system.
05:24:10 <elliott> Hey, that's going to be replaced by the PERFECT name for an operating system in a few centuries!
05:24:14 <kallisti> shachaf: calling it a "name" would be using misfitting terminology of present-day operating systems, which no longer applies to @.
05:24:19 <elliott> DEAR FUTURE LOGREADERS: Disregard this line and my previous line.
05:24:21 <elliott> kallisti++
05:24:27 -!- Klisz has quit (Ping timeout: 252 seconds).
05:24:32 <cswords_> "Unix's design doesn't really work in general."
05:24:38 <cswords_> Except, you know, for the entire internet.
05:24:49 <shachaf> elliott: Wait, what?
05:25:00 <elliott> cswords_: It's true that Unix software functions perfectly fine. I'm hardly advocating Windows. Or VMS.
05:25:05 <elliott> That's why I said "design".
05:25:07 <shachaf> elliott: I was talking about the name that \@ is substituted by, obviously, not about \@.
05:25:13 <elliott> shachaf: There is no escaping. Sorry.
05:25:14 <shachaf> elliott: Come on.
05:25:23 <elliott> shachaf: You're just going to sound incoherent in the future.
05:25:24 <kallisti> elliott: also did you read that stupid blog entry? the guy is talking about how programs gain overlapping features over time because it becomes difficult to communicate complex data across byte streams.
05:25:31 <kallisti> elliott: something that shouldn't be a problem in @.
05:25:32 <elliott> kallisti: I read a few paragraphs and then got bored.
05:25:41 <elliott> But yes, @ is probably the answer to whatever question he has or should have.
05:26:14 <shachaf> Also, De Bruijn sequences are neat.
05:26:37 <elliott> cswords_: I mean, yes, Unix is probably a Good Thing, at least compared to what we could have had instead (although Multics was actually pretty well-designed and innovative for its time...), but it's way past its expiry date.
05:26:55 <cswords_> De Bruijn indicies...
05:27:00 <cswords_> So in my final today
05:27:02 <cswords_> We got a question
05:27:03 <cswords_> It was
05:27:11 <shachaf> cswords_: Yes, it's the same De Bruijn.
05:27:17 <elliott> De Bruijn indices++
05:27:18 <cswords_> "Go through this nested lambda expression and provide the de bruijn indicies for each one"
05:27:28 <kallisti> sounds difficult.
05:27:30 <shachaf> @quote kmc unix
05:27:30 <kallisti> >_>
05:27:31 <lambdabot> No quotes match. :(
05:27:31 <cswords_> No, it's easy.
05:27:35 <elliott> cswords_: That's impossible.
05:27:41 <cswords_> What? It's scheme.
05:27:44 <cswords_> It's easy.
05:27:48 <elliott> Yeah, Chaitin proved it in 1982.
05:27:49 <cswords_> Any free variables were to be denoted with a -1.
05:27:50 <elliott> You must have made a mistake.
05:27:55 <elliott> I think your professor was trying to catch you out.
05:28:05 <cswords_> I am sure you are trolling.
05:28:06 * elliott is trolling, but would also have used a symbol instead of -1.
05:28:07 <shachaf> WHOA, MAN, A DE BRUIJN INDEX OF -1
05:28:11 <cswords_> Anyway.
05:28:13 <shachaf> THINK OF THE POSSIBILITIES
05:28:18 <cswords_> We were supposed to use a -1 if it was a free variable
05:28:21 <cswords_> And the expression was this:
05:28:25 <elliott> shachaf: It gets the argument from one lambda IN.
05:28:28 <shachaf> IT'S, LIKE, A LAMBDA *INSIDE* A LAMBDA!
05:28:38 <elliott> If you have two nested lambdas, it turns the language into a nondeterministic one.
05:28:45 <elliott> That... that sounds pretty cool, actually.
05:28:57 <cswords_> ((lambda (a) (lambda (b) ((d c) (lambda (a) d))) (lambda (c) a)) (lambda (a) c))
05:29:02 <monqy> exciting
05:29:03 <shachaf> elliott: Well, other than how the lambda hasn't been applied yet.
05:29:10 <shachaf> elliott: Not to mention De Bruijn indices of 0.
05:29:10 <kallisti> elliott: the more non-deterministic you can make something, the cooler gets. a little known fact.
05:29:14 <elliott> cswords_: Did they write it in Scheme notation? It's awfully clunky for pure LC. :(
05:29:14 <shachaf> Wait, I just mentioned them.
05:29:28 <cswords_> LC?
05:29:30 <elliott> shachaf: Yeah, that's why it gets the value in the future, duh.
05:29:32 <elliott> cswords_: Lambda calculus.
05:29:33 <shachaf> They should've used Common Lisp.
05:29:33 <monqy> lambda calculus, cswords_
05:29:34 <cswords_> Yes, the class was in scheme.
05:29:40 -!- MDude has quit (Ping timeout: 240 seconds).
05:29:41 <monqy> wh
05:29:46 <cswords_> Aaanyway.
05:29:55 <shachaf> #'(LAMBDA (LAMBDA) (LAMBDA LAMBDA) I don't have the heart to finish it.
05:29:56 <pikhq> Lambda calculus in sexp is saddening.
05:29:56 <elliott> Well, yeah, but presumably you didn't write a De Bruijn substitutor for the entirety of Scheme :P
05:29:57 <cswords_> Someone should do the de bruijns for those real quick.
05:30:03 <elliott> Okay.
05:30:04 <cswords_> It was... unnerving.
05:30:28 <monqy> unnerving?
05:30:35 <cswords_> Each is free.
05:30:35 <monqy> sounds quite nerving to me, actually
05:30:36 <kallisti> he lost his nerves.
05:30:42 <elliott> \ \ (-1 -1) \ (-1) ... yeah, this is ridiculous.
05:30:45 <cswords_> Yeah.
05:30:55 <cswords_> Apparently the problem was randomly generated.
05:30:59 <monqy> great
05:30:59 <cswords_> I redid it like three times.
05:31:12 <shachaf> Real programmers don't use syntax, they just input the directed graph directly.
05:31:19 <shachaf> That's why it's called a Directed graph, see.
05:31:22 <monqy> directly graph
05:31:26 <elliott> Hmm, lambda calculus programs would look nice as graphs, except for the nodes.
05:31:31 <kallisti> real programmers usse@.
05:31:32 <elliott> They'd look all sad and empty.
05:31:48 <cswords_> lol
05:31:55 <monqy> edgemess
05:31:55 <cswords_> Anyway, now I"m drinking and making techno. Life is grand.
05:32:06 <elliott> Wait, just use @ symbols as the nodes.
05:32:08 <monqy> i'm sitting
05:32:14 <kallisti> cswords_: "techno"
05:32:18 <cswords_> o.O
05:32:21 <monqy> techno
05:32:21 <elliott> (Yes, use an operating system name as a node!)
05:32:23 <elliott> (Future people.)
05:32:26 <elliott> (That is what I will do.)
05:32:34 <elliott> (It's funny because injokes are funny.)
05:32:46 <kallisti> elliott: the future people don't know that @ is the name of their operating system though.
05:32:48 <monqy> every node labeled "elliott is cool"
05:32:51 <kallisti> because you renamed it to something perfect.
05:32:57 * elliott waits for cswords_ to ask what @ is.
05:33:06 <cswords_> I know what @ is.
05:33:08 <cswords_> I'm not a noob.
05:33:11 <shachaf> elliott: WHAT'S @
05:33:13 <elliott> You... do?
05:33:25 <elliott> shachaf: It's a difficult question, because @ is impossible to describe. One might ask the same about Feather. What *is* Feather? We just don't know.
05:33:28 <cswords_> I've red the page.
05:33:33 <kallisti> cswords_: techno refers to a specific style of electronic music. Is that what you're making?
05:33:36 <elliott> There's... a page... for @?
05:33:43 <cswords_> kallisti . . .
05:33:44 <monqy> at.html
05:33:55 <elliott> at.html isn't on any web servers. :(
05:34:01 <cswords_> Wait, what OS am I thinking of, then?
05:34:02 <cswords_> Hmmm.
05:34:04 <elliott> cswords_ is hacking into my computer to read my top secret @ files.
05:34:10 <kallisti> email: at@at.org
05:34:12 <cswords_> lol
05:34:14 <cswords_> You didn't know?
05:34:17 <cswords_> I rooted your box hours ago/
05:34:20 <cswords_> I was taking an "exam"
05:34:29 <elliott> Oh, so THAT'S why all this gay porn came up.
05:34:33 <elliott> I assumed I just forgot about it.
05:34:39 <pikhq> Hawt.
05:34:54 <elliott> From this extensive evidence I deduce that cswords_ is pikhq.
05:35:00 <pikhq> Alas, no.
05:35:01 <kallisti> cswords_: yes I'm one of those people who are all pretentious about their electornic genres.
05:35:02 <cswords_> -_-
05:35:12 <cswords_> kallisti, it isn't dubstep if that helps.
05:35:18 <kallisti> a little.
05:35:18 <cswords_> If I can get soundcloud to work I'll link to some.
05:35:26 <monqy> techno pretension is quite a hilarious pretension
05:35:35 <elliott> Techension.
05:35:47 <kallisti> monqy: I'm not pretentious about just techno. I'm pretentious about electronic music genres, obviously.
05:35:53 <monqy> kallisti: that's the joke
05:36:00 <kallisti> monqy: BECAUSE THEY'RE DIFFERENT? DO YOU SEE? YES?
05:36:02 <kallisti> YES.
05:36:03 <kallisti> yes
05:36:04 <monqy> nope
05:36:06 <elliott> http://esolangs.org/wiki/Everything2_Chat_Box_Archive
05:36:06 <elliott> finally!
05:36:11 <elliott> all I've wanted in life is an everything2 chat box archive
05:36:16 <elliott> thanks to spam, I can have it!
05:36:34 <monqy> we also have single fifo, animated chatrooms, bbw dating north dakota, dating program
05:36:52 <kallisti> *antimated
05:36:53 <monqy> there was a good one earlier today but I forget what it was
05:37:02 <monqy> oh yes antimated
05:37:06 <monqy> even better
05:37:18 <elliott> Well gosh darnit, I'm looking for a BBW dating program in North Dakota so that I can use a single FIFO to communicate with animated chatrooms.
05:37:22 <elliott> LOOKS LIKE I'VE GOT IT MADE.
05:37:40 <cswords_> What the fuck?
05:37:42 <monqy> I wonder what antimated chat rooms are
05:37:51 <cswords_> antimated
05:37:52 <cswords_> As in
05:37:53 <cswords_> anti
05:37:54 <cswords_> mated
05:37:54 <elliott> cswords_: We're talking about our wiki spam.
05:37:56 <monqy> How a prosperous Link Building Service Displays Profitable Results on Expenditure
05:38:00 <kallisti> elliott: I used my FIFO to communicate with your antimated BB mom.
05:38:00 <monqy> yes!!!
05:38:07 <elliott> monqy: I read that as "preposterous" first time round and it was better.
05:38:24 <cswords_> Gah
05:38:24 <monqy> i seem to have missed white wives dating black men
05:38:27 <cswords_> My internet is terrible.
05:38:37 <monqy> and secret friends sex chat ;_;
05:38:49 <kallisti> friendship sex chat.
05:38:54 <elliott> You'll never get into our secret friends sex chat now!!!
05:39:02 <monqy> ppc johnny chat
05:39:15 <kallisti> cswords_: I'm sorry that none of this makes any sense to you.
05:39:20 <cswords_> kallisti, http://soundcloud.com/kaosjester/sines-in-space
05:39:24 <monqy> fond memories of my name is johny, what the f**k
05:39:34 <cswords_> Also, http://soundcloud.com/kaosjester/saws-in-bass
05:39:41 <kallisti> cswords_: sines in space? sounds impossible.
05:40:12 <elliott> cswords_: There's no sound in space, dude.
05:40:18 <cswords_> Oh?
05:40:21 <elliott> That's as impossible as de-Bruijn numbering lambdas.
05:40:23 <cswords_> But if you had a Space ship
05:40:33 <cswords_> And you were having a disco on said space ship.
05:40:35 <elliott> By that standard sines on earth are sines in space. :(
05:40:47 <elliott> F- WOULD NOT BUY AGAIN BOOK CLAIMED TO BE ABOUT SPACE BUT WAS ACTUALLY JUST ABOUT EARTH
05:41:01 <monqy> wheres the sines
05:41:12 <elliott> monqy: THERE ARE NO SINES IN SPACE!!!
05:41:14 <elliott> Only square waves.
05:41:36 <cswords_> That must make space travel difficult.
05:41:45 <cswords_> YOU MUST MOVE UP AND DOWN RAPIDLY WHILE TRAVELING!
05:41:49 <elliott> Exactly.
05:41:52 <elliott> That's how the Earth travels.
05:41:55 <kallisti> cswords_: this is kind of like house I would say. Except there was one breakbeat part, but I guess that's okay.
05:42:04 <monqy> oh there's that effect similar to that of rapidly plugging and unplugging ears
05:42:05 <cswords_> lawl
05:42:07 <kallisti> electronic genres are strange.
05:42:09 <cswords_> The second one is housy-er.
05:42:26 <elliott> monqy: Wow, that's ... the best intuitive description ever.
05:42:34 <elliott> kallisti: You knew what he meant first time, right??
05:42:49 <kallisti> elliott: sure.
05:42:56 <cswords_> If we keep this up I will need to fetch more alcohol.
05:43:02 <monqy> blinking : strobe lights :: ear plug cycling : this thing
05:43:03 <elliott> We always operate at this level.
05:43:10 <elliott> Only the toughened few survive.
05:43:13 <elliott> monqy: :D
05:43:13 <cswords_> Hmmm. I feel like coding something. Balmer peak!
05:43:32 <elliott> The Ballmer peak is reached at the point where you can no longer spell "Ballmer".
05:43:55 <cswords_> Oh.
05:43:57 <cswords_> I've had like
05:44:02 <cswords_> A guinness and half a bottle of wine
05:44:11 <cswords_> I'm nowhere near that drunk.
05:44:13 <elliott> cswords_: Don't tell PH.
05:44:17 <cswords_> PH?
05:44:27 <elliott> Phantom_Hoover.
05:44:29 <monqy> alcohol is for old people
05:44:31 -!- GreaseMonkey has joined.
05:44:39 <cswords_> monqy is actually sixteen
05:44:42 <kallisti> monqy: you might be referring to side-chaining compression?
05:44:45 <monqy> cswords_: not yet
05:44:54 <cswords_> lawl
05:45:05 <kallisti> monqy: where everything becomes softer when the kick drum hits.
05:45:11 <kallisti> to emphasize the bass.
05:45:13 <elliott> monqy is actually 4 years old.
05:45:23 <monqy> kallisti: i don't know what you're talking about im bad at techno
05:45:50 <kallisti> monqy: it's a good thing I'm not talking about techno specifically. -more pretentiousness-
05:46:51 <cswords_> It is, in fact, side-chaining compression on the bass line.
05:47:17 <itidus21> ok, so one envies the greener grass.. in spite of the fact that the grass is not infact greener. acting on this envy (which is always a hassle), one now envies ones initial grass which is now the greener.
05:47:45 <kallisti> ..
05:47:57 <kallisti> what
05:48:09 <elliott> hi
05:48:10 <itidus21> "the grass is greener on the other side of the fence"
05:48:14 <cswords_> I live on both sides of the fence and the grass is always green.
05:48:17 <kallisti> cswords_: whatt porgrmus u use 4 soundz0xrz
05:48:27 <cswords_> Reason.
05:48:39 <elliott> I make music with PURE LOGI- wait god dammit Logic is an audio program too.
05:48:52 <elliott> DEAR AUDIO PEOPLE: Stop being so bloody pretentious you are not the epitome of rationality??
05:48:57 <itidus21> I feel like developing!
05:49:02 <elliott> oh good
05:49:04 * kallisti makes music with PURE-DA --- fuuuuuuck
05:49:12 <itidus21> `log developers
05:49:20 <elliott> That's not developing itidus21.
05:49:22 <HackEgo> 2007-10-10.txt:15:40:34: <ehird`> and you have't seen it fail because web developers have to prance around until IE accepts it
05:49:26 <itidus21> `log developers
05:49:33 <HackEgo> 2011-08-20.txt:23:22:30: <fizzie> They're (according to current plans/rumours) going to release a grand total of approximately 1.1 MeeGo devices; the N9, plus the N950 "developers only" phone, which I'm counting as 0.1 because (even though it is a MeeGo device) it's not going to actually be released.
05:50:32 <cswords_> Stupid OpenDNS.
05:50:35 <cswords_> Being all lame.
05:50:36 <kallisti> elliott: I still need to start working on The Best Signal Processing And Music Production Library Ever (in Haskell)... right after I gain more practical experience with Haskell.
05:50:49 <elliott> cswords_: 8.8.8.8 or that Verizon one that I don't recall if you believe you can escape Google's infinite clutches.
05:51:03 <elliott> kallisti: Have I mentioned that your design for that was terrible and mine was awesome?
05:51:05 <cswords_> elliott, I have long ago accepted thgat I cannot.
05:51:12 <cswords_> I just don't remember how to change my DNS settings.
05:51:14 <kallisti> elliott: yes. I have considered different designs.
05:51:15 <itidus21> i'm still not certain which type of person balmer is keen on.
05:51:16 <cswords_> And I can't google it.
05:51:19 <elliott> cswords_: vi /etc/resolv.conf
05:51:21 <kallisti> elliott: involving LAYERS OF ABSTRACTION. -gasp-
05:51:26 <cswords_> ...
05:51:38 <cswords_> So I'm using a windows computer for the music development, whereis where it needs to happne.
05:51:40 <elliott> This is the point where we laugh at cswords_ because he uses Windows.
05:51:47 <cswords_> Nope.
05:51:49 * elliott begins laughter routines.
05:51:51 <itidus21> i use windows
05:51:51 <cswords_> I have a windows box, too.
05:51:53 <monqy> laughe
05:51:58 <cswords_> I also have a mac somewhere...
05:52:04 <cswords_> er, linux
05:52:06 <cswords_> I run arch.
05:52:12 * elliott runs Arch. It's terrible.
05:52:15 <cswords_> But SC2 + Linux is not hte kinded thing.
05:52:18 <kallisti> elliott: oh right it's winter break I need to switch to Debian eventually.
05:52:20 <monqy> is anything not terribel................
05:52:21 <cswords_> gah, that spelling was terrible
05:52:22 <elliott> By the way, I hate everything.
05:52:24 <cswords_> Debian is terrible.
05:52:30 <cswords_> Not as bad as Gentoo.
05:52:34 <kallisti> cswords_: do you watch pro SC2 games?
05:52:34 <itidus21> i run winxp sp2
05:52:36 <cswords_> elliott, just switch to slackware.
05:52:37 <cswords_> it'll be fine.
05:52:39 <elliott> Debian is more terrible than, but not as obnoxious as Arch. YMMV.
05:52:40 <cswords_> kallisti, yes!
05:52:52 <kallisti> cswords_: I watch them on youtube.
05:52:55 <elliott> cswords_: If I'm switching to another existing distro it'll be NixOS.
05:52:55 <kallisti> all the time.
05:52:58 <kallisti> like. daily.
05:53:07 <elliott> kallisti is actually the abstract concept of StarCraft II.
05:53:35 <itidus21> even though i've never been a starcraft player, or a pc-game player, i will try to make more starcraft references from now on
05:53:40 <elliott> cswords_: Anyway, go find your internet connection in Control Panel, and then double click it and it's in one of those tabs.
05:53:52 <elliott> 8.8.8.8 and 8.8.4.4.
05:54:09 <cswords_> God
05:54:16 <cswords_> I was going to try to avoid doing that much work to fix it
05:54:19 <cswords_> And instead just bitch
05:54:19 <kallisti> itidus21: you can use "canon rush" to mean any kind of cheap trick that doesn't pay off in the long run.
05:54:20 <cswords_> But NO
05:54:23 <kallisti> itidus21: *cannon
05:54:24 <cswords_> You have to make it sound easy
05:54:25 <elliott> That's like three clicks.
05:54:32 <elliott> You just can't operate on our level.
05:54:52 <itidus21> hmmm.. freenode is really zerg rushing me
05:55:07 <itidus21> verily
05:55:08 <kallisti> itidus21: also "I nydus'd her main" is a popular sexual reference, for some reason.
05:55:15 <elliott> kallisti: Stop it stop it.
05:55:18 <elliott> You're encouraging him.
05:56:12 <kallisti> itidus21: cannon rush to 3gate DT rush blah blah blah
05:56:15 <itidus21> i guess battlenet references are important too
05:56:18 <kallisti> you can find endless combinations
05:56:38 <cswords_> Wow, that's way better.
05:56:52 <cswords_> elliott, I've been running linux since I'm 12. Back off!
05:57:02 <monqy> whoa!!!!!!!
05:57:04 <itidus21> fungot is running out of minerals
05:57:04 <fungot> itidus21: where is samsara?." " yeah, i see what the value of the current working directory
05:57:14 <elliott> cswords_: I've been running Linux since I was 10 or 11, I think.
05:57:18 <elliott> I am now 5 years old.
05:57:22 <elliott> That's one year older than monqy!
05:57:22 <cswords_> Sweet
05:57:27 <cswords_> You have never ran linux before.
05:57:28 <cswords_> Excellent.
05:57:38 <cswords_> Shit, there was something I needed to buy from amazon.
05:57:39 <elliott> Uh, I just ran it in the FUTURE? With FEATHER? Hello?
05:57:41 <cswords_> I don't remember what it is.
05:57:44 <elliott> You must be new here.
05:57:52 <kallisti> cswords_: for some reason husky has like completely stopped casting pro games. I don't understand.
05:58:00 <cswords_> I don't like Husky or HD.
05:58:03 <itidus21> feather sounds like some kind of protoss technology
05:58:05 <cswords_> I watch Day9 and GSL.
05:58:18 <kallisti> cswords_: I don't like HD but Husky is a pretty good caster. he's just not a very good player so his strategy stuff isn't good.
05:58:23 <kallisti> cswords_: Day9 is great.
05:58:37 <cswords_> FUCK
05:58:39 <elliott> itidus21: Stop iiiit.
05:58:46 <cswords_> I needed to buy something IMPORTANT.
05:58:53 <monqy> oops
05:59:02 <itidus21> your base is under attack
05:59:03 <cswords_> The lamest part about getting married is that you can't ask for knives.
05:59:21 <kallisti> cswords_: though I wish day9 would do just a few pro games. I like his strategy analysis but sometimes I just want to watch him cast a game.
05:59:39 <cswords_> kallisti, watch MLG?
05:59:55 <kallisti> cswords_: how? where?
05:59:57 <itidus21> elliott: its fairly safe since i really haven't played the game in any meaningful extent
06:00:08 <cswords_> When MLG happens.
06:00:12 <cswords_> Day9 always casts.
06:00:13 <cswords_> It's great.
06:00:17 <kallisti> cswords_: right but like... where do I view this?
06:00:20 <kallisti> preferably on the internet.
06:00:25 <kallisti> or is it like... a television thing?
06:01:33 <kallisti> cswords_: I remember the first time I heard day9 cast mlg, and thought he was annoying.
06:01:40 <kallisti> because I was accustomed to Husky's beautiful voice. :P
06:01:48 <cswords_> Well I can't help that your'e dumb.
06:01:50 <cswords_> :P
06:01:51 <kallisti> lol
06:01:56 <cswords_> It's on the internet.
06:02:05 <cswords_> MLG is a US-based tournament.
06:02:08 <cswords_> It happens about once a month.
06:02:12 <cswords_> They livestream the games.
06:02:14 <kallisti> cswords_: I changed my mind. The casting was kind of bad for the first game I watched.
06:02:19 <kallisti> lots of shouting. :P
06:02:34 <kallisti> but then I listened to more day9 stuff.
06:03:21 <oklopol> wow what's this here now, cswords' nick is of such a bright and morningly color
06:03:45 <oklopol> my eyes are rejoicing
06:04:27 <cswords_> WTF does that even mean?
06:04:54 <oklopol> er
06:05:06 -!- cswords_ has changed nick to cswords.
06:05:08 <oklopol> can you be more specific
06:05:18 <cswords> wow what's this here now, cswords' nick is of such a bright and morningly color
06:05:35 <oklopol> well "what's this here now" means i'm astonished about something
06:05:48 <cswords> Thanks.
06:05:50 <cswords> Thanks for that.
06:06:07 <oklopol> well i'm going to explain the rest as well, just gimme a minute
06:06:19 <oklopol> cswords' nick is your nick which i see on my screen
06:06:27 <oklopol> when you say things, i see your nick before those lines
06:06:35 <oklopol> your nick is cswords
06:06:48 <oklopol> now, your nick has a color, as is obvious from my line
06:06:55 <oklopol> it is very bright and morningly.
06:06:55 <monqy> was it bright and morningly
06:06:57 <oklopol> yes
06:06:57 <monqy> :o
06:07:02 <oklopol> it was very bright and morningly
06:07:08 <oklopol> and still is
06:07:16 <oklopol> bright means like emits lots of light
06:07:21 <cswords> Aren't.
06:07:23 <cswords> What the fuck
06:07:26 <monqy> all I see is grey; my eyes are rejoicing
06:07:30 <cswords> Aren't all the nicks the same color?
06:07:34 <cswords> Why would mine be different?
06:07:43 <monqy> different clients or extensions or w/e
06:07:47 <monqy> some people like colored names
06:07:49 <kallisti> cswords: but yeah... HD is bad.
06:07:54 <oklopol> no, none of the colors are the same.
06:07:55 <monqy> I don't care enough to do name coloring
06:08:02 <oklopol> as is very common in modern irc clients
06:08:12 <monqy> sometimes name coloring can be ugly
06:08:17 <oklopol> try always
06:08:37 <oklopol> i don't care enough to not do it. because it's done automatically
06:08:37 * kallisti just reads peoples' names.
06:08:39 <kallisti> it's amazing.
06:08:48 <monqy> one time I heard of name coloring that colored both the foreground and the background
06:08:51 <monqy> double ugly
06:08:55 <cswords> What color is mine, oklopol?
06:09:00 <elliott> bright and morningly
06:09:07 <oklopol> cswords: super bright morning green
06:09:23 <elliott> Because mornings are green in Finland!
06:09:52 <oklopol> mine colors backgrounds too
06:10:00 <monqy> eugh
06:10:07 <cswords> Ugh.
06:10:09 <cswords> WTF internet.
06:10:11 <monqy> nonblack backgrounds make me sad
06:10:16 <monqy> make my eyes sad
06:10:18 <monqy> make me sad
06:10:19 <oklopol> well it makes logreading way faster
06:10:23 <elliott> monqy: White on black makes your eyes sad.
06:10:38 <oklopol> but then again i'm sure you could do all kinds of horrible things with colors that would make it even faster
06:10:55 <monqy> elliott: I prefer it a bit dimmer than white
06:11:11 <monqy> I also have some green stuff going on
06:11:12 <elliott> monqy: Well, pure black backgrounds in general are a bad idea on LCDs. Try #333.
06:11:26 <elliott> Green on black. You're a bad person. I bet it's monospaced too.
06:11:30 <elliott> It might even be aliased.
06:11:35 <monqy> not aliased
06:11:42 <monqy> but it's a bitmap font
06:11:48 <monqy> do i lose points for that
06:11:51 <monqy> oh wait
06:11:53 <elliott> There are antialiased bitmap fonts?
06:11:54 <monqy> i mixed up
06:11:57 <monqy> aliased and antialiased
06:12:00 <monqy> woops
06:12:00 <oklopol> white on black is my favorite irc and porn style
06:12:02 <monqy> cries
06:12:09 <elliott> You've pretty much lost all the points monqy.
06:12:12 <elliott> It's been nice knowing you.
06:12:12 <monqy> :(
06:12:22 <monqy> the green is just for the
06:12:23 <monqy> uh
06:12:29 <elliott> "everything"
06:12:31 <monqy> no
06:12:36 <monqy> just for the very bottom and top
06:12:42 <elliott> That's too much green, monqy.
06:12:44 <monqy> where the topic goes and the info bar thing goes
06:12:45 <zzo38> My IRC is many colors on black with monospaced
06:12:55 <monqy> what's so bad about green
06:12:57 <monqy> green is coooool
06:13:12 <oklopol> green can be bright and morningly
06:13:14 <elliott> You're not a hacker monqy. You won't be like in those movies just because you use green to make your IRC client less boring.
06:13:23 <elliott> oklopol: Yes, I'll allow bright and morningly greens.
06:13:26 <elliott> But only for nicks.
06:13:34 <elliott> Other contexts are unworthy of the privilege of that colour.
06:13:39 <monqy> i dont want to be a hacker :( but i don't have other good colors
06:13:48 <monqy> blue is a bit too dim and red is a bit too bright
06:13:49 <monqy> green is
06:13:51 <monqy> ~just right~
06:13:53 <monqy> and also a good color
06:13:58 <elliott> There are more than three colours, monqy.
06:14:00 -!- azaq23 has quit (Remote host closed the connection).
06:14:08 <zzo38> monqy: I think, select the color of your choice; the choice of your color does not make you a hacker or not hacker
06:14:16 -!- cswords_ has joined.
06:14:16 <monqy> thanks zzo38
06:14:19 <monqy> i feel better now
06:14:22 <elliott> STOP PROMOTING EQUALITY
06:14:36 <cswords_> Ah
06:14:49 <zzo38> What equality?
06:14:55 <monqy> i could pick grey but so all the chatter is grey and making the ui grey would be boringggg
06:15:02 <elliott> Equality of green and non-green people!
06:15:05 <monqy> are there other colors
06:15:10 <elliott> monqy: Yes.
06:15:12 <monqy> :o
06:15:16 <cswords_> So
06:15:22 <cswords_> Resetting modem = good internet
06:15:23 <elliott> monqy: Haven't you upgraded to RGBOA yet?
06:15:23 <zzo38> Why should other people care what color you use on your IRC if other people do not use your computer?
06:15:28 <elliott> Red, green, blue, octarine, alpha.
06:15:40 <monqy> :o octarine
06:15:44 <oklopol> some people are way better than others
06:16:00 <monqy> alpha would be bad because my background color is black so it would all just blend in
06:16:17 <kallisti> elliott: pure (==) --promoting equality
06:16:38 <cswords_> Nobody uses any computers.
06:16:40 <elliott> :t pure (==)
06:16:41 <cswords_> That I won
06:16:41 <lambdabot> forall a (f :: * -> *). (Eq a, Applicative f) => f (a -> a -> Bool)
06:16:43 <cswords_> Except me
06:16:46 <elliott> cswords_: What.
06:17:08 -!- cswords has quit (Ping timeout: 268 seconds).
06:17:28 <oklopol> zzo38: would you not care if someone killed the whole population of norway just because you don't know any people worth knowing from there?
06:17:31 <oklopol> OOOOOPS
06:17:31 <cswords_> I don't know.
06:17:32 <cswords_> Never mind.
06:18:36 <zzo38> oklopol: That is different for at least two reasons.
06:18:39 <kallisti> elliott: why did you check the type of that...
06:18:43 <oklopol> tell me
06:18:49 <elliott> kallisti: Magic.
06:18:52 <oklopol> i need to leave soonish
06:19:07 <kallisti> elliott: "magic" is only an acceptable answer to "how" questions.
06:19:43 <oklopol> in one case, someone is hurting themselves, in the other, they are only hurting (all) norwegians (to death)
06:19:44 <cswords_> oklopol, don't go!
06:20:16 <oklopol> i have to go do some programming
06:20:25 <kallisti> oklopol: Norway must stay. Sweden must go.
06:20:33 <oklopol> and before that, visit the uni to leave my friend's projector there
06:20:38 <elliott> oklopol: You still program? Ever?
06:20:44 <oklopol> well kind of
06:21:05 <elliott> `addquote <oklopol> in one case, someone is hurting themselves, in the other, they are only hurting (all) norwegians (to death)
06:21:07 <HackEgo> 766) <oklopol> in one case, someone is hurting themselves, in the other, they are only hurting (all) norwegians (to death)
06:21:14 <oklopol> what we do is that i stare at the screen and my friend programs, and when he has a bug i look at the screen and fix it, and program the few interesting ones
06:21:31 <oklopol> (staring doesn't imply looking)
06:21:40 <oklopol> erm
06:21:52 <oklopol> ones? like the few interesting bugs? i think i meant, like, things.
06:22:05 <zzo38> oklopol: Yes, that is one thing. If you hurt yourself on purpose then probably that is what you wished anyways..... But there is also, many other people might care even if one person does not care (note the qualified "just because you don't know any people worth knowing from there" as well).
06:22:33 <oklopol> well you make a waterproof point
06:22:46 <oklopol> i guess all i can say is LEAVING TIME, WOOOOOO
06:22:49 <oklopol> see you :)))))
06:23:23 <elliott> :')
06:37:04 -!- Slereah_ has quit (Ping timeout: 244 seconds).
06:42:35 -!- augur has changed nick to NOTBROSEFSTALIN.
06:42:42 -!- NOTBROSEFSTALIN has changed nick to augu.
06:42:44 -!- augu has changed nick to augur.
06:59:31 -!- DCliche has quit (Quit: You are now graced with my absence.).
07:30:58 <pikhq> Wow.
07:31:02 <pikhq> Merge sort is older than bubble sort.
07:32:12 <pikhq> Merge sort was done in 1945 by von Neumann, bubble sort in 1956 by some grad student at Stanford.
07:33:07 <kallisti> aw, I was hoping quicksort would be older than bubblesort too
07:35:34 <fizzie> But radix sort is older still: "Radix sort dates back as far as 1887 to the work of Herman Hollerith on tabulating machines."
07:36:02 <kallisti> turns out people like to sort stuff fast!
07:37:19 <fizzie> I wouldn't be surprised if insertion sort also beat bubble-bobble, but couldn't find a reference for that, just that shell sort (as an extension of insertion sort) is from 1959.
07:37:59 <kallisti> modern cutting edge research into sorting algorithms includes: bogosort and quantum bogosort.
07:40:25 <kallisti> best case on bogo sort is even O(n)
07:40:28 <kallisti> !!!
07:42:02 <Sgeo> What was the point of bubble sort?
07:42:13 <Sgeo> Besides educational?
07:42:27 <fizzie> Non-seriously you could argue that the best case for any sort is O(1), happening when the array is already sorted and a random cosmic ray flips the instruction pointer (and related bits of memory, if any) so that the implementation glitches and jumps directly to the "okay, sorted" stage.
07:43:31 <kallisti> O(1) sorting could be possible if you maintained some kind of "sorted" bit. I'm not really sure if you could maintaining its accuracy with constant time though.
07:43:46 <kallisti> weroweroiijwer enghlish
07:44:15 <pikhq> I'm calling that bogo-best case.
07:44:37 <kallisti> but you could certainly turn on the sorted bit after you sort something, and then turn it off when you modify the sequence.
07:45:20 <pikhq> Bogo-best case for sorting is, indeed, O(1).
07:45:33 <kallisti> for appends/pushes/pops you could actually continue to maintain the sorted bit in constant time provided you also knew if it were ascending or descending order.
07:45:42 <kallisti> pikhq: oh I thought it was linear, because it has to shuffle it once.
07:46:11 <kallisti> oh
07:46:13 <kallisti> bogo-best
07:46:15 <pikhq> kallisti: "Bogo-best case" is the case where the list is already sorted and the instruction pointer randomly skips the sorting function.
07:46:17 <kallisti> not bogosort best case :P
07:46:24 <kallisti> gotcha
07:47:11 <fizzie> "Bozo sort is another sorting algorithm based on random numbers. If the list is not in order, it picks two items at random and swaps them, then checks to see if the list is sorted. The running time analysis of Bozo Sort is more difficult, but some estimates are found in H. Gruber's analysis of perversely awful randomized sorting algorithms.[1]"
07:47:15 <fizzie> "[1] Gruber, H.; Holzer, M.; Ruepp, O., "Sorting the slow way: an analysis of perversely awful randomized sorting algorithms", 4th International Conference on Fun with Algorithms, Castiglioncello, Italy, 2007."
07:47:26 <fizzie> Computer scientists having fun? How inappropriate.
07:48:14 <kallisti> a constant-time sort is possible for pointers to C arrays by swapping out the array with an already sorted array.
07:48:45 <kallisti> for example, an empty array!
07:49:34 <fizzie> "To our knowledge, the analysis of perversely awful algorithms can be tracked back at least to the seminal paper on pessimal algorithm design in 1984 [2]. -- Among other solutions, the formerly mentioned work contains a remarkably slow sorting algorithm named slowsort achieving running time Omega(n^(log n/(2+eps))) even in the best case."
07:49:42 <fizzie> These dudes certainly like their slow sorts.
07:51:17 <kallisti> bogosort and bozosort have the maximal worst time at O(infinity)
07:51:24 <kallisti> can't beat that
07:51:49 <olsner> if so, I think they would fail to count as algorithms
07:52:24 <olsner> (because an algorithm must terminate)
07:52:26 <kallisti> though isn't O(infinity) a kind of constant time?
07:52:30 <kallisti> where the constant is infinity?
07:52:41 <kallisti> it doesn't vary with the input.
07:52:42 <pikhq> The odds of them halting are 1.
07:52:49 <fizzie> olsner: Well, it's a probabilistic algorithm, and it will "almost surely" (as they say) terminate, so.
07:52:52 <pikhq> But they're not guaranteed to halt.
07:53:05 <pikhq> :P
07:53:12 <fizzie> With a bad PRNG, it might also in practice never halt.
07:53:16 <olsner> fizzie: so "almost" algorithms then? :)
07:53:47 <fizzie> Though if you say "in practice", I suppose it'll halt at heat death time, if not earlier.
07:53:49 <pikhq> Quantum bogosort is much better.
07:54:16 <pikhq> Yay, O(n).
07:54:38 <kallisti> if you're lucky
07:54:44 <kallisti> your universe only gets a few of those perfect sorts.
07:55:10 <pikhq> But by MWI and quantum immortality, I'm sure to be in the universe that gets perfect sorts!
07:55:13 <pikhq> :P
07:55:25 <kallisti> consider the universes in which a bogosort was needed to run at O(n) in order to save humanity
07:55:35 <kallisti> now consider the ones that failed to do so. tragic.
07:55:42 <pikhq> Tragic indeed.
07:55:53 <kallisti> now consider the ones that succeeded. TRIUMPH.
07:56:09 <pikhq> Should've had broken world destruction mechanisms.
07:56:16 <fizzie> I think it's funny how the "List of dates predicted for apocalyptic events" also lists heath death of the universe, at (a remarkably stetson-harrison looking number of) 10^100 years, claimed by "various scientists". (And the Sun's red-giant stage in about 5 billion years, also claimed by "various scientists".)
07:56:59 <kallisti> fizzie: the only true apocalypse is IPv4 address exhaustion.
07:57:20 <fizzie> Don't say that, someone's going to add IPv4 exhaustion predictions onto that list.
07:57:22 * kallisti needs to get a static IP to Prepare.
07:57:37 <kallisti> but maybe even that won't save me!
07:58:23 <elliott> <kallisti> for appends/pushes/pops you could actually continue to maintain the sorted bit in constant time provided you also knew if it were ascending or descending order.
07:58:36 <elliott> kallisti: the word you are looking for here to explain why this doesn't make everything O(1) is "amortised"
07:59:00 <kallisti> elliott: wow thanks I had no clue what that was.
07:59:09 <pikhq> Clearly. :P
07:59:19 <fizzie> I "have" two IP addresses, but sadly they're just assigned to me by the ISP and not actually allocated to myself, so when the Ipocalypse hits they can just terminate my contract and reclaim them. :(
07:59:33 <elliott> If only Ilari were here.
07:59:37 <elliott> fizzie: Track down Ilari for us.
07:59:40 <elliott> Bring him home.
07:59:50 <fizzie> I don't even know his last name.
08:00:06 <zzo38> ReaderT seem to make a Kleisli compose, for example you make a monoid of (ReaderT x m x) by Kleisli composition
08:00:07 <fizzie> There are quite a few of Ilaries in Finland.
08:00:41 <zzo38> mempty = ReaderT return; mappend (ReaderT x) (ReaderT y) = ReaderT (x >=> y);
08:00:46 <olsner> finland, famous for its ilaries
08:01:02 <zzo38> Because it is also like a Kleisli category
08:01:08 <kallisti> elliott: "amortized" doesn't explain in what way.
08:01:43 -!- monqy has quit (Quit: hello).
08:01:43 <fizzie> olsner: Land of a thousand Ilaries.
08:02:09 <elliott> fizzie: Unfortunately grepping produces naught.
08:02:18 <olsner> hmm, some sense of the IPv4 address exhaustion has already happened though, hasn't it?
08:02:19 <elliott> Wait, Ilari is online now.
08:02:23 <elliott> fizzie: As a Finn you must invite Ilari back.
08:02:24 <elliott> olsner: Yes.
08:02:44 <olsner> it just hasn't yet become apocalyptic
08:02:49 <fizzie> olsner: In fact, land of the 13724 Ilaries, at December 12th, according to the Population Register Centre.
08:02:57 <olsner> fizzie: wow!
08:03:32 <elliott> *Ilarien
08:04:15 <fizzie> Or the 13724 male Ilaries and "less than 15" female ones, even though it's a male name. (It doesn't give exact numbers if there are <=5 people in the particular name/gender/year-of-birth-range bucket.)
08:04:54 <fizzie> Also some of those are dead.
08:05:16 <fizzie> Of surnames it gives different living/dead counts, but of first names no. :/
08:05:25 <olsner> Det finns 206 män som har förnamnet Ilari. Av dessa har 20 namnet Ilari som tilltalsnamn.
08:05:37 <olsner> but no swedes with ilari as their surname, apparently
08:05:37 <kallisti> why do I have 20 cents in my paypal.
08:06:03 <fizzie> There are "less than 5" dead people with the surname "Ilari"; none living.
08:06:23 <olsner> no living dead people?
08:06:52 <fizzie> 10 living, 7 dead, and "less than 5" had-the-name-earlier-but-not-any-more people with my surname. It's an exclusive club.
08:07:22 -!- zzo38 has quit (Remote host closed the connection).
08:09:01 <olsner> oh, 3 people in sweden have olsner as their surname
08:10:19 <elliott> fizzie: INVITE ILARI BACK ;__;
08:10:29 <elliott> hes our bef
08:10:29 <elliott> bff
08:10:31 <elliott> fbfbf
08:10:59 <elliott> hmm, 2011-04-30 was the last day Ilari was in here
08:11:03 <elliott> <oerjan> Ilari: i am _so_ tempted to ban you for ignoring my comments...
08:11:12 <elliott> last non-join/part line mentioning Ilari before he left :P
08:11:25 <olsner> and there are 16 swedes (all men) with the name Django
08:11:34 <fizzie> I don't want to, it would be a SOCIAL INTERACTION THING, I don't do those.
08:11:43 <fizzie> olsner: It takes 16 to Django.
08:11:46 <elliott> fizzie: I KNOW YOU'RE A FINN BUT CAN'T YOU NOT BE A FINN JUST FOR A LITTLE WHILE?
08:13:32 <fizzie> <=20 Djangos in Finland; <=10 male, <= female; <=5 men born in 1980-99, <=5 women born in 1980-99, <=5 men born in 2011, <=5 women born in 2011. So during this year there's been at least one boy and girl both named Django.
08:13:46 <fizzie> Wonder if they're named after the web framework.
08:13:57 <fizzie> Also whether they're in the same family.
08:14:05 * elliott decides to name his future children after web frameworks.
08:14:16 <elliott> ASP.NET MVC is such a good baby name.
08:14:32 <fizzie> "Little Aspy", you can call him/her.
08:14:41 <fizzie> /it.
08:18:59 <cheater> fizzie: what are you using to determine those name-related statistics?
08:19:23 <olsner> the department of name-related statistics, obviously
08:22:26 <fizzie> There's a web-terface to our population registry; it can look up given names (and return a histogram-ish thing of counts per gender/birth-year-range) and surnames (counts per gender/{current name,ex-name,deceased}).
08:22:42 <fizzie> http://verkkopalvelu.vrk.fi/Nimipalvelu/default.asp?L=3
08:25:07 <pikhq> "verkkopalvelu" Oh, Finland, your non-Indoeuropeanness is so strange.
08:27:52 <fizzie> Lit. "network service".
08:28:21 <cheater> The Population Information System does not contain the surname you searched for
08:29:45 <cheater> not a big surprise.
08:30:10 <cheater> does it contain sweden too fizzie?
08:30:23 <cheater> or just finland finland
08:30:40 <olsner> different countries, man
08:31:14 <olsner> the swedish counterpart: http://www.scb.se/Pages/NameSearch____259432.aspx
08:32:08 <olsner> they actually have that in english too, but since swedish is indo-european you should have no problems understanding it
08:33:36 <elliott> fizzie: Does it contain Russia?
08:33:40 <elliott> How about France?
08:35:26 <elliott> Huh, Hitchens died.
08:52:21 <kallisti> elliott: so does infinite time technically count as a sort of constant time or does infinity not work like that.
08:52:51 <elliott> kallisti: "Infinity" is not a real number.
08:52:55 <kallisti> or do algorithms not work like that. since they must always halt.
08:52:57 <kallisti> elliott: I'm aware.
08:53:36 <elliott> Can I just say "no, it doesn't count" or will you ask why?
08:53:44 <kallisti> no that's fine.
08:54:14 <elliott> No, it doesn't count.
08:55:21 <kallisti> but why? it doesn't vary with input.
08:55:28 <kallisti> >:)
08:55:30 <pikhq> It's also a non-number.
08:55:46 <kallisti> is big O constrained to reals?
08:56:06 <elliott> kallisti: I'm not answering the "why", that's why I checked first.
08:56:07 <kallisti> I guess so, yes.
08:56:52 <pikhq> elliott: Well, there's the unexplanative answer.
08:56:57 <pikhq> "It just doesn't work that way".
08:57:02 <pikhq> I'm going with that.
08:57:09 <pikhq> And considering sleep.
08:57:42 <kallisti> I ask because Wikipedia lists bogosorts worst case complexity at O(infinity)
08:57:53 <kallisti> which I'm guess is not an actual thing but just an intuitive idea?
08:58:00 <pikhq> As far as I'm aware.
08:58:33 <elliott> Sure O(\infty) makes sense.
08:58:40 <elliott> See http://en.wikipedia.org/wiki/Big_O_notation.
09:00:52 <kallisti> so O(infinity) is O(g(x)) where g(x) = infinity
09:00:59 <kallisti> LOOKS PRETTY CONSTANT TO ME. :>
09:01:07 <kallisti> constantly infinite.
09:01:40 <pikhq> Note the bit about "reals" there.
09:01:50 <pikhq> \infty is not in R.
09:01:56 <kallisti> yeah I noticed that.
09:02:51 <kallisti> so then the O(infinity) that makes sense to elliott is not the thing that's being described here. Though maybe I'm missing some section about infinity.
09:03:39 <elliott> f(x) = O(\infty) iff there exists a positive real number M and a real number x_0 such that |f(x)\ <= M|\infty| for all x > x_0
09:03:48 <elliott> f(x) = O(\infty) iff there exists a real number x_0 such that |f(x)\ <= |\infty| for all x > x_0
09:03:53 <elliott> f(x) = O(\infty) iff there exists a real number x_0 such that |f(x)| <= \infty for all x > x_0
09:04:04 <elliott> Everything is <= \infty, blah blah blah
09:04:11 <elliott> It's about growth, \infty makes perfect sense there
09:04:19 <elliott> It means unbounded growth
09:04:47 <kallisti> ah okay. O(1) is no growth.
09:04:56 <kallisti> YES, I CAN INTUIT THIS.
09:05:17 <kallisti> but I don't grok the math much. Soon I'll be taken an algorithm analysis class though.
09:05:20 <kallisti> so maybe I'll actually learn something.
09:05:37 <elliott> It is... really not difficult, f(x) here is the number of steps f takes to complete.
09:05:44 <kallisti> no I get all of that.
09:05:47 <elliott> Machine instructions, whatever, it's all constant factors so it ends up equivalent.
09:05:50 <fizzie> Once you go Inuit, you never come out of it. (elliott: that's an isometric quote this time.)
09:06:11 <kallisti> elliott: I understand what the function represents.
09:06:35 <elliott> fizzie: Thanks for letting me know.
09:07:02 <fizzie> I'm trying to find it but I just recall that the name wasn't very related to the contents.
09:07:20 <elliott> http://isometric.sixsided.org/strips/you_dont_go_back
09:07:24 <elliott> Related enough.
09:07:27 <elliott> It's even on the front page.
09:07:30 <fizzie> Oh.
09:07:44 <fizzie> I was being too diffikult. :/
09:07:46 <elliott> This is a good comic.
09:07:47 <kallisti> elliott: oh hmmm, big O notation really isn't saying much at all.
09:07:50 <elliott> So much better than Station V3.
09:07:53 <kallisti> elliott: it basically eliminates constant factors.
09:07:59 <elliott> kallisti: You only just realised?
09:08:01 <kallisti> in the actual definition
09:08:09 <kallisti> elliott: no I knew that just not /how/
09:08:17 <kallisti> I have never actually sat down and studied the definition of big O
09:08:20 <elliott> Saying an algorithm is O(g(n)) is just saying that the number of steps it takes is g(n), modulo constant factors.
09:08:26 <kallisti> just what it means intuitively.
09:08:30 <kallisti> elliott: yes yes I know.
09:08:36 <elliott> Well, now you know twice.
09:08:43 <elliott> So that's the full battle.
09:09:12 <kallisti> elliott: I thought perhaps there was more to it than that.
09:09:22 <elliott> Come on guys, don't G.I. Joe references satisfy you?!?!?!
09:09:26 <elliott> It's FUNNY.
09:09:35 <elliott> fizzie: Tell me you got it.
09:09:43 <shachaf> elliott: I have no idea what G.I. Joe is.
09:09:51 <shachaf> The only thing I've ever seen is references.
09:09:52 <fizzie> Yes, yes, twice a half is the whole enchilada, sure.
09:09:53 <elliott> shachaf: YOU'RE JUST NOT GOOD (BAD) ENOUGH FOR US
09:09:55 <shachaf> In particular, that reference.
09:10:14 <elliott> I have actually watched *several episodes* of the animated series.
09:10:16 <kallisti> elliott: lawyer time: it doesn't /have/ to be "steps"
09:10:33 <kallisti> elliott: it could be oranges, for example. You could have an orange orchard algorithm.
09:10:36 <elliott> kallisti: Yes it does; big-O in algorithms is always referring to the time the function takes.
09:10:46 <shachaf> It does?
09:10:55 <kallisti> elliott: not space?
09:10:55 <elliott> shachaf: Well, in the kind of low-class dreck /kallisti/ will be reading.
09:11:01 <elliott> Or that, yse.
09:11:02 <elliott> yes.
09:11:04 <kallisti> lol
09:11:04 <elliott> But not oranges.
09:11:10 <kallisti> it COULD be though
09:11:16 <kallisti> there is no unit specified.
09:11:18 <shachaf> elliott: It could be "comparisons" or "swaps" or something.
09:11:30 <shachaf> I guess those count as steps.
09:11:33 <kallisti> it could be people. the rate of growth of people ignoring uh, multiplication.
09:11:42 <shachaf> In fact, if you broaden your definition of "step" enough, anything counts as a step.
09:11:48 <elliott> shachaf: That's why I clarified to "time".
09:12:11 <elliott> shachaf: But we can just fix the definition of "step" to something Turing-machiney which has O(1) integer arithmetic, and we'll b done.
09:12:11 <kallisti> in minecraft, n could be boredom.
09:12:12 <elliott> *be
09:12:19 <kallisti> constant factors could include how prone you are to boredom
09:12:26 <kallisti> but the rate of growth is always factorial for everyone.
09:12:27 <kallisti> :>
09:12:38 <shachaf> O(1) integer arithmetic?
09:13:19 <elliott> shachaf: People tend to assume that when calculating big-Os. At least in my experience.
09:13:36 <kallisti> people who actually play minecraft just have an enormously tiny constant factor, so they haven't realized they're bored yet.
09:15:14 * kallisti sound maths.
09:15:32 <shachaf> elliott: By the way, huge pages didn't magically make my thing faster. :-(
09:15:43 <elliott> shachaf: That's because it's NoSQL. Try adding some SQL and it'll be fast.
09:15:57 <shachaf> Who said anything about NoSQL?
09:16:13 <elliott> Memcache is, like, NoSQL, so you're NoSQL too, so EVERYTHING YOU TOUCH IS NOSQL.
09:16:21 <shachaf> I suppose this program doesn't have any SQL support.
09:16:39 <shachaf> Quite a lot of things are NoSQL, come to think of it.
09:16:46 <kallisti> NoSql could easily be a rip-off band copying NOFX
09:16:48 <elliott> My toothbrush is NoSQL.
09:16:53 <elliott> That's why us Brits have such bad dental hygiene.
09:17:22 * elliott is kidding; he doesn't actually have teeth.
09:17:54 <kallisti> I thought it was because you ate limes all day.
09:18:03 <kallisti> limes and tea.
09:18:19 <kallisti> 90% of the britons diet.
09:18:21 <elliott> kallisti: That was the predominant hypothesis before Newton invented science and discovered that what we needed was a good dose of SQL.
09:18:31 <kallisti> lolwat
09:20:00 <fizzie> elliott: Men, remember that it was my citrus laser which protected you from the space scurvy! (I've got that comic in my brain now, thanks to earlier.)
09:20:00 <kallisti> my plan for future success: invent time machine; travel to 90s; invest in promising startups; exploit stupid things like poor input sanitization and javascript validation
09:22:03 <kallisti> other plans: take versions of present day open source software and sell it to somebody for last sums of money (would that even work???)
09:22:11 <kallisti> s/last/vast/
09:23:06 <fizzie> You could sell the completed Hurd to Stallman in the 80s.
09:23:19 <kallisti> fizzie: no such thing
09:23:53 <kallisti> (haha hurd humor)
09:29:13 <fizzie> candide's ",english", the most useful bot-command ever: http://codepad.org/EaZo3jrm
09:29:18 <fizzie> It translates C code to English.
09:36:30 <shachaf> fizzie: What is that function?
09:36:59 <elliott> Hey shachaf, take a look at this (probably) GHC bug: http://stackoverflow.com/questions/8531997/adding-ghcis-inferred-type-signature-causes-an-error
09:37:00 <fizzie> It's a brainfuck interp; I just picked something short.
09:37:04 <Sgeo> The last line is a punchline
09:37:10 <elliott> I HEAR YOU'RE A CONNOISSEUR OF THEM.
09:37:38 <elliott> fizzie: Hey, it turns DeCSS into something legally redistributable...
09:41:27 <shachaf> elliott: Not as good as the one where it deletes your source code.
09:42:13 <Sgeo> o.O
09:43:17 <shachaf> <CTCP>ACTION �n����������n�p�@�?����U`>�1�R`>A�.���r��r��r��r��r��r��r��r�p��0s���������@s��t� �?����U`>W1�R`>A�.��Sw�Sw�Sw�Sw�Sw�Sw�Sw�Tw��t���w����������w�y��?����U`>ǰ�R`>A�.���{��{��{��{��{��{��{��{�y��0|���������@|
09:43:23 <elliott> shachaf: Hi.
09:44:11 <elliott> Sgeo: "ghc had a bug once where it deleted the source file if it had a type error. Quite sensible, I think." --augustss
09:44:14 <shachaf> I hope that random memory I just pasted didn't have anything confidential in it.
09:44:21 <elliott> Or the HIPSTER 2011 TWITTER VERSION, http://twitter.com/#!/bos31337/status/116372971509121025.
09:44:27 <elliott> shachaf: You forgot the terminating one-byte.
09:44:48 <elliott> Hey, snow.
09:45:20 <Sgeo> Unicode snow?
09:45:23 <elliott> Yes.
09:45:26 <elliott> IRL.
09:45:28 <elliott> IRL Unicode snow.
09:45:41 <shachaf> elliott: Note that the [] is apparently superfluous.
09:46:05 <shachaf> elliott: I.e., f' :: a -> F a b; f' a = f a has the same problem.
09:46:34 <elliott> shachaf: Yikes.
09:46:57 <elliott> shachaf: Can I quote you on that?
09:47:42 <shachaf> I suppose.
09:47:50 <elliott> Don't worry, I won't bother attributing it.
09:47:55 <elliott> :p
09:49:03 <shachaf> "I am never forget the day I first meet the great elliott. In one word he told me secret of success in mathematics."
09:49:28 <elliott> PRECISELY.
09:49:33 <elliott> There's REPUTATION at stake here!!!!
09:49:41 <elliott> I put it in quote marks though, so everyone knows I don't really "believe" it.
09:50:26 -!- elliott has quit (Remote host closed the connection).
09:51:44 <shachaf> Aw, elliott's gone. I was about to tell him I simplified it even further.
09:53:04 <shachaf> @tell elliott type family F a; f :: x -> F a; f = undefined; f' a = f a
09:53:04 <lambdabot> Consider it noted.
10:02:04 -!- elliott has joined.
10:02:09 <elliott> I'm back now.
10:02:09 <lambdabot> elliott: You have 1 new message. '/msg lambdabot @messages' to read it.
10:02:12 <elliott> @messages
10:02:12 <lambdabot> shachaf said 9m 8s ago: type family F a; f :: x -> F a; f = undefined; f' a = f a
10:02:17 <elliott> And HUNGRY FOR REPUTATION.
10:02:49 <elliott> shachaf: Also, surely you need a type signature on that f' for it to fail.
10:03:02 <shachaf> elliott: I know.
10:04:09 <elliott> shachaf: Nice tip. I'll do you one better still: type family F a; x, y :: F a; x = undefined; y = x. – Daniel Wagner 1 min ago
10:04:21 <elliott> I HAVE TO REPUTE FAST AND SHACHAF TOO SLOW
10:04:51 <shachaf> elliott: While you were gone I gave my improvement to dmwit in #haskell.
10:04:58 <shachaf> So really everything here is a derivative work of me.
10:05:07 <elliott> TRAITOR!!!!
10:05:34 <elliott> shachaf: (At this point I realise that that guy is dmwit.)
10:05:43 * elliott is a clever, clever person.
10:05:54 <shachaf> elliott: It's OK, he realized that you were ehird a little while before.
10:06:17 <elliott> I think he realised I'm ehird pretty quickly, seeing as it's right there below my answer.
10:06:40 <shachaf> elliott: When I mentioned "elliott" in IRC, I mean.
10:06:57 <elliott> shachaf: I think what we can learn from this is to never rely on you for plagiarisation.
10:07:29 <elliott> @tell shachaf he's a bad person.
10:07:30 <lambdabot> Consider it noted.
10:07:36 -!- elliott has quit (Quit: DRAMATIC EXIT).
10:07:50 <shachaf> @messages
10:07:50 <lambdabot> elliott said 21s ago: he's a bad person.
10:25:28 -!- Jafet has joined.
10:49:58 -!- elliott has joined.
10:55:00 -!- MSleep has joined.
11:26:39 -!- cheater has quit (Ping timeout: 248 seconds).
11:27:59 -!- cheater has joined.
11:32:42 -!- cheater has quit (Excess Flood).
11:33:55 -!- cheater has joined.
11:36:31 -!- cheater has quit (Excess Flood).
11:36:58 -!- cheater has joined.
11:40:06 -!- Phantom_Hoover has joined.
11:40:41 <Phantom_Hoover> What,, are,,, the hap
11:40:41 <lambdabot> Phantom_Hoover: You have 2 new messages. '/msg lambdabot @messages' to read them.
11:42:26 -!- cheater has quit (Ping timeout: 244 seconds).
11:43:05 -!- cheater has joined.
11:45:00 -!- cheater has quit (Excess Flood).
11:46:11 -!- cheater has joined.
11:50:39 -!- cheater has quit (Ping timeout: 248 seconds).
11:56:22 -!- cheater has joined.
11:59:43 -!- cheater has quit (Excess Flood).
12:01:01 -!- cheater has joined.
12:04:35 -!- cheater has quit (Excess Flood).
12:31:24 <Phantom_Hoover> Hmm, Christopher Hitchens is dead.
12:31:40 <Phantom_Hoover> Was he the terrible Hitchens or the— wait both Hitchenses were terrible.
12:39:12 -!- GreaseMonkey has quit (Quit: The Other Game).
12:39:44 -!- Ngevd has joined.
12:40:15 <Ngevd> Hello!
12:44:16 <elliott> GOODBYE
12:44:17 <elliott> hi
12:58:45 <Ngevd> Well, I've started my first BytePusher project
13:01:53 <elliott> I saw.
13:02:06 <Ngevd> It will take a while
13:02:10 <Ngevd> BUT IT WILL BE EPIC
13:02:47 <Ngevd> Also, it is snowing.
13:03:06 <Ngevd> I don't know if you know this, but it is true
13:03:48 <elliott> No, I live in Finland.
13:03:51 <elliott> It never snows here.
13:04:56 <Phantom_Hoover> It's not snowing here :(
13:06:49 <Ngevd> Serves you right for not going to Edinburgh from York via Carlisle, Dumfries, and Glasgow
13:09:38 <Phantom_Hoover> I'm so sorry.
13:09:51 <Ngevd> Hang on.
13:10:00 <Ngevd> We need ais523 to tell us if that would be legal
13:10:22 <elliott> Ngevd: You could read the book yourself!
13:10:31 <Ngevd> I REFUSE
13:11:04 <elliott> "Enthusiasts using the routeing guide to identify good value travel often use the two together." BUT WHY
13:14:24 <Phantom_Hoover> http://blackboardsinporn.blogspot.com/
13:14:35 <Phantom_Hoover> a) why is this a thing; b) why is this such an amazing thing
13:15:03 <elliott> I've seen that site before! I am hipstererer than thou.
13:15:11 <elliott> (I spend my days googling for blackboards in porn.)
13:16:40 -!- derdon has joined.
13:17:35 <elliott> "Unfortunately, despite this good academic work, Dr Lagina is entirely unsuited to a career in education due to his surname. It would be no use trying to insist on a different pronunciation such as La-GHEE-na as students of any age will still make cruel remarks – it is little wonder that his detention list is so long. It is a shame that no careers officer ever tried to dissuade him from his current employment path, though he is still young enoug
13:17:35 <elliott> h to change his vocation. It is either that or change his name: even a teacher should be able to afford the £33 fee for a Deed Poll, though perhaps he has already changed it from something even more embarrassing, like Dr Lesticle, Dr Lyphilis or Nick Clegg."
13:17:36 <elliott> :D
13:20:30 * Phantom_Hoover wonders if there's a pro-SOPA subreddit.
13:21:44 <elliott> Phantom_Hoover: Does your contrarianism have no bounds??????????????//////////1111
13:22:15 <elliott> http://www.reddit.com/reddits/search?q=sopa ;; Well, there's /r/SOPACIRCLEJERK.
13:33:59 -!- sebbu2 has joined.
13:34:00 -!- sebbu2 has quit (Changing host).
13:34:00 -!- sebbu2 has joined.
13:35:59 -!- sebbu has quit (Ping timeout: 255 seconds).
13:42:17 -!- ais523 has joined.
13:42:29 -!- Betawolf33 has quit (Quit: Quick, say something cutting!).
13:42:43 -!- Vorpal has joined.
13:42:53 -!- Betawolf has joined.
13:43:00 -!- Betawolf has left.
13:50:18 <Vorpal> hi
13:50:39 <Ngevd> Hello!
13:52:42 -!- derdon has quit (Remote host closed the connection).
14:12:16 -!- Ngevd has quit (Ping timeout: 244 seconds).
14:13:50 -!- Patashu has quit (Quit: MSN: Patashu@hotmail.com , Gmail: Patashu0@gmail.com , AIM: Patashu0 , YIM: patashu2 , Skype: patashu0 .).
14:14:01 -!- elliott has quit (Ping timeout: 240 seconds).
14:28:37 -!- pikhq has quit (Ping timeout: 245 seconds).
14:28:43 -!- pikhq has joined.
14:35:44 -!- cheater has joined.
14:38:06 -!- kmc has joined.
14:41:21 -!- cheater has quit (Ping timeout: 252 seconds).
14:45:40 -!- cheater has joined.
14:46:28 -!- cheater has quit (Excess Flood).
14:47:47 -!- Slereah_ has joined.
14:51:40 -!- cheater has joined.
14:51:40 -!- cheater has quit (Excess Flood).
14:52:11 -!- cheater has joined.
14:54:05 -!- cheater has quit (Excess Flood).
14:56:15 -!- cheater has joined.
14:56:23 -!- cheater has quit (Excess Flood).
15:01:16 -!- Ngevd has joined.
15:06:30 <ais523> now we need to invent an esolang called Single Fifo
15:06:54 <ais523> it's the most ontopic name a spambot's come up with yet, even if it's not as /funny/ as My name Is Johny, what the F**K???
15:14:17 -!- cheater has joined.
15:16:23 -!- copumpkin has quit (Quit: Computer has gone to sleep.).
15:19:22 -!- cheater has quit (Ping timeout: 240 seconds).
15:19:22 -!- sebbu2 has changed nick to sebbu.
15:40:02 -!- copumpkin has joined.
15:44:39 -!- kmc has quit (Quit: Leaving).
15:49:02 -!- sebbu has quit (Read error: Connection reset by peer).
15:49:07 -!- kmc has joined.
15:49:27 -!- sebbu has joined.
15:49:27 -!- sebbu has quit (Changing host).
15:49:27 -!- sebbu has joined.
16:19:28 -!- Taneb has joined.
16:20:21 -!- Ngevd has quit (Ping timeout: 240 seconds).
16:20:52 <ais523> hmm, I just walked out of the office Christmas party, because I didn't understand it
16:21:03 <Phantom_Hoover> Oh god.
16:21:04 <Phantom_Hoover> Why.
16:21:16 <ais523> I, umm, just don't get it
16:21:33 <ais523> it's like everyone's just turning up and acknowledging that it's a Christmas party
16:21:37 <ais523> aren't those things meant to have some purpose?
16:23:14 <Taneb> Naw
16:24:31 <ais523> so why do they happen at all?
16:24:44 <ais523> it just seems like a huge waste of time and organisation effort for everyone involved
16:24:54 <Taneb> Pretty much
16:25:32 <ais523> that doens't explain why they hapen
16:25:33 <ais523> *happen
16:26:39 -!- KingOfKarlsruhe has joined.
16:36:29 -!- Taneb has quit (Ping timeout: 248 seconds).
16:44:25 -!- Ngevd has joined.
16:57:07 -!- MSleep has changed nick to MDude.
16:58:10 -!- Ngevd has quit (Ping timeout: 240 seconds).
16:59:49 -!- Ngevd has joined.
17:07:47 -!- derdon has joined.
17:07:49 <Gregor> ais523: EGGNOG BODY SHOTS WOOOOO
17:07:49 <Ngevd> Cobalt comes out sometime today!
17:08:14 <ais523> Gregor: I don't think it's that sort of Christmas party
17:08:29 <Gregor> ais523: Then MAKE IT that sort of Christmas party!
17:16:17 <fizzie> We just had a free lunch.
17:16:32 <fizzie> Can't say I minded that part.
17:17:07 <fizzie> Though that was for the whole "school" (~1500 employees); the departmental party was more partyish. (I.e. a free dinner instead.)
17:19:33 <fizzie> I've always assumed their main purpose is to be some sort of a collective present from the company/department/organization/whatever to the people, in that they're being given free consumables + someone pays the rent for a place where they can socialize; wasn't aware of any sort of hidden deeper purpose there.
17:20:22 <ais523> fizzie: there doesn't even seem to be socializing, though
17:20:25 <ais523> just… noting that people are there
17:21:46 <fizzie> Well, our department party had socializing. Yesterday's lunch not so much, but maybe it was the 600-or-so people who were mostly unfamiliar. On the other hand, it *was* in just the lobby of the building next door, so that one I interpreted as a free lunch coupon from the school.
17:23:45 <fizzie> (I may have a slightly phdcomics-y "free food" focus on events.)
17:23:47 <Gregor> "Yeah, we had a Christmas party. It was on the third floor of a building nearby, in some Real Estate company's office. I didn't recognize anybody there, but the food was good!"
17:24:31 <fizzie> Sadly, it wasn't especially good.
17:24:51 <fizzie> Except for the quality/price ratio, which is easy to get up by providing non-negative-quality food with zero cost.
17:25:45 <Gregor> If the quality was /precisely/ zero though then they ratio would be /NULLITY/
17:26:54 <fizzie> Sadly our food scientists are unable to obtain absolute zero (aka "the ultimate meh") in food quality yet.
17:29:03 <Phantom_Hoover> <ais523> fizzie: there doesn't even seem to be socializing, though
17:29:12 <Phantom_Hoover> So noöne is talking to anyone else.
17:30:08 <ais523> they're just leaving one at a time after realising they have no reason to be there
17:30:56 <Phantom_Hoover> The aisiest party ever.
17:31:34 <ais523> nah, a party entirely full of me and duplicates of me would go fine
17:31:41 <ais523> assuming there were actually multiple people there
17:31:49 <ais523> it wouldn't work too much like normal parties, though
17:52:47 <Sgeo> Is jedit usually considered decent?
17:56:15 <ais523> gah, there are a large number of people in the atrium wielding umbrellas
17:56:28 <ais523> I think it's connected to the Christmas party somehow, but don't want to delve too deeply into it
17:56:41 <ais523> Sgeo: it's entirely usable
18:17:50 -!- Ngevd has quit (Ping timeout: 240 seconds).
18:27:59 -!- Ngevd has joined.
18:54:27 <Ngevd> @pl \x -> length (filter (\y -> length y == 3) (nub (concat (concat (map subsequences (permutations x)))))) > 0
18:54:27 <lambdabot> (> 0) . length . filter ((3 ==) . length) . nub . join . join . map subsequences . permutations
18:58:04 <Sgeo> Hmm
18:58:15 <Sgeo> pl looks easier to read, I think
18:58:27 <Ngevd> Neither of them are what I wanted...
18:58:45 <Sgeo> Although I did trip up on the ((3 ==) . length) at first
19:00:02 <Ngevd> Some variation of map subsequences (permutations x) should be in the final
19:00:11 <Ngevd> But beyond that I just confused myself
19:04:30 <Ngevd> @pl \x -> any (15==) $ map sum $ filter ((3 ==) . length) $ nub $ concat $ map subsequences (permutations x)
19:04:30 <lambdabot> any (15 ==) . map sum . filter ((3 ==) . length) . nub . join . map subsequences . permutations
19:04:34 <Sgeo> Uh
19:04:45 <Sgeo> You ... did get a variation of map subsequences (permutations x)
19:05:01 <Ngevd> So that is what I wanted
19:05:13 <Sgeo> I have no idea what you want, but it's possible.
19:05:37 <Ngevd> Somehow, it's for my stupidly complicated naughts and crosses game
19:05:46 <Sgeo> (> 0) . length . filter ((3 ==) . length) . nub . join . join . map subsequences . permutations is the same as
19:06:19 <Sgeo> \x -> (> 0) . length . filter ((3 ==) . length) . nub . join . join $ map subsequences $ permutations x
19:06:40 <Sgeo> I think
19:09:59 <kallisti> ,,,,
19:11:24 <kallisti> you think?
19:14:05 <kallisti> that's a 4D list.
19:14:13 <kallisti> what is it for?
19:14:38 <Ngevd> Who are you asking?
19:14:44 <kallisti> relevant persons.
19:15:12 <Ngevd> The bit of code happens to be for seeing whether a game of naughts and crosses has been won
19:15:20 <kallisti> ah
19:15:58 <kallisti> so the input is two-dimensional?
19:16:08 <kallisti> :t permutations
19:16:09 <lambdabot> forall a. [a] -> [[a]]
19:16:11 <kallisti> :t map subsequences
19:16:12 <lambdabot> forall a. [[a]] -> [[[a]]]
19:16:16 <kallisti> oh no
19:16:19 <kallisti> one dimensional.
19:16:21 <kallisti> okay.
19:16:49 <kallisti> or...
19:16:53 <kallisti> SO MANY DIMENSIONS AAAAH
19:17:50 <kallisti> I'm going to guess 2D because that would make sense. :P
19:18:02 <Ngevd> The type signature is Num a => [a] -> Bool, I thin
19:18:03 <Ngevd> k
19:18:22 <kallisti> yes that's correct.
19:18:41 <kallisti> that's simply because it can work on lists of arbitrary dimension.
19:18:53 <kallisti> but it may not be relevant to what you're trying to solve.
19:20:04 <kallisti> Tic-tac-toe, also called wick wack woe (in some Asian countries) and noughts and crosses (in the UK, Australia, New Zealand, South Africa, India and the rest of the British Commonwealth countries)
19:20:09 <kallisti> I like how US-centric Wikipedia can be.
19:22:39 <Ngevd> http://en.wikipedia.org/wiki/Wikipedia:LAME#Spelling
19:27:53 <Gregor> Who was it that was asking me about "classical" composers?
19:28:01 <Gregor> But is also never on while I'm awake.
19:30:54 <kallisti> Chopin is the only clsaasical ocmpostr
19:31:14 <Gregor> ... wow.
19:31:22 <Ngevd> I was Chopin for more from you, kallisti
19:31:24 <Gregor> That statement is so bizarre on so many levels.
19:31:34 <Gregor> Ngevd: THAT IS NOT HOW CHOPIN IS PRONOUNCED.
19:32:13 <kallisti> I pronounce it "showpan"
19:32:27 <kallisti> roughly
19:32:56 <Ngevd> Showpa(french sound)
19:33:19 <Gregor> And hence, not "hopin'" with a 'c' X_X
19:33:35 <kallisti> Gregor OFFENDED
19:34:07 <kallisti> Gregor: exactly how many levels is my statement bizzare on?
19:34:15 <kallisti> three?
19:34:20 <Ngevd> I've got a whole Bach of these
19:34:40 <kallisti> ......
19:35:15 <Gregor> kallisti: 1) Not a classical composer, 2) not a pre-20th-century composer people usually think of in the top five, making "only" bizarre, 3) "clsaasical", 4) "ocmpostr"
19:35:34 <kallisti> Gregor: I grouped the misspellings into one level.
19:36:11 <Ngevd> I like Chopin
19:36:18 <kallisti> but doesn't the Romantic period count as a period of classical music?
19:36:30 <Gregor> kallisti: No, the classical period counts as a period of classical music.
19:36:30 <Ngevd> Classical and Romantic are distinct
19:36:46 <kallisti> hmmm, okay.
19:37:31 <kallisti> I think someone else would disagree though.
19:37:41 <Gregor> And they would be wrong 8-D
19:37:48 <kallisti> someone who knew what they were talking about even. As the "classical period" is not the only source of "classical music"
19:37:48 <Ngevd> Not all Classical music is classical music
19:38:23 <Gregor> When people group Mozart and Borodin into the same style of music, I respond "well, blues and indy-grunge are basically the same, so I call them both 'modern music'"
19:38:38 <kallisti> yes, that's accurate.
19:38:42 <kallisti> THE VENN DIAGRAM OF MUSIC.
19:39:09 <Ngevd> http://www.amazon.co.uk/Venn-That-Tune-Bringing-Poetry/dp/0340955678/ref=sr_1_1?ie=UTF8&qid=1324064329&sr=8-1
19:39:41 <kallisti> I think you could probably make a distinction between Western classical music and classica era music, with "classical music" meaning either the more general or the more specific depending on the context.
19:40:04 <kallisti> +l
19:40:57 <kallisti> if you're in a class about musical history, "classical music" would probably not be how you would describe Romantic period music.
19:41:33 <Gregor> The problem is that part of the reason why people are so quick to dismiss all music more than a hundred years old is that everybody else is so quick to categorize it as one huge group.
19:41:46 <kallisti> Gregor: lame.
19:41:52 <Gregor> As if Rigoletto and Bach's Air on G are one in the same.
19:42:09 <kallisti> everyone knows Bariouqe is teh only clsaasical
19:42:14 <Gregor> X-D
19:43:05 <kallisti> incidentally, I've taken a liking to a lot of "very very new" "classical" music.
19:43:37 <kallisti> I think they call it like "alt classical" or something?
19:43:41 <kallisti> something silly like that.
19:44:22 <Gregor> I've heard the terms "neo-classical" and "modern classical" (which are both weird)
19:45:32 <kallisti> I think this is even newier
19:45:41 <Gregor> How 'bout modern classical-influence neo-jazz fusion (lol I'm putting so many nonsense words here)
19:45:52 <kallisti> neo-jazz fusion? definitely not.
19:45:59 <Gregor> http://erictheallen.com/music/Contrafunktus.mp3
19:46:14 <kallisti> I think you're just genre pretentious. GOSH I fucking hate those people.
19:46:32 <kallisti> (see: electronic music genre pretentious earlier)
19:46:36 <Gregor> I'm mostly just inventing words here :P
19:47:08 <kallisti> Gregor: well no, that's not where the pretentiousness arises. It's the insistence that "classical" refers to a specific historical period in absolutely all contexts
19:47:12 <kallisti> so "modern classical" is impossible.
19:47:18 <kallisti> or something.
19:48:11 <kallisti> in much the same way that I think people use "techno" when they really mean "electronic music"
19:48:34 <kallisti> the difference being that I'm totally right. :P
19:49:55 <Gregor> I see you have no comment on my link though :P
19:50:55 <Ngevd> There's gotta be an easier way to do what I'm trying to do
19:50:56 <kallisti> oh I was too busy being right, I stopped paying attention to everyone else.
19:50:58 * kallisti clicks.
19:51:50 <kallisti> Ngevd: what kind of possible inputs do you have for your problem?
19:52:14 <Ngevd> Subsets of [1..9]
19:52:17 <kallisti> Gregor: noice
19:52:23 <Ngevd> But not that problem
19:52:33 <Ngevd> It's making that thing useful
19:52:39 <kallisti> Ngevd: so this is a theoretical problem and not part of something more practical?
19:52:46 <kallisti> oh
19:52:49 <kallisti> okay.
19:52:57 <Ngevd> Wait, OF COURSE
19:53:00 <Gregor> kallisti: That's a friend of mine whose current career is "trying desperately to be noticed in New York" :P
19:53:04 <Ngevd> Of course?
19:53:05 <Ngevd> YES
19:53:10 <kallisti> Gregor: sounds difficult.
19:53:10 <Phantom_Hoover> It's surprising just how unmoonlike the far side of the moon looks.
19:53:18 <Ngevd> I just need some sort of version of Either that has three things
19:53:31 <Ngevd> :D
19:53:33 <kallisti> Either a (Either b c) :P
19:53:44 <Ngevd> kallisti, perfect.
19:53:53 <kallisti> or you know, like, an ADT.
19:54:09 <Ngevd> Actually, even better, Maybe (Either Piece Piece)
19:54:10 <kallisti> I've read those are useful.
19:54:15 * Phantom_Hoover didn't remember if disjoint union was associative for a second there.
19:54:28 <Ngevd> Or Maybe (Either Int Int)
19:56:10 <kallisti> Gregor: "eric the allen"?
19:56:45 <Ngevd> Oh, hey, Cobalt is out
19:56:50 <Gregor> kallisti: Eric [of] the [house of] Allen :P
19:57:17 -!- zzo38 has joined.
19:57:17 <Gregor> kallisti: Which of course is ultimately just his name, with "the" in the middle because all other combinations of domain names were taken.
19:57:24 <kallisti> okay..
19:57:45 <Gregor> kallisti: It has more relevance to his name than codu.org has to mine :P
19:57:50 <kallisti> Ngevd: are you making a tic tac toe AI?
19:58:02 <Ngevd> kallisti, that would be easier
19:58:20 <kallisti> Gregor: codu is pretty catchy though it could easily be a business name
19:58:30 <Ngevd> kallisti, I'm just making a game
19:58:41 <kallisti> Ngevd: a game of tic tac toe?
19:58:49 <kallisti> Gregor: though I pronounce it as "code you"
19:58:55 <Ngevd> kallisti, NO
19:59:12 <Ngevd> Naughts and Crosses, for I is a citizen of two different commonwealth countries
19:59:28 <kallisti> uh..
19:59:33 <kallisti> chances are you don't need subsets of anything.
19:59:36 <kallisti> to code that. I would think.
20:00:24 <Ngevd> Yeah, but I'm crazyu
20:00:46 <Ngevd> @pl \xs -> lefts (filter isJust xs)
20:00:46 <lambdabot> lefts . filter isJust
20:00:52 <Ngevd> and don't really understand (.)
20:00:56 <kallisti> lol
20:01:04 <kallisti> think of it as like...
20:01:05 <Gregor> <kallisti> Gregor: though I pronounce it as "code you" // heh, I just pronounce it co-du, though code-you is better :P
20:01:08 <kallisti> function composition. :p
20:01:18 <kallisti> Gregor: less accurate though.
20:01:24 <kallisti> co-du makes way more sense.
20:01:29 <kallisti> given the spelling.
20:01:51 <Ngevd> I pronounce it Code ooh
20:01:59 <Gregor> Code! Oooooooh
20:02:02 <kallisti> lol
20:02:10 <Ngevd> @pl \xs -> has_won (lefts (filter isJust xs))
20:02:11 <lambdabot> has_won . lefts . filter isJust
20:02:20 <kallisti> Ngevd: ....really?
20:02:23 <Ngevd> Yup
20:02:52 <kallisti> Ngevd: imagine you have like.... functions
20:02:58 <kallisti> now you want the output of one to be the input of another.
20:03:12 <kallisti> and you want the result of this combination to be A NEW FUNCTION
20:03:16 <kallisti> bam! function composition!
20:03:19 <kallisti> +_+
20:03:35 <Ngevd> Hold on, Scrabble time
20:04:31 <kallisti> :t isLeft
20:04:32 <lambdabot> Not in scope: `isLeft'
20:04:40 <kallisti> @hoogle Either a b -> Bool
20:04:40 <lambdabot> Data.Graph.Inductive.Basic hasLoop :: Graph gr => gr a b -> Bool
20:04:40 <lambdabot> Data.Graph.Inductive.Query.DFS isConnected :: Graph gr => gr a b -> Bool
20:04:40 <lambdabot> Data.Graph.Inductive.Graph isEmpty :: Graph gr => gr a b -> Bool
20:04:41 <Sgeo> f x = a $ b $ c $ d x is the same as f x = a . b . c $ d x is the same as f = a . b . c . d if that helps
20:05:12 <Sgeo> Having elliott yell at me for using the first one helped me learn that >.>
20:05:13 <kallisti> :t lefts
20:05:13 <lambdabot> forall a b. [Either a b] -> [a]
20:05:38 <kallisti> Sgeo: either usage is fine, honestly. obviously you want to use function composition when writing pointfree though
20:05:54 <Phantom_Hoover> @source (.)
20:05:54 <lambdabot> (.) not available
20:06:07 <kallisti> @source Prelude..
20:06:07 <lambdabot> Prelude.. not available
20:06:13 <kallisti> oh, hm.
20:07:41 -!- Ngevd has quit (Ping timeout: 240 seconds).
20:07:46 -!- monqy has joined.
20:08:01 <kallisti> monqy: hi
20:08:09 <monqy> hi
20:08:28 <zzo38> I think it can make for other m (Either a b) -> m a (>>= either return (const mzero))
20:09:02 <Sgeo> @source .
20:09:03 <lambdabot> . not available
20:09:11 <Sgeo> @source (Prelude..)
20:09:11 <lambdabot> (Prelude..) not available
20:09:30 <Sgeo> :t f Prelude.. x
20:09:31 <lambdabot> Couldn't match expected type `a -> b' against inferred type `Expr'
20:09:31 <lambdabot> In the second argument of `(GHC.Base..)', namely `x'
20:09:31 <lambdabot> In the expression: f GHC.Base.. x
20:09:34 <Sgeo> :t f Prelude.. g
20:09:35 <kallisti> @tell Ngebd COME BACK I HAVE SOMETHING IMPORTANT TO SAY.
20:09:35 <lambdabot> Consider it noted.
20:09:35 <lambdabot> Ambiguous type variable `b' in the constraints:
20:09:35 <lambdabot> `Show b' arising from a use of `f' at <interactive>:1:0
20:09:35 <lambdabot> `SimpleReflect.FromExpr b'
20:09:42 <Sgeo> :t f . g
20:09:43 <lambdabot> forall a b (f :: * -> *). (Show a, SimpleReflect.FromExpr b, SimpleReflect.FromExpr (f a), Functor f) => f b
20:09:47 <Sgeo> Hmm, that's weird
20:09:57 <kallisti> Sgeo: . is fmap in lambdabot
20:10:07 <Sgeo> Oh
20:10:21 -!- Phantom_Hoover has quit (Ping timeout: 240 seconds).
20:10:22 <kallisti> > f . [1..]
20:10:23 <lambdabot> Ambiguous type variable `b' in the constraints:
20:10:23 <lambdabot> `SimpleReflect.FromExpr ...
20:10:30 <kallisti> > f . [1..] :: [Expr]
20:10:32 <lambdabot> [f 1,f 2,f 3,f 4,f 5,f 6,f 7,f 8,f 9,f 10,f 11,f 12,f 13,f 14,f 15,f 16,f 1...
20:10:34 <zzo38> @unpl (.)
20:10:35 <lambdabot> (\ a b c -> a (b c))
20:11:22 <kallisti> Sgeo: though really I think it should be (.) from Category
20:12:09 <kallisti> we already have <$> for fmap and it looks quite nice.
20:12:47 <Sgeo> @tell Ngevd <Sgeo> f x = a $ b $ c $ d x is the same as f x = a . b . c $ d x is the same as f = a . b . c . d if that helps <Sgeo> Having elliott yell at me for using the first one helped me learn that >.>
20:12:47 <lambdabot> Consider it noted.
20:13:53 <zzo38> Yes <$> for fmap is better. Since you can use . for category morphism composition
20:14:18 <kallisti> also <$> has the $ which implies function application, which is how fmap is typically uses.
20:15:14 <kallisti> @tell Ngevd also lefts (filter isJust xs) isn't going to work because xs is still a list of Maybes after filtering.
20:15:14 <lambdabot> Consider it noted.
20:16:04 <kallisti> @hoogle [Maybe a] -> a
20:16:05 <lambdabot> Data.Maybe catMaybes :: [Maybe a] -> [a]
20:16:05 <lambdabot> Data.Maybe fromJust :: Maybe a -> a
20:16:05 <lambdabot> Control.Monad msum :: MonadPlus m => [m a] -> m a
20:16:15 <Sgeo> @tell Ngevd Is the same as f x = a . b . c . d $ x
20:16:15 <lambdabot> Consider it noted.
20:16:16 <kallisti> oh hmmm I thought catMaybes would return a
20:16:31 <kallisti> @tell Ngevd use catMaybes :: [Maybe a] -> [a] instead
20:16:32 <lambdabot> Consider it noted.
20:16:38 <kallisti> @teel Ngevd AAAAAAAH SO MANY MESSAGES
20:16:38 <lambdabot> Consider it noted.
20:16:57 <Sgeo> And then lambdabot crashes.
20:17:08 -!- Phantom_Hoover has joined.
20:17:18 <Sgeo> @lastspoke Phantom_Hoover
20:17:18 <lambdabot> Unknown command, try @list
20:17:43 -!- derrik has joined.
20:21:22 <zzo38> Should it be fixed to work with other monads too? Such as, instead of only list monad it can work other MonadPlus as well.
20:22:09 <kallisti> zzo38: that would make it much more inefficient for the list case I believe.
20:22:57 <kallisti> zzo38: also what are you using MonadPlus for?
20:23:21 <kallisti> you'd want Functor I think.
20:23:32 <kallisti> or...
20:23:35 <zzo38> kallisti: MonadPlus in case you need to use mzero, and you also need join
20:23:38 <kallisti> Functor and MonadPlus?
20:24:26 <kallisti> :t join
20:24:27 <lambdabot> forall (m :: * -> *) a. (Monad m) => m (m a) -> m a
20:24:34 <kallisti> zzo38: what do you need join for
20:24:39 <zzo38> catMaybes = (>>= maybe mzero return); lefts = (>>= either return (const mzero));
20:25:02 <zzo38> Note that >>= combines join with fmap
20:25:06 <zzo38> join = (>>= id)
20:25:10 <kallisti> ah yes.
20:25:17 <kallisti> cool.
20:25:41 <kallisti> @src catMaybes
20:25:41 <lambdabot> catMaybes ls = [x | Just x <- ls]
20:26:21 -!- oerjan has joined.
20:26:22 <Sgeo> :t either
20:26:23 <lambdabot> forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
20:26:23 <kallisti> hmm, I guess that's equivalently efficient.
20:26:42 -!- sebbu2 has joined.
20:26:42 -!- sebbu2 has quit (Changing host).
20:26:42 -!- sebbu2 has joined.
20:28:31 <zzo38> fmap f = (>>= return . f)
20:28:36 <zzo38> x >>= f = join $ fmap f x
20:29:41 -!- sebbu has quit (Ping timeout: 240 seconds).
20:35:37 <oerjan> * elliott is trying to point-free: f x y z = g (h x) (h y) (h z)
20:36:01 <Sgeo> http://boards.trutv.com/showthread.php?14444-seth-gold-is-hot!!!
20:36:29 <oerjan> :t \x -> ?g (?h x) `on` ?h
20:36:30 <ais523> oerjan: with lambdabot around, why is that hard?
20:36:30 <lambdabot> forall b c a. (?h::a -> b, ?g::b -> b -> b -> c) => a -> a -> a -> c
20:36:51 <oerjan> ais523: because the @pl result looks awful
20:37:12 <oerjan> @pl lacks many of the more subtle methods
20:37:41 <ais523> :t on
20:37:42 <lambdabot> forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
20:38:05 <oerjan> what he really needs is some kind of on3
20:38:12 <ais523> yep
20:38:25 <kallisti> :t on ?h . ?g . ?h
20:38:25 <lambdabot> forall b c a. (?h::b -> b -> c, ?g::(b -> c) -> a -> b) => b -> a -> a -> c
20:38:56 <kallisti> maybe I'm missing something here...
20:39:43 <oerjan> well a flip in front of on, to start
20:39:56 <kallisti> oh
20:39:59 <kallisti> :t flip on ?h . ?g . ?h
20:40:00 <lambdabot> forall c a a1. (?h::a -> a1, ?g::a1 -> a1 -> a1 -> c) => a -> a -> a -> c
20:40:07 <kallisti> is that equivalent?
20:40:11 <kallisti> to what you just wrote?
20:40:14 <oerjan> i think so
20:40:38 <kallisti> oerjan: you and elliott should devise a pointfree library. :3
20:40:40 <kallisti> with an on3!
20:41:09 <oerjan> i vaguely think i made a recursive onN sort of thing in a previous discussion
20:41:22 -!- zzo38 has quit (Remote host closed the connection).
20:44:52 <oerjan> \x y z -> g (h x) (h y) (h z) = \x y -> g (h x) (h y) . h = \x y -> on g h x y . h
20:45:08 <oerjan> @pl \x y -> on g h x y . h
20:45:08 <lambdabot> flip flip h . ((.) .) . on g h
20:45:19 <oerjan> bah
20:47:17 <oerjan> :t \x y z -> foldl (. ?h) ?g [x,y,z]
20:47:18 <lambdabot> Occurs check: cannot construct the infinite type: a = a1 -> a
20:47:18 <lambdabot> Expected type: a
20:47:18 <lambdabot> Inferred type: a1 -> a
20:47:22 <oerjan> eek
20:47:36 <oerjan> oh well
20:50:01 <Sgeo> How about dup and swap?
20:50:13 <Sgeo> cleave
20:50:16 <Sgeo> etc
20:50:19 <Sgeo> All the Factor stuff
20:50:22 <Sgeo> Can that be done?
20:50:59 <oerjan> fsvo done
20:51:19 <oerjan> it's not like haskell naturally is about stacks
20:51:36 <oerjan> or concatenative
20:51:59 <Sgeo> I want a function f, such that (+) . f :: (Num a) => a -> a
20:52:17 <Sgeo> Why don't I say dup instead of f
20:52:18 <oerjan> :t (+) . ?f
20:52:18 <lambdabot> forall a (f :: * -> *). (Num a, ?f::f a, Functor f) => f (a -> a)
20:52:28 <Sgeo> oerjan, huh?
20:52:35 <oerjan> :t (+) Prelude.. ?f
20:52:36 <lambdabot> forall b a. (Num b, ?f::a -> b) => a -> b -> b
20:52:39 <monqy> Sgeo: join (+)
20:52:43 <monqy> or uh
20:52:45 <monqy> wait i forget ugh
20:52:57 <Sgeo> Lemme solve for the types
20:52:59 <monqy> been a long time since i did that sort of thing
20:53:10 <Sgeo> :t (.)
20:53:11 <lambdabot> forall a b (f :: * -> *). (Functor f) => (a -> b) -> f a -> f b
20:53:12 <Sgeo> oops
20:53:15 <Sgeo> :t (Prelude..)
20:53:16 <lambdabot> forall b c a. (b -> c) -> (a -> b) -> a -> c
20:53:18 <monqy> :t join (+)
20:53:18 <lambdabot> forall a. (Num a) => a -> a
20:53:25 <monqy> > join (+) 5
20:53:26 <lambdabot> 10
20:53:28 <Sgeo> monqy, that's not quote what I want, though
20:53:31 <Sgeo> quite
20:53:39 <oerjan> Sgeo: i just did, and there is no solution
20:53:45 <Sgeo> o.O
20:54:20 -!- variable has quit (Quit: I found a 1 /dev/zero).
20:54:24 <oerjan> you cannot get around the fact that (+) . f will still be a function of two arguments
20:54:35 <monqy> Sgeo: uncurry (+) . (id &&& id)
20:55:11 <monqy> > uncurry (+) . (id &&& id) $ 5
20:55:13 <lambdabot> 10
20:55:43 <oerjan> basically, (.) does _not_ access all the arguments of its first argument, only the first, so there's no way to use it to treat its first argument as taking a stack.
20:56:38 <Sgeo> :t join
20:56:38 <lambdabot> forall (m :: * -> *) a. (Monad m) => m (m a) -> m a
20:56:58 <oerjan> :t join.($)
20:56:58 <lambdabot> forall a a1. (a1 -> a1 -> a) -> a1 -> a
20:56:59 * Sgeo whats at monqy's join example
20:57:03 <monqy> :t join :: (a -> a -> b) -> a -> b
20:57:04 <lambdabot> forall a b. (a -> a -> b) -> a -> b
20:57:38 -!- Ngevd has joined.
20:57:46 * Sgeo ducks for cover
20:57:56 <oerjan> all brace for the hello
20:58:56 <oerjan> there seems to be a malfunction
20:59:02 <ais523> `? welcome
20:59:10 <HackEgo> Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: http://esolangs.org/wiki/Main_Page
21:00:02 * oerjan looks suspiciously at ais523
21:00:22 <Sgeo> ais523 is clearly new to this community.
21:00:37 <monqy> sgeo: what's so scary about my join example
21:01:03 <Sgeo> monqy, I guess I wasn't thinking of functions as a monad
21:01:14 <Sgeo> Although I guess they are. Still not intuitive for me though.
21:01:37 <monqy> iirc it's the same as Reader
21:02:14 <monqy> all you need to know for join is: join f = \ a -> f a a
21:03:20 <kallisti> Ngevd: hmmm apparently lambdabot is not informing you of MESSAGES?
21:03:21 <monqy> and iirc fmap f g = f . g
21:03:28 <kallisti> monqy: yes
21:03:44 <oerjan> kallisti: this _might_ be related to the fact Ngevd isn't speaking.
21:03:55 <kallisti> oerjan: oh I thought it informed people when they joined.
21:03:59 <monqy> no[e
21:04:13 <monqy> I've never had to use >>= so I've forgotten what it does intuitively :(
21:04:15 <kallisti> okY
21:04:28 <kallisti> f >>= g = f (g x) x
21:04:31 <kallisti> I believe
21:04:35 <kallisti> er
21:04:40 <kallisti> f >>= g x = f (g x) x
21:04:45 <kallisti> f >>= g $ x = f (g x) x
21:04:46 <kallisti> :P
21:04:53 <copumpkin> \x ->
21:05:03 <oerjan> ?src >>= ->
21:05:04 <lambdabot> Source not found. And you call yourself a Rocket Scientist!
21:05:04 <kallisti> lambdas are for chumps.
21:05:08 <oerjan> ?src -> >>=
21:05:08 <lambdabot> Source not found. Take a stress pill and think things over.
21:05:13 <oerjan> ?src (->) (>>=)
21:05:14 <lambdabot> f >>= k = \ r -> k (f r) r
21:05:51 <oerjan> kallisti: WRONG!!!!!!!!!!!!!!!!!!!!111111111111111111ELEVEN
21:06:16 <kallisti> oh
21:06:17 <kallisti> indeed
21:06:27 <kallisti> I think f (g x) x is ap right?
21:06:38 <monqy> ap is whatever S is
21:06:43 <monqy> i always forget it :(
21:06:45 <oerjan> kallisti: WRONG!!!!!!!!!!!!!!!!!!!!111111111111111111ELEVEN
21:06:49 <monqy> and pure is const
21:06:52 <monqy> i.e. k
21:06:56 <kallisti> f x (g x)
21:06:57 <kallisti> is ap
21:07:21 <monqy> mhm
21:08:06 <kallisti> so >>= is like ap but turnways.
21:08:11 <monqy> wh
21:08:31 <monqy> sure
21:12:17 -!- Ngevd has quit (Read error: Connection reset by peer).
21:15:16 <kallisti> monqy: http://www.mspaintadventures.com/sweetbroandhellajeff/?cid=010.jpg
21:15:59 <monqy> yes i know
21:17:15 <kallisti> g (f x) x vs. f x (g x)
21:17:42 <kallisti> if that isn't turnways I don't EVEN know what it is.
21:18:49 -!- derrik has quit (Read error: Connection reset by peer).
21:21:41 <oerjan> :t flip ap
21:21:42 <lambdabot> forall (m :: * -> *) a b. (Monad m) => m a -> m (a -> b) -> m b
21:22:29 <oerjan> :t flip ap . flip
21:22:30 <lambdabot> forall b (f :: * -> *) a b1. (Functor f) => f (a -> b1) -> (a -> f b1 -> b) -> a -> b
21:22:53 <oerjan> :t flip ap Prelude.. flip
21:22:54 <lambdabot> forall b (f :: * -> *) a b1. (Functor f) => f (a -> b1) -> (a -> f b1 -> b) -> a -> b
21:23:06 <oerjan> :t flip ap . Prelude.flip
21:23:06 <lambdabot> forall b a b1 c. (a -> b1 -> c) -> (b1 -> (a -> c) -> b) -> b1 -> b
21:25:05 <oerjan> \f g x -> g (f x) x = \f g x -> flip g x (f x) = \f g -> ap (flip g) f = flip (ap . flip)
21:25:11 <oerjan> :t flip (ap . flip)
21:25:12 <lambdabot> forall a b a1. (a1 -> a) -> (a -> a1 -> b) -> a1 -> b
21:25:25 <kallisti> woo
21:25:27 <oerjan> :t (>>=).($)
21:25:28 <lambdabot> forall a b a1. (a1 -> a) -> (a -> a1 -> b) -> a1 -> b
21:26:08 <oerjan> :t flip ((>>=) . flip)
21:26:09 <lambdabot> forall b (f :: * -> *) a b1. (Functor f) => (f b1 -> a -> b) -> f (a -> b1) -> a -> b
21:26:20 <kallisti> flippity floppity floo
21:26:24 -!- Klisz has joined.
21:26:25 <oerjan> :t ap.($)
21:26:25 <lambdabot> forall a b a1. (a1 -> a -> b) -> (a1 -> a) -> a1 -> b
21:26:38 <oerjan> hm that's not quite right
21:26:50 <oerjan> :t flip (>>=) . flip
21:26:51 <lambdabot> forall (m :: * -> *) a b. (Monad m, Functor m) => m (a -> b) -> m a -> m b
21:27:19 <kallisti> <*>? :P
21:27:25 <oerjan> oh hm that's actually _general_ ap
21:27:51 <oerjan> given sufficient caleskell
21:27:57 <kallisti> heh
21:28:32 <oerjan> :t Prelude.flip (>>=) Prelude.. flip
21:28:33 <lambdabot> forall (m :: * -> *) a b. (Monad m, Functor m) => m (a -> b) -> m a -> m b
21:28:45 <oerjan> :t Prelude.flip (>>=) Prelude.. Prelude.flip --too little
21:28:46 <lambdabot> forall a b a1. (a1 -> a -> b) -> (a1 -> a) -> a1 -> b
21:29:28 <Phantom_Hoover> http://www.guardian.co.uk/science/blog/2009/mar/02/god-particle-peter-higgs-portrait-lhc
21:29:33 <Phantom_Hoover> This is the best portrait.
21:29:34 <oerjan> :t flip . flip
21:29:34 <lambdabot> forall a b a1. (a -> a1 -> b) -> a -> a1 -> b
21:29:50 <Phantom_Hoover> I like all the blue glowy lines around his head.
21:30:11 <Phantom_Hoover> It reminds me of that bit in Fine Structure where — oh wait future elliott.
21:30:20 <oerjan> :t flip
21:30:20 <lambdabot> forall (f :: * -> *) a b. (Functor f) => f (a -> b) -> a -> f b
21:31:13 <oerjan> only for functions is caleskell flip its own inverse
21:31:48 <kallisti> I'm guessing that's what the higgs boson looks like?
21:32:42 -!- augur has quit (Remote host closed the connection).
21:34:12 <oerjan> i'm guessing that's supposed to be a collision diagram from a particle accelerator
21:38:50 <oerjan> <shachaf> IT'S, LIKE, A LAMBDA *INSIDE* A LAMBDA! <-- BRUIJNCEPTION
21:39:25 <shachaf> Good old De Bruijndices.
21:44:37 <oerjan> <monqy> we also have single fifo, animated chatrooms, bbw dating north dakota, dating program <-- i suspect we are just going to give up fighting the spam and turn the wiki into a spam appreciation site.
21:48:16 -!- Ngevd has joined.
21:48:21 <Ngevd> Hello!
21:48:21 <lambdabot> Ngevd: You have 5 new messages. '/msg lambdabot @messages' to read them.
21:48:33 <Ngevd> Wow, messages, me?
21:51:52 <kallisti> Ngevd: yes you're special.
21:52:04 <Ngevd> Wow
21:52:14 <Ngevd> Also, I won at that game of Scrabble
21:52:19 <kallisti> good!
21:52:38 <Ngevd> Even low I was below 50 when the person who would eventually lose broke the hundred (he had a good start)
21:52:40 <kallisti> now you can go fix your haskell program in the way that I described. :)
21:53:04 <Ngevd> Has anyone got Cobalt?
21:53:20 <kallisti> no what's that
21:53:50 <Ngevd> A new game that's being somethinged by the company that makes Minecraft
21:54:04 <kallisti> lol
21:54:05 <kallisti> okay
21:54:58 <kallisti> oh hm, it looks pretty fun
21:56:00 -!- Klisz has quit (Quit: You are now graced with my absence.).
21:56:52 -!- Klisz has joined.
21:57:53 * kallisti wants to play a game that's a sort of mixture between Magicka and Demons' Souls.
21:58:21 <kallisti> a somewhat complex magic system. a strategic, fast-paced action RPG.
21:59:14 <Ngevd> Hold on a second
21:59:18 <Ngevd> I don't need the Maybes
22:00:23 <kallisti> Ngevd: I'm guessing the eithers represent the two different players?
22:00:27 <Ngevd> Yes
22:00:40 <kallisti> what does the inner-type represent?
22:00:42 <Ngevd> The Maybe would have represented empty squares
22:00:51 <kallisti> Sounds like you may want Maybe Bool
22:01:04 <kallisti> True = x, False = o, Nothing = empty
22:01:26 <Ngevd> Clever plan: Left n = square n is x, Right n = square n is o.
22:01:31 <Ngevd> No need for Maybe
22:02:40 <kallisti> oh okay
22:03:12 <Ngevd> What's a cool type for the internal "Sorry, that square is full, ask for another square" message?
22:03:28 <kallisti> well if you had.
22:03:34 <kallisti> Map Int (Maybe Bool)
22:03:36 <kallisti> er
22:03:38 <kallisti> Map Int Bool
22:03:39 <kallisti> I mean
22:03:51 <kallisti> then a lookup on the Map would return a Maybe Bool
22:04:03 <kallisti> so you could just test on that.
22:04:20 <kallisti> if it's Nothing, you can place a mark, if it's Just _ then you can't
22:04:30 <Ngevd> Clever idea!
22:04:40 <Ngevd> Essentially the opposite of what you just said!
22:04:46 <kallisti> a "cool type" for the error message would be String. A cool type to send an error message would be IO. :P
22:04:54 <kallisti> Ngevd: oh?
22:05:12 <Ngevd> Nothing = not good enough, try again
22:05:20 <kallisti> that doesn't make any sense.
22:05:25 <Ngevd> Just (Either Int Int) = brilliant, here's the new board
22:05:32 <kallisti> wat
22:05:42 <kallisti> I think Map Int Bool would be easier honestly.
22:05:59 <kallisti> and you could turn it into a [Either Int Int] if you needed.
22:06:50 <kallisti> but if you've got a good idea, don't let me stop you. :>
22:06:54 -!- KingOfKarlsruhe has quit (Quit: ChatZilla 0.9.87 [Firefox 8.0/20111104165243]).
22:07:34 <kallisti> Ngevd: because the key piece of data you have is the square I assume.
22:07:41 <kallisti> Ngevd: with the list you have to search through the list
22:07:49 <kallisti> with the Map you can just lookup via the integer.
22:08:02 <Ngevd> It's a list with maximum length of 9
22:08:16 <kallisti> well yes, it's not difficult to search through.
22:08:34 <Ngevd> If searching through the list is going to be a serious problem, I recommend you get a new computer and a new Haskell compiler
22:08:46 <kallisti> I was referring to conceptual simplicity. :P
22:08:49 <Ngevd> But a Map could be really good for my other project...
22:08:52 <kallisti> not a problem of efficiency, really.
22:12:01 <kallisti> placePiece m i p = maybe (insert i p m) (const m) (lookup i m)
22:12:20 <kallisti> m is the Map Int Bool, i is the Int, p is the player (True or False)
22:12:57 <kallisti> of course you'll probably want more logic than that.
22:13:06 <kallisti> because that doesn't tell you whether or not the board changed.
22:13:16 <kallisti> it just leaves it alone if it didn't change.
22:14:11 <kallisti> you could have it return an IO (Map Int Bool) instead or something.
22:14:24 <kallisti> with the error case sending a message to the player.
22:16:24 <kallisti> is it a text-based interface?
22:16:29 <kallisti> or something more complicated?
22:16:37 <Ngevd> Haven't actually done the interface yet
22:16:46 <kallisti> what do you plan for it to be?
22:16:54 <Ngevd> Probably text
22:17:17 <oerjan> :t lookup -- the list version also exists
22:17:18 <lambdabot> forall a b. (Eq a) => a -> [(a, b)] -> Maybe b
22:17:22 <kallisti> then yes placePiece :: Map Int Bool -> Bool -> Int would work
22:17:28 <kallisti> oerjan: indeed.
22:17:31 <kallisti> but MAPS ARE SO MUCH COOLER.
22:17:36 <kallisti> /trees/ man.
22:18:00 <oerjan> yeah but at 9 elements its quite plausible that lists are actually faster, isn't it?
22:18:06 <kallisti> > logBase 2 9
22:18:06 <lambdabot> 3.1699250014423126
22:18:11 <kallisti> oerjan: nah man never.
22:18:22 <kallisti> NEVER
22:18:24 <kallisti> NOT IN ANY CASE
22:18:28 <kallisti> THERE IS NO SCENARIO
22:18:30 <kallisti> (lies)
22:18:35 <oerjan> just like bubble sort actually wins over quicksort if the array is short enough
22:18:57 <kallisti> oerjan: but you're not thinking about scalability. Maybe Ngevd wants a 1 million square game of tic-tac toe.
22:19:03 <kallisti> eventually
22:19:07 <kallisti> THE REQUIREMENTS CHANGE.
22:19:11 <oerjan> plausible.
22:19:15 <kallisti> best to go with the one with the best growth factor.
22:19:33 <oerjan> kallisti: ah but then you need larger pointers
22:20:05 <kallisti> hm?
22:20:07 <oerjan> lest your solution runs out of them before filling the entire universe
22:20:33 <kallisti> Ngevd: if you'd rather maintain purity then you could return an Either String (Map Int Bool) instead
22:20:47 <kallisti> Ngevd: or Either String [Either Int blah blah blah dumb
22:20:49 <kallisti> :P
22:20:58 <oerjan> also, http://xkcd.com/865/
22:21:17 <Ngevd> What I really want is something like elemBy
22:21:41 <kallisti> :t any
22:21:41 <lambdabot> forall a. (a -> Bool) -> [a] -> Bool
22:21:43 <kallisti> :t all
22:21:43 <lambdabot> forall a. (a -> Bool) -> [a] -> Bool
22:21:53 <Ngevd> any is good
22:23:06 <kallisti> @hoogle Either a a -> a
22:23:07 <lambdabot> Data.Either rights :: [Either a b] -> [b]
22:23:07 <lambdabot> Data.Either lefts :: [Either a b] -> [a]
22:23:07 <lambdabot> Data.Typeable typeOf2 :: Typeable2 t => t a b -> TypeRep
22:23:33 <kallisti> ah I guess no one would need something so silly except Taneb.
22:23:38 <kallisti> >:)
22:23:56 <oerjan> Ngevd: if your elements are ((Int,Int),Bool) then lookup is perfect.
22:24:07 <kallisti> they're Either Int Int
22:24:28 <oerjan> which is isomorphic to (Int, Bool)
22:24:29 <kallisti> or (Int, Bool) equivalently
22:24:30 <kallisti> yes
22:24:35 <Ngevd> What I'm probably going to stick with is taken n = any (\x -> Left n == x || Right n == x)
22:24:41 <Ngevd> Because I am crazy
22:24:57 <kallisti> ....WHY
22:25:00 <Ngevd> And pl'ing that is crazy
22:25:10 <kallisti> map is so much easier...
22:25:13 <kallisti> *Map
22:25:15 <Ngevd> @pl \n -> any (\x -> Left n == x || Right n == x)
22:25:16 <lambdabot> any . ap (ap . ((||) .) . (==) . Left) ((==) . Right)
22:26:02 <kallisti> Ngevd: (Int, Bool) would probably be easier as well
22:26:07 <kallisti> as then you could just ignore the Bool element
22:26:09 <Ngevd> I DON'T CARE
22:26:15 <kallisti> instead of dealing with the Left and Right constructors
22:26:32 <kallisti> Ngevd: okay.
22:27:07 <oerjan> :t join either . (==)
22:27:08 <lambdabot> forall a. (Eq a) => a -> Either a a -> Bool
22:27:32 <Ngevd> That works too
22:28:04 <Ngevd> Except no
22:28:05 <kallisti> oerjan: fancy
22:29:21 <kallisti> Ngevd: the list /might/ end up being easier to work with when you have to compute a win.
22:30:21 -!- MDude has quit (Ping timeout: 240 seconds).
22:32:23 <Ngevd> There's probably thousands of different ways of doing this, each with its own merits
22:32:33 <kallisti> but not really because you just generate a list of winning configurations, and then use any (`isSubmapOf` board)
22:32:34 -!- augur has joined.
22:32:50 <Ngevd> I'm going to continue with the way I've got half a program to
22:34:43 <kallisti> (the "winning configurations" meaning the 4 different ways to win * the 2 players, not literally every possible winning configuration as that would be crazy slow)
22:38:25 <kallisti> well actually no it wouldn't be that slow.
22:38:44 <kallisti> I was confusing ending positions with possible games.
22:39:02 <kallisti> > 91 + 44
22:39:03 <lambdabot> 135
22:39:11 <kallisti> is the number of winning positions.
22:39:22 <kallisti> and 3 draws.
22:39:25 <oerjan> > 3^9
22:39:26 <lambdabot> 19683
22:39:43 <Ngevd> > product [1..9]
22:39:44 <lambdabot> 362880
22:40:00 <Ngevd> Number of possible games
22:40:12 <kallisti> not quite.
22:40:37 <Ngevd> Niave upper bound for the number of possible games
22:40:45 <kallisti> yes.
22:41:15 <Sgeo> "Naive"?
22:41:33 <kallisti> it doesn't take into account that the game /stops/ when you win.
22:41:40 <Sgeo> It's an upper bound, aren't all upper bounds of things that can in principle be calculated exactly "naive"?
22:41:52 <kallisti> some can be more naive than others.
22:42:16 <Ngevd> Positive infinity is a perfectly accurate upper bound for most things
22:43:29 <kallisti> Ngevd: how do you currently calculate wins? with the permutations thing?
22:43:36 <Ngevd> Yes
22:43:40 <Ngevd> It uses a magic square
22:44:09 <oerjan> also, 19683 is an upper bound on the number of board positions.
22:44:40 <oerjan> which means you could quite plausibly store them all.
22:44:41 <Ngevd> Gonna play Cobalt now
22:44:58 <Sgeo> Is Graham's Number naive?
22:45:08 <kallisti> in this case, yes.
22:45:23 <kallisti> well, maybe more like "dumb" :P
22:45:24 <oerjan> worst approximation to 6^H11 ever
22:45:59 <kallisti> Sgeo: oh nevermind
22:46:21 <kallisti> I thought you were asking if Graham's number was a naive upper bound to the number of possible games or something else we were talking about.
22:46:51 <oerjan> sorry, 13.
22:48:00 <Ngevd> I'm not even sure why I am doing this
22:49:04 <kallisti> Ngevd: me neither
22:49:24 <Ngevd> I could be doing something actually useful to my education and wellbeing rather than make a silly game
22:49:30 <Ngevd> Sillily
22:50:21 <Ngevd> Now, if I moved to a certain island group, I'd be the silly silly game developer of Scilly
22:53:34 <kallisti> Ngevd: I would be able to take your game more seriously if it used better data structures.
22:53:38 <Ngevd> I can't get Cobalt to run
22:53:43 <Ngevd> :~(
22:53:48 <kallisti> (is not serious, btw)
22:54:11 <kallisti> Ngevd: what platforms is it available on?
22:54:29 <Ngevd> Windows
22:54:38 <Ngevd> Coming soon for Mac and Linux
22:54:43 <Ngevd> Apparently it works in Wine?
22:55:00 <Ngevd> Got it working, maybe
22:59:48 <kallisti> !perl $x=3;$x=3**($x%10**50)for1..500;print$x
22:59:50 <EgoBot> Bareword found where operator expected at /tmp/input.15721 line 1, near ")for1"
22:59:56 <kallisti> !perl $x=3;$x=3**($x%10**50)for 1..500;print$x
22:59:57 <EgoBot> nan
23:00:18 <kallisti> !perl use integer;$x=3;$x=3**($x%10**50)for 1..500;print$x
23:00:18 <EgoBot> 1
23:00:20 <kallisti> ..
23:00:32 <kallisti> oh
23:00:40 <kallisti> !perl use integer;$x=3;$x=3**$x%10**50for 1..500;print$x
23:00:41 <EgoBot> 0
23:02:26 <oerjan> > iterate (\x -> 3^x `mod` 10^50) 3 !! 500
23:02:31 <lambdabot> mueval: ExitFailure 1
23:02:31 <lambdabot> mueval: Prelude.undefined
23:02:37 <oerjan> oops
23:02:47 <kallisti> oerjan: (^) is slow and stuff
23:03:00 <oerjan> not really
23:03:15 <kallisti> it's slower than (**) isn't it?
23:03:20 <oerjan> but the numbers get huge _before_ you mod them
23:04:06 <oerjan> ** is not exact, so obviously
23:04:11 <kallisti> > 5 ** 5000
23:04:12 <lambdabot> Infinity
23:04:21 <oerjan> > 5^5000
23:04:21 <kallisti> :P
23:04:22 <lambdabot> 707981126104817289238561515869405755294754851033943135872983022354636725918...
23:04:37 <kallisti> > 5 ** 5000 :: CReal
23:04:41 <lambdabot> 707981126104817289238561515869405755294754851033943135872983022354636725918...
23:04:50 <kallisti> SO MUCH FASTER SEE?
23:04:57 <oerjan> >_>
23:05:50 <kallisti> > x ** 4
23:05:51 <lambdabot> x**4
23:05:58 <oerjan> i assume you are trying to calculate the final digits of graham's number as described on wp
23:06:04 <kallisti> yes
23:06:25 <oerjan> i don't think it is quite as simple as that though
23:06:47 -!- ais523 has quit (Remote host closed the connection).
23:06:55 <oerjan> afair i did it myself once
23:07:08 <Phantom_Hoover> <Ngevd> Gonna play Cobalt now
23:07:10 <Phantom_Hoover> It's out?
23:07:29 -!- DCliche has joined.
23:08:17 <oerjan> > scanl (*3) 1
23:08:18 <lambdabot> Occurs check: cannot construct the infinite type: a = b -> a
23:08:28 <oerjan> > iterate (*3) 1
23:08:29 <lambdabot> [1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969,14...
23:08:37 <kallisti> `run dc -e '[3z202>xO200^|]dsxxrp'
23:08:55 <oerjan> the thing is, there isn't actually any pattern if you just do 3^x, it has to be 3^3^x
23:09:07 <oerjan> or something like that
23:09:08 <HackEgo> No output.
23:09:37 <kallisti> `run dc 0e ;dc -e '[3z202>xO200^|]dsxxrp'
23:09:42 <oerjan> > iterate (^3) 3
23:09:43 <kallisti> er
23:09:43 <lambdabot> [3,27,19683,7625597484987,443426488243037769948249630619149892803,871896424...
23:10:03 <oerjan> > map (`mod` 10^10) $ iterate (^3) 3
23:10:06 <kallisti> `run dc -e '3[3rAz^|dz202>x]dsxxAz3-^%p'
23:10:08 <lambdabot> mueval: ExitFailure 1
23:10:08 <lambdabot> mueval: Prelude.undefined
23:10:09 <HackEgo> dc: Could not open file 0e
23:10:12 <oerjan> eek
23:10:18 <oerjan> > take 10 . map (`mod` 10^10) $ iterate (^3) 3
23:10:20 <lambdabot> [3,27,19683,5597484987,9149892803,5225665627,1838846883,6369147387,94380896...
23:10:27 <oerjan> ok even that doesn't work
23:10:38 <HackEgo> No output.
23:10:54 <kallisti> anyway those programs work on my computer
23:10:57 <kallisti> they just timeout on hackego
23:11:02 -!- Klisz has quit (Ping timeout: 252 seconds).
23:11:59 <Sgeo> Why did it hit undefined?
23:12:05 -!- copumpkin has quit (Quit: Computer has gone to sleep.).
23:12:28 <oerjan> Sgeo: dunno, something going wrong when it times out, i assume
23:14:42 -!- Ngevd has quit (Ping timeout: 252 seconds).
23:14:49 <kallisti> > 21*60
23:14:50 <lambdabot> 1260
23:15:48 <oerjan> oh hm it says on wp that algorithm is actually correct
23:16:43 <oerjan> > iterate (\x -> 3^x `mod` 10^50) 3 !! 50
23:16:48 <lambdabot> mueval: ExitFailure 1
23:16:49 <lambdabot> mueval: Prelude.undefined
23:16:54 <oerjan> > iterate (\x -> 3^x `mod` 10^10) 3 !! 10
23:16:59 <lambdabot> mueval: ExitFailure 1
23:16:59 <lambdabot> mueval: Prelude.undefined
23:17:04 <oerjan> darn
23:17:09 <oerjan> > iterate (\x -> 3^x `mod` 10^10) 3 !! 10
23:17:14 <lambdabot> mueval: ExitFailure 1
23:17:14 <lambdabot> mueval: Prelude.undefined
23:17:58 <oerjan> @hoogle modpow
23:17:58 <lambdabot> No results found
23:18:02 <oerjan> @hoogle powmod
23:18:02 <lambdabot> No results found
23:18:36 <kallisti> http://en.wikipedia.org/wiki/Vampire_number
23:18:43 <kallisti> I don't really get the point'
23:19:10 <Phantom_Hoover> http://www.reddit.com/r/AskReddit/comments/nepda/whats_something_you_found_so_pretentious_that_it/c38i4ay
23:19:16 <Phantom_Hoover> I wish I had taken art.
23:20:18 <kallisti> why? so you could spend lots of money on useless classes?
23:20:29 <Phantom_Hoover> No, so I could study Dr McNinja.
23:21:23 <Phantom_Hoover> Oh god now I remember that I *still* haven't read the fourth book of The Sandman, about two years after I read the first.
23:21:37 -!- PiRSquared17 has joined.
23:22:29 * kallisti has never heard of this so-called Dr. McNinja
23:22:33 * kallisti googles.
23:22:39 * kallisti awe
23:22:42 -!- Vorpal has quit (Ping timeout: 276 seconds).
23:23:25 <kallisti> oh god this is beautiful what is this.
23:24:14 <kallisti> "we'll talk once your ghastronaut buddy shows up and gets stuffed on holy knuckle cheeseburgers"
23:24:17 <kallisti> wow. what.
23:24:27 <kallisti> I feel like I should probably read this from the beginning instead of backwards.
23:24:38 <monqy> yes
23:26:47 <oerjan> !haskell m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m; (+) = undefined; (-) = undefined; abs = undefined; signum = undefined; fromInteger = undefined }; main = print . iterate m (\M x -> M 3 ^ x) $ M 3
23:26:52 <EgoBot> runhaskell: syntax: runghc [-f GHC-PATH | --] [GHC-ARGS] [--] FILE ARG...
23:27:12 <oerjan> !haskell 2+2
23:27:15 <EgoBot> 4
23:27:21 <oerjan> !haskell main = print $ 2+2
23:27:24 <EgoBot> runhaskell: syntax: runghc [-f GHC-PATH | --] [GHC-ARGS] [--] FILE ARG...
23:27:32 <oerjan> Gregor: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
23:28:55 <kallisti> how do you even analyze Dr. McNinja
23:29:16 <kallisti> "the author here is trying to convey that a ninja doctor riding a raptor is awesome."
23:31:00 <oerjan> Gregor: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
23:31:28 <kallisti> oerjan: there would be no problem if elliott hadn't deleted my hackego script..
23:31:39 <oerjan> ic
23:31:40 * kallisti pouts.
23:33:02 <kallisti> `haskell
23:33:04 <HackEgo> ​/home/hackbot/hackbot.hg/multibot_cmds/lib/limits: line 5: exec: haskell: not found
23:33:55 <oerjan> @tell elliott you appear to have deleted kallisti's HackEgo haskell script while EgoBot's wasn't even _working_ properly. what do you have to say in defense and how would you like to be executed?
23:33:55 <lambdabot> Consider it noted.
23:34:08 <kallisti> oerjan: well.
23:34:11 <kallisti> it was working at the time
23:34:12 <kallisti> but
23:34:14 <kallisti> also at the time
23:34:17 <kallisti> egobot had been down for several days.
23:34:23 <oerjan> ic
23:34:59 <kallisti> I actually don't remember how I wrote it now...
23:35:46 <oerjan> btw i need a version which does newtype and instance declarations, of course.
23:36:22 <kallisti> can ghc run from standard input?
23:36:51 <oerjan> unless someone remembers that lambdabot has an obscure imported module which does modular powers.
23:37:12 -!- copumpkin has joined.
23:37:20 <oerjan> kallisti: for module compilation? doubt it.
23:37:25 <kallisti> oerjan: help how do I runhaskell with standard input.
23:37:30 <kallisti> HOW DID I DO THAT?
23:37:32 <kallisti> maybe I didn't.
23:37:34 <kallisti> what.
23:37:36 <kallisti> I don't know.
23:37:46 <oerjan> tmpfile? it's what EgoBot does, afaik.
23:37:53 <kallisti> I don't recall using a tempfile.
23:37:59 <kallisti> but that's an option.
23:38:07 <oerjan> maybe you just did ghc -e
23:38:14 <kallisti> oh, maybe.
23:39:21 <oerjan> that _should_ be enough with a ghc recent enough to support all declarations in ghci. but that's pretty recent, maybe even after latest platform.
23:39:37 <kallisti> `run ghc -e ' main = print (2+2)'
23:39:44 <HackEgo> ​\ <interactive>:0:6: parse error on input `='
23:40:08 <oerjan> no, ghc -e doesn't do modules. afaict it does ghci commands
23:41:29 <oerjan> `run ghc -e 'let {m = 10}; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m; (+) = undefined; (-) = undefined; abs = undefined; signum = undefined; fromInteger = undefined }; print . iterate m (\M x -> M 3 ^ x) $ M 3'
23:41:34 <HackEgo> ​\ <interactive>:0:13: parse error on input `;'
23:41:43 * Phantom_Hoover → sleep
23:41:45 <oerjan> fancy
23:41:48 -!- Phantom_Hoover has quit (Quit: Leaving).
23:41:54 <oerjan> `run ghc -e 'print (2+2)'
23:41:59 <HackEgo> 4
23:42:16 <oerjan> `run ghc -e 'let {m = 2}; print (m+m)'
23:42:21 <HackEgo> ​\ <interactive>:0:12: parse error on input `;'
23:42:35 <oerjan> ic :(
23:42:50 <oerjan> not quite all of ghci, i take
23:43:15 <oerjan> `run ghc -e 'putStr "test"; print (m+m)'
23:43:20 <HackEgo> ​\ <interactive>:0:14: parse error on input `;'
23:43:32 <oerjan> right, no support of multiple commands :(
23:43:38 <kallisti> `run cd bin && echo '#!/bin/sh' > haskell && echo '$T=mktemp; echo $1 > $T; runhaskell $T' >> haskell && chmod +x haskell
23:43:40 <HackEgo> No output.
23:43:42 <kallisti> oerjan: this is wrong isn't it.
23:44:22 <oerjan> you need .hs extension.
23:44:32 <kallisti> it's... enforced?
23:44:52 <oerjan> well, there's a flag to ignore it
23:45:14 <kallisti> `run cd bin && echo '#!/bin/sh' > haskell && echo '$T=`mktemp`; echo "$1" > $T; runhaskell $T' >> haskell && chmod +x haskell
23:45:16 <HackEgo> No output.
23:45:24 <kallisti> `haskell main = print $ 2+2
23:45:31 <kallisti> >_>
23:45:40 <kallisti> maybe I need to actually print something.
23:45:51 <Sgeo> > print $ 2+2
23:45:52 <lambdabot> <IO ()>
23:45:55 <Sgeo> boo
23:45:57 <HackEgo> ​/hackenv/bin/haskell: 2: =/tmp/tmp.yr3eUgdBhN: not found \ /hackenv/bin/haskell: 2: cannot create : Directory nonexistent
23:46:11 <kallisti> um, okay.
23:46:23 <kallisti> >_>oh
23:46:32 <kallisti> `run cd bin && echo '#!/bin/sh' > haskell && echo 'T=`mktemp`; echo "$1" > $T; runhaskell $T' >> haskell && chmod +x haskell
23:46:34 <HackEgo> No output.
23:46:39 <kallisti> `haskell main = print $ 2+2
23:46:42 -!- copumpkin has changed nick to pumpmas.
23:46:44 <HackEgo> 4
23:46:47 <kallisti> bam
23:47:10 -!- pikhq has quit (Read error: Operation timed out).
23:47:25 <kallisti> oerjan: presumably runhaskell turns on said option.
23:48:02 <oerjan> `haskell m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m; (+) = undefined; (-) = undefined; abs = undefined; signum = undefined; fromInteger = undefined }; main = print . iterate m (\M x -> M 3 ^ x) $ M 3
23:48:06 <kallisti> also when do temp files go away? maybe I shouldn't just create them all the time.
23:48:07 <HackEgo> ​\ /tmp/tmp.k5wpKFOHX0:1:224: \ Couldn't match expected type `a0 -> b0' with actual type `[a1]' \ In the return type of a call of `iterate' \ Probable cause: `iterate' is applied to too many arguments \ In the second argument of `(.)', namely \ `iterate m (\ M x -> M 3 ^ x)' \ In the expression: print . iterate m (\ M x -> M 3 ^ x)
23:48:08 -!- pikhq has joined.
23:48:14 <oerjan> fffffffff
23:48:35 <oerjan> kallisti: it is possible .hs is the default assumption, i guess
23:48:47 <oerjan> oh hm
23:49:07 <oerjan> `haskell m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m; (+) = undefined; (-) = undefined; abs = undefined; signum = undefined; fromInteger = undefined }; main = print $ iterate m (\M x -> M 3 ^ x) (M 3) !! m
23:49:12 <HackEgo> ​\ /tmp/tmp.ALDmG4ubTI:1:224: \ The function `iterate' is applied to three arguments, \ but its type `(a0 -> a0) -> a0 -> [a0]' has only two \ In the first argument of `(!!)', namely \ `iterate m (\ M x -> M 3 ^ x) (M 3)' \ In the second argument of `($)', namely \ `iterate m (\ M x -> M 3 ^ x) (M 3) !! m' \ In the expression: print $ iterate m (\ M x -> M 3 ^ x) (M 3) !! m
23:49:24 <oerjan> oops
23:49:28 <oerjan> `haskell m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m; (+) = undefined; (-) = undefined; abs = undefined; signum = undefined; fromInteger = undefined }; main = print $ iterate (\M x -> M 3 ^ x) (M 3) !! m
23:49:33 <HackEgo> ​\ /tmp/tmp.ME0aPlxkPR:1:234: \ Couldn't match expected type `t0 -> t1' with actual type `M' \ In the pattern: M \ In the first argument of `iterate', namely `(\ M x -> M 3 ^ x)' \ In the first argument of `(!!)', namely \ `iterate (\ M x -> M 3 ^ x) (M 3)'
23:51:03 <oerjan> :t iterate
23:51:04 <lambdabot> forall a. (a -> a) -> a -> [a]
23:51:08 <kallisti> explosion of tempfiles.
23:51:28 <oerjan> `ls /tmp
23:51:30 <HackEgo> No output.
23:51:34 <kallisti> oh
23:51:48 <oerjan> they're probably not put in the repository
23:53:08 -!- Klisz has joined.
23:53:32 <oerjan> oh hm
23:53:50 <oerjan> `haskell m :: Integer; m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m; (+) = undefined; (-) = undefined; abs = undefined; signum = undefined; fromInteger = undefined }; main = print $ iterate (\M x -> M 3 ^ x) (M 3) !! fromIntegral m
23:53:55 <HackEgo> ​\ /tmp/tmp.qMSSrjhqHX:1:248: \ Couldn't match expected type `t0 -> t1' with actual type `M' \ In the pattern: M \ In the first argument of `iterate', namely `(\ M x -> M 3 ^ x)' \ In the first argument of `(!!)', namely \ `iterate (\ M x -> M 3 ^ x) (M 3)'
23:54:04 * kallisti considered actually making a script that generates hackego commands
23:54:19 <oerjan> oh duh
23:54:26 <oerjan> `haskell m :: Integer; m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m; (+) = undefined; (-) = undefined; abs = undefined; signum = undefined; fromInteger = undefined }; main = print $ iterate (\(M x) -> M 3 ^ x) (M 3) !! fromIntegral m
23:54:32 <HackEgo> M 2464195387
23:54:35 <oerjan> yay!
23:54:50 -!- pikhq_ has joined.
23:55:06 <kallisti> oerjan: the fabled mod-10 integers...
23:55:09 <oerjan> `haskell m :: Integer; m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m }; main = print $ iterate (\(M x) -> M 3 ^ x) (M 3) !! fromIntegral m
23:55:14 <HackEgo> ​\ /tmp/tmp.Ybxs5kTYQA:1:75: \ Warning: No explicit method nor default method for `+' \ In the instance declaration for `Num M' \ \ /tmp/tmp.Ybxs5kTYQA:1:75: \ Warning: No explicit method nor default method for `abs' \ In the instance declaration for `Num M' \ \ /tmp/tmp.Ybxs5kTYQA:1:75: \ Warning: No explicit method nor default method for `signum' \ In the instance declaration for `Num M'
23:55:21 <oerjan> *sigh*
23:55:34 <oerjan> it seems all those undefined's are necessary in HackEgo too
23:55:56 -!- DCliche has quit (Ping timeout: 248 seconds).
23:56:03 <oerjan> `run haskell 'm :: Integer; m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m }; main = print $ iterate (\(M x) -> M 3 ^ x) (M 3) !! fromIntegral m' | tail -1
23:56:06 <kallisti> well necessary if you want to see your output through all the warnings.
23:56:08 <HackEgo> ​\ /tmp/tmp.90muCEPMJy:1:75: \ Warning: No explicit method nor default method for `+' \ In the instance declaration for `Num M' \ \ /tmp/tmp.90muCEPMJy:1:75: \ Warning: No explicit method nor default method for `abs' \ In the instance declaration for `Num M' \ \ /tmp/tmp.90muCEPMJy:1:75: \ Warning: No explicit method nor default method for `signum' \ In the instance declaration for `Num M'
23:56:22 <oerjan> wat
23:56:43 <kallisti> um
23:56:45 <kallisti> dunno
23:56:52 -!- pikhq has quit (Ping timeout: 248 seconds).
23:57:23 <oerjan> why in the world didn't the tail -1 work
23:57:52 <oerjan> oh wait hm
23:57:52 <kallisti> my script is too cool for it.
23:58:31 <oerjan> `run haskell 'm :: Integer; m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m }; main = print $ iterate (\(M x) -> M 3 ^ x) (M 3) !! fromIntegral m' 2&>/dev/null
23:58:36 <HackEgo> No output.
23:58:51 <oerjan> er hm wait
23:58:55 <oerjan> `run haskell 'm :: Integer; m = 10; newtype M = M Integer deriving (Eq, Show); instance Num M where { M x * M y = M $ (x * y) `mod` 10^m }; main = print $ iterate (\(M x) -> M 3 ^ x) (M 3) !! fromIntegral m' 2>/dev/null
23:59:00 <HackEgo> M 2464195387
23:59:03 <oerjan> whew
23:59:20 <kallisti> lol
23:59:23 <oerjan> it didn't work because it only affected stdout
23:59:40 <kallisti> &> redirects everything.
23:59:59 <oerjan> i remembered
←2011-12-15 2011-12-16 2011-12-17→ ↑2011 ↑all