←2011-09-16 2011-09-17 2011-09-18→ ↑2011 ↑all
00:00:07 <elliott> Only co-ops can register .coops
00:00:11 <Gregor> Oh :P
00:00:30 <elliott> But seriously, co-operatives aren't nonprofit, so .org doesn't apply, and they're not really anything like a "traditional" business at all, so .com doesn't really apply either
00:00:33 <elliott> .coop seems reasonable to me
00:00:43 <monqy> ok
00:00:56 <elliott> 23:31:52: <CakeProphet> kallisti.name
00:00:56 <elliott> 23:31:54: <CakeProphet> doesn't have the same ring
00:01:01 <elliott> CakeProphet: Your name is CakeProphet Kallisti?
00:01:06 <elliott> Otherwise no go, you can't register it.
00:01:12 <Gregor> Except that .com, .net and .org mean "entity that thinks .com is a cool TLD", "entity that thinks that .net is a cool TLD" and "entity that thinks that .org is a cool TLD"
00:01:23 <zzo38> OK, that seems a sensible explanation. But maybe better is .msc for "miscellaneous" anything that the other TLD does not apply
00:01:56 <elliott> Gregor: That doesn't make introducing new TLDs with semantic purpose dumb :P
00:02:03 <elliott> Gregor: .org's derestriction is terrible though.
00:02:11 <elliott> I've seen straight-out businesses operating off .org.
00:02:17 <Gregor> elliott: Codu dot ORRRRRRRRG
00:02:21 <Gregor> I AM AN ORG
00:02:42 <elliott> Gregor: You don't profit from codu, so it seems reasonable enough
00:02:50 <elliott> We really need a non-horrible "personal" TLD though
00:02:50 <Gregor> Damn
00:02:56 <Gregor> I just happen to be an org of one :P
00:03:00 <elliott> .name is awful, .me is awful
00:03:08 <itidus20> .info ?
00:03:13 <Gregor> Also, .me is not actually a TLD for individuals, right?
00:03:21 <monqy> info is not suited for personal
00:03:26 <elliott> Gregor: It's been marketed as one since before it came out
00:03:29 <elliott> Gregor: See nic.me
00:03:36 <Gregor> elliott: Well of course.
00:03:43 <Gregor> elliott: Just because whatever country .me is isn't stupid :P
00:03:47 <elliott> Gregor: Well, their government is making tons of money off it. :P
00:03:53 <elliott> So it's as officially for people as it can be.
00:03:56 <Gregor> Fair enough *shrugs*
00:04:16 <Gregor> It's amazing that we live in a world where a government can make a ton of money for happening to have a good name :P
00:04:19 <elliott> Montenegro apparently
00:04:24 -!- copumpkin has quit (Quit: Computer has gone to sleep.).
00:04:35 <elliott> Gregor: I gotta wonder why Tokleau isn't rolling out the casinos and hookers
00:04:36 <elliott> Maybe they are
00:05:00 <elliott> Although I can't imagine .tk makes that much money, seeing as its entire appeal is being free
00:05:08 <elliott> Oh wow.
00:05:09 <elliott> http://my.dot.tk/tweak/
00:05:11 <Gregor> Also it has no meaning as a word :P
00:05:16 <elliott> A URL shortener that registers a new domain for every URL.
00:05:23 <Gregor> BAHAHAHA
00:05:26 <elliott> Finally an idea so stupid I did not think of it first.
00:05:26 <Gregor> BEST
00:05:27 <Gregor> EVER
00:05:39 <zzo38> Both the official and unofficial DNS have TLDs according to mode of access; which is an idea I don't like. Mode of access would be the bottom level if anything, not the top level. It could also be by port number. (Some such TLDs are .mobi and .gopher)
00:05:43 <elliott> OK, who wants to set up a bot to shorten URLs with that constantly?
00:05:47 <elliott> We can exhaust the namespace in a few months.
00:06:12 <elliott> Oh wow, they even have an API.
00:06:14 <CakeProphet> elliott: my pretty newish Dell laptop starts to get very very slow once my population hits about 80
00:06:17 <elliott> "We never remove shortened URLs, as long as they are created in accordance with our terms & conditions."
00:06:19 <elliott> Yesssssssssssssssssssssssssssssssss
00:06:28 <elliott> CakeProphet: My pretty newish MacBook Air doesn't
00:07:06 -!- Nisstyre has quit (Ping timeout: 260 seconds).
00:07:18 <monqy> but what are their temrs ans conditieosn
00:07:44 <CakeProphet> elliott: also yeah VPN is probably the way to go. I just like the idea of running my own server, plus I can avoid hosting costs.
00:07:59 <elliott> >VPN
00:08:06 <elliott> Also, you "run your own" VPS. You get root.
00:08:17 <elliott> You can irrevocably fuck it up if you want. Nobody else can fix it for you.
00:08:22 <elliott> (Well, you can usually reset the HD.)
00:08:26 <CakeProphet> well right. Not what I mean..
00:08:39 <zzo38> Running your own server is always best way you can configure whatever protocols you need and whatever server software you need; even if you use Apache you should need to configure it
00:08:39 <CakeProphet> still I'd be paying for one internet bill instead of an internet bill and a hosting bill.
00:08:40 <elliott> Also, it's like twenty dollars a month, which is way cheaper than a non-laughable connection would be.
00:08:49 <elliott> Add the COST of the computer...
00:08:49 <CakeProphet> zzo38: you can do the same on a VPN
00:08:53 <elliott> VPS
00:08:53 <elliott> VPS
00:08:54 <elliott> VPS
00:08:59 <elliott> A VPN IS SOMETHING ENTIRELY DIFFERENT
00:09:03 <coppro> ^
00:09:04 <CakeProphet> elliott: I'll be getting a nice Desktop anyways.
00:09:07 -!- ralc has joined.
00:09:09 <CakeProphet> er... VPS
00:09:11 <CakeProphet> right
00:09:14 <itidus20> "Per IP address only 250 addresses maybe shortened per 24 hours. "
00:09:19 <coppro> CakeProphet: make sure you're allowed to run a server on your internet connection
00:09:22 <elliott> CakeProphet: Yes, and unless it's constantly idle it'll make a lousy server.
00:09:26 <coppro> CakeProphet: odds are good you aren't
00:09:32 <coppro> oh, and your OS too
00:09:34 <elliott> Especially since basically every major ISP tries to block nice ports such as, you know, eighty.
00:09:36 <coppro> check the licensing terms
00:09:42 <elliott> Eighty is also known as "port HTTP".
00:09:52 <CakeProphet> :(
00:10:26 <zzo38> Not all ISPs block port 80 (or other ports). You can still run HTTP server on nonstandard port, or run different protocol servers too
00:10:43 <CakeProphet> what so I can't play Borderlands and Magicka and Dwarf Fortress on my home web server? :P
00:10:48 <CakeProphet> it's like you're expecting me to get actual traffic.
00:11:02 <elliott> Enjoy hosting everyone's blogs
00:11:06 -!- Nisstyre has joined.
00:11:07 <elliott> Does Magicka run on Linux
00:11:09 <CakeProphet> no.
00:11:12 <elliott> Or are you seriously planning to run a server on Windows
00:11:15 <CakeProphet> no.
00:11:27 <CakeProphet> but it would be worth it to play Magicka I think.
00:11:27 <elliott> So you're planning to have a server that goes out for hours at a time at unpredictable intervals when you play games
00:11:29 <CakeProphet> my laptop can't run it.
00:11:39 <CakeProphet> elliott: yes that's the plan. :P
00:11:47 <monqy> good plan
00:11:48 <zzo38> My ISP has specifically said it is allowed to run servers on any port.
00:11:50 <CakeProphet> but do servers really "go out" because of that?
00:12:01 <monqy> what is zzo's isp
00:12:11 <zzo38> Delta Cable
00:12:37 <zzo38> I don't know if they have that information public, but they have told me by telephone.
00:13:43 <elliott> The .me registry is operated by doMEn, which won a contract to do so after a bid process conducted by the government of Montenegro.
00:13:50 <elliott> Gregor: So .me is owned by do men.
00:14:03 <CakeProphet> ....I believe that's "do me in", but okay.
00:14:06 <elliott> Oh jesus, I just realised that .me is the successor of .yu X-D
00:14:50 <CakeProphet> "do me in" sounds like a very trustworthy company.
00:15:02 <elliott> Gregor: Don't worry, you can get libc.what after a few revolutions.
00:15:11 <Gregor> :'(
00:15:22 <Gregor> elliott: BTW, .tk's "tweak" service has an API.
00:15:22 <CakeProphet> kallisti.pro is an awesome name.
00:15:26 <zzo38> And in fact I have servers on three ports. Later I might even add more.
00:15:28 <CakeProphet> monqy is a pro.
00:15:37 <elliott> Gregor: I said that.
00:15:42 <Gregor> elliott: I DON'T READ
00:16:18 <elliott> Man, web.archive.org is really bad at archiving.
00:16:39 <CakeProphet> elliott: you try archiving the web.
00:16:49 <zzo38> I don't plan to change any, because of links coming in externally, I want to ensure the URLs remain valid.
00:17:01 -!- hagb4rd has quit (Ping timeout: 260 seconds).
00:17:37 <CakeProphet> elliott: by the way Magicka is an excellent game if you have a graphics card you should buy it
00:17:41 <CakeProphet> it's like $10
00:17:47 <CakeProphet> best $10 spent
00:18:01 <Gregor> "if you have a graphics card"
00:18:02 <Gregor> lol
00:18:17 <Gregor> I'll just dig out my old Hercules card, I think I've got an ISA slot spare.
00:18:17 <CakeProphet> ..yes/?
00:18:18 <elliott> Unfortunately I use my MacBook Air via serial port.
00:18:25 <CakeProphet> oh.
00:18:32 <CakeProphet> you're running linux right?
00:18:39 <CakeProphet> ....right?
00:18:49 <Gregor> OK, fine, so I'll dig out my first-generation VGA card.
00:18:54 <elliott> No. OS X has excellent support for serial ports.
00:18:56 <CakeProphet> ..
00:19:00 <CakeProphet> NOOOOOO
00:19:03 <zzo38> Gregor: To play CGA collection games you need CGA card; Hercules won't work. You also need PC speaker.
00:19:04 <CakeProphet> and here I believed in you.
00:19:10 * Gregor nods sagely.
00:19:13 <elliott> To get around the fact that my MacBook Air has no serial port, I just punched an appropriately-sized hole in the side.
00:19:20 <elliott> Like, literally punched.
00:19:28 <CakeProphet> ha..
00:19:34 <elliott> Then I realised that it was thinner than a serial port. So I pulled it open.
00:19:38 <CakeProphet> I thought you ran Ubuntu somewhere?
00:19:41 <elliott> It works perfectly.
00:19:48 <elliott> CakeProphet: Everything I am saying is completely true.
00:19:58 <CakeProphet> ..
00:20:09 <Gregor> It is SO TRUE that you can't even handle it.
00:20:20 <CakeProphet> I can't handle this shit I've got to go.
00:20:20 <zzo38> Does the motherboard support serial ports even though there is none? If it isn't, I wouldn't expect that to work.
00:20:26 <CakeProphet> ....
00:20:37 <CakeProphet> I wonder when he'll catch on.
00:20:43 <elliott> zzo38: Yes. Apple may have welded the SSD directly to the motherboard.
00:20:47 <elliott> But they know that you don't fuck with serial ports.
00:20:58 <zzo38> In fact I am sure simply punching a hole in it won't work if the motherboard doesn't already support serial port.
00:21:27 <elliott> Good thing it does.
00:21:32 <elliott> They just couldn't fit the actual hole.
00:23:35 <monqy> wow what
00:23:39 <elliott> monqy: ?
00:23:51 <monqy> i'm two minutes too late because of log reading
00:24:05 <itidus20> crazy bastards just run something like dosbox
00:24:16 <elliott> monqy: too late for what
00:24:21 <monqy> responding snappily
00:24:23 <itidus20> and come to terms with the facts noone ever made cga games for linux
00:24:32 <elliott> monqy: To what
00:25:01 <monqy> not being able to fit in the hole for their port
00:25:06 -!- CakeProphet has quit (Ping timeout: 260 seconds).
00:25:18 <itidus20> or do a dos partition? i dunno
00:25:33 <itidus20> but installing an actual retro video card is not the answer i think
00:25:53 <elliott> monqy: Everything I am saying is completely true.
00:25:53 <monqy> sage advice as always
00:25:54 <zzo38> itidus20: Well, yes, you do not need an actual CGA card if you have a compatible card or an emulator.
00:26:00 <elliott> Gregor: itidus20 says you shouldn't install a CGA card.
00:26:10 <elliott> This is despite the fact that Hercules was a separate thing to CGA.
00:26:29 * itidus20 laughs aloud
00:26:33 <zzo38> Hercules was pretty good monochrome card.
00:26:50 <monqy> elliott: "wow what" doesn't necessarily mean i believe it's true, just that it's ridiculous
00:26:54 <elliott> But what about the Hercules InColor Card??????????????????????
00:27:07 <itidus20> whatever.. i secretly want him to do it
00:27:15 <zzo38> There is color Hercules card? I don't know about that.
00:28:15 <zzo38> CGA Collection is also fully source codes available, so with a few modifications you might get it to compile on other computers too
00:28:26 <monqy> good plan
00:28:44 -!- Tjr has left.
00:28:52 <zzo38> And it is public domain, so it is definitely allowed to do so.
00:28:53 <elliott> Wait, isn't Tjr that nethack guy?
00:29:26 <elliott> I blame ais.
00:29:31 <itidus20> elliott: I percieve two me's. The me of the past who did interesting things but not very well. And the me of the present who does nothing and who thinks the old me was better and also realizes the old me was a failure.
00:29:42 <zzo38> Actually, one of them is STARWARS is probably trademark infringement, but the copyright for the program is still public domain.
00:29:49 <elliott> itidus20: Ye verily.
00:30:39 <itidus20> some people use confusing language to confuse. i use it to make complicated statements
00:31:35 <zzo38> CGA works in low-resolution mode (40x25 text or 320x200 graphics) and high-resolution mode (double the horizontal). CGA Collection games all use low-resolution (although some are text mode and some are graphics mode).
00:31:50 <itidus20> what is cga collection?
00:32:05 <zzo38> A collection of public domain games for DOS computers.
00:32:07 <itidus20> i bet it includes bill williams's alley cats
00:32:15 <itidus20> or is it alleycat^
00:32:29 <zzo38> No it doesn't include that game. It only includes games in the public domain and with source-codes available.
00:32:34 <itidus20> ah
00:33:05 <zzo38> I made the collection myself, but if you have any games meeting the requirement I could add that one too.
00:33:14 <itidus20> hmm
00:33:28 <zzo38> Such as, make up your own game!
00:34:08 <zzo38> You can download some of the games: http://zzo38computer.cjb.net/GAMES/cgacoll1.zip
00:34:16 <itidus20> in the past before i got the world wide web, creating things on my pc was more entertaining
00:34:24 <itidus20> the web is like the spoiling parents
00:34:47 <zzo38> Tell me if you like this game.
00:34:53 <zzo38> Or, other opinion, please.
00:35:34 <zzo38> If you make up levels for any of the games already in CGA Collection, I will add that too.
00:36:08 <elliott> oerjan: STILL NEEDS SOME RENAMIN'
00:36:15 -!- KingOfKarlsruhe has quit (Quit: ChatZilla 0.9.87 [Firefox 6.0.2/20110902133214]).
00:36:49 <itidus20> Virus scanner says: This game cgacoll1 is free of viruses however my heuristics indicate it is probably bollocks.
00:37:08 <itidus20> (i didnt really virus scan it)
00:37:30 <itidus20> oh wow its a whole collection
00:37:39 <itidus20> in 208kb
00:38:16 <zzo38> It includes a lot of games although the linked URL is a ZIP file of only five of them. I will post more later. And possibly, update those that are already there, too.
00:38:58 <itidus20> i wish i had my old games from my 8086/80286 days
00:39:17 <Jafet> http://gog.com
00:39:18 <itidus20> my games were nothing fancy at all.. just experiments of someone learning qbasic1.0
00:39:37 <zzo38> If you read the documentation file and have questions about any of the other games described there, you can ask me. I might be able to post them immediately or it might take a while
00:39:49 <itidus20> 10 crappy versions of pong. fixed at 45degree angle increments
00:40:04 <zzo38> itidus20: I made only one.
00:40:15 <itidus20> it was the same version.
00:40:35 <zzo38> But I don't include those thing in CGA Collection.
00:40:35 <itidus20> i think i just renamed each improvement like pong1, pong2, pong3
00:40:58 <elliott> Jafet: I like the part where they're selling a game that came out this year
00:41:21 <elliott> Good Old Games without the old part... so Good Games... now we just need to find a bad game they're selling and it'll be Games
00:41:23 <elliott> g.com
00:42:04 -!- Vorpal has quit (Ping timeout: 260 seconds).
00:42:19 <monqy> it'll be an old game eventually
00:42:23 <monqy> they're future-ready
00:42:55 <zzo38> All games in CGA Collection so far are games I programmed myself, although if anyone make up other games too, meeting the requirements, please tell me I might add it there too
00:43:01 <itidus20> i did vector graphics in turbo pascal 6 simply because my way of doing putpixel for every pixel was way too slow
00:43:41 -!- oerjan has quit (Quit: Good night).
00:44:10 <itidus20> like line(0,0,5,0) or whatever the syntax was.. ran faster than putpixel(0,0); putpixel(1,0); putpixel(2,0); putpixel(3,0); putpixel(4,0); putpixel(5,0);
00:44:56 <itidus20> or did it.. oh who cares
00:46:02 <Jafet> elliott: perhaps the game was already old!
00:46:12 <zzo38> Try the five games I posted: BIGMAZE, PUZZLEX, STARSTAK, WUMPUS9, and ZNAK.
00:46:13 <itidus20> ok enough rambling.. i started bigmaze
00:46:14 <elliott> itidus20: What, you didn't try poking the byte before line?
00:46:16 <Jafet> Oh, it wasn't DNF.
00:46:23 <zzo38> itidus20: Did you read the documentation first?
00:46:31 <elliott> Jafet: Well, DNF would certainly remove the "Good" part.
00:46:39 <elliott> s/remove/invalidate/
00:46:43 <itidus20> a little...
00:46:49 <itidus20> i don't like over-reading documentations
00:47:27 <zzo38> OK, but at least be aware the controls are the arrow keys (or h,j,k,l if you prefer) and the space-bar to use dig.
00:47:43 <itidus20> big maze is reminiscent of minecraft innit
00:47:51 <zzo38> I don't think so.
00:48:28 <itidus20> it "anticipates" minecraft, to use art-critic speak
00:49:00 <zzo38> OK, but I don't know. Write your own reviews though, if you like to do so.
00:49:19 <zzo38> I don't know art-critic speak either.
00:50:29 <itidus20> well anticipates means, it basically does something before something else does it in a more popular way
00:50:38 <itidus20> something like that
00:51:09 -!- ive has quit (Read error: Operation timed out).
00:51:21 <zzo38> OK
00:51:36 <itidus20> hmm.. i like the ascii-maze style
00:52:13 <itidus20> also what seems to be hiding bits of the maze that are too far out of the way
00:53:51 -!- hagb4rd has joined.
00:54:33 <itidus20> ahh the cross was a window
00:55:17 <itidus20> thought maybe it is burial :P
00:55:23 <zzo38> Yes, the cross is a window.
00:56:07 <itidus20> zzo38: basically i try to add extra spice to some gaming experiences by intentionally not reading all of documentation
00:57:05 <zzo38> Well, it is not required to read the documentation. And then, you try to figure out.
00:58:09 <itidus20> there is a difficulty of if you give too many instructions the player will feel they are following instructions
00:58:47 <itidus20> im not saying bigmaze documentation does that.
01:00:03 <zzo38> Yes; I try to avoid discussing strategy in the documentation, and I also intentionally do not include everything, as much as possible.
01:00:31 <itidus20> heh
01:00:44 <zzo38> I list the controls, command-line parameters, goals, and possibly a few other things. But not everything.
01:01:21 <itidus20> but still, i am spoiled by the worldwide web
01:01:31 <itidus20> entertainment coming from so many sources
01:03:23 <elliott> Sigh, when did oerjan escape
01:03:32 <elliott> Hey Deewiant, the burden falls onto you to rename Vector again
01:03:57 <zzo38> itidus20: Did you win? Did you lose?
01:04:05 -!- sebbu2 has joined.
01:04:05 -!- sebbu2 has quit (Changing host).
01:04:05 -!- sebbu2 has joined.
01:04:09 <itidus20> oh i lost
01:04:21 <itidus20> it was late on that i noticed the arrow
01:04:43 <itidus20> also.. i think i got confused about what digging actually caused..
01:04:57 <itidus20> since so much of the screen can change when digging
01:05:11 <itidus20> now wumpus hunting
01:05:17 <zzo38> It digs around your location. However, some things are undiggable.
01:07:17 <zzo38> The WUNPUS9 game is much more difficult than the old "Wumpus" game. The goals are also different (in this game, simply to have a high score; you are guaranteed to die in this game)
01:08:18 <elliott> zzo38: can you relink again
01:08:20 <elliott> i might try in dosbox
01:08:21 -!- sebbu has quit (Ping timeout: 260 seconds).
01:08:30 <zzo38> http://zzo38computer.cjb.net/GAMES/cgacoll1.zip
01:09:16 <elliott> thx
01:09:18 <elliott> zipbomb right?
01:09:22 <zzo38> Yes
01:10:37 <elliott> bigmaze startup is fun.
01:10:45 <elliott> How many dots does it do
01:11:00 <zzo38> elliott: It is not always the same amount.
01:11:34 <elliott> How many lines can I expect to wait for, since it's pretty slow :P
01:11:37 <elliott> Roughly
01:12:05 <zzo38> Usually 4 to 6
01:12:47 <elliott> Thanks
01:12:53 <elliott> It must be a very big maze
01:13:23 <elliott> zzo38: It's meant to look kinda squashed, right
01:13:39 <elliott> (Also, where's the documentation itidus20 mentioned?)
01:14:01 <zzo38> elliott: No it isn't; it is meant for 40x25 text screen
01:14:06 <zzo38> The documentation is CGACOLL.DOC
01:14:13 <itidus20> microsoft proprietry format .doc
01:14:18 <itidus20> :P
01:14:18 <elliott> Hmm; here the face is squashed so it's much wider than high
01:14:22 <zzo38> It is a plain ASCII text file with printable line endings 75 columns
01:14:40 <zzo38> itidus20: It is not a Microsoft format; it is a plain ASCII format. It just has the .DOC extension.
01:14:42 <itidus20> sorry zzo for then for that accusation
01:16:12 <DH____> Word for MS Dos?
01:16:20 <zzo38> No; just plain ASCII text.
01:17:24 <elliott> zzo38: Where's DANCEKEY
01:17:31 <elliott> Or DOWN
01:17:57 <Gregor> What is that imaginary joke machine people mention when you start stepping on undefined behavior in C? And what is its best implementation? :P
01:17:58 <zzo38> Most of the files are missing; sorry. I will post whatever I can when I can. Possibly in a few days.
01:19:25 <elliott> Gregor: ...DS9K, and Deewiant has just started implementing one today... that we then talked about... for hours...
01:19:28 <elliott> Are you _trying_ to be synchronicious?
01:20:45 <Gregor> elliott: Um ... no? :P
01:20:53 <Gregor> elliott: I was trying to remember it for my C lab today.
01:20:56 <elliott> Gregor: Well you're succeeding.
01:21:14 <elliott> Gregor: I don't know of any implementations of C's abstract machine that deliberately try to trip code up; that's why we've discussed one a lot in here :P
01:21:54 <Gregor> Right, yeah, it's been talked a lot about in here, which is why I asked in here :P
01:21:57 <zzo38> I have old versions of some of the files but I don't want to post those. I believe I have the newest version of KNAR, though. (These files are on other computer and I need floppy disk to transfer them; that is why I don't have all files)
01:21:59 <Gregor> But you'd think SOMEBODY would have implemented it.
01:22:17 <elliott> Gregor: Maybe someone has, but it was probably bad
01:22:34 <elliott> Gregor: The problem is that almost every program relies on tons of UB.
01:22:53 <elliott> Gregor: You can either be an almost useless tool, or make UB /work/ but in a way that you can detect and log.
01:23:07 <Gregor> Hmm
01:23:27 <Gregor> I think more precisely you'd want a sort of "undefinedness verbosity level"
01:23:48 <elliott> It's not that simple; either you let UB happen undetected, or you define things in a way that when UB happens, you know about it, and that makes it almost impossible to recover from
01:24:11 <elliott> Casting an int to a pointer is UB, right?
01:24:12 <Gregor> Well, but there are many undefined behaviors.
01:24:17 <elliott> But pointer to int isn't.
01:24:34 <Gregor> In principle, you could switch off in each of those cases and either do the expected thing or nonsense based on flags.
01:24:44 <elliott> You want your int-representations of pointers to be absolutely ridiculous to trip out things that expect them to be used normally; but if someone casts a pointer to an int, you log it as UB, but then you have to /have a useful result/.
01:24:57 <Gregor> Hmhmhm
01:24:58 <elliott> And if you have a useful result, then pointer -> integer -> pointer doesn't work, and that'll break every program that expects it to.
01:25:05 <elliott> i.e. most programs that cast integers to pointers.
01:25:34 <elliott> Gregor: Personally I think it should just be hardline about it because good programs should make you feel bad about yourself
01:25:52 <elliott> No harm in offering a resume feature when it can be done, but pointless to try and design around it
01:25:54 <Gregor> But wait ... OK, maybe I'm not following.
01:26:19 <Gregor> Let's say for simplicity that "undefined behavior" is always "program terminates with exit code 42", since it's easy to check for.
01:26:23 <elliott> Gregor: Your false assumption is probably that you can detect UB without changing the semantics of the implementation.
01:26:30 <elliott> You cannot.
01:26:37 <Gregor> Hmmmmmmmmmm
01:26:42 <elliott> You must use completely pathological representations to trip programs up.
01:26:50 <elliott> e.g. pointers cannot be integers, internally, you want something completely different.
01:26:56 <elliott> You want to keep track of the type in pointers.
01:26:58 <elliott> Array bounds.
01:26:58 <elliott> etc.
01:27:12 <elliott> But hang on, you can convert anything in C to a bunch of bytes.
01:27:12 <Gregor> But the thing is, casting a pointer to an integer is something a compiler can see.
01:27:16 <elliott> Because you can cast anything to a char pointer.
01:27:19 <Gregor> It could simply write abort() instead of the code to do it.
01:27:29 <elliott> Gregor: Too bad that's not UB
01:27:46 <Gregor> You ... just said it is? :P
01:27:53 <elliott> No, integer -> pointer is
01:27:54 <elliott> I think
01:27:56 <Gregor> Oh
01:27:59 <Gregor> Well, whichever one.
01:28:04 <Gregor> Either way, the compiler can see it.
01:28:08 <elliott> Gregor: s/compiler/interpreter/
01:28:18 <elliott> It must be some kind of interpreter or it can't catch tons of things.
01:28:31 <Gregor> Fair enough, but this one in particular is static :P
01:28:40 <elliott> Gregor: Anyway, the point is that the way you define things mean that operations like that /can't/ just "log but then go on".
01:28:48 <elliott> Because you have to change the representations to trip programs up.
01:28:52 <elliott> Which then makes those operations meaningless.
01:28:56 <Gregor> I don't argue for "log but then go on"
01:28:57 <elliott> Which is the whole point they're UB - they don't make sense everywhere.
01:29:07 <elliott> Gregor: What, then? "Be more like a real machine slider"?
01:29:19 <elliott> That would probably work, but is a pain to code, and you'd lose a lot
01:29:25 <Gregor> Well, more like a bunch of flags (with convenient presets), and if a UB is met, *boom*
01:29:49 <Gregor> No "go on", because ... why go on?
01:29:53 <elliott> Well
01:29:55 <elliott> That isn't what I meant
01:30:04 <elliott> Gregor: You're assuming every UB detection can look like this
01:30:10 <elliott> if (level > n) abort();
01:30:13 <elliott> else return meaningful_result;
01:30:15 <elliott> It can't.
01:30:26 <elliott> I will say this one more time before I start typing in all-caps:
01:30:39 <elliott> You must change representations to catch as much UB as possible, and these changes make the relevant UB operations detectable but having _no meaningful result_.
01:30:50 <elliott> That is the reason a lot of things are UB: Because they only make sense given certain assumptions that aren't true everywhere.
01:30:56 <elliott> You must break those assumptions to trip programs up.
01:31:11 <elliott> The point is: "If my program works with DS9KCC, it works anywhere."
01:31:20 <elliott> Therefore, one must violate all assumptions possible.
01:31:55 <itidus20> one naive assumption is that a char is 8bits
01:32:03 <Gregor> I understand that you keep saying that, but I'm not yet convinced because you're yet to present an example :P. Although intuitively I'd agree with you that there are cases which are not detectable at runtime, I just haven't found a case in my head.
01:32:07 <itidus20> is that a good one to start with?
01:33:35 <Gregor> Well, that a char is 8 bits isn't a behavior ... that a char, shifted left by six bits, is something, is.
01:33:49 <Gregor> Though I suppose to define all such cases I end up in Rice's purgatory :)
01:34:07 <elliott> Gregor: Logread if you want examples
01:34:09 <elliott> It's been discussed tons
01:34:15 <Gregor> Fair 'nuff
01:34:16 <elliott> I gave a minor example
01:34:32 <itidus20> i will not try to wedge myself into the topic anymore.
01:34:35 <itidus20> :D
01:34:41 <elliott> itidus20: Oh, you were talking? :P
01:34:50 <elliott> Gregor: Btw "that a char is 8 bits isn't a behavior" yes it is
01:34:51 <elliott> CHAR_BIT
01:35:13 <Gregor> Reading CHAR_BIT is behavior.
01:35:18 <Gregor> The fact that a char is 8 bits is not.
01:35:20 <elliott> Gregor: Incidentally, Valgrind with -fmudflap and all that nonsense is kind of a partial C DS9K
01:35:24 <elliott> Handling only memory management
01:35:40 <elliott> I think -fmudflap is the one that causes every memory access to go through a function, at least
01:35:42 <elliott> I don't really recall
01:35:55 <elliott> The great thing about a C DS9K is that you can give ridiculously detailed errors :P
01:35:56 <Gregor> I just said "reading" for a #define, but y'know, that sorta is reading at CPP-time :P
01:36:47 <zzo38> It is possible to do C preprocessor at the same time as reading other C codes.
01:36:47 <elliott> "The pointer (sdfdf + 999) in function foo at file:line:col was dereferenced, overflowing the bounds of the array blah at otherfile:line:col by N elements."
01:37:30 <elliott> Gregor: Oh yeah, and pointers to different types should look TOTALLY different (when read via char-pointer)
01:37:38 <elliott> Especially function pointers
01:37:53 <elliott> Even if there's an integer index SOMEWHERE in a pointer, it wants to be random :P
01:38:09 <elliott> And each pointer should be of a different, stupid size.
01:38:11 <elliott> As in
01:38:13 <elliott> Each pointer type
01:38:32 <Gregor> Hmmmm ... I truly thought that void * was guaranteed to be the same size as char * (but not function pointers) ...
01:38:48 <elliott> The only guarantee is that any pointer can be casted to (void *)
01:38:53 <elliott> (void *) can just be lolhuge.
01:38:56 <Gregor> Ahh, so void * --- right.
01:39:18 <Gregor> Essentially you could have an arbitrarily-retarded amount of space be usable for things of certain types :P
01:39:21 <elliott> In fact, (void *) could be smaller than (char *); maybe (char *) stores string length or something for debugging purposes :P
01:39:23 <itidus20> ok i looked up ds9k .. what a wonderful thing.. especially the name
01:39:24 <elliott> Then the cast would just throw that away.
01:39:53 <Gregor> elliott: Surely (char *) (void *) (char *) is supposed to work ...
01:40:11 <elliott> Gregor: Yeah, but that'd just note that no length info was available.
01:40:23 <Gregor> Oh right, I spose that since it's for debugging it doesn't matter :P
01:40:23 <elliott> Of course == would discard the length info in comparing equality.
01:40:28 <elliott> But it's still part of the size.
01:40:32 <Gregor> Heh
01:40:41 <elliott> Gregor: Basically, the main reason to fuck with (observable) representations isn't to catch UB that you couldn't otherwise (though it can aid in that, certainly), but to violate the assumptions programs make.
01:40:59 <elliott> Sure, it might just crash horribly rather than giving a nice error message, but the point is that a program that assumes those things will break.
01:41:14 <elliott> And besides, "crashing horribly" pretty much always means you get a luxurious error message when the machine is this clued-in.
01:41:18 <Gregor> Sure sure.
01:41:48 <Gregor> Right, I guess my contention was just that this sort of thing isn't all cause /undefined/ behavior, the behavior is well-defined, it's just not what the programmer expected.
01:42:01 <elliott> Gregor: There's a problem similar to branch coverage though... e.g. if there's a signed overflow that only happens in extremely rare situations.
01:42:06 <Gregor> "isn't all cause" >_> ???
01:42:13 <elliott> You need a combination of static analysis and runtime DS9Kery... but those are basically entirely separate projects.
01:42:24 <elliott> Since DS9Kness is mostly in the backend, and static analysis is like compilation without a backend :P
01:42:27 <Gregor> elliott: Oh for piff sake, let's not go overboard :P
01:42:33 <Sgeo> DS9K?
01:42:40 <elliott> Gregor: Dude, you call signed overflow overboard?
01:42:49 * Sgeo googles
01:42:50 <elliott> Gregor: Do you REALISE how little you're allowed to do in C?
01:42:52 <Gregor> elliott: I call detecting that in all unreached branches overboard.
01:43:01 <elliott> That's impossible.
01:43:07 <Gregor> Yes :P
01:43:14 <elliott> The point is that lots of programs have UB that's only rarely reached.
01:43:18 <elliott> Most bugs are only rarely reached.
01:43:23 <elliott> That's why they haven't been fixed.
01:43:38 <elliott> So you need a separate static analyser to catch things less accurately but more ahead-of-time.
01:43:41 <elliott> But that's an entirely separate project.
01:43:54 <elliott> I'm just saying that a platonically perfect DS9K toolchain would include a static analyser.
01:44:06 <Gregor> I'm just --- right, "platonically perfect" is what I'm arguing about :P
01:44:09 <itidus20> there could be a C compiler which would simply not compile UB right?
01:44:28 <Gregor> elliott: Designing a system that is actually implementable within our lifetimes would be a nice first step :P
01:44:44 <elliott> Gregor: Deewiant wrote/is writing a parser, so /shrug
01:54:46 -!- myndzi\ has joined.
01:55:43 -!- Jafet1 has joined.
01:58:31 -!- mycrofti1 has joined.
01:58:55 -!- atehwa_ has joined.
01:59:33 -!- Jafet has quit (Ping timeout: 260 seconds).
01:59:34 -!- mycroftiv has quit (Ping timeout: 260 seconds).
01:59:34 -!- atehwa has quit (Ping timeout: 260 seconds).
01:59:35 -!- myndzi has quit (Ping timeout: 260 seconds).
02:04:23 <elliott> "Agda now knows where your (HTML5 geolocation compatible) browser is [...] I just came back from a walk round the block with my Android phone, and watched my coordinates update themselves."
02:04:26 <elliott> WHY ARE YOU DOING THIS TO POOR AGDA
02:05:23 <Sgeo> What do they mean by Agda? Surely not the language
02:06:58 <elliott> Agda
02:07:04 <elliott> http://permalink.gmane.org/gmane.comp.lang.agda/3127
02:11:32 <itidus20> new random thought here
02:11:37 <itidus20> is testing computation?
02:11:42 <elliott> >_<
02:12:16 <itidus20> every software system tends to involve testing
02:12:53 <itidus20> because what the human creates is not always what the human desires
02:13:05 -!- ralc has quit (Quit: Leaving).
02:13:52 <itidus20> and also, that a program is only correct according to a standard being used by a human
02:14:57 <Sgeo> I'm wondering if I could make my VM vaguely resemble PicoLisp's
02:14:58 <itidus20> i wish i didn't have to do this monologue
02:15:18 <itidus20> attempted cathartic
02:16:44 <itidus20> humans created C standard. humans wrote programs in C. the programs are only wrong because they are measured against C standard. therefore humans shouldn't beat themselves up over it ^^;
02:17:27 -!- Jafet1 has changed nick to Jafet.
02:17:41 -!- quintopia has quit (Ping timeout: 260 seconds).
02:17:59 <itidus20> i am not sure whether humans act randomly. because a computer can easily act pseudorandomly.
02:20:57 -!- quintopia has joined.
02:20:57 -!- quintopia has quit (Changing host).
02:20:57 -!- quintopia has joined.
02:21:47 <itidus20> most applications are written in such a way that they expect the user to not operate at 100% efficiency of using the application.
02:22:35 <itidus20> slow typing, slow mouse moving, slow thinking, slow text reading, uncertainty, ignorance of features
02:22:40 <Gregor> Hulu's movie selection is like MST3K without the MST3K characters.
02:23:23 <itidus20> so the most efficient applications are the ones most removed from human interaction
02:24:56 <itidus20> ahh.. one could just feed a stream of 0s and 1s into a cpu
02:25:03 <itidus20> who cares what it does
02:26:01 <elliott> `addquote <Gregor> Hulu's movie selection is like MST3K without the MST3K characters.
02:26:03 <HackEgo> 668) <Gregor> Hulu's movie selection is like MST3K without the MST3K characters.
02:27:53 <elliott> I wonder why FRP isn't more popular in JavaScript.
02:27:57 <elliott> Probably 'cuz it's called FRP.
02:28:04 <coppro> FRP?
02:28:08 <monqy> FUNCTIONAL IS HARD
02:28:15 <elliott> coppro: frp
02:28:18 <elliott> It stands for frp.
02:28:34 <itidus20> as long as a human is not monitoring the calculations then a CPU which is getting it's data and instructions as a stream of 0s and 1s is correct computation
02:29:19 <itidus20> i suppose then error is defined by anything which interrupts the processing of the stream
02:29:23 <coppro> elliott: that's the dumbest acronym ever
02:30:03 -!- copumpkin has joined.
02:30:10 <elliott> coppro: Sorry, you misspelled best.
02:30:15 <elliott> It lets you vary the punctuation.
02:50:03 <Gregor> "The Rocky Horror and Bullwinkle Picture Show"
02:53:15 <itidus20> so the trouble with software is it gives feedback
02:54:01 <itidus20> feedback means it enters into the reward and punishment mechanisms.. as if software is judging us
02:55:33 <itidus20> contrasting with the leitmotifs used to build up associations between music and characters/themes
02:56:19 <itidus20> so i am being too crazy about it..
02:56:32 <itidus20> cause and effect is not judgement
03:00:20 <elliott> <edwardk> i redesigned the way i was plumbing diagnostic messages through trifecta. now there are a much simpler set of combinators, and many fewer twisty passages they must take going through the parser
03:00:21 <elliott> Deewiant:
03:00:26 <elliott> New release ;-)
03:09:47 -!- evincar has joined.
03:10:55 <evincar> I am returned.
03:10:55 <lambdabot> evincar: You have 1 new message. '/msg lambdabot @messages' to read it.
03:11:39 <evincar> I don't suppose anyone cares much.
03:12:01 <Gregor> We care because now we have to type "el[tab]" for elliott instead of just "e[tab]" X-P
03:13:08 -!- evincar has changed nick to why.
03:13:16 <why> Aww, registered nick.
03:13:21 -!- why has changed nick to evincar.
03:13:24 <evincar> I give up.
03:13:35 <evincar> I'm not known by enough names that I can just switch.
03:19:45 -!- MDude has changed nick to MSleep.
03:20:04 <evincar> Holy shit. I earned $8.73 yesterday from ads?
03:22:05 <evincar> I did not know my blog was earning this much.
03:22:17 <elliott> A WHOLE EIGHT DOLLARS A DAY
03:22:39 <evincar> I know. That covers at least my food.
03:23:48 <evincar> I usually spend twenty minutes on a post, so if it makes me a few dollars, it still works out to a decent hourly rate.
03:23:53 <Jafet> "The best minds of my generation are figuring out how to make people click ads." ~ Jeff Hammerbacher
03:24:28 <evincar> I don't care too much about it. It's just a nice surprise.
03:25:01 <evincar> I'm more concerned with people reading my content than clicking the nearby salesmanboxen.
03:28:17 <evincar> Speaking of concerns, I'm concerned I'll need to rewrite the interpreter for my language. :(
03:29:58 <evincar> It's very modular and wonderfully lazy right now, and it would suck to break that...
03:30:05 <evincar> ...but the different levels of the language are heavily intertwined.
03:30:13 <evincar> So the interpreter may have to reflect that.
03:32:32 -!- itidus20 has quit (Quit: Leaving).
03:39:10 -!- ive has joined.
03:53:00 <zzo38> I found out something in Haskell, that if you import qualified, and then, you can define the class members for an instance without qualification.
04:07:16 <zzo38> And I think const = curry fst and flip const = curry snd
04:09:16 <zzo38> And fst = uncurry const and snd = uncurry $ flip const
04:14:46 <Lymee> :t fst
04:14:47 <lambdabot> forall a b. (a, b) -> a
04:15:03 <Lymee> :t curry
04:15:04 <lambdabot> forall a b c. ((a, b) -> c) -> a -> b -> c
04:15:20 <Lymee> Oh, curry, not uncurry.
04:15:38 <elliott> Deewiant: edwardk says he was planning to add something to customise the tab width
04:15:39 <elliott> FWIW
04:17:22 -!- hagb4rd has changed nick to hagb4rd|zzZ.
04:20:45 <zzo38> Tab width in what?
04:22:15 <elliott> trifecta
04:25:16 -!- nys has quit (Quit: enden).
04:25:38 <zzo38> Can you set it to infinite?
04:26:04 <elliott> no
04:26:41 -!- hagb4rd|zzZ has quit (Ping timeout: 260 seconds).
04:28:42 <elliott> http://www.moderngpu.com/intro/scan.html#Ballot
04:28:51 <elliott> ais deals with aliens.
04:31:25 <elliott> Gregor: Remember that question you asked who's answer was LZO
04:31:30 <elliott> Gregor: http://code.google.com/p/snappy/ might be another answer
04:33:07 <elliott> Deewiant: Also
04:33:10 <elliott> <edwardk> but even so, he could largely ignore the column information i give, i have a column byte in delta as well that provides the offset from the beginning of line in bytes
04:33:11 <elliott> <edwardk> if he doesn't care about the rendering of the source line then he can just use that if he must
04:33:14 <elliott> <edwardk> (assuming he doesn't care about utf-8)
04:33:22 <elliott> This is so much more efficient than direct communication
04:34:13 <Gregor> elliott: Sweet
04:34:24 <elliott> Gregor: What WERE you using it for, anyway?
04:34:47 <Gregor> elliott: Intermediate files produced while doing some music processing that ended up needing to be floating point.
04:35:05 <elliott> What's wrong with that
04:35:33 <Gregor> Only that there are no lossless codecs for floating point audio.
04:35:43 <Gregor> Err, no lossless /compressed/ codecs anyway :P
04:35:47 <elliott> Were the files really that big uncompressed?
04:35:51 <Gregor> Yes.
04:35:54 <elliott> How big
04:36:14 <Gregor> Well, for my ~4 minute audio file, before everything could finally be put together, it was about 5GB
04:36:19 <elliott> Yow
04:36:35 <elliott> How many fucking bits/channels/whatever :-P
04:36:38 <elliott> /hz
04:36:48 <Gregor> 64/2/48000
04:37:01 <elliott> 64-bit floating point? That... I don't think that's a commonly-used audio format.
04:37:18 <Gregor> Even 32-bit floating point isn't particularly common :P
04:37:23 <elliott> Why. Are you doing that.
04:37:34 <Gregor> But 32-bit floating point can't accurately store every 32-bit integer value, so converting /to/ it is lossy.
04:37:40 <Gregor> (I only go to 16-bit as my final step)
04:37:40 <elliott> >_<
04:38:33 <Gregor> Human ears can't hear the difference, but cumulative errors are a bitch, and human ears can hear them real good.
04:38:46 <Gregor> More precision = less cumulative errors
04:38:53 <Gregor> (Or rather, lesser cumulative errors)
04:39:28 <elliott> Humans can't tell ~128 Kio/s MP3 from the original source
04:39:33 <zzo38> Then don't use the floating point format
04:39:34 <elliott> For an average definition of human
04:39:44 <Jafet> For an average definition of source
04:39:45 <elliott> Do you have any examples of such cumulative errors? ABX results? :-P
04:39:48 <Gregor> elliott: Shall I just repeat my last three lines, or would you prefer to read them again?
04:40:14 <Gregor> Precisely the cumulative errors I was getting was from combining multiple reverberations.
04:40:14 <elliott> Gregor: Just asking if you have any actual examples, since I don't think anyone in the world has yet resorted to 64-bit floating point audio :P
04:40:29 <Gregor> Oh, I'm overkilling it.
04:40:33 <Gregor> Most assuredly.
04:40:44 <Gregor> But suffice it to say I was very frustrated with the cumulative errors :P
04:41:14 <Jafet> I heard from a film commentary that they had to render some part of it with 64-bit colour instead of 32-bit colour, because it affected the results
04:41:26 <Jafet> It involved a diffraction shader or something
04:41:51 <elliott> <director> The infrared! You fucked up the goddamn infrared! Fix it!
04:42:02 <Gregor> Right, probably the same sort of idea. You can't tell the difference, but if there's an error in the difference 1000 times, you can.
04:42:04 <elliott> Tetrachromats must find films really disappointing.
04:42:12 <elliott> They look so /dull/.
04:43:00 <Gregor> Is there a term for hypothetical beings that can actually discern all colors? (Ignoring the physical plausibility of such an ability)
04:43:12 <elliott> Headaches
04:43:14 <Gregor> X-D
04:43:41 <elliott> It sounds an excellent recipe for a pretty but useless visual field.
04:46:25 <elliott> Deewiant: <edwardk> elliott: trying to figure out how i can make a modeline parser transformer for reading vim and emacs mode lines and adjusting tabstops, etc. appropriately
04:46:45 <elliott> My parsing library had better become exponentially more awesome overnight with this kind of shit to keep up with
05:25:05 -!- ive has quit (Quit: leaving).
05:34:29 -!- copumpkin has quit (Ping timeout: 240 seconds).
05:34:53 -!- copumpkin has joined.
05:39:14 <evincar> elliott: How do you measure the awesome of a library?
05:44:25 <elliott> http://www.thepimanifesto.com/
05:44:33 <elliott> Oh my god everybody shut up.
05:45:39 <monqy> why is pi vs tau a thing
05:46:09 <elliott> people don't have anything better to do
05:46:19 <evincar> It's so petty...
05:46:21 <elliott> "Tauists also claim that their version of Euler's formula is better than the original, but we will see that it is in fact weaker."
05:46:26 <elliott> this is amazing
05:46:45 <elliott> im going to find a bunch of formulas where 3pi looks nicer and start the... uhh, lets look at the greek alphabet
05:47:02 <elliott> qoppa manifesto
05:47:11 <elliott> Ϙ
05:47:41 <evincar> That's not even modern Greek. You're doing it right.
05:48:32 <evincar> As programmers, aren't we guilty of stuff like this though?
05:48:52 <evincar> Very often?
05:49:07 <monqy> nope
05:49:43 <zzo38> I think pi is better, but the reason has nothing to do with circles.
05:50:14 <evincar> Pi has to do with circles...
05:50:20 <evincar> ...anything that has to do with pi has to do with circles.
05:50:28 <monqy> shut up shut up shut up
05:51:24 <zzo38> evincar: No it doesn't. Various things with circles have pi, but not everything, and not everything pi is circles.
05:51:53 <evincar> I'm much too lazy to argue.
06:01:23 <evincar> Blog posts about programming languages --> 0-100 views.
06:01:33 <evincar> Blog posts about stuff I don't really care about --> 100-1000 views.
06:01:35 <evincar> :(
06:01:45 <evincar> I appear to be doing it wrong.
06:01:51 <coppro> woot, almost finished getting down linear algebra notes
06:06:44 -!- acommasplice has joined.
06:08:24 <elliott> acommasplice: hi
06:08:57 <elliott> `? welcome
06:08:59 <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
06:09:25 <acommasplice> hi
06:11:11 <Jafet> Which esoteric programming languages have been deployed?
06:14:29 <evincar> Jafet: What do you mean by "deployed"?
06:15:11 <Jafet> HackEgo: What do you mean by "deployment"?
06:15:21 <elliott> `log international hub
06:15:22 <Jafet> The silent type, eh.
06:15:34 <elliott> Silenter than it should be.
06:15:35 <elliott> HackEgo: oi.
06:15:37 <HackEgo> 2009-05-07.txt:21:57:15: <ais523> ah, I always get a warm fuzzy nostalgic feeling when we have "the international hub for esoteric programming language design and deployment" in the topic
06:15:56 <elliott> I think it's just a play on them practical channels' topics.
06:16:00 <elliott> At least circa oh-five.
06:16:10 <evincar> So I'm thinking about a package system for my language.
06:16:12 <Jafet> We should be the intergalactic hub
06:16:31 <elliott> `log intergalactic hub
06:16:36 <HackEgo> 2011-09-17.txt:06:16:31: <elliott> `log intergalactic hub
06:16:44 <elliott> Hmph.
06:16:44 <elliott> `log intergalactic hub
06:16:47 <HackEgo> 2011-09-17.txt:06:16:31: <elliott> `log intergalactic hub
06:16:52 <elliott> `log I hate you
06:16:56 <HackEgo> 2007-07-09.txt:16:55:15: <CakeProphet> I HATE YOU
06:17:29 <elliott> I share these sentiments.
06:17:32 <evincar> Do you suppose it makes sense for a package to have a canonical URL?
06:17:40 <elliott> They are sentiments I share.
06:17:51 <evincar> Or should there be an alias and a central repo of redirects to real URLs, in case of change?
06:18:22 <elliott> What is it with me and long, verbose wiki comments lately.
06:18:25 <elliott> Well okay, two of them.
06:18:26 <evincar> I don't want to set up any central stuff...
06:18:38 <elliott> But two is, like, significantly more than one.
06:18:40 <elliott> Or even zero.
06:18:46 <elliott> I'd like to point out that two is much greater than zero.
06:19:02 <elliott> And thus by the "zero, one, infinity" rule we can conclude that I'll be making long, verbose wiki comments for the rest of my life.
06:19:14 <elliott> That isn't quite infinity though. I guess I've assured my own immortality?
06:19:27 <evincar> Congratulations.
06:19:37 -!- acommasplice has quit (Quit: acommasplice).
06:20:09 <elliott> RIP acommasplice.
06:20:12 <elliott> Killed by a comma splice.
06:20:47 <evincar> So like http://company.com/very/package.vp versus very://company/package
06:21:27 <elliott> Meanwhile, a very esoteric work:
06:21:28 <elliott> http://hackage.haskell.org/package/gutenberg-fibonaccis
06:21:36 <evincar> Where the latter would go to cvan.com/company/package.vp and possibly be redirected to the former.
06:21:36 <elliott> "The fibsLen function returns the number of Fibonacci numbers - |in the first1001Fibs list."
06:21:45 <evincar> ...
06:21:48 <elliott> Thank god Gutenberg are preserving the fibonacci numbers for generations to come.
06:22:17 <evincar> We might lose them otherwise.
06:22:35 <evincar> I guess decentralised > centralised?
06:22:48 <evincar> And then if you're changing your URL, you'll notify people anyway.
06:22:54 <evincar> And old software will just be broken.
06:23:07 <evincar> Or you could put it on github or something and save yourself the trouble.
06:23:14 <evincar> Hadn't thought of that.
06:23:39 <elliott> I wonder if that guy is anticipating further Gutenberg fibonacci releases.
06:23:49 <elliott> You know, so he can make it bigger, and then maybe fibsLen would be useful.
06:24:01 <elliott> When we discover more Fibonacci numbers.
06:24:06 <evincar> They come out in episodes of 1001 each.
06:24:19 <evincar> One episode a season.
06:25:04 <evincar> Also, is it a good idea for a web framework to validate generated code?
06:25:18 <evincar> Or should it stay out of the way?
06:25:23 <Jafet> Why would generated code be invalid?
06:25:36 <elliott> Jafet: It might break its knee.
06:26:03 <evincar> I dunno, you could write something that's syntactically fine but semantically invalid.
06:26:06 <Jafet> Is this why some programmers worry about padding?
06:26:08 <evincar> Easily.
06:26:15 <elliott> Jafet: Yes.
06:26:19 <elliott> Jafet: Health and safety is vital when programming.
06:26:22 <elliott> It's a rough world out there.
06:27:02 <Jafet> Why would a code generator produce something semantically invalid?
06:27:11 <Jafet> Find that code generator and break its knee.
06:27:38 <evincar> I dunno, say someone writes <span><p>...</p></span>. Am I responsible?
06:27:56 <Jafet> Did they include a doctype?
06:28:23 <evincar> Assume <!DOCTYPE html> I guess.
06:28:30 <monqy> evincar: you could put that in the type system if you wanted to
06:28:30 <elliott> Jafet: I, too, advocate violence against invalids.
06:28:34 <elliott> Jafet: You monster.
06:28:34 <Jafet> What's HTML?
06:28:45 <monqy> evincar: but why are you talking about this
06:28:54 <Jafet> Or html
06:29:07 <evincar> monqy: Writing a basic web framework for my language?
06:29:09 <monqy> ew
06:29:17 <evincar> Jafet: HTML5.
06:29:27 <monqy> evincar: anyway you wouldn't check the output; you'd put it in the type system and catch errors at compile time
06:29:33 <Jafet> Okay, then validate it as HTML5. If that's even possible.
06:29:54 <Jafet> For bonus points, validate all actionscript
06:29:55 <evincar> monqy: Yeah. Well, I'd do it at compile-time, but not in the type system.
06:30:07 <monqy> then where would it be?
06:30:14 <monqy> if not in the type system
06:30:19 <evincar> In a macro.
06:30:21 <monqy> what
06:30:27 <monqy> what do you mean
06:30:29 <monqy> in a macro
06:30:38 <evincar> In a function that is evaluated at compile time.
06:30:55 <monqy> and what would it do
06:31:11 <elliott> monqy: this is beautiful poetry.
06:31:11 <monqy> I have a feeling you're wrong about something and I have an idea as to what it is
06:31:20 <elliott> Beautry.
06:31:21 <elliott> Boetry.
06:31:36 <Jafet> How Poeful.
06:32:20 <monqy> evincar: indeed you could be Wrong about multiple things
06:32:35 <evincar> Well, I've got a family of macros (such as <span>) that read cdata and other SGML-like macros.
06:32:36 <monqy> evincar: it is very possible your naive approach would be computationally impossible
06:32:56 <evincar> So they'd just report any elements that show up that shouldn't be in them.
06:32:57 <elliott> Jafet: Boeful.
06:33:00 <elliott> Boefultry.
06:33:05 <elliott> Botry.
06:33:06 <elliott> Boats.
06:33:08 <elliott> I like boats.
06:33:10 <monqy> evincar: and how would it know what elements show up in them
06:33:16 <monqy> evincar: how would you determine this at compile time
06:33:51 <evincar> By...reading them?
06:33:56 <evincar> There are plenty of ways to check.
06:33:56 <monqy> what do you mean reading them
06:34:08 <elliott> You can read books.
06:34:11 <evincar> Maintain a stack of parent element names, and blow up if they're wrong.
06:34:11 <elliott> Not as well as boats though.
06:34:14 <elliott> Boaks.
06:34:17 <elliott> The best thing
06:34:18 <elliott> .
06:34:33 <monqy> evincar: what happens if it doesn't halt
06:34:40 <monqy> evincar: is your language sub-TC?
06:34:43 <evincar> Why wouldn't it halt?
06:35:02 <evincar> HTML is sub-TC. :P
06:35:05 <monqy> what
06:35:07 <monqy> i mean your language
06:35:35 <monqy> if you can use your language to embed arbitrary tags and stuff in html, and your language is TC, you've got a Real Problem if you're doing it your way
06:36:21 <evincar> I don't know what you mean by "embed arbitrary tags and stuff in html".
06:36:25 <monqy> i mean
06:36:27 <evincar> And I think you might be misunderstanding me.
06:36:37 <evincar> Because I haven't really explained myself. :P
06:36:50 <monqy> ok; explain away
06:36:58 <monqy> I assure you, you're Wrong
06:37:05 <elliott> Wrongness is good.
06:37:12 <elliott> Actually most things starting with capital letters are.
06:37:18 <elliott> They're so
06:37:20 <elliott> capital.
06:37:38 <shachaf> Capital letters are evil.
06:37:46 <shachaf> English would be far superior if they were completely eliminated.
06:37:46 <monqy> evincar: if you don't feel like explaining, that's fine too; honestly, I'd rather not bother
06:38:03 <monqy> evincar: just know that you're Wrong
06:38:46 <evincar> monqy: It's simple. Tags are macros, which expand to functions that act like templates.
06:39:02 -!- acommasplice has joined.
06:39:03 <monqy> evincar: and how does this catch html errors at compile time
06:39:40 <evincar> By including simple validation tests in the tag macros?
06:39:52 -!- acommasplice has left.
06:39:54 <monqy> and how would that catch html errors at compile time
06:40:07 <monqy> look, you're severely underthinking it
06:40:41 <evincar> There's not much to think about.
06:40:45 <monqy> oh?
06:40:50 <evincar> Write a function that validates some HTML.
06:41:03 <evincar> Now define it as a macro so it evaluates at compile-time.
06:41:16 <evincar> And name it after a tag.
06:41:21 <evincar> Yaaay done.
06:41:22 <monqy> how about an example
06:42:07 <monqy> (define f (don't terminate)) (span f)
06:42:39 <evincar> If the code you put in a template doesn't terminate, you can't expect the template to terminate.
06:43:09 <monqy> so your compilation will silently hang
06:43:28 <monqy> dude
06:43:34 <monqy> just embed it in the type system
06:43:35 <evincar> That's like saying <?php function f() { don't terminate } ?><span><?php f(); ?></span>
06:43:41 <monqy> or some other sub-tc language
06:43:43 <evincar> It's nonsensical.
06:43:48 <monqy> how about
06:43:53 <evincar> Why would you do that?
06:43:55 <monqy> writing your web framework
06:43:57 <monqy> in a sub-tc language
06:44:01 <monqy> such that
06:44:04 <monqy> nothing can ever not terminate
06:44:08 <monqy> that would be
06:44:08 <monqy> grand
06:44:25 <evincar> I already did that once.
06:44:28 <monqy> evincar: people make mistakes. mistakes make infinite loops.
06:44:48 <monqy> evincar: why not embed it in the type system? does your language not have a good type system?
06:45:35 <evincar> monqy: It would be possible to do it in the type system, but not as pretty.
06:45:43 <monqy> not as pretty?
06:45:49 <elliott> Can I have a number sign monqy?
06:45:51 <elliott> It'd be very nice and lovely.
06:45:54 <monqy> #
06:45:58 <elliott> Thanks bro.
06:46:08 <elliott> You can stop your poetry now though.
06:46:12 <monqy> ok
06:46:14 <monqy> evincar: shut up
06:46:28 <evincar> You're the one who was arguing.
06:46:35 <evincar> I just asked if it was a good idea to validate the output at all.
06:46:53 <monqy> how boring
06:56:52 <evincar> Not all problems are interesting.
06:59:49 <monqy> except this channel is for ones that are
07:02:21 <evincar> Care to help me figure out how I ought to implement this beast then?
07:02:33 <evincar> The language itself.
07:02:38 <evincar> Not the dumb library.
07:02:38 <monqy> be a better language / be a better person
07:02:59 <evincar> It's a great language.
07:03:05 <monqy> I'm doubtful
07:04:32 <evincar> It has an irrational obsession with metaprogramming.
07:04:52 <monqy> irrational obsession sounds Bad
07:05:14 <Jafet> Rational obsession?
07:05:20 <evincar> Sounds bad, but feels good.
07:05:36 <elliott> Irrational Obsession: a good b- no it's not who am I kidding.
07:05:49 <elliott> I wonder what the ratio of things people have said are good band names to good band names is.
07:06:58 <Jafet> Queen is a really shitty band name.
07:07:20 <evincar> I resent successful bands with bad names because it perpetuates bad naming.
07:07:50 <elliott> Jafet: Not as bad as King.
07:07:50 <monqy> cool
07:10:04 <evincar> All the layers of the language are intertwined problematically.
07:10:23 <evincar> I fear I'll end up with a one-function interpreter, with no modularity.
07:11:24 <monqy> oh no
07:12:04 <evincar> :/
07:18:16 -!- itidus21 has joined.
07:18:52 <elliott> oh hello itidus21
07:19:16 <monqy> A Refreshing Change of Pace
07:19:40 <elliott> a refreshing change of itidus21
07:23:27 <itidus21> ahh
07:27:16 <elliott> monqy: nother number sign please?
07:27:25 <monqy> ############################################
07:27:25 <elliott> never mind
07:27:28 <elliott> found the old one
07:31:48 <elliott> thanks though
07:33:17 -!- CakeProphet has joined.
07:33:17 -!- CakeProphet has quit (Changing host).
07:33:17 -!- CakeProphet has joined.
07:35:21 <CakeProphet> SUP GUYS
07:36:58 <elliott> sup
07:38:52 <CakeProphet> just got back
07:38:55 <CakeProphet> from social stuff
07:38:56 <CakeProphet> and now
07:38:59 <CakeProphet> I must do not social stuff.
07:39:04 <elliott> log off irc then
07:39:05 <monqy> like irc
07:39:07 <monqy> oops
07:39:11 <elliott> sorry monqy
07:39:14 <elliott> yours was better
07:39:24 <CakeProphet> elliott: unpossible.
07:40:08 <CakeProphet> assholes. doubting my multitasking skills.
07:41:14 <itidus21> i wish i could do social stuff
07:41:26 <itidus21> sort of
07:41:28 <CakeProphet> uh, why?
07:41:33 <CakeProphet> also, you ca.
07:41:33 <CakeProphet> n
07:42:17 <itidus21> because the fact that i can't is merely symptomatic of my mental problems
07:42:41 <CakeProphet> only if you think about that way.
07:42:51 <CakeProphet> which, is more difficult to change than it sounds, I realize.
07:43:08 <itidus21> i struggle to enjoy moment to moment existence
07:43:13 <elliott> CakeProphet: s/only if you think about it that way/only if you think about it that way, or actually have mental illness/
07:43:23 <CakeProphet> elliott: well...
07:43:29 <CakeProphet> that's a difficult topic.
07:43:36 <elliott> you brought it up
07:43:44 <CakeProphet> and like I said it's more difficult than it sounds, for anyone.
07:43:47 <itidus21> im always stressing about fear of vertigo, or fear of heights or fear of open spaces
07:43:49 <CakeProphet> especially if you have a mental illness.
07:44:16 <itidus21> fear of "what is self?"
07:44:28 <itidus21> ok its like this
07:44:30 <CakeProphet> I too have fears about Self. it's a scary idea.
07:44:44 <itidus21> you know that superman movie where they send the villains into space in a polygon
07:44:47 <evincar> When you have fears about Self, just make Smalltalk.
07:44:59 <itidus21> sometimes i wonder if my existence is really squashed like that
07:45:13 <elliott> CakeProphet: "Think your problems away" is basically the premise of that awful The Secret book. Though psychiatry is something like homeopathy, so it's not much better.
07:45:28 <evincar> itidus21: Would it really be relevant to your daily life if your existence were squashed?
07:46:06 <evincar> For all practical purposes, you can ignore most probing existential questions.
07:46:08 <CakeProphet> elliott: well, I'm not saying it works quite like that. But in essence any kind of therapy that isn't drug-based follows this kind of path.
07:46:20 <CakeProphet> it's important to think of yourself as not helpless
07:46:23 <CakeProphet> or you won't get anywhere.
07:46:28 <itidus21> evincar: i do ponder them... some people forced them on me i guess
07:46:42 <elliott> CakeProphet: Sure, but that's one of them "necessary, but not sufficient" conditions.
07:47:15 <CakeProphet> sure.
07:47:15 <itidus21> ive never been quite the same since i started to think of myself as a kind of 2 dimensional thing
07:47:49 <itidus21> it just amplifies all my other fears
07:48:41 <evincar> itidus21: Do you engage in enough physical activity? How's your diet?
07:48:54 <evincar> I find that I hate the world if my blood sugar is low.
07:48:59 <evincar> Or if I haven't exercised lately.
07:49:00 <itidus21> i have diabetes
07:49:06 <itidus21> and i dont get any exercize
07:49:07 <evincar> See, that would do it.
07:49:30 <itidus21> i have no friends
07:49:35 <evincar> Your sugar can really fuck with your emotions.
07:49:55 <itidus21> no money, no job, no schooling, can't drive/no car
07:50:08 <monqy> evincar what are you doing
07:50:18 <itidus21> and lots of people who like to manipulate me
07:50:20 <CakeProphet> elliott: perhaps we're not in disagreement here, just emphasizing different points that are both true.
07:51:05 <evincar> monqy: Trying to be helpful based on experience?
07:51:36 <monqy> experience with being itidus21? ouch.
07:51:50 <evincar> Experience with having fucked up blood glucose.
07:51:56 <elliott> the best experience
07:51:57 <elliott> bexperience
07:51:59 <elliott> toast
07:52:08 <elliott> toast :))))))))))))))))))))))))
07:52:09 * CakeProphet has experience at being crazy.
07:52:15 <CakeProphet> dunno how to help with that. I manage somehow.
07:52:37 <itidus21> i can't really be myself in my house because my brother has chronic explosive anger which can be triggered by anything
07:52:59 <itidus21> gradually i am learning that my mom and i are too passive, so the imbalance goes both ways
07:53:39 <itidus21> i need to get regular sleeping pattern to improve my diabetes
07:53:56 <itidus21> but... it seems like i am always being counted on occasionally to be awake in the morning
07:54:08 <itidus21> sometimes my brother will be sleeping in when he works..
07:54:24 <itidus21> or it could be an internet technician visiting early
07:55:23 <itidus21> its like when i go outside i start losing a sense of inside and outside
07:55:33 <itidus21> cos ive been indoors so much]
07:55:40 <itidus21> and i start to flip out
07:55:49 <CakeProphet> I've decided that sleeping properly in the modern world is close to impossible.
07:55:50 <itidus21> combined with the existential pondering
07:56:02 <itidus21> am i inside, am i outside
07:56:53 <evincar> Is the difference important?
07:57:06 <itidus21> i have pondered whether i have some problem with vestibular system
07:58:32 <itidus21> so i try various things.. opening the curtains.. turning on radio
07:58:44 <elliott> radio curtains
07:58:47 <elliott> rurtrains
07:59:05 <monqy> good idea
08:00:19 <elliott> that's
08:00:20 <elliott> my curtains
08:00:22 <elliott> open
08:00:23 <elliott> suddenly
08:00:24 <elliott> radio
08:00:29 <elliott> ......ghost
08:00:37 <CakeProphet> my osseous labyrinth is a beast.
08:00:38 <itidus21> a few times too much existential pondering leads me to start shaking.. at which times i got a cup of whiskey off my broter
08:00:43 <CakeProphet> knowing all sorts of shit about gravity and other forces.
08:00:45 <elliott> the words CakeProphet learned today
08:01:09 <CakeProphet> elliott: always learning.
08:01:23 <evincar> Alcohol isn't...the best thing.
08:01:46 <elliott> iti when's your birthday
08:01:53 <CakeProphet> alcohol is great people are just dumb.
08:01:53 <itidus21> march
08:02:02 <CakeProphet> addiction is a super power.
08:02:44 <evincar> I've never quite gotten past the fact that it tastes like and is poison.
08:02:49 <itidus21> freenode is too academic
08:03:07 <itidus21> every freaking channel is like a science lab :P
08:03:09 <evincar> And I get drunk quickly and sober quickly because I don't weigh a lot.
08:03:19 <CakeProphet> yeah but it's a great poison, and also a macronutrient!
08:03:24 <elliott> itidus21: it's for open projects
08:03:27 <elliott> which in practice reduces to programming
08:03:33 <elliott> what'd you expect
08:03:39 <CakeProphet> second highest in caloric content per mass below fat.
08:04:17 <CakeProphet> it's like, delicious poison fuel that makes it easier to socialize and relax and want to drink more.
08:04:26 <monqy> gross
08:04:31 <CakeProphet> what could go wrong.
08:04:53 <evincar> My progression is generally:
08:05:00 <evincar> One shot, can't feel face.
08:05:03 <evincar> Two shots, drunk.
08:05:08 <evincar> Three shots, can't taste alcohol.
08:05:19 <Patashu> first world problems
08:05:24 <evincar> Wait fifteen/twenty minutes, repeat.
08:05:35 <evincar> I haven't timed this.
08:05:40 <monqy> cool
08:05:42 <evincar> So I'm probably exaggerating.
08:05:52 <itidus21> Patashu: x + y = 0 is always equally dependant on x as it is on y >:-)
08:06:04 <Patashu> yes, very astute of you
08:06:17 <elliott> + is commutative --iti
08:07:01 <itidus21> unfortunately expectations increase needs
08:08:46 <CakeProphet> I'm going to rephrase what you said to make it sound trivial because I'm kind of a jerk -- elliott
08:08:49 * CakeProphet -- jerk
08:08:53 <evincar> Alcohol is excellent for practicing a language though.
08:09:07 <elliott> CakeProphet: but that's literally what he said
08:09:14 <CakeProphet> true enoug.
08:09:16 <CakeProphet> h
08:09:22 <elliott> also commutative is not a trivial word
08:11:18 <monqy> commutativbe is a baby word
08:11:19 <monqy> for babys
08:11:28 <elliott> my word is q
08:11:43 <monqy> q is a good word
08:12:36 <CakeProphet> I think q is frowzy.
08:13:16 <itidus21> all im saying is when i stagger into my brothers room laying down having a whiskey from him while my body is shaking.. which all seems caused by existential pondering
08:13:37 <itidus21> i have been less upset when my father died honestly
08:13:38 <CakeProphet> probably the diabetes.
08:13:40 -!- zzo38 has quit (Remote host closed the connection).
08:15:12 <CakeProphet> eat lots of steak
08:15:14 <CakeProphet> and fish
08:15:15 <CakeProphet> and chicken
08:15:21 <CakeProphet> and stay away from all those saccaride things.
08:15:27 <CakeProphet> when you ponder.
08:15:35 <itidus21> like diet coke type things?
08:15:41 <evincar> CakeProphet: Careful.
08:15:43 <CakeProphet> uh... no
08:15:55 <itidus21> dont even know what saccaride is
08:16:10 <CakeProphet> sugars. either simple or complex carbohydrates.
08:16:21 -!- nooga has joined.
08:16:27 <monqy> bad ideas town
08:16:31 <itidus21> i have to eat a lot of sugars cos my blood sugars drop too easily
08:16:32 <CakeProphet> I guess complex isn't bad.
08:16:33 <monqy> "a good place to be"
08:16:47 <itidus21> i cant control my sugar until i sleep better
08:16:50 <CakeProphet> but yeah #esoteric isn't an advice channel so I hope you're not like
08:16:54 <CakeProphet> taking everything too seriously.
08:17:02 <CakeProphet> itidus21: how so
08:17:09 <elliott> i thought diabetes was having too much blood sugar
08:17:13 <elliott> im not doctor
08:17:14 <itidus21> both
08:17:22 <CakeProphet> it's an inability to maintain it.
08:17:23 <itidus21> the insulin can make it drop if everything is not controlled
08:17:27 <monqy> theres lots of things called diabetes......
08:17:33 <elliott> diabetes "im dont know how to blood sugar" -- diabetes
08:17:35 <itidus21> lack of insulin = high sugar
08:17:38 <elliott> diabetesquotes.com
08:17:40 <itidus21> insulin without food = low sugar
08:17:57 <itidus21> its about mastering that balance
08:18:06 <monqy> do you get to put needles in yourself
08:18:09 <monqy> is that how it works
08:18:21 <itidus21> CakeProphet: perhaps just for you i will monitor my blood sugar better
08:18:34 <elliott> monqy: diabetes.....heroin addiction.....the same thing???
08:18:35 <itidus21> now my comment before was a bit morbid
08:18:37 <CakeProphet> awww how sweet. <3 :3 :3 :3 :3 :# :12; :;
08:18:42 <itidus21> but when im losing my mind.. what can be worse
08:18:43 <elliott> :12;
08:19:04 <elliott> my face
08:19:50 <CakeProphet> itidus21: I believe the trick is to eat small, frequent meals with very few simple sugars.
08:19:57 <CakeProphet> things that will metabolize slowly over time.
08:20:09 <elliott> im mel
08:20:10 <elliott> oops
08:20:37 <itidus21> sorry patashu
08:21:16 <itidus21> everyone of the comments in here must be helping
08:21:44 <CakeProphet> yes #esoteric-self-help is coming along nicely.
08:21:58 <itidus21> it was reading freud comments on subconcious which really gave me the shakes
08:22:09 <CakeProphet> don't ever pay attention to Freud.
08:22:14 <elliott> finally CakeProphet says something smart
08:22:24 <monqy> freud will Hurt you
08:22:33 <itidus21> monqy: why? :P
08:22:33 <elliott> freud is a big poop
08:22:36 <CakeProphet> finally elliott is still a jerk.
08:22:37 <CakeProphet> wait what?
08:22:37 <evincar> Immortalise him in the quote thing.
08:22:42 <elliott> and also unsmart
08:23:01 <elliott> CakeProphet: how many jerk accusations before the jerkhood flips... this is what i wish to know....
08:23:14 <CakeProphet> the jerk is bidirectional
08:23:53 <CakeProphet> elliott: stupid head. nyah.
08:24:05 <elliott> poop
08:24:13 <CakeProphet> > reverse "poop"
08:24:14 <lambdabot> "poop"
08:24:26 <elliott> whoaho
08:24:36 <elliott> monqy: waoah
08:24:39 <monqy> poop
08:24:51 <elliott> poop
08:24:54 <itidus21> now this fear about 2d... makes me worry.. about 1)depth perception 2) reading books 3)watching videos
08:24:59 <CakeProphet> oppo
08:25:03 <itidus21> i think
08:25:04 <elliott> NO
08:25:22 <CakeProphet> elliott: stop being a poop popo
08:25:33 <monqy> poop is a Bad Word
08:25:51 <itidus21> sort of traps me
08:26:21 <CakeProphet> itidus21: you might have extra-dimensional crises when you realize that there is also depth to your width and height.
08:26:33 <CakeProphet> or... width to your depth and height. or height to your depth and width
08:26:40 <CakeProphet> depends on what kind of 2-dimensional thing you are.
08:26:50 <elliott> <monqy> poop is a Bad Word
08:26:51 <elliott> no
08:26:53 <elliott> its the best
08:26:53 <CakeProphet> also point of reference as to where axes are plot.
08:26:56 <elliott> padrilome
08:27:02 <itidus21> i dont think you understand
08:27:16 <itidus21> this isnt a game.. this is pain i endure
08:27:34 <monqy> sorry itidus
08:27:40 <itidus21> to some extent locking me out of enjoyment of traditional 2d media
08:27:46 <itidus21> although i still enjoy some of it
08:29:15 <itidus21> which is ironic in a bedroom full of bookshelves
08:29:40 <CakeProphet> how do you feel about chess?
08:30:09 <itidus21> the solvability of it has started to make me unable to find real purpose in it
08:30:18 <evincar> Play Go then.
08:30:39 -!- evincar has quit (Quit: Goodnight all.).
08:30:45 <monqy> good night evin car
08:31:28 <itidus21> theres a lot which built up to it
08:31:36 -!- derrik has joined.
08:31:47 <itidus21> constant bullying and manipulation from people the whole time growing up
08:32:06 <itidus21> at the end i turned out to be more fragile than i expected
08:35:36 <CakeProphet> Why do you say that?
08:35:51 <monqy> he didn't expect to be as fragile as he observes himself now
08:35:55 <monqy> quite simpley
08:36:06 <itidus21> its a certain anxiety and heavy tiredness in my eyes
08:36:26 <CakeProphet> I don't understand.
08:36:33 <itidus21> just a mess
08:36:45 <monqy> he had an expectation of how fragile he would be. he observes himself to be more fragile than this.
08:37:02 <CakeProphet> Perhaps your plans have something to do with this.
08:37:04 <itidus21> psyche is fragile
08:37:18 <itidus21> im just feeling dizzy
08:37:32 <itidus21> short of breath
08:37:50 <itidus21> sinuses tight
08:38:05 <CakeProphet> `quote
08:38:08 <HackEgo> 59) <Warrigal> I think hamsters cannot be inert.
08:38:24 <itidus21> maybe sleepy
08:38:33 <CakeProphet> constant bullying and manipulation from people the whole time growing up
08:38:44 <CakeProphet> sounds bad.
08:39:35 * CakeProphet should really go to sleep so he can do this metric shit ton of work tomorrow.
08:40:36 <CakeProphet> ^style eliza
08:40:36 <fungot> Not found.
08:40:40 <CakeProphet> ^style
08:40:40 <fungot> Available: agora alice c64 ct darwin discworld europarl ff7 fisher homestuck ic irc* jargon lovecraft nethack pa sms speeches ss wp youtube
08:40:43 <CakeProphet> ^style alice
08:40:43 <fungot> Selected style: alice (Books by Lewis Carroll)
08:40:48 <CakeProphet> ^style agora
08:40:48 <fungot> Selected style: agora (a large selection of Agora rules, both current and historical)
08:40:59 <CakeProphet> ^style ct
08:40:59 <fungot> Selected style: ct (Chrono Trigger game script)
08:41:06 <CakeProphet> ^style pa
08:41:06 <fungot> Selected style: pa (around 1200 transcribed Penny Arcade comics)
08:41:11 <CakeProphet> ^style ss
08:41:11 <fungot> Selected style: ss (Shakespeare's writings)
08:41:14 <CakeProphet> fungot
08:41:15 <fungot> CakeProphet: ham. it is the bishop of winchester, a page with a torch.
08:41:23 <CakeProphet> excellent.
08:45:09 <monqy> good
08:46:52 <CakeProphet> fungot:
08:46:52 <fungot> CakeProphet: bast. my lord protector will come this way by and by
08:47:43 <monqy> bothj are
08:47:46 <monqy> peotic
08:49:58 <CakeProphet> fungot: blatherly
08:49:59 <fungot> CakeProphet: des. what, angry, sir. an early stirrer, by the king your father, and bid mee fetch thee fnord? i will find out logs, and fnord
08:53:52 <fizzie> "fetch thee fnord? i will find out logs, and fnord".
08:58:10 <Patashu> and fnord
09:01:30 <itidus21> ok feeling better with some drawing therapy
09:01:38 <itidus21> and momentary nap
09:13:57 <CakeProphet> fungot: I will fetch no fnords
09:13:58 <fungot> CakeProphet: no visor does become black villany so well as i: nothing confutes me but eyes, and then to beslubber our garments with it, it shall be still thy true loues recompence, my heart
09:16:15 <itidus21> ^style
09:16:15 <fungot> Available: agora alice c64 ct darwin discworld europarl ff7 fisher homestuck ic irc jargon lovecraft nethack pa sms speeches ss* wp youtube
09:16:31 <itidus21> ^style youtube
09:16:32 <fungot> Selected style: youtube (Some YouTube comments)
09:16:44 <itidus21> oh lordy fungot wot has you
09:16:45 <fungot> itidus21: again--not sent via this medium. you can't lie about things that they say: put up or shut up.
09:17:07 <itidus21> fungot, i invoke thee pray tell
09:17:07 <fungot> itidus21: wat language was the aircraft with sofisticate computers, but i think they can keep their bullsh*t straight anymore.
09:17:51 <itidus21> fungot moar
09:17:52 <fungot> itidus21: crappy actors, this video is wrong. the plane was empty ( no people were the days) or... how? like wtf
09:18:09 <itidus21> fungot so many aircraft oriented
09:18:10 <fungot> itidus21: its called takeoff go around button and thats fucking awesome
09:20:04 <itidus21> fungot are you partial to amelia earhart?
09:20:15 <CakeProphet> fungot:
09:20:15 <fungot> CakeProphet: or you will find that there was a fly by at an airshow. look over jorma's shoulder when he first came on snl.
09:20:25 <CakeProphet> youtube isn't great.
09:20:31 <CakeProphet> ^style europarl
09:20:31 <fungot> Selected style: europarl (European Parliament speeches during approx. 1996-2006)
09:20:33 <CakeProphet> fungot
09:20:34 <fungot> CakeProphet: mr president, the first of these is concerned, the use of all the legislation involved. this is a benchmark we must not bury our heads in the right place for these ideas to third countries or the countries currently members of the committee of inquiry into drugs in the first place when nitrofen has been banned for years.
09:20:52 <CakeProphet> fungot
09:20:54 <fungot> CakeProphet: madam president, i would like to draw the honourable members' commitment in the house, have had some very intensive talks with the un human rights committee to investigate the possibilities for aid for the victims of that crash. i feel that many more documents are being supplied in both the products and technologies used. this morning, seemed to me at all that right-wing forces have been involved in these four proc
09:21:39 <itidus21> australian parliament is also interesting
09:23:26 <itidus21> mr speaker, i would like to say to the leader of the opposition mr speaker that the opposition's policies are a betrayal of the australian public mr speaker
09:25:23 <itidus21> heres a random sample http://www.youtube.com/watch?v=aaLLP4sc_6Q
09:27:23 <elliott> this is just uk parliament but wimpier
09:27:29 <itidus21> yeah i know
09:27:30 <itidus21> ...
09:27:44 <elliott> :P
09:29:45 <CakeProphet> American politics is the best.
09:29:58 -!- monqy has quit (Read error: Connection reset by peer).
09:30:01 -!- monqy_ has joined.
09:30:41 <CakeProphet> it's like twice the tomfoolery with half of the sense.
09:32:52 <CakeProphet> > compare LT GT
09:32:52 <lambdabot> LT
09:33:03 <CakeProphet> > compare GT LT
09:33:04 <lambdabot> GT
09:33:07 -!- derrik has quit (Ping timeout: 252 seconds).
09:33:13 <CakeProphet> greater than is greater than greater than
09:33:15 <CakeProphet> er
09:33:16 <CakeProphet> less than
09:34:04 <CakeProphet> oh hey I just found the Ordering negation operator
09:34:05 <elliott> no shit
09:34:13 <CakeProphet> > let f = compare EQ in f LT
09:34:13 <lambdabot> GT
09:34:21 <elliott> clap clap clap
09:34:35 <CakeProphet> well I wouldn't say it's immediately obvious..
09:34:46 <elliott> calp
09:35:01 <CakeProphet> "oh hey why don't I compare comparison values"
09:36:37 -!- monqy_ has changed nick to monqy.
09:39:49 -!- sebbu2 has changed nick to sebbu.
09:50:49 -!- FireFly has joined.
10:13:30 -!- Vorpal has joined.
10:35:27 <monqy> http://esoteric.voxelperfect.net/wiki/User:Aptennap what could it be
10:35:42 -!- yorick has joined.
10:41:59 -!- oerjan has joined.
10:43:59 <oerjan> <elliott> Sigh, when did oerjan escape
10:44:04 <oerjan> i should be so lucky
10:46:08 <elliott> RENAEM MY VECTOR
10:46:48 <oerjan> wat
10:47:00 <oerjan> hector the vector
10:47:01 <elliott> i have a type Vector
10:47:03 <elliott> that amounts to (Value,Value
10:47:04 <elliott> )
10:47:05 <elliott> but
10:47:06 <elliott> Data.Vetor
10:47:07 <elliott> Vector
10:47:08 <elliott> also has
10:47:09 <elliott> Vector
10:47:10 <elliott> and...
10:47:13 <elliott> confusion
10:47:15 <elliott> so
10:47:16 <elliott> I want to rename my Vector type
10:47:19 <elliott> to something nicer??
10:47:20 <oerjan> Pair?
10:47:31 <elliott> I guess Vector might be a misnomer in the first place, I basically use it for position and delta
10:47:41 <elliott> oerjan: um Value is integral if that helps
10:48:00 <oerjan> delta is usually a vector-like quality
10:48:16 -!- nooga has quit (Ping timeout: 252 seconds).
10:48:36 -!- monqy has quit (Quit: hello).
10:49:22 <elliott> oerjan: but yeah help :(
10:49:27 <elliott> pair is ok i guess
10:49:29 <elliott> buuut
10:50:55 <oerjan> it seems hard to think of delta as something other than a vector...
10:51:59 <elliott> it's just a coordinate pair :P
10:52:04 <itidus21> Point ?
10:52:07 <elliott> except sometimes instead of coordinates it is a delta :-|
10:52:14 <elliott> maybe what I need to do is have two type
10:52:15 <elliott> s
10:52:16 <elliott> Point and Delta
10:52:20 <itidus21> Coordinate ?
10:52:28 <itidus21> Position ?
10:52:31 <elliott> Coords would work but is kind of bluh
10:52:34 <elliott> Position and Delta might work
10:52:41 <elliott> I think Point and Delta is nicer thouhg
10:52:46 <oerjan> itidus21: it's the delta that makes it not quite like a point
10:52:51 <itidus21> TwoD
10:53:02 <elliott> the annoying thing is that i'll have to define all the same things for positions and deltas
10:53:08 <elliott> but I guess I just need a simple typeclass for (.+.) and (.-.)
10:53:29 <oerjan> elliott: type Position = Delta, problem solved.
10:53:31 <itidus21> CoincidentScalars
10:53:38 <elliott> oerjan: yes. so well-type-checked.
10:53:59 <itidus21> Location
10:54:02 <oerjan> elliott: newtype Position = Position Delta deriving Everything
10:54:09 <CakeProphet> elliott: make a GADT, phantom types, and then type synonyms
10:54:17 <CakeProphet> profit.
10:54:26 <itidus21> XY
10:54:48 <itidus21> Pixel
10:55:14 <oerjan> Thataway
10:55:24 <itidus21> Translation
10:55:54 <oerjan> Thither
10:56:06 <CakeProphet> type Delta = Pointlike D
10:56:12 <CakeProphet> type Point = Pointlike P
10:56:21 <CakeProphet> SUDDENLY TYPE CHECKING.
10:56:43 <itidus21> Vektori
10:57:04 -!- elliott has quit (Read error: Connection reset by peer).
10:57:12 -!- elliott has joined.
10:57:19 <CakeProphet> obviously elliot left because he was disgusted by my design.
10:57:21 <CakeProphet> oh.. hi
10:57:25 <elliott> there is no elliot
10:57:35 <itidus21> Vektori, Vektor, Bektop
10:57:48 <CakeProphet> whatever you say eltoitl
10:58:02 <elliott> oerjan: now the problem being, I still need a type underlying the Point and Delta newtypes ;P
10:58:03 <itidus21> 空間ベクトル
10:58:03 <elliott> :P
10:58:15 <CakeProphet> elliott: some kind of Pointlike type
10:58:16 <oerjan> elliott: see CakeProphet
10:58:17 <elliott> oerjan: and that needs a name :D
10:58:18 <CakeProphet> with a phantom type.
10:58:22 <elliott> oerjan: no Pointlike is the worst.
10:58:26 <elliott> also using the phantom type like that is silly.
10:58:35 <CakeProphet> I think elliott just hates GADTs with phantom types.
10:58:42 <CakeProphet> for typechecking goodness.
10:58:47 <CakeProphet> which is totally what it's for.
10:59:05 <oerjan> i'd say this is precisely what phantom types are for
10:59:08 <itidus21> SinCos
10:59:39 <CakeProphet> though by the time elliott weighed all of these pros and cons he could have probably already written two instances.
10:59:43 <oerjan> itidus21: i think he wants longer vectors than that.
10:59:54 <CakeProphet> itidus21: also naming isn't really an issue here.
11:00:08 <elliott> yes
11:00:09 <elliott> it is
11:00:11 <CakeProphet> so just spewing names out of the front of your face is not helping.
11:00:21 <itidus21> it helps me
11:00:25 <CakeProphet> ...the front of your virtual face.
11:00:27 <elliott> oerjan: not really phantom types -- they're two types that happen to be composed of two values underneath
11:00:32 <elliott> and i was wrong wrt .+. and .-.
11:00:36 <elliott> they only have the possible types
11:00:41 <elliott> (.+.) :: Point -> Delta -> Point
11:00:49 <elliott> (.-.) :: Point -> Delta -> Point
11:00:49 <itidus21> Spot
11:00:50 <elliott> well
11:00:52 <elliott> you could also have
11:00:58 <elliott> (.-.) :: Point -> Point -> Delta
11:00:59 <CakeProphet> yes, so you can use one type to represent both, and then the phantom type is used to distinguish them for the purposes of typechecking....
11:01:01 <elliott> but I don't think I need that :P
11:01:02 <CakeProphet> ?
11:01:04 <elliott> CakeProphet: or
11:01:07 <elliott> just define two types?
11:01:23 <CakeProphet> well, you wanted to avoid that, and that seems like the best way to avoid it.
11:01:28 -!- nooga has joined.
11:01:30 <CakeProphet> do what you want.
11:01:36 <elliott> data Point = (:@) {-# UNPACK #-} !Value {-# UNPACK #-} !Value deriving (Eq, Ord, Show)
11:01:37 <elliott> data Delta = (:/) {-# UNPACK #-} !Value {-# UNPACK #-} !Value deriving (Eq, Ord, Show)
11:01:43 <CakeProphet> gross.
11:01:49 <CakeProphet> all of that identicalness.
11:01:57 <itidus21> Dual
11:02:02 <CakeProphet> itidus21: no
11:02:06 <CakeProphet> that's already taken.
11:02:14 <itidus21> ChuckNorris
11:02:17 -!- derdon has joined.
11:02:17 <elliott> CakeProphet: it comes down to
11:02:22 <elliott> data Point = Value :@ Value
11:02:25 <elliott> data Delta = Value :/ Value
11:02:27 <itidus21> DeltaForce
11:02:29 <elliott> it's just added optimisation sauce on top of that
11:02:36 <CakeProphet> yes I know.
11:02:56 <itidus21> DxDy
11:02:57 <CakeProphet> but now you have... instance Point ...
11:03:00 <CakeProphet> and instance Delta...
11:03:05 <CakeProphet> and any code that can operate on both
11:03:14 <CakeProphet> must be put in the instance.
11:03:16 <CakeProphet> and written twice.
11:03:16 <elliott> <CakeProphet> but now you have... instance Point ...
11:03:16 <elliott> <CakeProphet> and instance Delta...
11:03:20 <elliott> what? where do I have these?
11:03:34 <elliott> I think you will find that very few operations make sense identically on both points and deltas in context.
11:03:36 <CakeProphet> you were writing a typeclass right?
11:03:41 <oerjan> elliott: how do you define .+. without
11:03:49 <elliott> for instance
11:03:50 <elliott> origin :: Vector
11:03:51 <elliott> origin = 0 :@ 0
11:03:51 <elliott> south :: Vector
11:03:51 <elliott> south = 0 :@ 1
11:03:51 <elliott> east :: Vector
11:03:51 <elliott> east = 1 :@ 0
11:03:53 <elliott> north :: Vector
11:03:56 <elliott> north = 0 :@ (-1)
11:03:57 <elliott> west :: Vector
11:04:00 <elliott> west = (-1) :@ 0
11:04:02 <elliott> obviously origin is a Point, and the rest are Deltas
11:04:03 <elliott> CakeProphet: no, i was mistaken
11:04:06 <elliott> oerjan: without what?
11:04:10 <CakeProphet> ah okay.
11:04:12 <oerjan> elliott: without a typeclass
11:04:22 <elliott> oerjan: (.+.) :: Point -> Delta -> Point
11:04:31 <CakeProphet> ah.
11:04:34 <oerjan> er right
11:04:47 <elliott> oerjan: adding two deltas is rather fundamentally different from that, so it should have another name
11:04:50 * oerjan goes to turn on his brain
11:05:08 <oerjan> ...sorry, out of batteries.
11:05:15 <elliott> ah.
11:05:20 <elliott> your last task is to give Delta a nicer constructor name :P
11:05:22 <elliott> :/ is gross
11:05:29 <CakeProphet> :/ is :/
11:05:33 <elliott> (:@) is nice for Point because it has the nice "at" connotation.
11:05:52 <itidus21> Vertex
11:06:10 <CakeProphet> I wonder if you can use :, for point
11:06:13 <elliott> CakeProphet: no
11:06:29 <oerjan> :>
11:06:32 <CakeProphet> :% ?
11:06:35 <CakeProphet> for delta?
11:06:46 <itidus21> dunno why vertex didn't occur to me sooner.. it may not be appropriate but it's better than most of my efforts
11:06:47 <CakeProphet> connotate what you wish.
11:06:55 <oerjan> (it clashes if you use Seq, though)
11:06:58 <elliott> :% for delta might work
11:07:05 <elliott> I don't like :>, it's too directional and that conflict as you said
11:07:18 <CakeProphet> I don't like :> because it's a stupid little face
11:07:25 <CakeProphet> :>
11:07:26 <oerjan> elliott: but deltas _are_ directions >:)
11:07:38 <CakeProphet> but not directional between its arguments.
11:07:47 <oerjan> :^
11:07:52 <CakeProphet> :% implies change to me or something.
11:08:09 <elliott> :^ is cute
11:08:22 <elliott> we'll see
11:08:23 <CakeProphet> @hoogle (:^)
11:08:23 <lambdabot> No results found
11:08:41 <itidus21> :\/
11:08:47 <itidus21> :P
11:08:52 <CakeProphet> don't believe \ is valid actually
11:08:56 <oerjan> yes it is
11:08:58 <CakeProphet> ah
11:08:59 <CakeProphet> yes it is.
11:09:03 <itidus21> im being silly thouhg
11:09:08 <CakeProphet> :!@$%
11:09:12 <CakeProphet> for delta
11:09:16 <itidus21> :FFFFUUUUUUUUUUU
11:09:26 <oerjan> itidus21: that's not legal, no letters
11:10:00 <oerjan> > let (\/:) = (+) in 2 \/: 2
11:10:01 <lambdabot> 4
11:10:20 <elliott> oerjan: ah hm, turns out I do need addition on points
11:10:31 <CakeProphet> :\/ is not bad for delta except that it's annoying to type.
11:10:31 <oerjan> impossible!
11:10:31 <elliott> the storage offset (which is a point) plus a coordinate within that offsetted area
11:10:33 <elliott> but that's alright
11:10:36 <elliott> I can define it separately
11:10:42 <CakeProphet> just define it as Num
11:10:51 <elliott> no.
11:10:52 <itidus21> :|)
11:10:54 <itidus21> hahahah
11:11:16 <oerjan> itidus21: sorry, no brackets either
11:11:35 <CakeProphet> I bet you'll need addition on deltas as well.
11:11:57 <itidus21> well my intention with \/ is it spells v
11:12:08 <CakeProphet> .+. :: Pointlike a -> Pointlike a -> Pointlike a
11:12:11 <itidus21> otherwise i don't men much by it
11:12:11 <CakeProphet> teeheeheehee
11:12:23 <CakeProphet> :/\ kind of looks like a delta.
11:12:26 <CakeProphet> kind of.
11:12:37 <itidus21> :|\ :/|
11:12:53 <itidus21> :/|\
11:13:23 <itidus21> :/`\ :/_\
11:13:35 <CakeProphet> question
11:13:38 <CakeProphet> so if you make
11:13:51 <CakeProphet> er wait
11:13:53 <CakeProphet> can you write
11:13:57 <CakeProphet> type P = Pointlike a
11:14:04 <oerjan> no.
11:14:07 <CakeProphet> type P = forall a. Pointlike a
11:14:32 <oerjan> ...maybe.
11:14:43 <CakeProphet> so then is P -> P equivalent to Pointlike a -> Pointlike a or Pointlike a -> Pointlike b?
11:15:11 <oerjan> it's equivalent to (forall a. Pointlike a) -> (forall a. Pointlike a)
11:15:40 <itidus21> C< . . . . . . ∩ . . ∩
11:15:58 <oerjan> which cannot take a plain Pointlike a as argument.
11:16:27 <CakeProphet> erm, what can it take?
11:16:53 <CakeProphet> perhaps I don't understand rank-n types very well... or, I guess this is an existential?
11:16:56 <CakeProphet> just with no typeclass.
11:16:58 <oerjan> a polymorphic value of type forall a. Pointlike a
11:17:05 <oerjan> this is afaict rank-2
11:17:12 <CakeProphet> ...ah okay.
11:17:20 <CakeProphet> so plain as in has a concrete a.
11:17:28 <oerjan> yeah
11:17:39 <CakeProphet> hmmmm... okay
11:17:50 <CakeProphet> I think I understand rank-2 now.
11:17:57 <oerjan> the forall in the result type is easy to remove, though.
11:18:20 <CakeProphet> how does one get values of P then?
11:18:26 <olsner> hmm, the function gets a rank-2 type, but the type P isn't in itself? or is it?
11:18:30 <CakeProphet> with a polymorphic argument.
11:18:30 <itidus21> S ≡ λwyx.y(wyx)
11:18:51 <oerjan> CakeProphet: hopefully you would have some functions that are polymorphic in a...
11:19:05 <CakeProphet> hmmm, okay.
11:19:11 <elliott> <p>The REFC fingerprint allows vectors to be encoded into
11:19:11 <elliott> and decoded from single scalar cell values.
11:19:11 <elliott> Gah
11:19:14 <elliott> oerjan: Point or Delta :-P
11:19:35 <oerjan> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaaaa
11:19:42 <CakeProphet> why not just have points...
11:19:55 <CakeProphet> and then special functions that treat one point as a delta.
11:20:03 <CakeProphet> s/special//
11:20:08 <itidus21>
11:20:17 <elliott> Why don't we just have one type of data
11:20:20 <elliott> And functions that treat it specially
11:20:20 <oerjan> itidus21: that's not what we usually call S
11:20:25 <elliott> Oh right, because this isn't Tcl
11:20:34 <itidus21> oops :Δ
11:20:47 <itidus21> oerjan: ok sorry.
11:20:52 <CakeProphet> yeah but they're essentially the same thing the only difference is that you have operations that have an operand that treats the point as a delta.
11:21:02 <oerjan> itidus21: sadly greek letters count as letters, so no.
11:21:03 <elliott> yeah but they're essentially the same thing the only difference is that you have operations that have an operand that treats the string as a list.
11:21:08 <itidus21> lol
11:21:42 <oerjan> otherwise everyone would be using real λ in haskell by now
11:21:51 -!- Taneb has joined.
11:22:09 <CakeProphet> (mappend :: Point -> Point -> Point) point delta
11:22:10 <CakeProphet> bahahahaha
11:22:12 <Taneb> Hello!
11:22:50 <oerjan> ho lle
11:22:55 <CakeProphet> hmmm, booleans are monoids yes?
11:23:10 <oerjan> CakeProphet: in four different ways :P
11:23:13 <CakeProphet> but perhaps not in Haskell yes?
11:23:25 <CakeProphet> oerjan: makes me wonder why there is no typeclasses for monoids like that.
11:23:31 <oerjan> wait, six
11:23:33 <CakeProphet> like a typeclass for &&, ||, etc
11:23:44 -!- derdon has quit (Remote host closed the connection).
11:23:46 <elliott> what
11:23:56 <CakeProphet> nevermind.
11:24:01 <CakeProphet> basically I just don't like newtypes.
11:24:09 <CakeProphet> and would prefer having Monoid classes with more than one mappend.
11:24:11 <oerjan> &&, ||, /=, ==, const and const id are all monoid operations for Bool
11:24:27 <oerjan> er wait
11:24:31 <elliott> um
11:24:32 <oerjan> scratch those const ones
11:24:35 <elliott> isn't mempty `mappend` ... yeah
11:24:40 <oerjan> they're just semigroups
11:25:00 <itidus21> ╔╦═══╗
11:25:00 <itidus21> ╚╩═══╝
11:25:09 <CakeProphet> ^celebrate
11:25:09 <fungot> \o| |o| |o/ \m/ \m/ |o/ \o/ \o| \m/ \m/ \o| |o| |o/
11:25:10 <myndzi\> | | | `\o/´ | | | `\o/´ | | |
11:25:10 <myndzi\> >\ |\ >\ | >\ /'\ /`\ | /'\ |\ /<
11:25:10 <myndzi\> /'\ (_|¯`\
11:25:10 <myndzi\> (_| |_) |_)
11:25:20 <oerjan> itidus21: i have no idea what haskell considers those chars as
11:25:30 <CakeProphet> oerjan: box-drawing character duh.
11:25:32 <itidus21> i just got inspired playing around with character map
11:25:41 <CakeProphet> only useful for drawing boxes.
11:25:59 <oerjan> CakeProphet: well yes but are they legal operator characters? :P
11:26:18 <Taneb> Somebody's made another brainfuck derivative
11:26:25 <CakeProphet> does Haskell even allow Unicode aside from a few special cases?
11:26:25 <itidus21> ♫♪ ♫
11:26:25 <oerjan> > let a ╔ b = a + b in 2 ╔ 2
11:26:26 <lambdabot> 4
11:26:30 <oerjan> yay :P
11:26:39 <CakeProphet> oh
11:26:40 <CakeProphet> okay.
11:26:49 <elliott> haskell has full unicode support
11:26:58 <CakeProphet> goood.
11:27:02 <elliott> > let æßð = "yes" in æßð
11:27:02 <lambdabot> "yes"
11:27:05 <oerjan> CakeProphet: at least ghc uses the unicode character classifications to decide. somehow.
11:27:23 <CakeProphet> ╔ is an operator that takes uh two.... uh... somethings and TURNS RIGHT,
11:27:29 <elliott> > let æßð = "yes"; (→) = const in æßð → "a"
11:27:29 <lambdabot> <no location info>: parse error on input `
11:27:31 <CakeProphet> sharply.
11:27:32 <elliott> Aw. :/
11:27:40 <elliott> > let æßð = "yes"; → = const in → æßð "a"
11:27:41 <lambdabot> <no location info>: parse error on input `
11:27:42 <elliott> :|
11:27:50 <CakeProphet> you could also have it turn one thing right by being postifx.
11:28:24 <CakeProphet> (car╔)
11:28:32 <itidus21> > let a ▲ b = a + b in 2 ▲ 2
11:28:33 <lambdabot> 4
11:29:06 <CakeProphet> elliott: there you go, your delta-application function. :)
11:29:16 <CakeProphet> obviously with type Point -> Delta -> Point
11:29:19 <CakeProphet> where type Delta = Point
11:29:22 <itidus21> It is cheerfully describes it as Black Up-Pointing Triangle
11:29:59 <elliott> cheerfully
11:30:21 <itidus21> > let a ∆ b = a * b in 3 ∆ 5
11:30:22 <lambdabot> 15
11:30:32 <itidus21> thats another one
11:30:44 <oerjan> > let x → y = x in 2
11:30:45 <lambdabot> <no location info>: parse error on input `
11:30:47 <itidus21> cheerfully described as "Increment"
11:31:12 <oerjan> > (sin :: Double → Double) 2
11:31:13 <lambdabot> 0.9092974268256817
11:31:14 <CakeProphet> now I just need a unicode keyboard so I can sanely program with these operators.
11:31:17 <oerjan> ah.
11:31:31 <Taneb> My chair has speakers in it
11:31:39 <oerjan> it wasn't illegal, just taken.
11:31:51 <Taneb> I am going to play some Queen music
11:31:53 <itidus21> i didnt mean to define all of these things
11:32:04 <itidus21> i hope im not making a mess of lambdabot
11:32:26 <itidus21> haha...
11:32:45 <CakeProphet> there should be a Haskell IDE or somesuch in which you can assign numpad keys to unicode characters
11:32:50 <oerjan> itidus21: > let doesn't actually define things permanently
11:32:52 <CakeProphet> with some kind of graphical bank displayed.
11:32:58 <itidus21> oerjan: thats good
11:33:10 <itidus21> at least i have kind of opened the possibility of the unicodes :D
11:33:18 <oerjan> you need @let for ... slightly more permanent, but not really.
11:33:19 <itidus21> beginning with my /\ tomfoolery
11:34:25 <CakeProphet> also other nice features like automatically inserting type signatures, renaming functions globally across multiple files, etc.
11:34:45 <CakeProphet> but the unicode bank would actually make unicode operators convenient
11:34:53 <itidus21> my zanyness can come in handy
11:36:18 <oerjan> today's http://www.mezzacotta.net/postcard/ has a nice disclaimer
11:38:10 <oerjan> *(no, the picture is not broken)
11:38:27 <elliott> yes, it is
11:38:33 <elliott> depending on your definition of broken
11:38:52 <elliott> oerjan: only four more IWC strips left ;D
11:39:08 <oerjan> ^ul ((A)S:^):^
11:39:08 <fungot> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ...too much output!
11:40:13 <CakeProphet> other Haskell IDE ideas: builtin (un)?pl, (un)?do, djinn, shell (which obviously includes ghci), hoogle, documentation viewer stuff
11:40:58 <oerjan> CakeProphet: there is a way to plug lambdabot into ghci. ostensibly.
11:41:16 * itidus21 starts pondering other potential uses of unicode characters.
11:41:41 <oerjan> itidus21: maybe you could use them to write in strange languages
11:42:07 <CakeProphet> oerjan: ah yes that would work I think. though also a source-code transform version of each would be neat.
11:42:22 <CakeProphet> so you right-click on a type signature, run djinn, and it spits out a function definition
11:42:36 <CakeProphet> right-click on a function and then transform via do/pl
11:42:45 <CakeProphet> ...more useful for do than pl
11:42:52 <elliott> oerjan: not really ostensibly, IIRC it's even maintained still.
11:42:53 <CakeProphet> as you may not necessarily want what pl gives you. :P
11:43:01 <elliott> CakeProphet: djinn is not very useful in practice at all.
11:43:10 <CakeProphet> eh, still
11:43:15 <elliott> I guess it's nice if you want to generate large swathes of the Prelude, but apart from that.
11:43:16 <CakeProphet> if it ever does become useful in practice.
11:43:20 <elliott> "ever does"?
11:43:25 <CakeProphet> ..yes
11:43:28 <elliott> It's not some collection of hacks; it's a defined, immutable algorithm.
11:43:28 <CakeProphet> like, if they improve it.
11:43:35 <elliott> Do you know how djinn works?
11:43:40 <CakeProphet> not specifically.
11:43:58 <elliott> "For the curious, Djinn uses a decision procedure for intuitionistic
11:43:58 <elliott> propositional calculus due to Roy Dyckhoff. It's a variation of
11:43:58 <elliott> Gentzen's LJ system."
11:44:13 <elliott> It's just Curry-Howard.
11:44:28 <CakeProphet> okay, but that's not to say it couldn't be improved.
11:44:33 <elliott> ...
11:44:51 <elliott> You would like it to just make shit up if that fails?
11:45:10 <CakeProphet> well no, but if it had access to more functions
11:45:14 <elliott> What.
11:45:23 <CakeProphet> to plug in... in the correct place.
11:45:28 <CakeProphet> I'm sure this makes sense. :P
11:46:08 <oerjan> djinn does have a way to define data types. they just cannot be recursive.
11:46:14 <oerjan> @list djinn
11:46:14 <lambdabot> djinn provides: djinn djinn-add djinn-del djinn-env djinn-names djinn-clr djinn-ver
11:46:18 <oerjan> @djinn-env
11:46:18 <lambdabot> data () = ()
11:46:18 <lambdabot> data Either a b = Left a | Right b
11:46:18 <lambdabot> data Maybe a = Nothing | Just a
11:46:18 <lambdabot> data Bool = False | True
11:46:18 <lambdabot> data Void
11:46:20 <lambdabot> type Not x = x -> Void
11:46:22 <lambdabot> class Monad m where return :: a -> m a; (>>=) :: m a -> (a -> m b) -> m b
11:46:24 <lambdabot> class Eq a where (==) :: a -> a -> Bool
11:46:26 <lambdabot> class Applicative f where pure :: a -> f a; (<*>) :: f (a -> b) -> f a -> f b; (*>) :: f a -> f b -> f b; (<*) :: f a -> f b -> f a
11:46:32 <elliott> I'm honestly impressed djinn can even do typeclasses.
11:46:43 <CakeProphet> well I don't mean define data types. I mean if it had a collection of functions and their type information
11:47:00 <CakeProphet> it could decide that a function has the correct type to satisfy the proof, so to speak.
11:47:23 <Taneb> brb
11:47:25 -!- Taneb has quit (Quit: what a big quitter he is, eh?).
11:47:30 <oerjan> well that would be equivalent to having some extra axioms in the logic.
11:47:42 <oerjan> so probably possible in principle
11:47:54 <elliott> oerjan: I'm pretty sure you'd have to modify the search procedure for each new axiom.
11:48:13 <CakeProphet> yes, and it would make it more practical as you could say "write a program for this type and here's a function, module, etc to use"
11:48:15 <elliott> so the answer to the question "can djinn do lists if we special-case it to do lists" is... yes!
11:48:41 <oerjan> elliott: it would still be limited to non-recursive types i think
11:48:57 <elliott> yeah, I just couldn't think of a type :P
11:48:59 <elliott> :t (((. head . uncurry zip . splitAt 1 . repeat) . uncurry) .) . (.) . flip
11:49:00 <lambdabot> forall b c a. (b -> a -> c) -> (b -> a) -> b -> c
11:49:15 <CakeProphet> also there are other problems.
11:49:17 <CakeProphet> ambiguity...
11:49:38 <CakeProphet> but a sufficiently sophisticated djinn could list a bunch of alternatives and have the user decide which one to insert.
11:49:38 <oerjan> elliott: in fact you can in principle already do this with @djinn as it stands - just add your axioms as extra a1 -> a2 -> parts
11:50:01 <oerjan> well, those cannot be polymorphic i guess.
11:50:06 -!- nooga has quit (Ping timeout: 252 seconds).
11:50:10 <elliott> oerjan: wasn't that obvious? :P
11:50:18 <elliott> you can also define any data type by just including the relevant function as its only field.
11:51:28 <oerjan> yeah
11:51:54 <oerjan> @djinn Monad m => m (m a) -> m a
11:51:54 <lambdabot> -- f cannot be realized.
11:52:12 <oerjan> ...something tells me the monad support is rather limited
11:52:35 <elliott> heh
11:52:37 <oerjan> @djinn Monad m => a -> m a
11:52:37 <lambdabot> f = return
11:52:59 <oerjan> @src join
11:52:59 <lambdabot> join x = x >>= id
11:53:46 <oerjan> @djinn Monad m => (a -> m b) -> m a -> m b
11:53:47 <lambdabot> f a b = b >>= a
11:55:48 <elliott> hm is there a way to tell GHC to use irrefutable patterns for a datatype by default?
12:00:41 <twice11> elliott: None I know of, as irrefutable patterns destroy the ability of matching multiple patterns.
12:01:04 <twice11> Depending on what you try to do, you could replace your datatype by a newtype.
12:01:25 <twice11> As newtypes are single-constructor only, matches on them are inherently irrefutable.
12:01:57 <oerjan> i assume the useful case would be single-constructor, multiple fields
12:02:05 <twice11> newtype a tuple.
12:02:14 <oerjan> doesn't work.
12:03:42 <elliott> twice11: There's only one constructor.
12:04:04 <elliott> Newtyping a tuple isn't viable, the whole reason I'm using this in place of a tuple is that it's strict and unboexd :-)
12:04:06 <elliott> unboxed
12:04:56 <oerjan> also this would be tricky, what about case (x, (y:z)) of ... where the tuple does this by default, but it would still be wierd to error out if the second element is an empty list...
12:04:58 <twice11> oerjan: Doesn't work? For me it certainly does.
12:05:03 <twice11> newtype Test = Test (Int,Bool, String) deriving Show
12:05:10 <twice11> main = print $ Test (3,True,"why?")
12:05:11 -!- Sgeo has quit (Ping timeout: 260 seconds).
12:05:15 <twice11> compiles + runs
12:05:22 <oerjan> twice11: doesn't work to achieve a useful irrefutable pattern default
12:05:54 <elliott> I'm sure oerjan knows what he's talking about, having written half the Haskell Report. :p
12:07:15 <oerjan> case Test (1, True, "") of Test (_, _, (x:xs)) -> ... would still error out too early.
12:07:56 <twice11> In this case, the match on the list would need to be irrefutable, though, not the match on the type "Test".
12:08:49 <twice11> Of course there is no way to make the match on members of a data type irrefutable by just playing around with the data type.
12:08:50 <oerjan> > case (1, True, "") of ~(_, _ x:xs) -> "testing"
12:08:51 <lambdabot> <no location info>: Parse error in pattern
12:08:59 <oerjan> > case (1, True, "") of ~(_, _, x:xs) -> "testing"
12:09:00 <lambdabot> "testing"
12:09:54 <twice11> OK, I'm not gonna split hairs here, but the "~" character is obviously "recursive", applying to all sub-patterns too.
12:09:58 <elliott> "hough, not the match on the type "Test".
12:09:58 <elliott> <twice11> Of course there is no way to make the match on members of a data type irrefutable by just playing around with the data type."
12:10:00 <elliott> I was thinking more a flag.
12:10:03 <elliott> Erm
12:10:04 <elliott> Like INLINE
12:10:08 <elliott> A declaration
12:10:12 <elliott> Admittedly INLINE doesn't change semantics
12:10:15 <elliott> But LANGUAGE does :P
12:10:37 <twice11> So like "data Test = Test Int Bool String {#-IRREFUTABLE-#}"?
12:10:46 <oerjan> twice11: it's not clear what should be the semantics if someone _did_ provide a way to make irrefutable default patterns
12:10:50 <elliott> Something like
12:10:54 <twice11> So that matches on the string fields would be irrefutable.
12:10:54 <elliott> {#- IRREFUTABLE Test -#}
12:10:59 <elliott> data Test = Test Int Bool String
12:11:00 <elliott> Then a match
12:11:03 <elliott> f (Test ...) = ...
12:11:04 <elliott> would actually be
12:11:06 <elliott> f ~(Test ...) = ...
12:11:15 <elliott> So I could say:
12:11:19 <elliott> {#- IRREFUTABLE Point -#}
12:11:22 <elliott> infix 0 :@
12:11:22 <elliott> data Point = (:@) {-# UNPACK #-} !Value {-# UNPACK #-} !Value deriving (Eq, Ord, Show)
12:11:45 <elliott> Erm, {-# ... #-} not {#- ... -#} of course.
12:12:52 -!- MSleep has changed nick to MDude.
12:12:54 <twice11> for the top-level match, newtype-of-tuple provides the required irrefutability:
12:13:07 <twice11> data Test2 = Test2 Int Bool String deriving Show
12:13:11 <twice11> foo1 (Test _) = True
12:13:14 <twice11> foo2 (Test2 _ _ _) = True
12:13:18 <twice11> foo3 ~(Test2 _ _ _) = True
12:13:28 <twice11> foo1 and foo3 can be called with "undefined".
12:13:46 -!- hagb4rd|zzZ has joined.
12:14:06 <oerjan> twice11: but you can actually define any variables in foo1
12:14:09 <oerjan> *cannot
12:14:15 <elliott> twice11: But not the required unpacking or strictness.
12:14:17 <twice11> right, so I was cheating.
12:14:20 <elliott> If I didn't need them, I would just use a tuple.
12:14:38 <twice11> elliott: I guess "unboxed tuples" are too limited for you.
12:15:02 <elliott> Definitely. Also ugly. :p
12:16:47 <twice11> foo4 (Test (_,_,_)) can not be called with undefined (of course), so I just moved the refutability by introducing a non-refutable futile further layer of indirection.
12:17:03 <elliott> I love how cabal, when a package fails to build, just builds a random other number of them before reporting the error.
12:17:15 <elliott> twice11: Clearly we just need an infinite stack of irrefutability.
12:20:24 <twice11> elliott: Do you want irrefutability for performance or for being able to pass undefined?
12:21:24 <elliott> Performance. Not that I expect it'll help much or perhaps even at all... I'd just like to try everything before actually having to replace my fungespace :-P
12:22:10 <twice11> So saying !Point instead of Point and relying of ghc's worker split-off would do the job nicely.
12:22:27 <twice11> No, I don't know a way of getting the bang everywhere.
12:22:31 <elliott> Well, sed.
12:22:47 <elliott> Preferably I'd like to localise the Horrific Cthulian Directives, though. :p
12:23:00 <twice11> Also, !Point is a pattern does not work...
12:23:23 <elliott> ~(a :@ b) would do it.
12:23:55 <twice11> Modifying actual patterns instead of type signatures would be even more ugly.
12:24:24 <elliott> You can say !Point as a type?
12:24:48 <twice11> No.
12:24:55 <elliott> Aw. That would be nice.
12:25:12 <elliott> Fun Haskell-derivative feature number 9999: Strictness polymorphism.
12:25:27 <twice11> That's what I meant when I wrote "!Point is a pattern", wanted to type "!Point in a pattern" and meant "!Point in a signature".
12:25:32 <elliott> Right.
12:26:07 <elliott> To expand on that feature: Every type is, by default, takes either "strict" or "lazy". It then passes this on to all the types mentioned in its definition that don't have an explicit override.
12:26:39 <elliott> So you can define lists once and get lazy lists with lazy elements, spline-strict lists with lazy elements, element-strict lists with lazy splines, ...
12:28:43 -!- oerjan has quit (Quit: leaving).
12:31:41 -!- itidus21 has quit (Quit: Leaving).
12:37:34 -!- Taneb has joined.
12:37:42 <Taneb> Hello!
12:41:55 -!- itidus21 has joined.
12:44:28 <Taneb> Does anyone else do Project Euler?
12:46:38 -!- itidus21 has quit (Client Quit).
12:50:21 -!- itidus21 has joined.
12:50:53 -!- itidus21 has quit (Client Quit).
12:56:47 -!- itidus21 has joined.
12:59:03 -!- Taneb has quit (Remote host closed the connection).
13:01:45 -!- Taneb has joined.
13:02:26 <Jafet> The thing that isn't a project and has nothing to do with Euler
13:03:32 <Taneb> That has nothing to do with my question
13:03:49 <cheater> what is the keyboard combination to change readline to vi mode and emacs mode?
13:03:58 <Jafet> elliott: data Lazy a = Lazy a; data StrictList a = SNil | SCons !a (StrictList a); type LazyList a = StrictList (Lazy a)
13:04:43 <elliott> Jafet: Cute. But doesn't let you parameterise spline strictness.
13:05:29 <Jafet> data ElliottIsAFag s a = SNil | SCons !a !(spn (ElliotIsAFag spn a))
13:05:44 <Jafet> ...I think that would work.
13:06:00 <Jafet> s/s /spn /
13:06:04 <elliott> Congratulations, you've proved that strict languages admit explicit laziness
13:06:27 <Jafet> Damn, I was trying to prove the converse.
13:06:28 <elliott> The idea with this is that you wouldn't have to define all that, and also wouldn't have to pack/unpack Lazy values (i.e. the reason laziness is awful in strict languages) :P
13:07:14 <Jafet> You can usually fix that with more polymorphism.
13:07:26 <Jafet> POLYMOARPHISM
13:09:13 <elliott> Go on then
13:09:44 <Jafet> The Prelude does not have polymoarphism.
13:10:04 <elliott> Implement yer own
13:10:09 <elliott> I guess you mean
13:10:13 <elliott> data Lazy a = Lazy a
13:10:20 <elliott> data Strict a = Strict !a
13:10:32 <Jafet> Also, you can't unbox that !a.
13:10:41 <elliott> class O o where pack :: a -> o a; unpack :: o a -> a
13:10:43 <elliott> instance O Lazy
13:10:45 <elliott> instance O Strict
13:10:57 <Jafet> More like Num a => Num (Lazy a)
13:11:05 <Jafet> Repeat 9001 times
13:11:13 <elliott> data List o a = Nil | Cons !(o a) !(o (List o a))
13:11:22 <elliott> Jafet: who cares about the prelude
13:11:28 <Jafet> And don't have pack or unpack, just roll both into cast
13:11:40 <elliott> Jafet: Anyway, one problem there is that yo uca'n't override strictness of the element type
13:11:49 <elliott> You need to define your own newtype that discards its argument
13:11:52 <elliott> Which is lame
13:12:09 <elliott> Compare (List! Int~)
13:12:16 <elliott> i.e. spline-strict list of lazy integers
13:12:25 <elliott> (List! Int) == fully strict list because the ! is passed on
13:12:30 <elliott> I dunno, it sounds interesting :-P
13:12:46 <elliott> (List Int!) -- polymorphic on spline strictness but with strict elements
13:13:08 <Jafet> Programming with splines sure is
13:13:26 <elliott> Sure is what
13:14:15 <Jafet> ,,,smooth? Visually appealing?
13:14:24 <elliott> Totes
13:14:45 <elliott> The other nice thing is that functions become the automatic "correct" strict implementation
13:14:54 <elliott> As in you don't need to rewrite map for efficiency on strict lists
13:15:43 -!- itidus21 has quit (Read error: Connection timed out).
13:15:46 <Jafet> How would it be more efficient?
13:16:08 <elliott> Than what?
13:16:11 -!- itidus21 has joined.
13:16:20 <Jafet> map on a non-strict list.
13:16:30 <elliott> It wouldn't, it'd just be properly strict
13:16:32 -!- sllide has joined.
13:16:45 <elliott> I guess that Haskell stuff gtes you the same, but really nobody wants to write in that
13:17:23 <Jafet> That would suck, actually, since you'd need a stack or a reversal.
13:18:27 <Jafet> Either way, it's a linear amount of extra space.
13:19:51 <elliott> Jafet: What would suck?
13:20:12 <Jafet> map on strict lists.
13:20:45 <elliott> Jafet: Well, I'm not saying strict languages are a party.
13:20:56 <elliott> But people do map over strict lists quite an awful lot In The Real World, it has to be said. :p
13:21:10 <Jafet> It's kind of egregious when a strict solution uses more space than the lazy one.
13:21:27 <elliott> But the main thing is that I could write !(Value,Value) as a type, dammit, rather than defining my own fucking tuples.
13:21:31 <Jafet> Well, you save a bit of space from unboxing, but it's not enough.
13:21:50 <Jafet> (#,#)
13:22:32 <Jafet> Do you need strict tuples that often, or do you just want unboxed tuples
13:22:50 <elliott> infix 0 :@
13:22:50 <elliott> data Point = (:@) {-# UNPACK #-} !Value {-# UNPACK #-} !Value deriving (Eq, Ord, Show)
13:22:51 <elliott> I want these
13:23:06 <elliott> Except without the part where I reimplement tons of things for them and the constructor/destructor syntax isn't as nice as (a,b)
13:23:15 <elliott> Unboxed tuples wouldn't even remotely work, I need to return these things
13:23:23 <Jafet> Well, you can fix the tuple type system while you're at it.
13:23:30 <elliott> Tuple type system?
13:24:06 -!- Taneb has quit (Read error: Connection reset by peer).
13:24:22 <Jafet> So you can write tail (a,b,c...) and get (b,c...)
13:24:36 -!- elliott has changed nick to Clippy.
13:24:40 <Jafet> Then init (x,y,z,w) = (x,y,z)
13:24:42 <Clippy> It looks like you're writing HLists.
13:24:44 <Clippy> - Bow to Oleg
13:24:47 <Clippy> - Continue futility
13:24:50 <Clippy> - Bug the GHC developers
13:24:51 -!- Clippy has changed nick to elliott.
13:25:39 <elliott> Everyone loves Clippy.
13:25:52 <elliott> If you disagree, reconsider your opinions.
13:26:12 <Jafet> Eh pops up at the right time and doesn't afraid of anything.
13:26:28 <elliott> Except rejection.
13:26:31 <Jafet> @google openoffice.org clippy
13:26:32 <lambdabot> http://www.oooforum.org/forum/viewtopic.phtml?t=50110
13:26:44 <elliott> Finally I can switch to Linux.
13:28:37 <Jafet> http://www.oooforum.org/forum/viewtopic.phtml?t=22401
13:28:46 <Jafet> 10% of people actually want it.
13:29:54 <Jafet> That's probably more people than the people who want, say, auto-turn-everything-that-could-possibly-be-interpreted-as-a-date-into-a-date-even-American-so-called-dates in spreadsheets.
13:30:32 <elliott> Really, American dates aren't that bad. PDPs had integers like that, you know.
13:30:45 <elliott> I wonder if PDPs were fast at handling American dates.
13:33:06 -!- sebbu has quit (Read error: Connection reset by peer).
13:35:24 -!- sebbu has joined.
13:35:24 -!- sebbu has quit (Changing host).
13:35:24 -!- sebbu has joined.
13:38:35 -!- ais523 has joined.
13:45:53 <ais523> something that came up at my job, and people might have ideas on here: what's the easiest (ideally fully-automated) way to get all the email sent to a gmail account into an mbox file or equivalent easily machine-readable format?
13:46:05 <ais523> I'm assuming it involves IMAP somewhere
13:47:34 * ais523 goes and checks CPAN
13:47:36 <elliott> step one
13:47:36 <elliott> imap
13:47:39 <elliott> step two
13:47:40 <elliott> done
13:47:46 <elliott> gmail has imap interface, so just enable it and... use a client
13:47:50 <elliott> a standard imap client
13:47:53 <ais523> yep, I'm wondering where to get an appropriate IMAP client
13:48:03 <ais523> using Evolution is obviously silly
13:48:05 <elliott> fetchmail :-)
13:48:12 <elliott> note: joke. joke. joke. no. joke.
13:48:17 <ais523> I thought it might be
13:48:32 <elliott> ais523: At least do Maildir rather than mbox.
13:48:42 <ais523> what's the difference?
13:48:50 <elliott> Maildir isn't useless.
13:49:18 <ais523> well, the application is: I want to perform an operation on the text and subject line of every email emailed to a particular gmail account
13:49:28 <elliott> It has a file per message and actually supports more than one application accessing a file without like totally rewriting it.
13:49:28 <ais523> (using gmail wasn't my choice here, and seems a little inappropriate for the task)
13:49:42 <elliott> It's easy to implement, http://en.wikipedia.org/wiki/Maildir#Technical_operation
13:49:48 <ais523> there's only the one application accessing the account
13:49:50 <elliott> ais523: bayes has code for this :-)
13:49:53 <ais523> it's dedicated for the one task only
13:49:58 <elliott> though you'd have to ask comex if he has a copy of it
13:50:00 <elliott> and it's Python
13:50:01 <ais523> elliott: aha, it probably does
13:50:09 <elliott> well, I forget what bayes operated on
13:50:12 <ais523> language isn't really important, although I don't like Python
13:50:14 <elliott> might have been imap, might have been mbox
13:50:21 <elliott> but python has imap too so that's like three extra lines
13:50:24 <elliott> ais523: i don't either but it worked at the time
13:50:25 <itidus21> `log language
13:50:33 <elliott> ais523: I'm really surprised Bayes worked, really
13:50:39 <itidus21> `log language
13:50:46 <ais523> elliott: the same is true of most programs
13:50:47 <HackEgo> 2007-08-19.txt:22:24:16: <Overand> Gurami: my favorite language for web development is english - I requie all web users to phrase queries in plain english, then I write my answer out in cursive german, which an OCR program will scan, and translate to english, then feed back to the user.
13:50:47 <HackEgo> 2005-07-16.txt:07:25:12: <calamari> that's interesting though.. I wonder what a programming language would look like if the ancient egyptians had computers
13:50:55 <ais523> I'm surprised my quick hacks to OCaml's parser this morning worked
13:51:00 <ais523> and to its main evaluation loop
13:51:05 <elliott> did Bayes ever actually do well at the AAA?
13:51:15 <elliott> it played perfectly, but I don't remember if that translated into real success
13:51:16 <itidus21> `log really important
13:51:16 <ais523> the AAA collapsed before it had much of a chance, IIRC
13:51:19 <HackEgo> 2008-04-04.txt:19:06:07: <ais523> but it's really important in sed
13:51:23 <itidus21> `log really important
13:51:27 <HackEgo> 2011-09-17.txt:13:51:16: <itidus21> `log really important
13:51:31 <itidus21> `log really important
13:51:34 <HackEgo> 2010-01-25.txt:22:02:48: <cpressey> If it was really important for me to get clang running, I probably would have tried it in the VM. But for kicks, it's hey, let's try cygwin!!
13:51:43 <itidus21> `log really important
13:51:46 <HackEgo> 2010-10-16.txt:15:01:08: <elliott> catseye: is the windows partition really important? i'd have just upgraded the ubuntu install
13:52:00 * itidus21 sidles away
13:52:22 <elliott> ais523: hmm, partnerships weren't stripped of personhood, right?
13:52:37 <elliott> ...never mind :P
13:52:38 <itidus21> `log personhood
13:52:41 <HackEgo> 2010-10-20.txt:00:04:00: <cpressey> trees have personhood
13:52:43 <ais523> yes, they were
13:52:46 <itidus21> `log personhood
13:52:49 <HackEgo> 2010-10-20.txt:00:04:00: <cpressey> trees have personhood
13:52:53 <ais523> I know I tried to argue that they were still nonetheless players
13:52:58 <elliott> hmm, I thought that was ruled R101-violating
13:52:58 <itidus21> `log personhood
13:52:58 <ais523> until someone explicitly deregistered them
13:53:01 <HackEgo> 2010-09-12.txt:07:51:52: <Sgeo> Does U.S. Law, which might contain legal fictions (corporate personhood, for example), constitute a fictitious world?
13:53:11 <ais523> but I think it was decided that the undefinition of concepts caused partnerships to cease to exist
13:53:13 <elliott> seems an easy way to circumvent R101; depersonalise something, abuse it, then repersonalise it
13:53:16 <elliott> ais523: heh
13:53:21 <elliott> `log nomic
13:53:24 <HackEgo> 2010-09-17.txt:05:44:25: <pikhq> Less so culturally, but very much so economically.
13:53:38 <ais523> `log \bnomic\b
13:53:40 <itidus21> nice abuse of nomic
13:53:41 <HackEgo> 2007-12-28.txt:00:17:49: <ihope> Small world, I guess. I conclude that everyone here is interested in Nomic.
13:53:53 <ais523> egrep recognises \b? nice
13:54:08 <itidus21> `log recogni
13:54:12 <HackEgo> 2008-05-08.txt:15:36:17: <ehird> Monticello recognizes your monkey patches and even version controls them
13:54:23 <ais523> elliott: ooh, that sounds useful
13:54:38 <itidus21> `log recogni
13:54:41 <elliott> ais523: I'm sure Feather's VCS could do that
13:54:42 <HackEgo> 2007-04-17.txt:02:37:31: <SevenInchBread> if the filesystem recognizes content types... then it can be smart about handling them. audio is typically large, and edited infrequently... while a swap file stays roughly the same most of the time, but will be written and read from frequently.
13:54:42 <ais523> I was planning to diff my unpacked OCaml directory against the original, ignoring files that didn't exist in both, to find my monkeypatches
13:54:48 <ais523> elliott: Feather has a VCS?
13:54:51 <ais523> do you mean @'s VCS?
13:54:53 <elliott> Monticello is a Smalltalk thing, so presumably?
13:55:01 <ais523> oh, I see
13:55:03 <itidus21> `log VCS
13:55:07 <HackEgo> 2010-03-01.txt:11:58:55: <scarf> one thing I've been thinking about recently is designing my own VCS
13:55:16 <ais523> haha, it begins
13:55:18 <elliott> Ha, what does that scarf know about VCSes.
13:55:20 <elliott> He should try scapegoat.
13:55:24 -!- ais523 has changed nick to scarf.
13:55:24 <elliott> It'll beat whatever crappy idea HE has.
13:55:27 <scarf> heh
13:55:29 -!- scarf has changed nick to ais523.
13:55:44 * itidus21 abuses `log
13:55:53 <ais523> `log
13:55:55 <HackEgo> 2011-03-16.txt:02:53:07: <quintopia> indeed, it is impossible to give an answer inadvertently
13:55:56 <elliott> ?tell scarf I'm from the future! Turns out your VCS sucks. Actually it wiped out half the human population. Thanks a bunch.
13:55:56 <lambdabot> Consider it noted.
13:56:19 * itidus21 leaves lesions and trauma on `log
13:56:24 <ais523> elliott: you're getting sg and feather muddled again
13:56:33 <ais523> anyway, I'm pretty sure I know what a Feather program is
13:56:39 <elliott> ais523: the folly is pretending all these concepts can be separated
13:56:49 <ais523> it's a sequence of program fragments that, when run, transform a Feather interpreter into a new state
13:57:01 <ais523> I'm not sure if output is possible, but luckily it's an esolang, so I don't really mind
13:57:30 <itidus21> `log ton
13:57:34 <HackEgo> 2010-04-19.txt:16:38:52: -!- Tritonio_GR has quit (Read error: Connection reset by peer).
13:57:42 <itidus21> `log fuckton
13:57:45 <HackEgo> 2010-03-13.txt:18:25:41: <Gregor> pikhq: Y'know, I'm starting to think that metric fucktons aren't even a real unit!
13:57:54 <itidus21> yes they are
13:58:07 <itidus21> blasphemy
13:58:21 <itidus21> jk,,
13:58:50 <itidus21> `log fuckton
13:58:53 <HackEgo> 2010-10-17.txt:17:57:02: <elliott> pikhq: I think we are up for a FUCKTON of flashbacks.
13:59:46 <itidus21> why are people always addressing pikhq with the word fuckton i wonder
14:00:15 <elliott> Always=two.
14:00:18 <itidus21> lets take another dip
14:00:18 <elliott> Two=infinity.
14:00:20 <itidus21> `log fuckton
14:00:21 <elliott> Zero, one, infinity.
14:00:24 <HackEgo> 2011-09-17.txt:13:58:50: <itidus21> `log fuckton
14:00:28 <itidus21> `log fuckton
14:00:31 <HackEgo> 2011-09-12.txt:03:52:40: <Gregor> As per how many files, roughly a metric fuckton.
14:00:57 <itidus21> so it seems gregor's faith in that metric is stable
14:01:06 <itidus21> ok my sample size was too small
14:01:33 <itidus21> `log fuckton
14:01:37 <HackEgo> 2009-06-18.txt:21:10:58: <ehird> pikhq: metric fuckton?
14:01:59 <itidus21> wtf.. some freeeaky pattern there
14:02:18 <itidus21> gestures
14:13:46 -!- Taneb has joined.
14:17:59 -!- hagb4rd|zzZ has changed nick to hagb4rd.
14:29:06 -!- Taneb has quit (Read error: Connection reset by peer).
14:35:24 -!- Patashu has quit (Ping timeout: 258 seconds).
14:39:15 -!- Taneb has joined.
15:13:04 -!- derrik has joined.
15:15:31 -!- Taneb_ has joined.
15:17:56 -!- sebbu2 has joined.
15:18:08 -!- Taneb has quit (Ping timeout: 252 seconds).
15:21:20 -!- sebbu has quit (Ping timeout: 252 seconds).
15:25:06 -!- Taneb_ has quit (Ping timeout: 252 seconds).
15:38:18 -!- sebbu2 has changed nick to sebbbu.
15:39:20 -!- calamari has joined.
15:59:22 <Gregor> `pastelogs fuckton
15:59:28 <HackEgo> http://codu.org/projects/hackbot/fshg/index.cgi/raw-file/tip/paste/paste.3409
16:00:35 <Gregor> Welp, I'm the first person to ever say "fuckton" in this channel.
16:00:38 <Gregor> Pretty proud of that.
16:00:47 <Gregor> Also the first person to say "metric fuckton"
16:01:13 <ais523> isn't a metric fuckton slightly smaller than an imperial fuckton?
16:01:24 <Gregor> ais523: According to our own logs, slightly /larger/
16:01:28 <ais523> ah, aha
16:01:57 <Gregor> `run sed 's/\(.*metric\)/ \1/gi' paste/paste.3409 | paste
16:01:59 <HackEgo> http://codu.org/projects/hackbot/fshg/index.cgi/raw-file/tip/paste/paste.5111
16:02:32 <Gregor> Looks like about half of all fuckton mentions are qualified.
16:28:08 -!- sebbbu has quit (Read error: Connection reset by peer).
16:30:37 -!- sebbbu has joined.
16:35:33 -!- sebbbu has changed nick to sebbu.
16:35:47 -!- sebbu has quit (Changing host).
16:35:48 -!- sebbu has joined.
16:46:35 -!- ive has joined.
16:46:43 -!- Freedom666 has joined.
16:47:36 -!- Freedom666 has left.
16:48:06 <elliott> ?hoogle Q [Q a] -> [Q a]
16:48:07 <lambdabot> Language.Haskell.TH appsE :: [ExpQ] -> ExpQ
16:48:07 <lambdabot> Language.Haskell.TH listE :: [ExpQ] -> ExpQ
16:48:07 <lambdabot> Language.Haskell.TH tupE :: [ExpQ] -> ExpQ
16:48:08 <elliott> That won't work >_>
16:48:17 <elliott> ?hoogle m [m a] -> [m a]
16:48:17 <lambdabot> Data.List transpose :: [[a]] -> [[a]]
16:48:17 <lambdabot> Control.Monad msum :: MonadPlus m => [m a] -> m a
16:48:17 <lambdabot> Test.QuickCheck oneof :: [Gen a] -> Gen a
16:48:19 <elliott> BUT I MIGHT AS WELL TRY
16:48:53 -!- derrik has quit (Quit: gone).
16:49:21 <Deewiant> elliott: (Parsec3, Text) -> (Trifecta, ByteString): 6 files changed, 263 insertions(+), 202 deletions(-)
16:49:38 <elliott> Deewiant: Nice
16:49:41 <elliott> Deewiant: I logpinged you repeatedly
16:49:43 <elliott> w/ edwardk comments
16:49:48 <Deewiant> I noticed
16:50:12 <Deewiant> Nice to know that the tab thing is in the works
16:51:12 <Deewiant> Dang, 12% of this file is imports now
16:51:21 <elliott> :-D
16:51:29 <elliott> Deewiant: Be thankful, you're not dealing with TH like I am
16:51:34 <Deewiant> I don't think I've ever had 8 qualified imports in one module
16:52:00 <elliott> Gotta love a library where the recommended calling convention for the API functions is "they all take monadic values and return monadic values, except that, if it's a list, it's actually a pure list of monadic values, and..."
16:55:27 <Deewiant> Whoops, make that 214 deletions
16:59:32 <elliott> Deewiant: Can you shoot whoever wrote the cereal package for me, thanks
16:59:52 <elliott> What kind of horrible person adds functions for serialising WordNs for various N in little-endian BUT NOT INTS
16:59:56 <elliott> WHAT AM I MEANT TO DOOOOO
17:00:05 <elliott> (Okay I guess I can just fromIntegral it and it'll be fine but still)
17:01:43 <Deewiant> elliott: That'd be "Galois Inc." and some others
17:03:14 <elliott> Deewiant: DAMN YOU GALOIS INC.
17:03:20 <elliott> module MC.Protocol.Helpers
17:03:20 <elliott> ( putInt16be
17:03:20 <elliott> , putInt32be
17:03:20 <elliott> , putInt64be
17:03:20 <elliott> , putTextUCS2be
17:03:21 <elliott> ) where
17:03:26 <elliott> Finally my code is becoming a mess already
17:03:31 <elliott> Just what I always secretly wanted
17:19:21 -!- azaq23 has joined.
17:19:22 -!- azaq23 has quit (Changing host).
17:19:22 -!- azaq23 has joined.
17:28:09 -!- calamari has quit (Quit: Leaving).
17:48:02 <fizzie> Deewiant: My xmonad.hs has six qualified imports, and they're named using the "1-3-letter all-uppercase cryptic acronyms" style elliott hates. (Though three of them probably have no real business to be qualified.)
17:49:40 <elliott> fizzie: I thought you used so-called ``awesome''.
17:49:53 <Deewiant> At least I can recognize five of these eight abbreviations out of context
17:50:02 <elliott> Also, as far as hating them goes, I realised my style was totally inconsistent and switched to Deewiant's
17:50:06 <elliott> Bit of an existential crisis there
17:50:07 <Deewiant> as BS
17:50:07 <Deewiant> as BSL
17:50:07 <Deewiant> as UTF8
17:50:07 <Deewiant> as F
17:50:07 <Deewiant> as IM
17:50:09 <Deewiant> as IS
17:50:12 <Deewiant> as PP
17:50:14 <Deewiant> as TriD
17:50:23 <elliott> Deewiant: I gently request "B" instead of "BS", on behalf of programmers worldwid.e
17:50:25 <elliott> worldwide.
17:50:28 <elliott> I mean come on, BS.
17:50:33 <elliott> Also it: is shorter.
17:50:35 <fizzie> elliott: I made the plunge a month ago.
17:50:43 <fizzie> Deewiant: HT, W, T, DBA, DBC, DBT.
17:50:47 <Deewiant> Actually I just remembered that BSL should be BL
17:50:51 <elliott> fizzie: I hope you've enjoyed your plungerating.
17:51:00 <fizzie> elliott: At Least It's Not Lua(tm).
17:51:22 <Deewiant> Anyway, BS is intentional precisely because it's BS
17:51:49 <Deewiant> UTF8 should probably be BS_UTF8 but meh
17:52:26 <elliott> fizzie: I should probably try out xmonad sometime myself. I mean, there's something to be said for being under fifty lines.
17:52:32 <elliott> Deewiant: What exactly is the BS_UTF8 module
17:52:41 <Deewiant> Data.ByteString.UTF8
17:53:31 <elliott> I'd go for BUTF8
17:53:35 <elliott> Beautiful eight.
17:53:39 <olsner> Data.BullShit.UTF8
17:53:41 <Deewiant> Butt F8
17:53:44 <elliott> Meanwhilst, from the land of generated code:
17:53:45 <elliott> 1 -> Control.Monad.ap
17:53:45 <elliott> (Control.Monad.ap
17:53:45 <elliott> (Control.Monad.ap
17:53:45 <elliott> (Control.Monad.ap
17:53:45 <elliott> (Control.Monad.ap
17:53:45 <fizzie> elliott: So far I like it, even though my setup (Gnome-2 session running XMonad as the WM, with a gnome-panel instance holding all those indicator schwubblets and a systray) is probably something that would make "real XMonadists" go up in flames.
17:53:46 <elliott> (Control.Monad.ap
17:53:48 <elliott> (Control.Monad.ap
17:53:50 <elliott> (Control.Monad.ap
17:53:52 <elliott> (Control.Applicative.pure CLogin)
17:53:54 <elliott> MC.Protocol.Helpers.putInt32be)
17:53:56 <elliott> MC.Protocol.Helpers.putTextUCS2be)
17:53:58 <elliott> MC.Protocol.Helpers.putInt64be)
17:54:00 <elliott> MC.Protocol.Helpers.putInt32be)
17:54:02 <elliott> Data.Serialize.Put.putWord8)
17:54:04 <elliott> Data.Serialize.Put.putWord8)
17:54:08 <elliott> Data.Serialize.Put.putWord8)
17:54:10 <elliott> Data.Serialize.Put.putWord8 } }
17:54:13 <fizzie> Oh no, I messed up the pretty triangle. :(
17:54:16 <elliott> fizzie: Pretty sure PROMINENT XMONAD COMMUNITY MEMBERS(tm) do the Gnome thing too.
17:54:22 <elliott> And yes, you are disgusting.
17:54:41 <elliott> Now if you stay quiet for a second, you will hear the sound of Deewiant yelling USE <ASTERISK>
17:54:43 -!- DH____ has quit (Read error: Connection reset by peer).
17:54:47 <elliott> He will then type the asterisk, enabling my use of it
17:55:04 -!- DH____ has joined.
17:55:11 <Deewiant> <*>
17:55:20 <elliott> Also he might tell me that it should be get instead of put there and he'd be EXACTLY RIGHT.
17:55:57 <elliott> 1 -> ((((((((Control.Applicative.pure CLogin
17:55:57 <elliott> Control.Applicative.<*>
17:55:57 <elliott> MC.Protocol.Helpers.getInt32be)
17:55:57 <elliott> Control.Applicative.<*>
17:55:57 <elliott> MC.Protocol.Helpers.getTextUCS2be)
17:55:58 <elliott> Control.Applicative.<*>
17:55:59 <elliott> MC.Protocol.Helpers.getInt64be)
17:56:02 <elliott> Control.Applicative.<*>
17:56:03 <elliott> MC.Protocol.Helpers.getInt32be)
17:56:05 <elliott> Control.Applicative.<*>
17:56:09 <elliott> Data.Serialize.Get.getWord8)
17:56:11 <elliott> Control.Applicative.<*>
17:56:16 <elliott> Data.Serialize.Get.getWord8)
17:56:16 <elliott> Control.Applicative.<*>
17:56:17 <elliott> Data.Serialize.Get.getWord8)
17:56:19 <elliott> Control.Applicative.<*>
17:56:21 <elliott> Data.Serialize.Get.getWord8) } }
17:56:23 * copumpkin sighs
17:56:25 <elliott> Isn't it pretty?
17:56:28 <Deewiant> elliott: Do you need those brackets
17:56:31 <fizzie> I also have a dzen2-for-each-monitor statusbars thing fed by a separate proggie that receives status updates via DBus, and the XMonad.Layout.IndependentScreen thing that makes workspaces local per screen (as in Awesome), which I guess are non-conventional things to do also.
17:56:32 <Deewiant> elliott: Also btw henceforth when I use first/second if you yell at me about arrows I'll say they're from Data.Bifunctor
17:56:35 <fizzie> The sauna. ->
17:56:45 <elliott> Deewiant: (a) This is GHC printing its generated splice code
17:56:48 <elliott> All this is from TH
17:56:52 <elliott> Deewiant: (b) Okay
17:56:58 <elliott> copumpkin: Do you have a highlight on applicative or something
17:57:03 <copumpkin> nope
17:57:10 <elliott> Or were you just expressing general disapproval of my beautiful exhibits
17:57:36 <Deewiant> elliott: And if you can find me an (&&&) outside Control.Arrow I can drop arrows entirely
17:57:49 <elliott> :t (&&&)
17:57:50 <lambdabot> forall (a :: * -> * -> *) b c c'. (Arrow a) => a b c -> a b c' -> a b (c, c')
17:57:53 <elliott> Hayoo time
17:58:00 <Deewiant> \f g -> bimap f g . join (,)
17:58:31 <Deewiant> It exists in various places IIRC but nowhere nice :-P
17:58:38 <elliott> http://hackage.haskell.org/packages/archive/data-aviary/latest/doc/html/Data-Aviary-Functional.html#v:(&&&)
17:58:38 <elliott> http://hackage.haskell.org/packages/archive/uulib/latest/doc/html/UU-Util-Utils.html#v:split
17:58:40 <elliott> http://hackage.haskell.org/packages/archive/pointless-haskell/latest/doc/html/Generics-Pointless-Combinators.html#v:(/\)
17:58:41 <elliott> http://hackage.haskell.org/packages/archive/Agda/latest/doc/html/Agda-Utils-Tuple.html#v:(/\)
17:58:43 <elliott> http://hackage.haskell.org/packages/archive/hamusic/latest/doc/html/Music-Analysis-PF.html#v:split
17:58:46 <Deewiant> Yes, exactly
17:58:48 <elliott> I suggest the Agda or hamusic one. :p
17:58:52 <elliott> Deewiant: Well, hmm
17:58:53 <Deewiant> Yes, exactly not :-P
17:59:10 <elliott> http://hackage.haskell.org/package/pointless-haskell-0.0.5 does not look so bad, though it depends on haskell98 and duplicates a lot of edwardk packages ;-)
17:59:29 <Deewiant> Yes, the duplication is the main problem :-P
17:59:31 <elliott> uulib is apparently the parsing library? I assumed it'd just be a grab-bag of Utrecht-style insanity
17:59:44 <elliott> Oh, data-aviary is just a set of combinator birds
17:59:48 <elliott> That's not so bad, is't?
17:59:52 <elliott> Though it certainly has all the stupid names. :p
18:00:05 <elliott> Oh, Data.Aviary.Functional: "This is for reference (obviously) and is not intended for use."
18:00:17 <elliott> Deewiant: In conclusion, I recommend depending on Agda
18:00:24 <Deewiant> Not hamusic?
18:00:31 <elliott> Deewiant: It uses the older Haddock CSS
18:00:33 <elliott> I don't like that
18:01:00 <elliott> Deewiant: More seriously though, I might just make my own package of "Arrow shit except specialised to functions"
18:01:05 <elliott> Since I want it, too
18:01:15 <elliott> The question is where to put them, module-wise :P
18:01:19 <elliott> Data.Function.Extra is gross
18:01:20 <Deewiant> Make it a "tuple helpers" instead
18:01:28 <elliott> Deewiant: What about arrowchoice
18:01:29 <Deewiant> And add Trifunctors etc
18:01:33 <Deewiant> Nobody uses arrowchoice
18:01:45 <elliott> Deewiant: But okay, tuple helpers sounds decent
18:01:48 <elliott> Data.Function.Tuple?
18:01:53 <Deewiant> Data.Tuple already exists
18:02:01 <Deewiant> Data.Tuple.ElliottsExtrasEmporium
18:02:08 <elliott> Yes, which is why I'm trying to think of logical other names
18:02:21 <Deewiant> I meant that I'd put it under Data.Tuple
18:02:30 <elliott> Data.Tuple.Combinators?
18:02:40 <elliott> That seems reasonable, if a little long
18:02:48 <Deewiant> That's not long
18:02:54 <Deewiant> System.Console.Terminfo.PrettyPrint is long
18:02:58 <elliott> Your mind is warped by the trifecta
18:03:04 <Deewiant> That's not trifecta
18:03:13 <elliott> s/trifecta/edwardk/ :-P
18:03:30 <Deewiant> And hey, Data.ListTrie.Patricia.Map.Enum
18:03:35 <Deewiant> That's long too
18:03:44 <elliott> Deewiant: I'm so glad I put GPipe stuff on the back-burner
18:03:46 <Deewiant> But it's only ever imported qualified so it doesn't matter for my alignment purposes
18:03:56 <elliott> Means I'm not dealing with your awful library :-D
18:04:04 <Deewiant> :-(
18:04:12 <elliott> OK, beautiful library with ugly typeclasses.
18:04:25 <Deewiant> Which you haven't fixed yet
18:04:28 <Deewiant> Or where did we end up with that
18:04:32 <elliott> Like I said, I put GPipe stuff on the backburner
18:04:38 <Deewiant> Yeah okay
18:04:44 <elliott> It's not hard to fix at all, it's just a lot of tedious work :P
18:04:46 <Deewiant> I'm just wondering if you'd given up on it or if we were stuck on something else
18:04:58 <elliott> Deewiant: So (&&&) isn't a very nice name
18:05:09 <Deewiant> I don't care about the name
18:05:16 <elliott> You probably care about whether it's infix or not
18:05:23 <Deewiant> Not that much
18:05:26 <Deewiant> I'm fine with bimap instead of ***
18:05:31 <Deewiant> I think, at least
18:05:41 <Deewiant> I haven't used either *** or &&& lately
18:05:44 <elliott> What type does (\f g -> bimap f g . join (,)) actually come out to
18:06:01 <Deewiant> \f g -> bimap f g . join (,) :: (c -> b) -> (c -> d) -> c -> (b, d)
18:07:49 <Deewiant> (Same as with (***))
18:08:17 <elliott> Oh, I thought it'd end up with some funky bifunctor crap in the type
18:08:31 <Deewiant> The (,) makes it be a pair
18:08:39 <Deewiant> And that's the only bifunctor crap there could be
18:09:06 <ais523> <Esolang> Brainlove adds a few more commands to brainfuck in order to make it easier to program in.
18:09:08 <ais523> oh dear
18:09:10 <elliott> ais523: augh
18:09:12 <elliott> ?hoogle showHex
18:09:12 <lambdabot> Numeric showHex :: Integral a => a -> ShowS
18:09:23 <elliott> > showHex 99 "a"
18:09:24 <lambdabot> "63a"
18:10:10 <ais523> it seems to be BF + one register that can be copied to/from tape + until loop + instruction that makes while/unless into if/unless
18:11:29 <Deewiant> I always think of http://i.imgur.com/6Ybge.jpg when elliott says "augh"
18:11:40 <elliott> Fairly accurate
18:12:38 <elliott> Has anyone here who is Deewiant used lazy bytestrings
18:12:48 <Deewiant> Yes
18:12:52 <elliott> Excellent
18:13:03 <elliott> Deewiant: I take it doing the equivalent of getContents for a lazy bytestring isn't a Done Thing
18:13:16 <elliott> It's only that, I just realised that cereal only works on bytestrings
18:13:20 <elliott> And the data is variable length
18:13:27 <elliott> So I have no idea how many bytes to read
18:13:27 <elliott> So
18:13:27 <elliott> Yeah
18:13:35 <elliott> I could do my own buffering but I'd rather it be more automatic
18:13:36 <elliott> Oh hmm
18:13:38 <elliott> Constructors
18:13:38 <elliott> Fail String
18:13:38 <elliott> The parse failed. The String is the message describing the error, if any.
18:13:38 <elliott> Partial (ByteString -> Result r)
18:13:39 <elliott> Supply this continuation with more input so that the parser can resume. To indicate that no more input is available, use an empty string.
18:13:43 <elliott> Done r ByteString
18:13:45 <elliott> The parse succeeded. The ByteString is the input that had not yet been consumed (if any) when the parse succeeded.
18:13:48 <elliott> Yeah okay this should work
18:13:55 <Deewiant> Glad I could help
18:13:56 <elliott> I'll still have to keep my own buffer but that's pretty good
18:14:01 <elliott> Deewiant: You're very welcome
18:14:18 <elliott> Deewiant: To thank you for your help, here's a horrible function: http://sprunge.us/ASLM
18:14:30 <elliott> Actually that's probably the prettiest TH code I've written yet
18:14:31 <Deewiant> Looks fine to me
18:14:36 <Deewiant> The average identifier length far exceeds 1
18:14:42 <elliott> Deewiant: Quick, what does it do, tell me in ten seconds
18:14:43 <Deewiant> Compare to trifecta
18:14:45 <elliott> No cheating
18:14:58 <elliott> Also no looking at the function body which makes it obvious :-P
18:15:10 <Deewiant> Too late, I already looked before you asked
18:15:30 <elliott> Dammit
18:15:41 -!- copumpkin has quit (Quit: Computer has gone to sleep.).
18:15:43 <elliott> let x = 0 of type UNSIGNED byte
18:15:43 <elliott> while (x = read byte from stream) does not equal 127:
18:15:44 <elliott> select based on value of (x >> 5):
18:15:44 <elliott> case 0: read byte from stream
18:15:44 <elliott> case 1: read short from stream
18:15:44 <elliott> case 2: read int from stream
18:15:46 <elliott> case 3: read float from stream
18:15:48 <elliott> case 4: read string (UCS-2) from stream
18:15:50 <elliott> case 5: read short, byte, short from stream; save as item stack (id, count, damage, respectively)
18:15:52 -!- zzo38 has joined.
18:15:53 <elliott> case 6: read int, int, int from stream; save as extra entity information.
18:15:55 <elliott> end select
18:15:57 <elliott> end while
18:15:59 <elliott> What a beautiful serialisation.
18:16:01 <elliott> By beautiful, I mean ``augh''.
18:19:50 <ais523> is that pseudocode? or some language I'm not aware of?
18:19:54 <Deewiant> elliott: (x *> ((:) <$> y) <* z <*> w) or ((:) <$> (x *> y) <* z <*> w) or ((:) <$> (x *> y <* z) <*> w)
18:19:59 <ais523> oh, must be pseudocode because of the "respectively"
18:20:00 <Deewiant> Question mark
18:20:12 <ais523> the only language I can think of that has something even vaguely corresponding to that is COBOL
18:20:15 <elliott> ais523: pseudocode, yeah
18:20:27 <elliott> Deewiant: Um
18:20:33 <ais523> err, pun unintentional
18:20:35 <elliott> ?. undo unpl ((:) <$> (x *> y) <* z <*> w)
18:20:35 <lambdabot> (((((:)) <$> (x *> y)) <* z) <*> w)
18:20:38 <elliott> God dammit
18:20:41 <ais523> and probably will be missed unless you know at least a bit of COBOL
18:20:44 <elliott> ?. do unpl ((:) <$> (x *> y) <* z <*> w)
18:20:45 <lambdabot> (((((:)) <$> (x *> y)) <* z) <*> w)
18:20:47 <elliott> God dammit
18:20:53 <elliott> ?. do unpl ((:) `fmap` (x *> y) <* z `ap` w)
18:20:53 <lambdabot> (do { b <- ((fmap ((:)) (x *> y)) <* z); a <- w; return (b a)})
18:21:00 <elliott> ?. do unpl ((:) `fmap` (x >> y) <* z `ap` w)
18:21:00 <lambdabot> (do { b <- ((fmap ((:)) (do { x; y})) <* z); a <- w; return (b a)})
18:21:25 <elliott> ?do let q a b = do x <- a; b; return x in (do { b <- ((fmap ((:)) (do { x; y})) `q` z); a <- w; return (b a)})
18:21:26 <lambdabot> let { q a b = do { x <- a; b; return x}} in (do { b <- ((fmap ((:)) (do { x; y})) `q` z); a <- w; return (b a)})
18:21:28 <elliott> >_<<
18:21:29 <elliott> >_<
18:21:36 <elliott> Deewiant: Yeah, I recommend something that looks nothing like that
18:21:58 <Deewiant> I'll just take the first option then
18:22:59 <Deewiant> Well, I suppose I could use (:) <$> between x z y <*> w
18:25:40 <elliott> Hey Deewiant, what should I prefix/suffix/whatever field constructors with
18:25:49 <elliott> "string" and "bool" are a bit too close to clashing wit things for comfort
18:26:02 <elliott> f_ prefix is ugly, fInt is hideous, intF/stringF/... are just kinda weird
18:26:09 <elliott> Clearly you have the perfect solution
18:26:12 <Deewiant> Some say "don't, import qualified"
18:26:15 <olsner> Deewiant: or something with liftA2 (:) or liftM2 (:), if you haven't already been there
18:26:21 <elliott> Deewiant: Hmm, that might actually be a good idea here
18:26:48 <elliott> Yeah, that should work
18:26:59 <elliott> Although "TF." is a bit long a prefix
18:27:06 <elliott> I don't want F., that's reserved for Foldable
18:38:39 -!- Taneb has joined.
18:40:06 <Taneb> How about GHost?
18:40:26 <Taneb> I'm not sure why I said that
18:49:51 -!- copumpkin has joined.
19:04:11 -!- Taneb has changed nick to Taneb|Hovercraft.
19:04:34 -!- oerjan has joined.
19:04:58 -!- Zuu has quit (Ping timeout: 244 seconds).
19:12:38 -!- Taneb|Hovercraft has changed nick to Taneb.
19:22:34 <oerjan> the Taneb has landed
19:23:39 <zzo38> One feature idea I have for Haskell, is ability to define equivalence classes where you can specify that it should assume everything listed there is equivalent to each other. If the name of an equivalence class is mentioned, it will select whichever one has a matching type (or kind), and if more than one has, it selects one arbitrarily. The equivalence class has its own fixity.
19:24:29 <Taneb> What does anyone think of Salesman?
19:24:37 <Taneb> I'm trying to get opinions and feedback of it
19:24:47 <oerjan> *MWAHAHAHA*
19:24:51 <zzo38> Taneb: OK I will read it
19:24:56 <Taneb> http://esoteric.voxelperfect.net/wiki/User:Taneb/Salesman
19:26:39 <zzo38> OK. Although, examples should be given, and a line break in the description of command 3
19:31:17 <ais523> hmm, the joys of orthogonality: IMAP has a pair of commands that returns a message's UID, one takes a sequence number as argument, the other takes a message's UID as argument
19:31:56 <fizzie> So it takes a message's UID and returns the message's UID?
19:32:05 <ais523> yep
19:32:08 <oerjan> the id-eal command
19:32:29 <fizzie> Does it return some sort of an error for a nonexistent message?
19:32:31 <ais523> the Perl library I'm reading actually has a wrapper for that command that actually sends it across the network
19:32:38 <ais523> umm, I think so
19:32:42 <ais523> but I'm not sure from the docs
19:32:42 <fizzie> Then it's not so id-eal.
19:34:22 <oerjan> @hoogle Set key -> key -> Maybe key
19:34:23 <lambdabot> Did you mean: Set Key -> Key -> Maybe Key /count=20
19:34:23 <lambdabot> Prelude asTypeOf :: a -> a -> a
19:34:23 <lambdabot> Data.Dynamic dynApply :: Dynamic -> Dynamic -> Maybe Dynamic
19:34:47 <Deewiant> elliott:
19:34:50 <Deewiant> > chr 42
19:34:50 <lambdabot> '*'
19:35:03 <oerjan> that could be a useful command for monadic chaining
19:35:25 <oerjan> hm
19:35:28 <oerjan> :t guarding
19:35:29 <lambdabot> Not in scope: `guarding'
19:35:50 <oerjan> i think someone suggested that once...
19:36:11 <oerjan> @hoogle (x -> Bool) -> x -> m x
19:36:11 <lambdabot> Prelude until :: (a -> Bool) -> (a -> a) -> a -> a
19:36:11 <lambdabot> Data.IntMap filter :: (a -> Bool) -> IntMap a -> IntMap a
19:36:11 <lambdabot> Data.Foldable find :: Foldable t => (a -> Bool) -> t a -> Maybe a
19:36:20 <oerjan> @hoogle MonadPlus m => (x -> Bool) -> x -> m x
19:36:20 <lambdabot> Prelude until :: (a -> Bool) -> (a -> a) -> a -> a
19:36:21 <lambdabot> Data.IntMap filter :: (a -> Bool) -> IntMap a -> IntMap a
19:36:21 <lambdabot> Data.Foldable find :: Foldable t => (a -> Bool) -> t a -> Maybe a
19:36:55 <fizzie> ^ord *
19:36:55 <fungot> 42
19:37:00 <fizzie> Unfortunately it doesn't do the inverse.
19:37:08 <Deewiant> ?ty \x s -> fmap (const x) $ guard (Data.Set.member x s)
19:37:08 <lambdabot> forall a (f :: * -> *). (Functor f, Ord a, MonadPlus f) => a -> S.Set a -> f a
19:37:14 <oerjan> ^show ord
19:37:14 <fungot> >>,[[-<+2>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[<[-]+>->+<[<-]]]]]]]]]]>]<2[>+6[<+8>-]<-.[-]<]+32.[-]>>,]
19:37:28 <oerjan> fizzie: hm shouldn't be _too_ hard
19:37:43 <elliott> Deewiant: Can't type dem numbers either
19:39:08 <Deewiant> > map chr [fromIntegral (minBound :: Char)..]
19:39:08 <lambdabot> No instance for (GHC.Real.Integral GHC.Types.Char)
19:39:08 <lambdabot> arising from a use of...
19:39:15 <Deewiant> Oops
19:39:19 <Deewiant> > map chr [ord (minBound :: Char)..]
19:39:20 <lambdabot> "\NUL\SOH\STX\ETX\EOT\ENQ\ACK\a\b\t\n\v\f\r\SO\SI\DLE\DC1\DC2\DC3\DC4\NAK\S...
19:39:25 <Deewiant> Bah
19:39:46 <ais523> hmm, interesting that the backslash-single-character escapes are in a block like that
19:40:19 <Lymee> > text $ "\NUL"
19:40:37 <Lymee> > ord '\NUL'
19:40:38 <lambdabot> 0
19:41:11 <Lymee> ^ord joijio
19:41:11 <fungot> 106 111 105 106 105 111
19:41:23 <Lymee> ^ord
19:41:26 <Lymee> ^ord aa aa
19:41:26 <fungot> 97 97 32 32 32 97 97
19:41:44 <Deewiant> ^ord asterisk
19:41:45 <fungot> 97 115 116 101 114 105 115 107
19:41:49 <Lymee> > ord '\SQH'
19:41:50 <lambdabot> <no location info>:
19:41:50 <lambdabot> lexical error in string/character literal at chara...
19:42:01 <Lymee> > chr 0
19:42:01 <lambdabot> '\NUL'
19:42:02 <Lymee> > chr 1
19:42:03 <lambdabot> '\SOH'
19:42:43 <Lymee> > chr 1 : "ACTION hugs oerjan" ++ [chr 1]
19:42:44 <lambdabot> "\SOHACTION hugs oerjan\SOH"
19:42:51 <Lymee> > text $ chr 1 : "ACTION hugs oerjan" ++ [chr 1]
19:42:52 <lambdabot> ACTION hugs oerjan
19:42:57 <Lymee> :(
19:46:11 -!- Taneb has quit (Remote host closed the connection).
19:46:50 -!- Taneb has joined.
19:51:01 <fizzie> ^bf ,[>[->++++++++++<]>[-<+>]<<------------------------------------------------[>+<-],]>.!42
19:51:01 <fungot> *
19:51:06 <fizzie> ^help
19:51:06 <fungot> ^<lang> <code>; ^def <command> <lang> <code>; ^show [command]; lang=bf/ul, code=text/str:N; ^str 0-9 get/set/add [text]; ^style [style]; ^bool
19:51:17 <fizzie> ^def chr bf ,[>[->++++++++++<]>[-<+>]<<------------------------------------------------[>+<-],]>.
19:51:18 <fungot> Defined.
19:51:21 <fizzie> ^chr 42
19:51:21 <fungot> *
19:51:23 <fizzie> ^save
19:51:23 <fungot> OK.
19:51:32 <fizzie> (Not that elliott can still write any numbers.)
19:52:05 <fizzie> (Human interest point: I first did that the wrong way around.)
19:52:19 <fizzie> ^bf ,[>,]<[>>[-<++++++++++>]<<------------------------------------------------[>+<-]<]>>.!24
19:52:20 <fungot> *
19:52:22 <fizzie> Like that.
19:52:52 <fizzie> ^show chr
19:52:52 <fungot> ,[>[->+10<]>[-<+>]<2-48[>+<-],]>.
19:52:55 -!- Taneb has quit (Remote host closed the connection).
19:54:34 <oerjan> <elliott> The idea with this is that you wouldn't have to define all that, and also wouldn't have to pack/unpack Lazy values (i.e. the reason laziness is awful in strict languages) :P
19:55:01 <oerjan> if you could do this with data/codata instead, it might be useful for dependently typed languages...
19:56:24 <fizzie> ^bf +.,[.,]+.!ACTION still doesn't filter CTCP *shame*
19:56:24 * fungot still doesn't filter CTCP *shame*
19:56:37 <fizzie> "One of these days."
19:56:38 <oerjan> how does agda handle this? does it just define most functions twice for lists and streams?
19:57:18 <oerjan> fizzie: secretly we all prefer it that way, just don't tell any admins
19:58:48 -!- augur has quit (Remote host closed the connection).
19:59:23 <oerjan> or make an exception for ACTION
20:06:25 <fizzie> If I manage to gather the willpower to actually filter it, maybe checking the first word wouldn't be such a huge hassle, yes.
20:09:01 <elliott> Well, we're Plazmaless. :p
20:09:25 <oerjan> we're a zolid bunch
20:09:37 <oerjan> having a gaz
20:10:28 <oerjan> elliott: also, i thought you were the resident agda expert
20:10:57 <elliott> i am?
20:11:09 <oerjan> as in you've actually tried it, or something
20:11:48 <oerjan> i guess some of the #haskellers might be even more likely
20:12:12 <oerjan> (re my data/codata question)
20:14:57 <copumpkin> ?
20:15:19 <copumpkin> yeah, you just define functions twice
20:15:30 <copumpkin> you do the same in haskell, fwiw
20:15:56 <copumpkin> the closest thing to a haskell list is a colist in agda
20:16:09 <oerjan> yes, but it seems like it would be more annoying the more variations of a list there are
20:16:14 <copumpkin> certainly
20:16:26 <copumpkin> which is why people are especially interested in generics in dependent languages
20:16:37 <copumpkin> the levitation stuff in epigram, for example
20:16:47 <copumpkin> or the ornamentation
20:24:34 <zzo38> I want to change rules of Magic: the Gathering cards, I have a lot of ideas.
20:25:12 <zzo38> * Each object which is a card has an initial state, which corresponds to what is printed on the card and is immutable. Other objects have no initial state and cannot be given any.
20:25:59 <zzo38> * When an object moves from one zone to another, except for stack->play, and phasing, the old object is destroyed and a new object created from the old object's initial state is placed in the new zone.
20:26:45 <zzo38> * There is no state-based effect for tokens out of play ceasing to exist. Instead, the above rule applies, which has a similar effect.
20:26:55 <zzo38> * Copies of spells on the stack are the same things as tokens.
20:27:31 <zzo38> * No state based effects for auras or equipments that are also creatures. Something that is both a creature and an aura still is both things with no conflict.
20:27:54 <zzo38> * If a nonexistent object would deal damage, that damage is prevented.
20:27:59 <ais523> hmm, next issue: what if someone sends an HTML email, or GPG-signed email (both quite likely to happen on our systems)
20:28:31 <elliott> ais523: what issue?
20:28:40 <zzo38> * Losing due to being unable to draw a card is not a state based effect; it happens immediately.
20:28:51 <ais523> elliott: with the system I'm writing for work
20:28:54 <zzo38> (Before state-based effects are checked)
20:29:02 <ais523> what we really want is just to receive plain text as the email body
20:29:03 <elliott> ais523: I mean, why is that an issue?
20:29:11 <elliott> GPG is just cruft above and below the message
20:29:14 <ais523> because I can't exactly run HTML through an OCaml parser
20:29:16 <elliott> But uh
20:29:21 <elliott> Grep Python's stdlib for MIME :P
20:29:25 <elliott> ais523: wait, what?
20:29:33 <elliott> whatever you're doing, stop, I don't care who told you to do it
20:29:42 <ais523> elliott: running arbitrary code emailed to me?
20:29:52 <elliott> I believe I already told you to stop
20:29:55 <ais523> nah, I'm not quite that mad
20:30:06 <elliott> I don't really care what it is, I know enough
20:30:24 <ais523> just you telling me to stop won't stop me designing something I'm being paid to do
20:30:42 <zzo38> * Mana burn still works (that is one of the rules changed in the new rules; I don't know all the changes)
20:30:55 <elliott> ais523: i can no longer talk to you in good conscience :(
20:30:57 <ais523> gmail being involved is ridiculous enough as it is
20:31:04 <ais523> seriously, though, why are you so upset about this?
20:31:16 <ais523> parsing user input is hard, especially when it comes from students
20:31:24 <oerjan> <ais523> because I can't exactly run HTML through an OCaml parser <-- just consider it a CHALLENGE
20:31:31 <elliott> you're feeding html mail into the ocaml parser
20:31:34 <elliott> that's never ok :(
20:31:37 <ais523> no, I'm not
20:31:40 <ais523> at least, I don't want to
20:31:51 <elliott> you want to turn it into text then feed it into the ocaml parser which is just as bad
20:31:52 <elliott> :P
20:31:53 <zzo38> * Rules for playing land cards no longer overrides rules for other types. (Existing Artifact Lands will still act as they do; but if you make an Artifact Land with a mana cost, you can now play the card as either an Artifact or as a Land, because the mana cost allows you to do so.)
20:31:53 <ais523> so the challenge is to figure out when I'm sent HTML mail, and look for the plaintext portion, or at worst detag it myself
20:32:04 <elliott> what language?
20:32:21 <ais523> elliott: there's no way you're going to get a yearful of students to get it right when they can't even do CSV right
20:32:31 <elliott> what language are you writing this in, I mean?
20:32:33 <ais523> I'm using Perl for the glue code, but the OCaml parser itself is in OCaml
20:32:43 <elliott> heh
20:32:57 <zzo38> ais523: Would it help to convert HTML mail into ANSI escape sequences?
20:33:21 <ais523> zzo38: I'd prefer to convert it into plain Unicode
20:33:23 <oerjan> i recall back when i found ocaml, ocamlyacc still was based around a modified yacc in C
20:33:30 <ais523> or even ASCII would do
20:33:57 <elliott> oerjan: nicw
20:33:58 <elliott> nice
20:34:12 <zzo38> ais523: OK, that would do, I suppose. Although it loses formatting in case there is any important formatting
20:34:28 <ais523> elliott: it'd be fun to punish the students for sending HTML email, but I really doubt I could get away with that
20:34:37 <ais523> especially because it's basically impossible to do in most webclients
20:34:45 <elliott> ais523: p.s. I want to confess that I've just willingly used git to version control something that I could have put into darcs without much trouble
20:34:48 <elliott> i'm sorry :(
20:34:51 <ais523> zzo38: well, they're meant to be sending programs, and I think I can dispense with syntax highlighting
20:35:00 <zzo38> OK
20:35:02 <ais523> elliott: it's OK
20:35:10 <elliott> "especially because it's basically impossible to do in most webclients" -- what, send html mail? :-)
20:35:12 <ais523> git might be utterly broken, but it still works well enough to be usable
20:35:15 <ais523> elliott: send plaintext mail
20:35:18 <elliott> ais523: is it ok if I partly did it for github? :-P
20:35:35 * ais523 laughs at the question, but doesn't answer
20:35:53 <elliott> oh lame, github's haskell syntax highlighting doesn't recognise template haskell's overloading of the character quoting character
20:35:56 <elliott> i want my money back
20:36:03 <elliott> (TH has the worst syntax imaginable)
20:36:11 <elliott> (character literal in haskell: 'a', '\n')
20:36:17 <elliott> (reference to name foo in template haskell: 'foo)
20:36:24 <ais523> ouch
20:36:33 <elliott> (pop quiz: how do you get a reference to the name x', which is of course perfectly legal?)
20:36:34 <ais523> OCaml uses 'a for type variables
20:36:41 <elliott> (hint: you don't, you have to use mkName manually)
20:36:58 <elliott> oh, and ''Foo is the same at the type level
20:37:03 <elliott> because it wasn't confusing enough
20:37:43 <ais523> elliott: I was really impressed with Kate's syntax highlighting of Perl
20:37:44 <zzo38> I recognized that problem immediately when reading about Template Haskell syntax.
20:37:52 <ais523> it managed stuff that confused all the other editors I tried
20:38:11 <oerjan> starting things with $ also doesn't seem very nice, but at least you can use space then
20:38:12 <elliott> ais523: well, the KDE folks need _something_ to win the flamewars with
20:38:21 <elliott> so they got a perl junkie to spend a few weekends on it :P
20:38:43 <elliott> "oh, well, I quite like ema-" "CAN YOUR PRECIOUS EMACS HIGHLIGHT THIS????"
20:38:46 <ais523> I actually downloaded a Perl port of the source for Kate's syntax highlighter
20:38:54 <ais523> for reasons I can't quite remember
20:39:05 <ais523> maybe it'll come in useful some day
20:39:06 <zzo38> I happen to think Template Haskell syntax works OK, though, even though there is that problem
20:39:17 <elliott> it works, it just isn't very nice
20:40:01 -!- monqy has joined.
20:40:18 <elliott> arcane monqy. how are the curts wronrging.
20:40:19 <zzo38> Currently at FreeGeek Vancouver, UNIX-to-UNIX mail doesn't work. The system administrator says he will fix it soon, and that the software already has this capability it only has to be configured. He also says Internet-to-UNIX mail will be configured (UNIX-to-Internet already works).
20:40:32 <monqy> whats a curt
20:40:32 <ais523> now I need to work out how to send an HTML email, as a test for this thing
20:40:36 <ais523> just to see what it comes up with
20:40:36 <elliott> zzo38: like... UUCP?
20:40:52 * ais523 tries to work out how to send HTML mail from Evolution
20:41:13 <ais523> ah, there's a dropdown
20:41:26 <elliott> be a bad person: [yes] [no]
20:41:28 <elliott> except
20:41:30 <elliott> as a dropdown
20:42:03 <ais523> indeed
20:42:17 <elliott> you have selected
20:42:20 <elliott> to be a bad person
20:42:23 <elliott> you must now face the consequences :(
20:43:14 <zzo38> elliott: Actually, I mean to a different user on the same computer.
20:43:17 <ais523> aha, Evolution sends a plaintext component, then the HTML component after that
20:43:20 <ais523> that's actually really nice behaviour
20:43:44 <ais523> anyone here who uses Thunderbird? could you send me an HTML mail with a bit of formatting in, so I can see how it behaves?
20:44:06 <monqy> oh no, as i feared, brainlove is Bad
20:44:19 <elliott> hmm, apparently the fucking weather is fucking ...alright
20:44:27 <elliott> i don't know whether to agree or not
20:44:33 <elliott> ais523: I use gmail
20:44:36 <elliott> ais523: can i still send html mail
20:44:57 <ais523> well, that's less useful, because the students /should/ be using their University accounts
20:45:12 <ais523> which means that they should be sending from Thunderbird or Outlook Web Access (*shudder*)
20:45:27 <ais523> and I definitely don't trust OWA to do anything sane, but I was hoping with Thunderbird
20:45:30 <elliott> MC/Protocol.hs:1:1: Error: Unused LANGUAGE pragma
20:45:30 <elliott> Found:
20:45:30 <elliott> {-# LANGUAGE TemplateHaskell #-}
20:45:30 <elliott> Why not remove it.
20:45:30 <elliott> because it's not unused, you presumptuous program >:(
20:45:32 <elliott> ais523: "should"
20:45:47 <ais523> elliott: "should" in that we're at least justified if we deny them marks for using something else
20:46:01 <elliott> ais523: deny someone marks for avoiding Outlook Web Access?
20:46:04 <ais523> because those are the only clients they're given on their University account, which is the one they're meant to use
20:46:06 <elliott> you're horrible
20:46:09 <elliott> I don't like the new ais523
20:46:12 <ais523> hey, I didn't make the rules
20:46:22 <elliott> that's what the Nazis said!
20:46:25 <ais523> how I'd love to say "use mail(1) only"
20:46:31 <ais523> and avoid all these issues
20:47:02 <zzo38> I too would say use UNIX mail, if the computer is UNIX you would use it. However, some people might use other program anyways.
20:56:03 -!- augur has joined.
20:58:32 <zzo38> Did someone tell me before that do-notation with the (x ->) monad does correspond to something in Curry-Howard? Can you please remind me?
20:58:34 <fizzie> My inbox has bazillion emails from Thunderbird (it's the quasi-official client in our desktop installation, I think) but so far all of them have been plaintext-only.
20:59:47 <fizzie> "Microsoft Office Outlook 12.0" has sent a multipart/alternative message, with a text/plain copy first, and a text/html copy after. That I think is the "usual way".
21:01:30 <ais523> I think what I'll do is parse it, and take the first text/plain part I come across
21:01:32 <elliott> ais523: I sent you some HTML mail just in case
21:01:41 <elliott> I think your spam filter might block it thoug
21:01:41 <elliott> h
21:01:49 <ais523> is it that spammy?
21:01:53 <elliott> It's a masterpiece.
21:01:59 <ais523> I haven't received it, at least
21:02:06 <elliott> "viagra cialis" appears more than once.
21:02:10 <elliott> Also there's some Haskell in it.
21:02:14 <elliott> It's pink.
21:02:34 <fizzie> I did get one incredibly complicated-looking MIME subpart tree from a student once.
21:02:39 <elliott> Wow, the text/plain version is almost not entirely fucked up, too.
21:02:46 <fizzie> (Mutt's message-part-viewer shows it as a tree.)
21:04:02 <ais523> hmm, I'm going to send myself some OCaml as an attachment, just to see what content-type it gets
21:04:04 <elliott> Deewiant: So what manner of trifunctory stuff would you want to see in the hypothetical tuple-combinators
21:04:13 <ais523> I'm hoping for text/x-ocaml, but that seems really implausible
21:04:36 <Deewiant> elliott: trimap, first3/second3/third3
21:04:56 <Deewiant> (Do we already have thd/trd and friends in base somewhere?)
21:05:01 <elliott> Deewiant: What signature would trimap have exactly, I'm trying to think of a use-case for this
21:05:09 <elliott> Oh
21:05:11 <elliott> For three-ples
21:05:13 <Deewiant> Like bimap but for three
21:05:25 <ais523> hmm, at least the involvement of gmail was the least complex part in all of this
21:05:28 <elliott> I have this kind of belief that using anything more than a tuple is bad. Is that bad of me?
21:05:40 <elliott> It feels like once you get to that point you need to start naming something.
21:05:42 <Deewiant> s/tuple/pair/
21:05:46 <elliott> Yeah yeah
21:05:47 <elliott> two-ple
21:05:54 <Deewiant> I think three isn't that bad
21:06:15 <fizzie> I think I took a screencap of the complicatedness, but it's hard to find anything when all the names are like "florb.png".
21:06:23 <Deewiant> ?ty Data.Map.splitLookup
21:06:23 <lambdabot> forall k a. (Ord k) => k -> M.Map k a -> (M.Map k a, Maybe a, M.Map k a)
21:06:33 <elliott> Deewiant: I'd kind of prefer Trifunctor to be in a separate trifunctors package, but that feels like it's a slippery slope towards Kmett package dominance
21:06:42 <Deewiant> Yeah, I know
21:06:50 <elliott> Finally we can replicate Control.Arrow specialised to functions with only fifty import
21:06:50 <elliott> s
21:07:54 <fizzie> Also there's a "blurg.png".
21:07:58 <ais523> elliott: a 3-item tuple is called a triple
21:08:05 <ais523> given that people here seem to have had issues finding the name
21:08:20 <elliott> I wish I had a nicer name than tuple-combinators
21:08:21 <fizzie> Perhaps it should be called a "trubble", because it's nothing but trouble?
21:08:21 <oerjan> zzo38: i think i said something about the "decision theorem", which i then failed to google, but it's essentially about proving a -> b by assuming a locally as an axiom and proving b from that, which to me seems similar to what the (x ->) monad allows you to do
21:08:33 <ais523> elliott: Subject: [SPAM?] SPAM: example viagra cialis hexham didgeridoo
21:08:46 <ais523> it seems to have been greylisted and marked as possible spam by one filter and certain spam as another
21:08:46 <elliott> ais523: Yessssssssssssss
21:08:52 <ais523> but not to the extent that it wasn't delivered at all
21:08:55 <elliott> I hope I'm on blacklists now
21:09:03 <ais523> what's with all the GIF images?
21:09:05 <elliott> Deewiant: Yo, better name than tuple-combinators, hit me
21:09:12 <elliott> ais523: Emojis!
21:09:13 <Deewiant> tumbinators
21:09:14 <elliott> Gmail supports them nowadays.
21:09:22 <monqy> viagra cialis hexham didgeridoo
21:09:25 <elliott> They're even in Unicode!
21:09:33 <elliott> But I doubt you have a font with the PILE OF POO character in it, so I used the images instead.
21:09:40 <ais523> wow, it hit a 7.4 on spam score
21:09:42 <ais523> that's pretty high
21:09:43 <elliott> I neglected to include GOAT.
21:09:51 <elliott> It's a pretty spammy message.
21:10:40 <ais523> strangely, it was knocked down 0.7 for the reputation of your account
21:10:48 <ais523> it'd have been 8.1 from an unrecognised sender
21:10:53 <zzo38> oerjan: OK, yes I suppose I can see how that works with do-notations.
21:11:12 <elliott> ais523: haha
21:11:17 <elliott> good to know I have the karma
21:11:43 <ais523> the pharmaceutical-related words make up most of the spam score, it seems
21:11:58 <oerjan> zzo38: oh wait now i suddenly remembered and no wonder i couldn't google it, it's called the _deduction_ theorem. http://en.wikipedia.org/wiki/Deduction_theorem
21:12:06 <ais523> also, it seems it has 10 nested blockquotes
21:12:15 <fizzie> ais523: One of our departmental "little christmas" parties had (as one of the multitude of activities they usually have) a SPAM competition; there was a console set up on a desk, and you typed a handle and a message, and then it ran SpamAssassin on the message and showed a highscore list of handles and corresponding spam scores.
21:12:29 <zzo38> oerjan: Yes, and I think what you describe is also like what is called "fantasy rule" in Hofstadter's book, which I already figured out before, which is why I asked about do-notation, because it seem to do the fantasy rule.
21:12:30 <ais523> haha
21:12:45 <ais523> it might be quite hard to get control of a blacklisted spam domain to bump the score up higher
21:13:00 <elliott> Deewiant: Hmm, wait, isn't bimap a superset of (&&&)'s type
21:13:02 <ais523> although we managed it with Normish, seems the IP had belonged to a spammer before Normish gained it
21:13:08 <fizzie> I think it just fed the message as-is to SA, so you got to write all kinds of headers into it.
21:13:10 <ais523> and it took a while to get it off the blacklists
21:13:28 <Deewiant> elliott: No, it's a superset of (***) restricted to functions
21:13:36 <Deewiant> (So really, it's disjoint)
21:13:45 <elliott> Oh, hmm, right
21:13:55 <elliott> I'm new to this fancy bifunctor shit :-P
21:14:24 <elliott> Is there really no way to avoid the explicit (,) in that triple-ampersands implementation?
21:14:26 <elliott> It's soooo inelegant. :p
21:14:48 <Deewiant> If you can think of a way of going from a to (a,a) without a (,), sure
21:15:09 <zzo38> Deewiant: It seem to me, the way would be: join (,)
21:15:14 <elliott> Without a (,)
21:15:18 <Deewiant> zzo38: That's not without a (,)
21:15:33 <zzo38> Deewiant: I know. But I don't know why you don't want (,)
21:15:38 <oerjan> zzo38: oh there's something possibly relevant in that wp article: "Under the Curry–Howard correspondence, the above conversion process for the deduction meta-theorem is analogous to the conversion process from lambda calculus terms to terms of combinatory logic, where axiom 1 corresponds to the K combinator, and axiom 2 corresponds to the S combinator. Note that the I combinator corresponds to the theorem schema P→P.
21:15:46 <Deewiant> zzo38: elliott just stated why.
21:16:31 <zzo38> Of course you can write (a,a) but I don't know if that counts.
21:16:39 <oerjan> and the SKI combinators are ap, return, ask in the (x ->) monad
21:17:16 <zzo38> I know return = const so that is K combinator.
21:17:33 <zzo38> I have not heard of "ask"
21:17:40 <elliott> thread :: (a -> b) -> (c -> d) -> (a,c) -> (b,d)
21:17:40 <elliott> combine :: (a -> b) -> (a -> c) -> a -> (b,c)
21:17:41 <monqy> it's from Reader
21:17:44 <elliott> Deewiant: Whaddya think of those names
21:17:49 <elliott> With thread just being defined as bimap ofc
21:17:58 <monqy> there's a MonadReader instance for (a ->)
21:18:13 <Deewiant> They sound as arbitrary as the names of the polarities of bfjoust
21:18:24 <elliott> Deewiant: I put thought into those :(
21:18:40 <Deewiant> "combine" is about as generic a name as possible
21:18:41 <elliott> Deewiant: With the first, you can imagine two completely separate bits of string that you want to meet at the inputs and outputs
21:18:52 <elliott> So you thread them together through two little holes
21:18:58 <elliott> And that threading is the result
21:19:02 <Deewiant> I can imagine that, or I can imagine something completely different
21:19:08 <elliott> Pah
21:19:13 <Deewiant> forkIO could be called thread :-P
21:19:14 <elliott> Gimme nice operator names then :P
21:19:28 -!- MDude has quit (Ping timeout: 252 seconds).
21:19:30 <elliott> "split" would be good for combine
21:19:35 <elliott> but it's taken by Data.List.Split
21:19:42 <Deewiant> ?ty split
21:19:43 <lambdabot> forall g. (RandomGen g) => g -> (g, g)
21:19:47 <Deewiant> ?ty Data.Map.split
21:19:48 <lambdabot> forall k a. (Ord k) => k -> M.Map k a -> (M.Map k a, M.Map k a)
21:19:57 <zzo38> But of course I is id, and K is const.
21:20:04 <elliott> Hmm, pointless-haskell does
21:20:11 <elliott> (/\) :: (a -> b) -> (a -> c) -> a -> (b, c)
21:20:17 <oerjan> :t join (curry id)
21:20:17 <lambdabot> forall b. b -> (b, b)
21:20:18 <elliott> (><) :: (a -> b) -> (c -> d) -> (a, c) -> (b, d)
21:20:26 <Deewiant> ?hoogle (><)
21:20:26 <oerjan> Deewiant: ^
21:20:26 <lambdabot> Data.Sequence (><) :: Seq a -> Seq a -> Seq a
21:20:26 <lambdabot> Data.Graph.Inductive.Query.Monad (><) :: (a -> b) -> (c -> d) -> (a, c) -> (b, d)
21:20:29 <elliott> Ugh
21:20:42 <Deewiant> oerjan: s/Deewiant/elliott/
21:20:48 <oerjan> elliott: ^
21:21:26 <elliott> oerjan: Not the point :-P
21:21:30 -!- MDude has joined.
21:21:42 <fizzie> In[1]:= ?Thread
21:21:42 <fizzie> Thread[f[args]] "threads" f over any lists that appear in args
21:21:46 <Deewiant> That second (><) is the same one though
21:21:46 <fizzie> See, that's what "thread" does.
21:21:48 <elliott> Deewiant: Heh, it then goes on to do (\/) :: (b -> a) -> (c -> a) -> Either b c -> a
21:22:09 <Deewiant> I'd have \/ and /\ the other way around
21:22:10 <oerjan> zzo38: ask is a method of MonadReader, which (x ->) belongs to
21:22:19 <elliott> >_<
21:22:29 <zzo38> oerjan: OK
21:22:34 <elliott> Which logical operator is /\ again
21:22:36 <elliott> I always mix 'em up
21:22:41 <Deewiant> And
21:22:41 <elliott> The one that's and should be the tuple one :P
21:22:45 <elliott> Then it's correct
21:22:48 <elliott> Either ~ or, so \/
21:22:51 <elliott> (,) ~ and, so /\
21:22:52 <Deewiant> heh
21:23:01 <Deewiant> Fair enough I guess
21:23:14 <elliott> ?hoogle (a -> b) -> (c -> d) -> (a,c) -> (b,d)
21:23:14 <lambdabot> Data.Graph.Inductive.Query.Monad (><) :: (a -> b) -> (c -> d) -> (a, c) -> (b, d)
21:23:17 <oerjan> <zzo38> But of course I is id, and K is const <-- i meant that they are monadic functions from the (x ->) monad
21:23:18 <elliott> Hmph
21:23:25 <Deewiant> ?hayoo
21:23:25 <elliott> Nobody has a nicer operator name for it? :-P
21:23:25 <lambdabot> Unknown command, try @list
21:23:36 <Deewiant> ?ty (|||)
21:23:37 <lambdabot> forall (a :: * -> * -> *) b d c. (ArrowChoice a) => a b d -> a c d -> a (Either b c) d
21:23:46 <Deewiant> Hmf
21:23:53 <elliott> OK, so the names are:
21:23:56 <elliott> (><)
21:23:57 <Deewiant> elliott: |,| ? :-P
21:23:57 <elliott> cross
21:23:59 <elliott> (-asterisk-)
21:24:01 <elliott> pairApply
21:24:04 <elliott> (asteriskasteriskasterisk)
21:24:35 <elliott> Deewiant: I'd go for || were it not taken
21:24:42 <zzo38> oerjan: OK.
21:24:49 <elliott> Deewiant: Actually >< is quite brilliant graphically, it shows the two unrelated functions "meeting" in the middle
21:24:52 <Deewiant> I'd go for |,| if you don't want to override |||
21:24:53 <elliott> Input below/above, output above/below
21:25:03 <Deewiant> Right, >< is fine as well
21:25:05 <zzo38> But |,| is not a name in Haskell
21:25:05 <elliott> Hmm, /\ does the same
21:25:10 <Deewiant> It isn't?
21:25:14 <elliott> Two separate functions
21:25:16 <elliott> One from the left
21:25:18 <elliott> One from the right
21:25:20 <elliott> And a single output value at the top
21:25:38 <elliott> Deewiant: What fixity :-P
21:25:44 <elliott> I'm terrible at fixities
21:25:44 <elliott> Always
21:25:50 <Deewiant> Ditto
21:25:53 <elliott> Darn
21:25:56 <elliott> I'll copy Control.Arrow's
21:26:01 <elliott> But first, I'll sleep.
21:26:18 <Deewiant> I guess you want . to bind tighter
21:26:35 <oerjan> Deewiant: commas are punctuation and cannot be used in operators
21:26:41 <Deewiant> Darn
21:26:54 <oerjan> same with semicolons. although not colons...
21:28:29 <oerjan> also not brackets or quotes, except ' is generally messed up
21:30:27 -!- elliott has quit (Ping timeout: 260 seconds).
21:30:58 <fizzie> "Comma is a semi-semicolon", to quote a Perl document.
21:31:08 <fizzie> I don't know why but it sounds funny.
21:31:42 <ais523> it's because they were really stretching for mnemonics at that point
21:31:51 <ais523> and pretty much admitted as much
21:31:57 <oerjan> > let a |!@#$%&/=?+\^~*-:. b = a + b in 2 |!@#$%&/=?+\^~*-:. 2
21:31:58 <lambdabot> 4
21:32:09 <oerjan> oh wait
21:32:18 <oerjan> > let a |!@#$%&/=?+\^~*-:.<> b = a + b in 2 |!@#$%&/=?+\^~*-:.<> 2
21:32:19 <lambdabot> 4
21:33:27 -!- pikhq has joined.
21:33:41 <fizzie> I might think a semi-semicolon would be some sort of a "two commas vertically" instead. Haven't found a real character for that from Unicode yet, though of course you can put a "combining comma above" on a comma, like ,̓ that.
21:34:14 <itidus21> `pastelogs fuckton
21:34:20 <HackEgo> http://codu.org/projects/hackbot/fshg/index.cgi/raw-file/tip/paste/paste.21829
21:35:14 <fizzie> 35 of every 80 fucktons are metric.
21:37:44 <zzo38> The character ' in Haskell is a letter that is neither uppercase nor lowercase. (I think)
21:38:09 <monqy> letter?
21:39:29 <ais523> Content-Type: text/x-ocaml;
21:39:33 <ais523> oh Evolution I love you
21:39:45 <ais523> although I'm not entirely sure how you figured it out
21:39:59 <ais523> perhaps from the extension, although .ml could mean all sorts of ML-family languages
21:41:28 <fizzie> <glob pattern="*.ml"/> and <glob pattern="*.mli"/> are in my /usr/share/mime/text/x-ocaml.ml.
21:41:33 <fizzie> (And no other conditions.)
21:41:49 <Deewiant> Shameful
21:42:04 -!- pikhq_ has joined.
21:42:11 <ais523> fizzie: ditto in mine, that must be it
21:42:14 <ais523> I didn't know that file existed
21:42:33 <ais523> it also has "OCaml source code" translated into a lot of languages
21:42:35 <fizzie> It's the modern way to do /etc/mime.types.
21:43:29 <ais523> so there's a good chance I will get text/x-ocaml attachments after all
21:44:02 <ais523> I suppose I could just run an OCaml parser over every part of the message (after decoding and deHTMLing) to see which parsed correctly
21:44:36 <oerjan> monqy: ' is used for character constants, but also in otherwise alphanumeric identifiers. but because of the former it cannot be used at the beginning of identifiers.
21:44:57 <ais523> use ACME::Don't;
21:45:14 -!- pikhq has quit (Ping timeout: 260 seconds).
21:45:47 <fizzie> I guess it could also be using "file --mime", which has a magic-db contents of http://p.zem.fi/hws1
21:46:01 <oerjan> monqy: "neither uppercase or lowercase" sort of fits to characterize that in haskell, because haskell distinguishes those in meaning at the beginning of identifiers. btw _ is then lowercase.
21:46:01 <fizzie> (Do they all really start with "Caml1999"?)
21:46:30 <fizzie> I suppose that's for the more compiled file types, not the source.
21:46:58 <oerjan> monqy: and : is the only uppercase _operator_ character :P
21:47:32 <ais523> hmm, the author of MIME::Parser is insistent that storing parsed MIME components of email in memory is a security risk in case someone emails you a many-gigabyte attachment
21:47:58 <ais523> I'm getting around it by refusing to parse emails more than a megabyte long, on the basis that that's /quite/ enough for one short OCaml program
21:48:38 <ais523> fizzie: the standard compiled bytecode actually starts with a shebang
21:51:14 <monqy> : being the only uppercase operator character...is that why all the type/data constructor operators start with :
21:51:54 <monqy> At least I think I've only seen them ever start with :
21:52:17 <ais523> bleh, a search for "which punctuation marks are uppercase?" gave me no results
21:52:25 <ais523> (with the quotes; without, it gave only irrelevant results)
21:52:35 <ais523> I was hoping for some crazy answer
21:53:31 <ais523> and "uppercase punctuation" gives me just pages which meant to say "uppercase, punctuation" or "uppercase/punctuation" but screwed up the punctuation mark between them
21:57:59 <zzo38> Is there any standard function for "foldr (.) id"?
22:01:22 <oerjan> monqy: yep, precisely
22:01:38 <oerjan> :t foldr (.) id
22:01:38 <lambdabot> forall b. [b -> b] -> b -> b
22:02:36 <oerjan> @hoogle [b -> b] -> b -> b
22:02:36 <lambdabot> Data.Generics.Schemes everywhere :: (a -> a) -> a -> a
22:02:37 <lambdabot> Data.Generics.Schemes everywhere' :: (a -> a) -> a -> a
22:02:37 <lambdabot> Prelude until :: (a -> Bool) -> (a -> a) -> a -> a
22:02:45 <oerjan> zzo38: i don't know of any
22:02:52 <oerjan> :t foldr ($)
22:02:53 <lambdabot> forall b. b -> [b -> b] -> b
22:03:04 <oerjan> :t flip (foldr ($))
22:03:05 <lambdabot> forall b. [b -> b] -> b -> b
22:03:15 <oerjan> i think that's equivalent
22:03:52 <zzo38> I suppose I can define it in my program then. What should it be called?
22:04:03 <oerjan> @hoogle f (b -> b) -> b -> b
22:04:03 <lambdabot> Data.Generics.Schemes everywhere :: (a -> a) -> a -> a
22:04:03 <lambdabot> Data.Generics.Schemes everywhere' :: (a -> a) -> a -> a
22:04:03 <lambdabot> Prelude until :: (a -> Bool) -> (a -> a) -> a -> a
22:04:20 <monqy> compose? composes? composed?
22:04:58 <oerjan> @hoogle (a -> m) -> t a -> m
22:04:59 <lambdabot> Prelude ($) :: (a -> b) -> a -> b
22:04:59 <lambdabot> Prelude ($!) :: (a -> b) -> a -> b
22:04:59 <lambdabot> Data.Function ($) :: (a -> b) -> a -> b
22:05:25 <oerjan> @hoogle (Monoid m, Foldable f) => (a -> m) -> f a -> m
22:05:25 <lambdabot> Data.Foldable foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
22:05:25 <lambdabot> Data.Traversable foldMapDefault :: (Traversable t, Monoid m) => (a -> m) -> t a -> m
22:05:25 <lambdabot> Data.Foldable all :: Foldable t => (a -> Bool) -> t a -> Bool
22:05:25 <zzo38> Is @hoogle broken?
22:05:35 <oerjan> :t foldMap Endo
22:05:36 <lambdabot> Not in scope: `foldMap'
22:05:48 <oerjan> :t Data.Foldable.foldMap Endo
22:05:49 <lambdabot> forall a (t :: * -> *). (Data.Foldable.Foldable t) => t (a -> a) -> Endo a
22:06:17 <oerjan> hm or is that in the direction
22:06:30 <oerjan> zzo38: how so?
22:06:41 <zzo38> It makes responses which don't match
22:07:05 <oerjan> zzo38: yes it tries to guess if you meant something different if there's no exact match
22:07:20 <fizzie> 12.8 htkallas 9/18 01:07 0+00:00:00 [????????????????]
22:07:26 <fizzie> That does not look good.
22:07:40 <fizzie> It's supposed to say where my job is running.
22:09:50 <oerjan> @hoogle (Arrow a) => [a b b] -> a b b
22:09:50 <lambdabot> Data.Map unions :: Ord k => [Map k a] -> Map k a
22:09:51 <lambdabot> Data.Graph.Inductive.Internal.Heap mergeAll :: Ord a => [Heap a b] -> Heap a b
22:09:51 <lambdabot> Data.Graph.Inductive.Basic grev :: DynGraph gr => gr a b -> gr a b
22:10:12 <fizzie> XMonad calls it (well, something a bit like it; in fact it composes ManageHooks) "composeAll".
22:11:07 <oerjan> zzo38: what worries me more is that it required me to add the Monoid and Foldable class before it gave anything useful, that's stupid.
22:11:08 <fizzie> But that's possibly because it also has a composeOne, which runs only the first on the list that actually does something.
22:11:17 -!- sebbu has quit (Ping timeout: 260 seconds).
22:12:00 <oerjan> it seems obvious to me that adding those should be a smaller change than modifying the actual type part to something incompatible...
22:12:18 -!- sebbu has joined.
22:13:31 <oerjan> @hoogle (Category a) => [a b b] -> a b b
22:13:31 <lambdabot> Data.Map unions :: Ord k => [Map k a] -> Map k a
22:13:31 <lambdabot> Data.Graph.Inductive.Internal.Heap mergeAll :: Ord a => [Heap a b] -> Heap a b
22:13:31 <lambdabot> Control.Category (.) :: Category cat => cat b c -> cat a b -> cat a c
22:14:40 <oerjan> :t foldr`flip`id
22:14:41 <lambdabot> forall a a1. (a -> (a1 -> a1) -> a1 -> a1) -> [a] -> a1 -> a1
22:14:49 <oerjan> oops
22:15:14 <oerjan> oh right
22:22:23 -!- ive has quit (Ping timeout: 252 seconds).
22:59:14 <CakeProphet> data Many a = One a | Many (Many a)
22:59:18 <CakeProphet> I wonder what you could use this for.
22:59:47 <CakeProphet> it seems to just associate an integer count to a value.
23:01:08 <CakeProphet> count (One a) = 1; count (Many a) = 1 + count a
23:01:14 <oerjan> like Nat with an extra parameter
23:01:46 <CakeProphet> you could also generalize (1+) to f
23:01:51 <CakeProphet> er, well no
23:01:54 <oerjan> also it's isomorphic to that delayed monad thing
23:01:58 <CakeProphet> but you can apply f a number of times.
23:02:15 <CakeProphet> runMany (Many a) = f(runMany a)
23:02:15 <zzo38> What delayed monad thing?
23:02:19 <oerjan> data Delayed a = Now a | Later (Delayed a)
23:02:31 <oerjan> (not sure i have the name right)
23:02:34 <zzo38> If you want to apply a number of things, you can also use church numerals
23:02:47 -!- copumpkin has quit (Quit: Computer has gone to sleep.).
23:03:36 <CakeProphet> data Lol a b = Nothing | Left a | Right b | Both a b | Many (Lol a b)
23:03:37 <CakeProphet> bahahaha
23:03:51 <monqy> is this abomination your doing
23:03:56 <CakeProphet> yes
23:04:22 -!- DH____ has quit (Ping timeout: 260 seconds).
23:04:30 <zzo38> I made genCurry i = do { n <- mapM id $ replicate i (newName "x"); f <- newName "x"; lamE (varP f : map varP n) (appE (varE f) . tupE $ map varE n); };
23:05:38 <CakeProphet> type Lol a b = Many ( Maybe (Either (Either a b) (a,b)))
23:06:00 <monqy> zzo38: mapM id? isn't that the same as sequence?
23:06:17 <zzo38> monqy: O, maybe it is.
23:06:54 <zzo38> Yes that works
23:07:40 <oerjan> zzo38: in fact i think mapM id $ replicate i = replicateM i
23:08:05 <CakeProphet> yep
23:08:09 <zzo38> So, in other words, curry = $(genCurry 2)
23:08:41 <CakeProphet> good ol' replicateM
23:09:05 <zzo38> OK, I fixed it to use replicateM and it works.
23:10:12 <oerjan> s/[$]/./ technically
23:10:21 <monqy> I was about to comment on that
23:10:55 <zzo38> oerjan: Yes
23:11:59 <zzo38> Now I can understand how the "newName" command works. The documentation doesn't say what it is but I figure it out.
23:12:12 <zzo38> The document just says the type.
23:12:49 <oerjan> i guess it's for inventing a fresh variable name
23:13:12 <oerjan> almost like lisp gensym
23:13:12 <zzo38> Yes, that is what it does. But you still need to indicate its name anyways!
23:13:39 <zzo38> Why does it require you to indicate the name anyways, even though it is always a new name?
23:14:02 <oerjan> zzo38: i assume it uses the x as a prefix
23:14:04 -!- CakeProphet has quit (Ping timeout: 260 seconds).
23:14:17 <oerjan> zzo38: it might help if you want to read core output, perhaps
23:14:30 <zzo38> Yes it does use it as a prefix
23:15:29 <oerjan> or generated output, there's probably an option for printing it just after the TH step
23:16:18 <zzo38> Generated output printing after TH step by -ddump-splices shows the name you specify as prefix, and the other stuff in []
23:16:34 <oerjan> ok
23:17:08 <zzo38> But I suppose one other thing, is to tell whether you want uppercase or lowercase, but it should be able to figure that out by itself.
23:18:15 <oerjan> might be tricky in some cases
23:18:21 <zzo38> But perhaps they don't want one name used in both ways, but it can anyways because it is for type levels and value levels
23:19:20 <oerjan> zzo38: but constructors appear both places.
23:20:20 <zzo38> If you do something like f = X :: X; then both X are different
23:21:07 <oerjan> yes but what about x = X :: X x
23:21:51 <zzo38> Then I also think both x are different, too, isn't it?
23:22:11 <oerjan> zzo38: i thought you were talking about distinguishing upper and lower case
23:23:22 <zzo38> Yes.....
23:23:55 <zzo38> But those don't seem to be problem there, if you can use a name in multiple places
23:23:57 -!- ive has joined.
23:24:06 <oerjan> all of those might be produced from newName "x" if it were to change the case everywhere
23:24:47 <oerjan> anyway it probably _could_ decide, since the actual definition site inserted would probably tell what it was
23:25:04 <zzo38> oerjan: Say, you have a different function newName' which takes no argument.
23:25:05 <oerjan> but it might require some awkward tying of the knots
23:25:30 <zzo38> But it could not use newName' for either of the X here.
23:25:49 <zzo38> I don't think it could use newName either.
23:26:20 <oerjan> oh so newName isn't general for all names?
23:26:26 <oerjan> @hoogle newName
23:26:26 <lambdabot> Language.Haskell.TH newName :: String -> Q Name
23:26:26 <lambdabot> Language.Haskell.TH.Syntax newName :: String -> Q Name
23:26:27 <lambdabot> Language.Haskell.TH.Syntax qNewName :: Quasi m => String -> m Name
23:26:59 <zzo38> oerjan: newName can do uppercase or lowercase names, but in the example "x = X :: X x" it couldn't do because X would need to be defined already for that to be accepted
23:27:29 -!- sllide has quit (Ping timeout: 258 seconds).
23:28:46 <oerjan> zzo38: right, so newName requires that you're generating a splice which includes the definition.
23:28:51 <zzo38> Actually I suppose there is still some difficulty, that you have [d| data X = $x; y = $x; |] the answer is still obvious but the program to determine it might not be entirely simple.
23:29:03 <monqy> the best part of TH is using mkName to make impossible names, like ones with alphanumeric and operator charaters mixed together
23:29:04 <zzo38> oerjan: Yes, because it is the Q monad.
23:29:42 <zzo38> But I suppose you can have newVar = newName "name___"; newCon = newName "Name___";
23:29:58 <oerjan> monqy: those actually _work_?
23:30:04 <monqy> oerjan: I've done it!
23:31:03 <oerjan> monqy: in that case, does it work to use the name in a spot with the "wrong" case for it?
23:31:18 <ais523> monqy: /why/ did you do it?
23:31:21 <monqy> I've never tried, but I'm guessing yes it will work
23:31:35 <monqy> ais523: bad reasons, naturally
23:31:51 <oerjan> zzo38: ok if what monqy says is true then it's likely TH doesn't actually _care_ about the case used
23:32:05 <zzo38> Actually it works as long as the *first* character is of the correct case.
23:32:12 <ais523> hmm, idea my supervisor had for sandboxing OCaml (whilst preventing uses we don't want of the standard library): reject all mentions of modules other than Pervasives, combined with rejecting the stuff in Pervasives we don't want them to use
23:32:15 <zzo38> Everything else can be any symbols it doesn't matter.
23:32:17 <monqy> ais523: I was too lazy to parse haskell but I wanted to do some syntactic modifications where I could mark a haskell expression, pull it out, put it somewhere else, and leave a stump in its place
23:32:25 <ais523> so I've hooked the parser to recognise only Pervasives as a legitimate module name
23:32:31 -!- CakeProphet has joined.
23:32:31 -!- CakeProphet has quit (Changing host).
23:32:31 -!- CakeProphet has joined.
23:32:31 <oerjan> zzo38: oh so that is required.
23:32:32 <ais523> is this going to be a crazily flawed solution?
23:32:40 <monqy> ais523: yes
23:32:58 <monqy> I used the syntactically invalid identifier to mark the expressions I wanted to pull out
23:33:00 <ais523> (that is, in any context where a module name is expected, if it isn't "Pervasives" error out)
23:33:02 <zzo38> Now instead of f <- newName "x"; I can write f <- newVar;
23:33:06 <ais523> monqy: can you see any flaws with it?
23:33:11 <monqy> it was ugly
23:33:22 <monqy> oh you were not talking about what I was doing there
23:33:22 <monqy> oops
23:33:25 <ais523> oh, I see
23:33:31 <monqy> I was talking about my thing being falwed
23:33:35 <ais523> crossed conversations
23:34:27 <monqy> but it does have a sort of ugliness similar to what i was doing
23:34:42 -!- kmc has quit (Ping timeout: 260 seconds).
23:34:51 <monqy> hm
23:34:58 <oerjan> never cross the conversations!
23:36:25 <monqy> dunno if this quite applies to ocaml at all, but perhaps make a wrapper module, always included, which exports only the stuff you want from Pervasives, and make all module imports syntactically invalid?
23:36:30 <Vorpal> oerjan, augh
23:36:44 <monqy> or would that be going against a goal or two
23:37:24 -!- CakeProphet has quit (Ping timeout: 260 seconds).
23:38:45 <ais523> yep, the idea is to verify that input programs use a particular subset of OCaml
23:39:00 <ais523> I haven't yet got around to the idea of conditionally banning if, mostly because it's so easy to work around
23:39:20 <ais523> there are any number of ways to express an if in OCaml, just as in most languages
23:39:49 <monqy> the ugliest part is rejecting the stuff in Pervasives you don't want them to use
23:39:50 <Gregor> Heh, one of the places where I buy cheap Chinese junk just sent me an email saying that they now have a US warehouse for their most popular wares, and so can offer 3nd day delivery. Whatever "3nd day delivery" is :P
23:40:12 <monqy> I can't think of any clean way to do it without making a new module :(
23:40:19 <monqy> and making a new module is also ugly :(
23:41:20 <ais523> I could reject module imports and qualifies altogether, because Pervasives is loaded by default
23:41:30 <ais523> but yes, I agree, the issue's rejecting things like file opens
23:42:00 <ais523> Gregor: I can pronounce it as a word somewhere between "third" and "second", and yet even though it's obvious how to pronounce it, I still don't know what it means
23:42:01 -!- Patashu has joined.
23:43:46 <zzo38> One idea is, to have a macro system in Haskell with its own syntax and its own types. Such as, MetaExp, MetaPat, MetaName, MetaLcName, MetaUcName, MetaNewLcName, MetaNewUcName, MetaLocalLcName, MetaLocalUcName, MetaInt, MetaOrder, MetaLayout, etc.
23:44:00 <zzo38> And each keyword is its own type.
23:44:03 -!- CakeProphet has joined.
23:44:03 -!- CakeProphet has quit (Changing host).
23:44:03 -!- CakeProphet has joined.
23:49:06 <oerjan> zzo38: i somehow had the idea that was what template haskell is...
23:49:21 <oerjan> approximately, anyhow
23:50:27 -!- kmc has joined.
23:51:50 <zzo38> oerjan: No, it isn't. What I mean is something, you can define macro called "j" of type (MetaNewUcName -> Q [Dec]) to make a declaration "j K" permitted and it means K is a new name to this module instead of imported or something like that. And same with the other things; including make up new syntax and affecting what is already there, such as making up do-notation instead require it already have do-notation.
23:52:57 <zzo38> Or possibly different monad not Q, it would be different to do the different thing, but in addition to the Q stuff of Template Haskell too.
23:54:53 <oerjan> i see. i think that would require intertwining TH with parsing?
23:55:25 <zzo38> Yes, unless you did it different so that it is a separate step from TH.
←2011-09-16 2011-09-17 2011-09-18→ ↑2011 ↑all