00:04:55 -!- pikhq has quit (Ping timeout: 244 seconds). 00:04:56 -!- pikhq_ has joined. 00:16:30 -!- pumpkin has joined. 00:19:24 -!- sebbu2 has quit (Quit: updating xchat-wdk). 00:19:56 -!- copumpkin has quit (Ping timeout: 248 seconds). 00:30:30 -!- lambdabot has joined. 00:41:54 The things about Dungeons&Dragons game, is that unlike chess and poker and so on, it is possible to solve situations that are impossible to solve. 00:54:00 -!- pikhq_ has quit (Ping timeout: 244 seconds). 00:59:22 -!- pikhq has joined. 01:02:44 http://hackage.haskell.org/package/barrier-monad 01:08:00 -!- DCliche has joined. 01:11:17 -!- Klisz has quit (Ping timeout: 252 seconds). 01:15:00 -!- pumpkin has changed nick to copumpkin. 01:24:03 -!- BeholdMyGlory has joined. 01:24:05 -!- BeholdMyGlory has left. 01:26:37 -!- sebbu has joined. 01:26:47 -!- kmc has quit (Quit: Leaving). 02:08:49 -!- Jafet has joined. 02:14:52 -!- pikhq_ has joined. 02:15:02 -!- pikhq has quit (Ping timeout: 244 seconds). 02:15:05 -!- copumpkin has quit (Ping timeout: 240 seconds). 02:23:13 -!- Darth_Cliche has joined. 02:25:07 -!- zzo38 has quit (Remote host closed the connection). 02:26:55 -!- DCliche has quit (Ping timeout: 244 seconds). 02:27:10 -!- itidus21 has changed nick to alloca_i32. 02:31:37 -!- alloca_i32 has changed nick to itidus21. 02:36:48 -!- copumpkin has joined. 03:07:18 `log situation 03:07:23 2010-11-15.txt:18:29:06: (I'm aware of the US phone situation) 03:42:16 -!- zzo38 has joined. 04:10:32 I invented the D&D feat "Favored Mercy"; you have to select a creature type same as the ranger's favored enemy list and then there are various bonuses and restrictions that apply. 04:13:39 "Science Made Stupid: How to Discomprehend the World Around Us" by Tom Weller 04:14:26 "Cvltvre Made Stvpid: A Misguided Tour of Illiterature, Fine & Dandy Arts, & the Subhumanities" by Tom Weller 04:18:15 -!- azaq23 has joined. 04:37:47 good morning 04:38:05 does anyone no of a google API where I can grab timezone info? 04:38:13 equivalent to the "time in " searched 04:38:16 *searches 04:40:07 -!- MDude has changed nick to MSleep. 04:59:56 kallisti, update 05:00:07 Sgeo: oZOMG 05:00:27 kallisti: tzinfo? 05:01:57 pikhq_: can I ask tzinfo "time in anywhere, USA" and it will tell me the time? 05:03:04 Erm, zoneinfo 05:03:05 Bleh. 05:03:14 oh, possibly. 05:03:32 I don't think it would work with small town names though 05:03:42 I'll just... do google searches and regex the time. :P 05:03:53 You'd probably need a map for *that*. 05:04:08 (it's an IRC bot so dependence on a network connection isn't a problem) 05:04:27 Also, that's bound to screw up: town name is ambiguous. :) 05:04:45 that's fine. 05:04:56 Well, with state I *think* it might not be? 05:05:05 a reasonable person would provide a town, state combo 05:05:23 or a town, whateverelseyourcountrycallsthisshit, country 05:07:05 wow... boiling peanuts is rather time consuming. 05:07:11 suppose to boil them for like 24 hours. 05:09:12 hmmm, well, Google doesn't really make this easy. 05:09:24 maybe there XML api is better for this. 05:15:34 Do you know the sidereal time? 05:17:29 zzo38: yes it's 04:18 LST here 05:17:36 :D 05:52:50 is that a welsh town? 05:53:10 ? 05:53:19 whateverelseyourcountrycallsthisshit 05:54:09 no town is a whateverelseyourcountrycallsthisshit town. 05:54:15 obviously. 05:55:09 * kallisti has been boiling peanuts for over an hour now. 05:55:26 but then there is a town named Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch 05:56:13 oh look that's an actual thing. 05:56:49 Toponymy is the scientific study of place names (toponyms), their origins, meanings, use and typology. A toponymist is one who studies toponymy. 05:57:57 itidus21: The apple is the pomaceous fruit of the apple tree, species Malus domestica in the rose family (Rosaceae). It is one of the most widely cultivated tree fruits, and the most widely known of the many members of genus Malus that are used by humans. Apple grow on small, deciduous trees that blossom in the spring and produce fruit in the fall. 05:58:02 .. 05:59:19 hmmm, these peanuts are still kind of crunchy. 05:59:26 maybe another hour? :P 06:02:33 A seminal experiment by Karen Wynn in 1992 involving Mickey Mouse dolls manipulated behind a screen demonstrated that five-month-old infants expect 1 + 1 to be 2, and they are comparatively surprised when a physical situation seems to imply that 1 + 1 is either 1 or 3. 06:02:45 ... 06:03:06 `word 50 06:03:10 serate erilinst squcefingrata nridi sche dk feculaza le pres elatardia kan za ar sau rempanissidaroparinsilh tovigisallassa toncippilluce riedaiilloccau tfinan rous affiens feaatherroellyte rumqh sed em jelendcclocwted nut va acistophoroculvaliamangtola disses climan coo ebyted wity baniff hinosele proley widuchissirs forraseek oliterskiitcligitussies kr rapeosendon co pos lornfiernsident unalragewelsiegaus ze beffuringlatismen natschic bareng 06:03:22 after being taught the meanings of the Arabic numerals 0 through 4, one chimpanzee was able to compute the sum of two numerals without further training 06:03:32 feaatherroellyte 06:07:48 kallisti: O, you do know the sidereal time. Do you know the moon declination? 06:09:51 -!- monqy has quit (Read error: Operation timed out). 06:11:44 zzo38: nope 06:12:04 zzo38: I actually just googled for the former. :P 06:12:09 but I now know what it means. 06:12:17 Moon declination is -8 degrees 18 minutes 06:12:25 Sideral time is the right ascension of the zenith. 06:12:41 -!- monqy has joined. 06:12:50 2h33m here 06:13:07 -!- azaq23 has quit (Quit: Leaving.). 06:14:31 for a second that looked like leetspeak.. 06:14:41 some weird way to say "same here" 06:15:00 Actually I meant 2 hour 33 minutes 06:15:06 yes I know. 06:17:28 awwww yeah boiled peanut time. 06:17:31 if you have never had boiled peanuts 06:17:35 I highly recommend that you do. 06:18:21 Do you know what right ascension and declination are? These are equatorial coordinates; do you know ecliptic coordinates? 06:22:44 I'm vaguely familiar with what an ecliptic is. 06:22:55 I can imagine that ecliptic coordinates are based on the ecliptic plane. 06:23:08 Yes, that is what it is. 06:24:32 and I'm guessing equatorial coordinates are based on the equator? 06:24:38 Yes. 06:25:29 Hour angle can be used instead of right ascension. And you can use local hour angle or Greenwich hour angle. 06:26:00 but it's more or less expressing the same thing as right ascension, yes? 06:26:14 Yes, the difference is where the zero will be. 06:26:18 right 06:26:42 is hour angle in different units compared to right ascension? 06:27:12 Usually they are both given in units of hours, although you can use degrees instead. 06:28:38 ah so greenwich hour angle and right ascension are equivalently based on the prime meridian. 06:29:11 Right ascension has zero at the vernal equinox. Greenwich hour angle has zero at Greenwich. 06:29:26 Local hour angle is based on your location. 06:30:18 ah okay 06:30:51 could be useful to know local hour angle if you're looking for celestial bodies in the sky. 06:31:00 is there any notion of local declination? 06:31:33 kallisti: Not as far as I know, but I was thinking about the same thing earlier today; you could have local declination too. 06:31:54 it would just be less convenient without GPS monitoring of some kind 06:32:07 with local hour angle you could go by your time zone instead of the precise longitude. 06:34:23 these poorly made boiled peanuts make me want some actual boiled peanuts. 06:34:38 You could, but timezones are only approximate. Using your precise longitude is better (you could find it in a city list if you have no GPS, and enter it into the computer, together with your latitude as well) 06:35:02 Of course city lists are more accurate than using timezones but still not perfectly accurate because the city is larger than one point. 06:35:24 I basically took some ripe shelled frozen peanuts and boiled them. you're supposed to take unripe peanuts with shells and boil them forever in salt water like peas. 06:35:43 zzo38, is your barrier monad code up yet >.> 06:35:51 Sgeo: Yes. 06:35:58 The package is called "barrier-monad" 06:36:21 ty 06:36:27 I have no peanuts 06:36:48 I don't even know if they sell raw unripe peanuts. 06:37:17 Can you grow peanuts in your garden? 06:37:19 typically you buy boiled peanuts from stands. it's a popular thing in the deep south where peanuts are grown (especially Georgia and South Carolina) 06:37:23 -!- oerjan has joined. 06:37:28 zzo38: doubt it. 06:37:34 well, depending on where you live 06:38:36 typically you buy boiled peanuts from stands. it's a popular thing in the deep south where peanuts are grown (especially Georgia and South Carolina)Peanuts grow best in light, sandy loam soil. They require five months of warm weather, and an annual rainfall of 500 to 1,000 mm (20 to 39 in) or the equivalent in irrigation water. 06:38:55 Peanuts grow best in light, sandy loam soil. They require five months of warm weather, and an annual rainfall of 500 to 1,000 mm (20 to 39 in) or the equivalent in irrigation water. 06:38:59 :P 06:39:21 zzo38: good luck :P 06:41:57 * oerjan recalls his mom grew tomatoes and cucumbers indoors, they needed buckets of water every day 06:42:35 that's because you live in a barren icy tundra. 06:42:36 right? 06:42:37 well i'm sure there were tomatoes, i think there were cucumbers. 06:42:43 kallisti: close enough. 06:43:24 I'm pretty sure tomatos more or less grow themselves here. 06:43:32 i should point out this was still done in the summer, so they did get sunlight through the big glass door. 06:43:38 my parents have a tomato garden and I don't think I've seen them upkeep it very much. 06:44:43 also corn. wow, imagine that! plants that originate from the Americas grow well in the Americas! 06:44:52 well afair it was mostly the water. 06:45:31 the americas _are_ big you know, and especially in the north-south direction which temperatures vary along :P 06:46:09 and i vaguely think i read corn originated in the tropics. 06:46:22 incas or mayas or thereby 06:47:05 yes, but now we have like miles and miles of yellow corn being mass produced in the midwest 06:47:07 but i guess georgia is nearly tropical, isn't that were you were from 06:47:13 yes. it's "sub-tropical" 06:47:48 oerjan: Not to mention we've got a lot of climactic changes from geography. 06:47:54 which means it's really hot in the summer, noticeably cold in the winter, and always humid. 06:47:55 i also guess they've probably bred varieties that need less heat 06:48:08 kallisti: heh 06:48:49 current humidity: 100% (it just rained a few hours ago :P) 06:48:51 oerjan: Such breeding was lost to the mists of time; domesticated corn had already pretty well spread through the Americas. 06:49:07 most of my time the one time i was staying in the US was in Seattle, which probably does not fit that description. Boston did when i was there, though. 06:49:18 the midwest is insane. 06:49:25 literally miles and miles of corn and soybeans. 06:49:29 Yeah. 06:50:03 You've got grazing melding into corn fields... Over the course of several hundred miles. 06:50:20 pikhq_: yeah i just recently read that the original english settlers learned to grow corn 06:50:43 Yup. 06:51:01 Mostly I know all this stuff about right ascension and ecliptic plane and that stuff due to looking at oerjan's "Agora Nomic's Horoscope" and I didn't know what "Node" is or what all these lines and numbers means, or what "Placidus houses" is; and then I downloaded Astrolog (and Daedalus, the author's other program) and it had a bunch of other features that I didn't understand, 06:51:10 oerjan: we learn about that shit in middle school history. :P 06:51:45 kallisti: i figure it is part of the thanksgiving lore 06:51:55 oerjan: but we don't learn any important history in middle school. 06:51:59 oerjan: yes, it is. 06:52:27 and I wondered why the sunrise/sunset times in this program are a bit off (I think it is because of refraction), and I figured out how to use it to calculate the date of Chinese New Year, and so on. 06:52:52 as far as I can tell Thanksgiving is basically "let's eat a bunch of stuff that's native to North America" 06:52:59 zzo38: well you definitely should know more than me already after all your experiments 06:53:16 zzo38, I wrote this code to try to show off your Barrier monad, sorry if it's horrible and ugly and evil 06:53:16 http://hpaste.org/54738 06:54:24 zzo38: i think i saw someone mention a monad essentially identical to the Barrier monad under a different name on some haskell forum recently. i've forgotten what the name was, though. 06:54:38 so it's not completely unknown 06:55:22 Sgeo: At least it works; I don't know if it is horrible and ugly and evil but it is a simple demonstration (simpler than many things you could do with this library) 06:56:11 zzo38: Sgeo: oh yes that is very analagous to Python coroutines. 06:56:16 I'm assuming more could be done though 06:56:24 i come to think of it, shouldn't there be a way to split the Barrier monad into two transformers, one for each part? 06:56:40 kallisti, can you put yield into a function in Python and call that function and have it work sensibly? 06:56:50 Sgeo: yes. 06:56:56 fsvo sensibly 06:56:57 oerjan: Yes, I thought of that someone else might have done similar things, anyways that happens a lot in mathematics (and programming in Haskell involves much about mathematics) 06:57:22 yeah 06:59:12 Sgeo: http://pastebin.com/j732vmzF 06:59:37 it's also possible to throw exceptions into a coroutine from other code. 06:59:43 g = generate(10) 06:59:50 g.throw(SomeException) 06:59:58 Not quite what I meant 07:00:07 oerjan: And yes I suppose I also know more about the Astrolog and what all that stuff means since I have used most of its features (except the biorhythms and the interpretation mode used for Agora; I don't care for those), and so on... I configured the file to use different defaults, such as degrees instead of zodiac signs, Campanus instead of Placidus, and so on 07:00:09 what did you mean then? 07:00:13 As in, can you encapsulate complex yield code and use that in place of the yield keyword? 07:00:21 To make a generator 07:00:59 well, calling the function produces the generator, with some plumbing it's possible but it's not implicit. 07:01:00 -!- Darth_Cliche has quit (Quit: You are now graced with my absence.). 07:01:32 I do know how generator functions work in JavaScript. Any function containing "yield" is a generator function, and it returns a Generator object when called (not doing anything yet). When you call the next or send methods of the generator function, it runs until yield, at which point the next or send method returns the value being yield and send(x) will cause the yield to x 07:01:39 for my MUD I was actually working on a menu system that maintained a stack of coroutines. when the top coroutine is exhausted it would pop off and go back to the previous one. 07:01:47 sheesh my nose tip got all scaly from blowing my nose 07:02:00 despite putting on lots of lotion 07:02:01 zzo38: yes that's how it works in Python 07:02:08 with the addition of a throw method that allows you to signal exceptions. 07:02:10 You could make it yourself without using yield; that is possible too (you simply need to return an object with the correct methods) 07:02:21 kallisti: JavaScript generator functions have that too. 07:03:14 Sgeo: i assume to work properly inside functions, yield needs to encapsulate a continuation 07:03:37 also menu coroutines could do things like manipulate the menu stack or defer to previous menu (without actually being consumed) 07:04:01 but essentially if the courtine yielded a new generate then the system pushed the new generator onto the stack, so it was fairly natural to write nested menu code. 07:04:02 but maybe not a completely arbitrary one 07:04:15 *generator 07:05:12 it was pretty neat, but I never actually finished the MUD codebase 07:05:18 mainly because I was doing pointless stuff like that. 07:06:18 in any case, it would be possible to abstract that sort of nested coroutine system into one coroutine. 07:06:55 the controller coroutine is the outside interface, and delegates input/output to the coroutines in the stack that it maintains. 07:08:32 can barrier monads do anything like that? 07:08:39 05:17:29: zzo38: yes it's 04:18 LST here 07:08:43 I mean, in there current state. 07:08:47 I don't doubt the possibility 07:09:19 apparently tunes also uses sidereal time. 07:09:22 I think the Haskell code using the library that I wrote, which is like the Python code example posted, would be like this: generate i = yield i >>= generate . maybe (succ i) id; 07:09:46 oerjan: Are you sure? 07:10:08 zzo38: it was a joke by the fact it was at almost the same minute, and tunes _does_ have a broken clock 07:10:26 oh wait 07:10:32 scratch that 07:10:38 kallisti: You probably can do something like that in Haskell somehow, using barrier monads, possibly using the BarrierT (the monad transformer for barrier monad) 07:10:53 zzo38: how does generate work? 07:10:54 i was pasting codu :P 07:11:23 kallisti: It is like the Python example code you posted: http://pastebin.com/j732vmzF 07:11:32 right but how does it actually work. :P 07:11:47 Is crosstalk actually useful? >.> 07:11:58 zzo38: oh 07:12:00 I'm blind 07:12:02 zzo38: :P 07:12:04 disregard 07:12:06 Sgeo: I don't know but I think you suggested that to me isn' it? 07:12:13 zzo38: "help what is recursion" 07:12:23 zzo38, I'm just wondering if what I suggested might be completely useless 07:13:01 Sgeo: Well, I don't know; maybe someone will find a use for it, either for computer programming or for mathematical use. 07:13:14 zzo38: I'm thinking an explicit stack is unecessary 07:13:26 but... maybe it is? 07:13:34 05:56:49: Toponymy is the scientific study of place names (toponyms), their origins, meanings, use and typology. A toponymist is one who studies toponymy. 07:13:37 05:57:57: itidus21: The apple is the pomaceous fruit of the apple tree, species Malus domestica in the rose family (Rosaceae). It is one of the most widely cultivated tree fruits, and the most widely known of the many members of genus Malus that are used by humans. Apple grow on small, deciduous trees that blossom in the spring and produce fruit in the fall. 07:14:06 zzo38: maybe it just be handled with simple recursion? 07:14:07 incidentally, the city name Almaty originally means "father of the apple" 07:14:10 iirc 07:14:31 kallisti: Probably it can be done without an explicit stack; recursion probably works OK 07:14:48 zzo38: maybe with >> even 07:15:58 oh wait it's apparently the older Alma-Ata form which means that 07:16:37 http://en.wikipedia.org/wiki/Almaty#Toponymy 07:17:04 f x = yieldSomeStuff >> (if someCondition then (>> f x) else id) barrier2 07:17:07 kallisti: Yes, you can use >> if you don't need the back values. Or whatever other values there are when using BarrierT with other monads too 07:18:33 (Almaty is still related to apples.) 07:18:36 Yes I suppose that is another way, too. 07:18:57 (>> f x)? 07:19:10 Hmm 07:19:11 Sgeo: yes, I'm so cool. 07:19:17 CONDITIONAL FUNCTIONS DUDE 07:19:19 way of the future. 07:19:22 hmmm, these peanuts are still kind of crunchy. <-- WHY WOULD SOMEONE WANT NON-CRUNCHY PEANUTS, IT MAKES NO SENSE 07:19:34 oerjan: because they're boiled and thus soft and salty and delicious. 07:19:48 mmmm boiled pnuts 07:19:54 BUT BUT THEY'RE NOT _CRUNCHY_ SO IT'S ALL MEANINGLESS 07:20:04 quintopia: I misread that in the obvious fashion. 07:20:04 dude boiled > roasted 07:20:07 crazy murricans 07:20:08 any day. 07:20:21 roasted is all dry and gross 07:20:25 oerjan: you are wrong 07:20:28 go eat some actual nut 07:20:37 like cashew (hahaha get it because it's not an actual nut?) 07:20:43 eek i have unleashed the american hordes 07:20:57 no just the georgia hordes 07:21:00 oerjan: boiled peanuts aren't even really a completely American thing. 07:21:01 ah 07:21:18 I could probably tell a New Yorker to eat some boiled peanuts and they'd be like "wat" 07:21:26 but yeah dont knock it til youve tried it man 07:21:53 oerjan: it's just common in places where peanuts are grown. mainly in the south. 07:21:59 georgi is the peanut state. we get to decide what peanuts are best 07:22:20 we actually don't grow the kind of peanuts that are supposedly best for boiling 07:22:30 Valencia is supposed to be better than Runners. we grow Runners. 07:23:11 oerjan: eating boiled peanuts is kind of like... eating some kind of shellfish 07:23:20 but with peanut instead of fish meats. 07:23:21 i dont actually know anything about peanuts 07:23:22 so 07:23:25 you lost me there 07:23:31 oerjan: Roasted is by far the more common thing in America. 07:23:33 oh well it's probably all that crazy mad scientist GWC's fault 07:23:41 yeah man 07:23:45 gwc is the shit 07:24:06 mad peanut scientists... 07:24:12 Peanut butter, fuck yeah. 07:24:18 he'd have invented more but he disappeared in his peanut oil powered time machine 07:24:30 oerjan: peanut oil is awesome btw 07:24:33 but the best mad food scientist is clearly robert c baker 07:25:32 kallisti: lets ship oerjan some boiled peanuts in a can. i know its not as good as fresh, but maybe it would be enough to sway him? 07:25:41 quintopia: it's a shame that oerjan probably doesn't know the joy of deep-fried chicken in peanut oil. 07:25:44 quintopia: sounds like a fowl guy 07:25:45 quintopia: per. haps 07:26:13 ill buy the can if youll cover shipping 07:26:20 asshole 07:26:36 Incidentally, oerjan, "deep-fried *" is as American as you can get. 07:27:33 pikhq_: also scottish, i hear 07:27:44 they borrowed it from us. :P 07:27:44 Yeah. 07:28:07 quintopia: you've had chik-fil-a yes? 07:28:58 apparently they're like... common in many US states now. 07:29:34 Some people have issues with funding anti-gay organisations, though. 07:29:57 pikhq_: I knew they were Christian based but not anti-gay 07:30:00 sometimes you have to think how many things we take for granted were actually invented by someone 07:30:12 (nearly all of them) 07:30:16 oerjan: woah dude 07:30:20 I had never thought of it that way. 07:30:28 * kallisti mind blown. 07:30:51 kallisti: They're *American* Christian based. The only Christians in America that are in any way loud about it hate gay people so much. (and, of course, make regular trips to the nearest gloryhole) 07:31:29 looooooool 07:31:40 * kallisti consults the yellow pages for the nearest gloryhole. 07:32:01 * kallisti googled for: gloryholes near Jasper, GA 07:32:01 sic transit gloria mundi 07:33:04 hmmm "glory hole rock shop" in Jasper, GA 07:33:07 not quite what I wanted. 07:33:16 also what is a "rock shop" 07:33:37 kallisti: yes i have had chik-fil-a 07:33:42 i dont anymore tho 07:34:02 because of what pikhq said 07:37:17 also i hate their marketing dept forever 07:37:41 heh 07:37:52 bbef iz sketchy eh? 07:38:22 fuck no. mechanically separated chicken is 07:47:26 "Sketchy" understates. 07:50:52 kallisti, UPDOOT 08:00:25 anyone else like starcraft2? 08:02:43 -!- zzo38 has quit (Remote host closed the connection). 08:31:05 -!- GreaseMonkey has quit (Quit: The Other Game). 08:34:10 kallisti: just post the question to reddit.com/r/doesanybodyelse >:) 08:54:48 @hoogle forkIO 08:54:49 Control.Concurrent forkIO :: IO () -> IO ThreadId 08:54:49 GHC.Conc.Sync forkIO :: IO () -> IO ThreadId 08:54:49 GHC.Conc forkIO :: IO () -> IO ThreadId 08:58:04 > forever . putStrLn $ "Hello, World!" 08:58:05 Ambiguous type variable `b' in the constraint: 08:58:06 `Data.Typeable.Typeable b... 08:58:22 what's up with this? 09:00:11 :t forever . putStrLn 09:00:14 forall b. String -> IO b 09:00:37 ah right, it's because of the ambiguous result type 09:00:46 oerjan: works fine in ghci though. 09:00:50 > forever . putStrLn $ "Hello, World!" :: IO () 09:00:52 09:01:05 does ghci assume IO () or something? 09:01:13 kallisti: it's because ghci doesn't do a typeclass check on b 09:01:15 i think 09:01:36 because it doesn't have a Show instance for IO 09:01:36 why does lambdabot? 09:01:39 oh. 09:01:49 aaaaaah 09:02:00 while lambdabot uses Typeable b => Show (IO b) in order to print that thing 09:02:29 right 09:03:03 oerjan: is there any standard type that doesn't derive Typeable 09:03:07 ghci just runs the action, and possibly prints the result with the right option set 09:03:11 specifically one that lambdabot exposes? 09:03:22 hm 09:04:00 pretty much any type can derive typeable 09:04:05 :t typeRef 09:04:06 Not in scope: `typeRef' 09:04:07 so it would probably be hard to find. 09:04:28 kallisti: not if it has type arguments of kind not * 09:04:42 but you can still write a custom one then 09:04:49 :t typeRep 09:04:49 @hoogle a -> Int# 09:04:49 Prelude id :: a -> a 09:04:50 Data.Function id :: a -> a 09:04:50 GHC.Exts breakpoint :: a -> a 09:04:50 Not in scope: `typeRep' 09:04:57 argh 09:05:02 @src Typeable 09:05:02 Source not found. My brain just exploded 09:05:05 @hoogle Int -> Int# 09:05:06 Prelude (!!) :: [a] -> Int -> a 09:05:06 Data.List (!!) :: [a] -> Int -> a 09:05:06 Data.Sequence index :: Seq a -> Int -> a 09:05:20 @hoogle Typeable a => a -> b 09:05:21 Control.OldException throwDyn :: Typeable exception => exception -> b 09:05:22 Unsafe.Coerce unsafeCoerce :: a -> b 09:05:22 Data.Dynamic toDyn :: Typeable a => a -> Dynamic 09:06:12 > undefined :: IO (StateT IO Int) 09:06:13 `Control.Monad.Trans.State.Lazy.StateT GHC.Types.IO GHC.Types.Int' is not a... 09:06:27 oops 09:06:32 > undefined :: IO (StateT Int IO Int) 09:06:32 No instance for (Data.Typeable.Typeable1 09:06:33 (Control.Monad... 09:06:36 ah 09:06:40 kallisti: well that's one 09:06:52 um... StateT? 09:07:02 :k StateT 09:07:02 * -> (* -> *) -> * -> * 09:07:18 maybe it just doesn't have an instance? 09:07:25 as you see it has a * -> * argument, so cannot be derived, and nobody presumably bothered to make one 09:08:02 well let me check 09:08:37 > [1..10] 09:08:38 [1,2,3,4,5,6,7,8,9,10] 09:08:40 yeah looks like it 09:09:33 the new polymorphic kind extension will probably make it possible to derive any Typeable eventually 09:09:44 :t for 09:09:45 Not in scope: `for' 09:09:51 heh 09:09:58 seems strange to call it forM 09:10:00 when there's no for 09:10:03 i've been thinking sometimes that for seems to be missing :P 09:10:22 it would just be flip map, presumably 09:10:27 @let for = flip map 09:10:28 Defined. 09:10:29 oerjan: indeed 09:10:47 > for [1..10] (\x -> show x) 09:10:49 ["1","2","3","4","5","6","7","8","9","10"] 09:10:52 I am teh leet Python programmer 09:12:52 :t newIORef 09:12:53 Not in scope: `newIORef' 09:12:58 :t writeIORef 09:12:59 Not in scope: `writeIORef' 09:13:22 lambdabot: "no imperative programming allowed" 09:13:50 well you can use ST, i think 09:13:56 :t newSTRef 09:13:57 forall a s. a -> ST s (STRef s a) 09:14:19 ah good 09:18:27 :t runST 09:18:27 forall a. (forall s. ST s a) -> a 09:22:39 > let var = newSTRef; get = readSTRef; (*=) r n = modifySTRef r (*n); factorial n = runST $ do { x <- var 1; forM [1..n] (\i -> x *= i ); return (get x) } in factorial 5 09:22:39 Inferred type is less polymorphic than expected 09:22:40 Quantified type variable... 09:22:46 huh? 09:24:44 oerjan: help 09:27:51 > let var = newSTRef; get = readSTRef; (*=) r n = modifySTRef r (*n); factorial n = runST $ do { x <- var 1; forM [1..n] (\i -> x *= i ); get x } in factorial 5 09:27:52 120 09:28:59 oh... 09:29:02 :t readSTRef 09:29:03 forall s a. STRef s a -> ST s a 09:29:04 right. :P 09:30:01 > let var = newSTRef; return = readSTRef; (*=) r n = modifySTRef r (*n); factorial n = runST $ do { x <- var 1; forM [1..n] (\i -> x *= i ); returm x } in factorial 5 09:30:01 Not in scope: `returm' 09:30:06 > let var = newSTRef; return = readSTRef; (*=) r n = modifySTRef r (*n); factorial n = runST $ do { x <- var 1; forM [1..n] (\i -> x *= i ); return x } in factorial 5 09:30:07 120 09:30:20 probably the most elegant way to write factorial. 09:31:05 as a Python coder writing Haskell, I find that forM [1..n] (x *=) is a tad unreadable 09:31:11 x *= what exactly? 09:31:14 makes no sense. 09:31:48 As a corollary to "most elegant way to write factorial", 09:31:50 > let var = newSTRef; return = readSTRef; bestIdEver x = runST $ do { y <- var x; return y } in bestIdEver 42 09:31:51 42 09:33:28 yes quite nice. 09:34:04 of course a real Haskell programmer never leaves ST 09:34:16 If only (x *= ◌) were the same thing as (x *=), then it'd make sense; x *= the hole. 09:34:22 so really we should omit the runST and simply pass in STRefs 09:35:37 well, actually just omit the runST 09:35:50 passing STRefs would be if you want pass-by-reference 09:41:44 oerjan: fizzie: would be nice to have a Ref typeclass with the var function 09:41:50 instance Ref IO IORef where var = newIORef 09:42:18 though I think I like the name ref better. 09:42:39 Why are some things called Refs and others called Vars? 09:43:02 variable implies a syntactical feature 09:43:27 x = 2 09:43:46 x is the variable. YOu access via the syntax of the programming language, simply by writing its name. 09:44:10 An MVar is not any more syntactic than an IORef though. 09:44:15 That's great, except it doesn't explain why Haskell has MVars and TVars 09:44:19 oh right 09:44:30 dunno. different people write different code? :P 09:44:37 unless they're in the report 09:44:38 "MRef" sounds too much like a dog barking? 09:45:21 maybe if you're a norseman 09:45:44 Well, I mean, "arf!" 09:46:12 "mref mref mref!" 09:48:09 I wonder if anyone actually uses ST 09:49:26 It's funny how the descriptions of IORef and STRef both use the word "variable" ("A mutable variable in the IO monad", "a mutable variable in state thread") while neither of the descriptions for MVar and TVar do ("mutable location", "Shared memory locations"). 09:49:53 it would be better if MVar and TVar said "reference" 09:55:51 -!- oerjan has quit (Quit: leaving). 10:32:00 > deriv (\x -> x*sin(X^2 + 1)) 5 10:32:00 Not in scope: data constructor `X' 10:32:05 > deriv (\x -> x*sin(x^2 + 1)) 5 10:32:05 33.10852456691162 10:32:23 > deriv (\x -> x*sin(x^2 + 1)) (x :: Expr) 10:32:23 1 * sin (x * x + 1) + x * ((1 * x + x * 1) * cos (x * x + 1)) 10:33:10 if only it reduced properly... 10:33:41 > x + x == 2*x 10:33:42 False 10:33:46 :( 10:40:42 > x == x 10:40:43 True 10:40:46 :/ 10:40:50 > 1 * x == x 10:40:50 False 10:41:11 > 0 * x 10:41:12 0 * x 10:41:15 > x * 0 10:41:16 x * 0 10:41:49 Maybe == should just be undefined 10:41:52 > x > y 10:41:53 False 10:41:59 > x < y 10:41:59 True 10:42:09 Ords of genius. 10:43:36 Sgeo: well it kind of can't make sense unless Expr is demonstrating a particular kind of Num instance. 10:44:03 if all Num instances were fields, you could make a number of reductions that make two Exprs with different textual representations equivalent. 10:44:39 Huh, didn't think about that 10:48:50 but unless you do some pretty complicated symbolic reasoning you're not really going to get an Eq instance that comes anywhere close to basically determine if two arbitrary expressions are equal. 10:49:10 under the assumption that the Num instance that Expr is representing behaves like real numbers. 10:51:23 -!- monqy has quit (Quit: hello). 10:59:44 :t extract 10:59:45 forall source. (Extract source) => (Int, Int) -> source -> source 10:59:52 -!- ais523 has joined. 10:59:53 ..no 10:59:58 :t (=>=) 10:59:59 Not in scope: `=>=' 11:05:28 -!- ais523 has quit (Ping timeout: 258 seconds). 11:06:04 -!- ais523 has joined. 11:06:05 -!- ais523 has quit (Changing host). 11:06:05 -!- ais523 has joined. 11:08:19 > replicateM 3 "<>=" 11:08:20 ["<<<","<<>","<<=","<><","<>>","<>=","<=<","<=>","<==","><<","><>","><=",">... 11:08:24 They should have all of those. 11:09:05 ["<<<","<<>","<<=","<><","<>>","<>=","<=<","<=>","<==","><<","><>","><=",">><",">>>",">>=",">=<",">=>",">==","=<<","=<>","=<=","=><","=>>","=>=","==<","==>","==="] -- that's not such a long list. And I'm sure they can figure out some meanings for everyone. 11:09:21 For example <>< could make some fish swim across the screen. 11:13:11 <=> is compare ala Perl. 11:14:35 ><> makes the fishes go the other way. 11:15:27 :t deriv 11:15:28 forall a b. (Num a, Num b) => (Dif a -> Dif b) -> a -> b 11:15:34 I'm confused as to where this function comes from 11:15:38 I can't find it anywhere on the interwebs 11:18:05 http://hackage.haskell.org/packages/archive/numbers/2009.8.9/doc/html/Data-Number-Dif.html ? 11:22:52 ( http://holumbus.fh-wedel.de/hayoo/hayoo.html?query=%28Dif%20a%20-%3E%20Dif%20b%29%20-%3E%20a%20-%3E%20b ) 11:29:28 <<= and =<< are from Feather 11:29:48 retroactive and proactive assignment, respectively 11:30:03 (proactive assignment does nothing right now, but controls when in time a retroactive assignment happens) 11:31:23 > read "1" :: Dif Int 11:31:24 1~~ 11:32:00 > df $ read "1" :: Dif Int 11:32:00 0~~ 11:32:06 er 11:32:15 > df (read "1" :: Dif Int) 11:32:16 0~~ 11:32:18 okay. 11:34:04 >, ≫, ⋙; greater-than, much greater-than, very much greater-than; sadly I think that's where they gave up. (Though there is ⫸, the triple nested greater-than.) 11:35:17 Certainly there would have been more intensifiers to go with. Really very much greater-than, honestly really very much greater-than, I'm not even kidding how much greater-than, etc. 11:35:22 > iterate df (sin (dVar pi :: Dif Expr)) 11:35:23 [sin pi~~,1 * cos pi~~,1 * (1 * negate (sin pi))~~,1 * (1 * (1 * negate (co... 11:35:40 > map val $ iterate df (sin (dVar pi :: Dif Expr)) 11:35:41 [sin pi,1 * cos pi,1 * (1 * negate (sin pi)),1 * (1 * (1 * negate (cos pi))... 11:36:12 the value, first derivative, second derivative, etc 11:37:15 -!- Phantom_Hoover has joined. 11:39:36 > map val $ iterate df (sin (dVar x)) 11:39:37 [sin x,1 * cos x,1 * (1 * negate (sin x)),1 * (1 * (1 * negate (cos x))),1 ... 11:43:04 > let y = dVar x in map val $ iterate df (x^3 + x^2 + x + 5) 11:43:05 Couldn't match expected type `Data.Number.Dif.Dif a' 11:43:05 against inferr... 11:43:18 It would be better if it printed [sin x,cos x,negate (sin x),negate (cos x),sin x,cos x,even you,should be,able to,figure it,out by,now,...] 11:43:25 > let loly = dVar x in map val $ iterate df (x^3 + x^2 + x + 5) 11:43:26 Couldn't match expected type `Data.Number.Dif.Dif a' 11:43:27 against inferr... 11:43:35 fizzie: asshole :P 11:43:43 but yeah I agree. 11:43:48 I HAVE TALKED ABOUT THIS PREVIOUSLY 11:44:03 > (sin x * sin x) + (cos x * cos x) 11:44:04 sin x * sin x + cos x * cos x 11:44:08 About making the bot more of an asshole? Yes, I think it would fit in better here. 11:44:30 > deriv (\a -> (sin a * sin a) + (cos a * cos a)) x 11:44:31 1 * cos x * sin x + sin x * (1 * cos x) + (1 * negate (sin x) * cos x + cos... 11:44:58 > let y = dVar x in map val $ iterate df (y^3 + y^2 + y + 5) 11:44:59 [x * x * x + x * x + x + 5,(1 * x + x * 1) * x + x * x * 1 + (1 * x + x * 1... 11:45:06 gross/ 11:45:17 > let y = dVar x in map val $ iterate df (y^2 + y + 5) 11:45:18 [x * x + x + 5,1 * x + x * 1 + 1,1 * 1 + 1 * 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,... 11:49:00 All those are so begging for a Mathematica FullSimplify[]. 11:49:09 Or "FoolSimplify", as we tend to call it. 11:49:12 Well, tended. 11:50:03 :t let nDerivs f x = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) = dVar x in nDerivs 11:50:04 parse error on input `=' 11:50:11 :t let nDerivs f x = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) in nDerivs 11:50:12 forall a a1. (Num a, Num a1) => (Dif a -> Dif a1) -> a -> Int 11:50:35 :t let nDerivs f x = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) in nDerivs (\x -> x^2) 11:50:36 forall a. (Num a) => a -> Int 11:50:42 > let nDerivs f x = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) in nDerivs (\x -> x^2) 11:50:45 Overlapping instances for GHC.Show.Show (a -> GHC.Types.Int) 11:50:45 arising fro... 11:50:50 oh... 11:51:03 > let nDerivs f x = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) in nDerivs (\x -> x^2) 5 11:51:04 4 11:51:10 > let nDerivs f x = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) in nDerivs (\x -> x^2) 0 11:51:11 1 11:51:19 so it might not be accurate when you pass 0 :P 11:51:39 > let nDerivs f x = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) in nDerivs (\x -> x^2) 1 11:51:40 4 11:52:17 > (0 :: Expr) == 0 11:52:17 True 11:52:49 > let nDerivs f = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) in nDerivs (\x -> x^2) 11:52:51 4 11:52:54 there we go. 11:53:00 @let nDerivs f = succ . length . takeWhile (/= 0) . iterate df $ (f (dVar x)) 11:53:01 Defined. 11:53:08 > nDerivs (^3) 11:53:09 5 11:53:13 > nDerivs sin 11:53:17 mueval-core: Time limit exceeded 11:54:35 > nDerivs (const 1) 11:54:36 2 11:54:42 erm 11:55:13 > iterate df (const 1 (dVar x)) 11:55:14 [1~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~... 11:55:25 oh, okay. 11:55:39 right, I want it to count the first 0. 11:58:22 er, no... 11:58:25 not right. 11:58:30 @undefinee 11:58:31 @undefine 11:58:35 @unlet 11:58:36 Defined. 11:58:37 @halp 11:58:37 help . Ask for help for . Try 'list' for all commands 11:58:49 @help undefine 11:58:50 undefine. Reset evaluator local bindings 11:59:15 @let nDerivs f = length . takeWhile (/= 0) . iterate df $ (f (dVar x)) 11:59:16 Defined. 11:59:23 > nDerivs (const 2) 11:59:24 1 11:59:26 much better. 11:59:34 > nDerivs (^2) 11:59:36 3 12:15:00 @let (++) = mappend 12:15:01 :3:0: 12:15:01 Multiple declarations of `L.++' 12:15:01 Declared at: .L.hs:97... 12:15:06 > (++) 12:15:06 Overlapping instances for GHC.Show.Show (m -> m -> m) 12:15:06 arising from a use... 12:15:11 :t (++) 12:15:12 forall m. (Monoid m) => m -> m -> m 12:15:26 :t nDerivs 12:15:27 forall a. (Num a) => (Dif Expr -> Dif a) -> Int 12:17:39 -!- Patashu has quit (Quit: MSN: Patashu@hotmail.com , Gmail: Patashu0@gmail.com , AIM: Patashu0 , YIM: patashu2 , Skype: patashu0 .). 12:24:12 -!- Phantom_Hoover has quit (Ping timeout: 248 seconds). 12:40:12 -!- Phantom_Hoover has joined. 13:02:08 -!- zzo38 has joined. 13:06:44 -!- boily has joined. 13:12:12 -!- Phantom_Hoover has quit (Ping timeout: 248 seconds). 13:13:42 -!- Patashu has joined. 13:13:52 I'm staying up to solve this http://www.canyoucrackit.co.uk/15b436de1f9107f3778aad525e5d0b20.js my life is interesting 13:14:35 -!- Taneb has joined. 13:23:02 -!- Phantom_Hoover has joined. 13:37:14 -!- Patashu has quit (Quit: MSN: Patashu@hotmail.com , Gmail: Patashu0@gmail.com , AIM: Patashu0 , YIM: patashu2 , Skype: patashu0 .). 13:37:24 -!- Phantom_Hoover has quit (Ping timeout: 244 seconds). 13:44:51 Hello 13:48:15 hi! 13:48:27 How are you, boily? 13:50:38 -!- Phantom_Hoover has joined. 13:51:28 Hello, Phantom_Hoover 13:58:18 -!- ais523 has quit (Ping timeout: 244 seconds). 13:58:49 -!- ais523 has joined. 14:08:31 Once, I was in a hotel, they required keycards for the elevator but I didn't have any so I went to the top floor by stairs and knocked on the door (it is my hotel room, but some other people too, and they had the keycard). And if any hotel has elevator that requires a keycard and then you only go to your floor, then it makes it less secure than one that does not require a keycard 14:12:30 Once, I was in a hotel, booked under the name of "random" 14:16:12 -!- Phantom_Hoover has quit (Ping timeout: 248 seconds). 14:24:16 Quite often the doors in the stairwell that lead to the actual floors also require a keycard. 14:26:13 Once I worked at a place where you would get trapped in the stairwell if you forgot your card; the door from the offices to the stairs could be opened with a button from the inside, but the exit door at the bottom required a card always. I have a vague feeling that's against all kinds of emergency exit rules and whatnot. 14:26:54 Normally those things are always constructed so that if you forget the key, you can at least exit the building. 14:27:08 (And then freeze to death outside, but that's not relevant.) 14:27:46 In the place I was in, a keycard was not required to open the doors in the stairwell. 14:29:03 -!- Phantom_Hoover has joined. 14:47:33 Oh dear, I am become join spam. 14:48:19 lambdabot: Any spammy, useless messages for me? 14:49:22 how is it december help 14:49:29 2011, we hardly knew ye. 14:49:53 Dungeons of Dredmor just crashed 14:51:18 Does it print out "Suddenly, the dungeon collapses" too? 15:03:30 Why can I not access this? http://www.freesoftwaremagazine.com/articles/encouraging_next_generation_hackers_part_1_raspberry_pi_25_computer 15:12:08 Taneb: linux? 15:12:14 Taneb: and segfault? 15:12:17 Vorpal, yes 15:12:26 And maybe, what do they look like? 15:12:29 Taneb: if so there is a patch to the data files that might help (helped for me). Let me find the link 15:13:36 Taneb: http://community.gaslampgames.com/threads/statue-of-inconsequentia-crash.1318/ (for me it happened when changing dungeon level) 15:13:59 there is a patch a bit down 15:14:06 (post #4) 15:14:38 Does it print out "Suddenly, the dungeon collapses" too? <-- for me it just plain segfaulted 15:23:39 Suddenly, the dungeon segfaults! 15:30:24 wow I apparently didn't have the network package installed. 15:30:28 shows you how much Haskell I've been programming.. 15:31:08 hmmm, I still get these really weird linker errors from importing Network.Socket 15:31:12 dunno what's up with that. 15:36:24 does anyone else find Network.Socket a little cumbersome? 15:37:55 Taneb: did it work? 15:38:26 Can't find the install directory.. 15:39:28 -!- copumpkin has quit (Quit: Leaving...). 15:39:37 -!- copumpkin has joined. 15:45:14 "Shopping for a Dyson DC25 Ball All-Floors Upright Vacuum Cleaner might not appear like a big deal, however it does require a bit of planning." 15:45:54 aha: "Probably you aspire to realize what is certainly my favourite [http://google.com internet search engine]." 15:46:00 the spambots spamming Google are back again 15:46:33 (as in, advertising Google) 16:03:47 -!- Taneb has quit (Quit: Leaving). 16:12:25 -!- elliott has joined. 16:13:04 22:22:05: Just noticed my email in my account settings was 0.034064395384923 I asume that was the issue. 16:13:06 ais523: context? 16:13:21 elliott: the phpBB gone mad 16:13:28 thought so 16:13:35 * elliott tries to figure out how that could possibly work 16:13:43 where it changed all the posts into md5 hashes, it apparently changed email addresses into (double-precision, by the look of it) floating point numbers 16:14:05 (it's unclear what they're md5 hashes /of/, btw; kind-of hard to reverse them) 16:14:08 :D 16:14:13 did you try googling them? 16:14:19 I picked one at random, no results 16:14:22 I didn't google any others 16:15:32 hrm 16:15:38 why did I get an email sent to all employees 16:15:50 -!- derrik has joined. 16:16:10 perhaps you are an employee 16:16:47 -!- Slereah has joined. 16:18:17 -!- Slereah_ has quit (Ping timeout: 240 seconds). 16:18:27 sending an email to all employees would be impressive 16:18:38 almost like sending an email to every internet user, just slightly less global 16:18:38 elliott: No, I pay them. 16:18:56 presumably sending an email to absolutely everyone would be the easiest way to accomplish an "email-all-employees" requirement 16:19:00 (them being the university) 16:19:30 ais523: that would be fun to try 16:22:29 ais523: You'd also need to get them all email addresses 16:22:47 coppro: that's trivial 16:22:50 MWAHAHAHA, IN HWN AGAIN 16:22:54 sending them their logins would be the hard part 16:23:27 ais523: Why not just make an email address for everyone? 16:23:52 > fix . (++) $ "hi" 16:23:53 "hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi... 16:23:54 coppro: that's what I was implying 16:24:05 hmm, github's language detection is rather imperfect 16:24:10 the hard part being, giving everyone access to their account 16:24:21 ais523: just let everyone access every account 16:24:29 #ifdef USE_DIRECT3D 16:24:29 glClear(GL_COLOR_BUFFER_BIT); 16:24:29 #endif 16:24:33 this seems so very wrong 16:24:36 Vorpal: :D 16:24:36 elliott: then how is it an account specific to the person? 16:24:46 Vorpal: awesome, please give more context 16:24:48 ais523: nobody would stop calling personal email just because there's a backdoor! 16:24:56 ais523: can't. Darwinia source code. 16:24:57 ais523: they might claim it's a /bad/ personal email service, though 16:25:03 Vorpal: err, not in the code itself 16:25:13 but as to why that's written 16:25:29 (I'm guessing that there's some sort of OpenGL/Direct3D wrapper that can call either, and is based on OpenGL function names) 16:25:38 elliott: anyway I gave up getting darwinia to compile... Linux implementation files are way out of date with shared headers (like when there is foo_win.cpp and foo_sdl.cpp) 16:25:47 but as to why that's written <-- don't know yet 16:26:02 Vorpal: I bet AII compiles perfectly on Linux. 16:26:14 elliott: give me the source right now then 16:26:27 Vorpal: Nobody can do that; light speed, dude. 16:26:38 elliott: well within 10 minutes 16:26:41 You can't even access Darwinia's code instantly. 16:26:44 > let fixify f = fix . f; repeat = fixify (:); cycle = fixify (++); forever = fixify (>>) in fixify 16:26:45 Overlapping instances for GHC.Show.Show (f (a -> a) -> f a) 16:26:45 arising from... 16:26:49 :t let fixify f = fix . f; repeat = fixify (:); cycle = fixify (++); forever = fixify (>>) in fixify 16:26:50 forall (f :: * -> *) a. (Functor f) => f (a -> a) -> f a 16:26:57 Vorpal: What, so if it's bigger than you can download in 10 minutes it doesn't count? 16:27:23 elliott: no to the start of downloading. I expect the rest within at most a few days 16:27:30 anything more is just silly 16:27:43 Vorpal: I refuse to let my reputation depend on the reliability of your internet connection 16:27:49 @hoogle (Functor f) = 16:27:49 Parse error: 16:27:49 (Functor f) = 16:27:49 ^ 16:27:55 @hoogle (Functor f) => f (a -> a) 16:27:55 Data.Generics.Schemes everywhereBut :: GenericQ Bool -> GenericT -> GenericT 16:27:55 Data.Generics.Aliases unGQ :: GenericQ' r -> GenericQ r 16:27:55 Data.Generics.Twins gzipWithT :: GenericQ (GenericT) -> GenericQ (GenericT) 16:28:00 kallisti: impossible 16:28:09 wat 16:28:14 Functor provides no way to get an f a for any a 16:28:24 without already having an f b and a (b -> a), ofc 16:28:28 :t pure id 16:28:29 forall a (f :: * -> *). (Applicative f) => f (a -> a) 16:29:57 elliott: well obviously it's not unpossible because I just used 3 functions that satisfy that type. I assume you mean it's impossible to generally do that. 16:30:28 ais523: there seem to be no such wrappers 16:30:33 there is no value foo :: (Functor f) => f (a -> a) 16:30:35 I was hoogling for functions I could fixify as above. 16:30:38 ais523: it just makes no sense 16:30:42 Vorpal: they'd probably be in a third-party library 16:30:44 your type was (Functor f) => f (a -> a) -> f a 16:30:50 ais523: well I looked in lib/ 16:30:51 correct 16:30:56 it could be a typo for ifndef, I guess 16:31:01 kallisti: anyway, that's just because lambdabot (.) = fmap 16:31:10 correct. 16:31:17 but I doubt it, or the d3d version wouldn't even compile with the typo in, so it'd have been caught easily 16:31:32 Vorpal: um, maybe the Direct3D version just uses OpenGL for some things? 16:31:53 :t let fixify f = fix Prelude.. f; repeat = fixify (:); cycle = fixify (++); forever = fixify (>>) in fixify 16:31:54 forall a a1. (a -> a1 -> a1) -> a -> a1 16:31:58 ais523: arguable, considering the code doesn't compile on linux in the first place 16:32:01 elliott: maaybe. But I'm pretty sure that mixing them is in general a bad idea and unlikely to work 16:32:16 elliott: it'd have happened on every platform, unless that bit's Linux-specific too 16:32:24 it was shared 16:32:24 @@ @hoogle @type let fixify f = fix Prelude.. f; repeat = fixify (:); cycle = fixify (++); forever = fixify (>>) in fixify 16:32:25 Data.IntMap fold :: (a -> b -> b) -> b -> IntMap a -> b 16:32:26 Data.IntMap foldr :: (a -> b -> b) -> b -> IntMap a -> b 16:32:26 Data.IntMap foldr' :: (a -> b -> b) -> b -> IntMap a -> b 16:32:33 ais523: USE_DIRECT3D would not be set on Linux 16:32:43 elliott: it was in the classical software raytrace loading screen of darwinia 16:32:46 ais523: I'm just saying that the code obviously has errors not in the released binaries for whatever reason 16:32:46 if you remember that one 16:32:57 elliott: ah, OK 16:33:05 @hoogle (a -> a1 -> a1) 16:33:05 Prelude seq :: a -> b -> b 16:33:05 GHC.Conc.Sync par :: a -> b -> b 16:33:05 GHC.Conc par :: a -> b -> b 16:33:20 kallisti: flip const 16:34:07 what does seq do, and is it something incredibly unhaskellish? 16:34:16 you know what seq does 16:34:24 -!- derrik has quit (Quit: reconnect). 16:34:29 ais523: it's kind of unhaskellish? 16:34:33 either that, or are on a campaign to wilfully forget as much Haskell as possible :P 16:34:40 elliott: well, the obvious meaning is "force a and return b" 16:34:41 ais523: seq _|_ a = _|_; seq a b = b 16:34:46 ah, OK 16:34:47 that's not its meaning 16:34:53 (force a and return b) 16:34:57 it does break parametricity a bit though 16:34:59 -!- derrik has joined. 16:35:06 but not unsalvagably 16:35:09 I was thinking "a can't possibly have a side effect, so how would seq be different from flip const" 16:35:20 and the answer is that it's an infinite-loop-checker? 16:35:23 it does have a side effect of sorts. 16:35:31 kallisti: no, it doesn't 16:35:35 _|_ isn't a side-effect 16:35:35 now I'm just trying to work out why it'd be useful 16:35:41 ais523: it's not an infinite loop checker 16:35:45 ais523: it's _|_ if either argument is bottom 16:35:47 else the right argument 16:36:01 elliott: forcing the evaluation of a thunk is pretty side-effecty 16:36:07 well, bottom = infinite loop or exception 16:36:07 kallisti: there are no thunks 16:36:15 elliott: ah, of course. 16:36:16 kallisti: by that definition, beta-reduction is a side-effect 16:36:22 because it mutates the thunk in many implementations 16:37:55 ais523: anyway, it's useful because seq is strict in both of its arguments 16:37:58 elliott: well it forces a in a context where it would not normally be forced. 16:38:04 as opposed to flip const, which is strict in only its latter 16:38:12 kallisti: "not normally"? plenty of functions are strict in both their arguments 16:38:17 seq is just the only polymorphic one 16:38:18 elliott: oh, so in practice it makes the code run faster by being strict? 16:38:22 elliott: yes, those functions do things to their arguments 16:38:26 (strictness doesn't always speed up code, but can do in some contexts) 16:38:26 elliott: seq only "does things" to one of them. 16:38:34 ais523: that's why you would use it, yes 16:38:41 ais523: it's a common misconception that seq must evaluate its first argument first 16:38:44 but that's not guaranteed at all 16:38:47 GHC provides pseq for that purpose 16:39:04 elliott: it can evaluate the second argument, then the first, then return the second, I guess 16:39:06 (some people think it /should/ guarantee that, but that breaks even more properties :)) 16:39:13 and that's the only other possible evaluation order 16:39:13 ais523: indeed. and GHC sometimes _does_ do this. 16:39:21 kallisti: wrong; id is strict in its argument too 16:39:33 elliott: ... -_- 16:39:35 seq "does the same thing| to both its arguments 16:39:36 " 16:39:43 i'm not being purposefully dense, you're just wrong 16:40:13 elliott: under normal Haskell semantics, if you accept two arguments and return the second one, the first one is never evaluated 16:40:16 with seq it is.. 16:40:17 elliott: happy? 16:40:31 elliott: id is irrelevant because it returns its one argument 16:40:42 kallisti: actually no, the first one could be evaluated too. but you are still wrong even ignoring that: 16:40:50 all you are saying is that (\a b -> b) is not strict in its first argument 16:40:56 yes 16:40:58 because that is the only such function that meets your criteria 16:41:00 that is what I'm saying. 16:41:05 but nobody claimed seq was like (\a b -> b) "but special" 16:41:18 elliott: ...is it not? 16:41:22 also, "doing something special" is not a side-effect. 16:42:07 @src seq 16:42:07 Source not found. You untyped fool! 16:43:36 elliott: is there any observable difference between id being strict and id being lazy? 16:43:39 help where's the part where seq only uses un-side-effectful Haskell code to do what it does. 16:43:43 ais523: id can't possibly be lazy 16:43:56 kallisti: similarly, (+) on Int has side-effects, because you can't implement it in Haskell 16:44:01 in fact -- brace yourself 16:44:05 EVERY PRIMITIVE HAS SIDE-EFFECTS! 16:44:11 elliott: well, lazy id would do the say thing as strict id, right down to evaluation order 16:44:12 Turns out Haskell is impure because kallisti is an idiot. 16:44:18 elliott: that is not what I meant. 16:44:21 ais523: no, it wouldn't; there is no lazy id, there are no lazy functions of type (a -> a) 16:44:21 so the two are the same 16:44:25 ais523: it's an incoherent question 16:44:43 elliott: have you seen the hardware implementation of call-by-name id? it is quite undeniably lazy 16:44:57 ais523: no shit, "lazy" changes meanings in different evaluation orders 16:45:06 ah, OK 16:45:07 ais523: but call-by-name is a valid strategy for Haskell too 16:45:11 ais523: id is still strict in it 16:45:23 elliott: side-effects involve modifying state that is not part of the result of the expression. seq does this. clearly (+) does not do that. 16:45:27 you can't /observe/ its supposed "laziness" at all 16:45:34 and it's the semantics that matter, not the operations 16:45:35 elliott: except with a multimeter, right 16:45:46 kallisti: seq DOES NOT MODIFY ANY STATE 16:46:01 you can implement haskell in fucking term rewriting 16:46:04 where there is no 16:46:04 mutable 16:46:05 arguably, I'd say that id is both strict /and/ lazy 16:46:05 state 16:46:11 ais523: id _|_ = _|_ 16:46:13 ais523: Q.E.D. 16:46:27 elliott: seq would still be a side-effect in those circumstances. 16:46:41 kallisti: you do not understand what a side-effect is. 16:47:10 elliott: well, "lazy id" is always forced instantly; that's why it's the same as being strict 16:47:33 ais523: you're bringing details like "force" into it that don't exist at this layer 16:47:33 aren't all unary operators either strict, or ignore their argument, with your definition? 16:47:40 elliott: I think you just have a very weird notion of what a side-effect is. 16:47:43 ais523: of course 16:47:50 ais523: if you don't ignore an argument, you force it 16:47:57 ah, OK 16:48:03 elliott: clearly seq makes an /observable/ difference to the operational semantics of the program that /has nothing to do with its return value/ 16:48:13 anyway, I agree with your definition of "strict", but am not convinced it's the opposite of "lazy" 16:48:18 kallisti: ah! what you mean is that since 16:48:20 seq a b 16:48:21 isn't the same as b 16:48:24 seq has a side-effect 16:48:26 by the same token 16:48:27 a+1 16:48:29 is not the same as a 16:48:32 elliott: uh, what? 16:48:34 therefore, again (+) on Int has a side-effect! 16:48:36 OMG! 16:48:38 no. I'm sorry, but you're stupid. 16:48:47 kallisti: but seriously though, you can stop bothering, because you're... wrong 16:48:57 and have no idea what you're talking about 16:48:58 so 16:48:58 yeah 16:49:10 elliott: nice strawman though. "oh you actually meant this. now I will demonstrate that what I said is wrong." 16:49:22 hey guys, I heard I/O is relevant to the definition of turing completeness 16:49:29 it's not. 16:49:47 reaaaaaaally? I think I'll argue the issue for a few hours with people who know more about the topic than me 16:49:58 elliott: and this is relevant to what we're talking about how? 16:50:09 elliott: it basically just sounds like a personal attack to me. how silly. 16:50:18 kallisti: I think your problem is, that seq a b is designed to calculate a value depending on both a and b; the fact that the value is always the same as b, doesn't change the fact that it depends on a 16:50:25 the relevance is that you should really just drop it before this log becomes more personally embarrassing to you in the future 16:50:28 it wasn't intended as an argument 16:50:30 you could implement seq on integers as seq i j = (i-i) + j 16:50:48 ais523: I've occasionally explained seq as just magically knowing the constructors of every data-type 16:50:49 and looking like 16:50:52 seq (A_ ) x = x 16:50:55 seq (B _ _) x = x 16:50:56 ... 16:51:02 *A _ 16:51:06 and the only reason you think that the generalised seq is side-effecty is that there's no way to get a polymorphic version 16:51:13 that kind of breaks down for functions, but so does seq :) 16:51:25 -!- Phantom_Hoover has quit (Ping timeout: 248 seconds). 16:51:26 (seq lets you distinguish _|_ and (const _|_)) 16:51:34 (another thing kallisti has been confused about, incidentally) 16:51:36 ais523: seq /doesn't/ calculate a value based on a and b though. only b. 16:51:41 kallisti: yes it does 16:51:50 the value depends on a by definition 16:52:03 thus, optimising out the dependency on a, just because the return value isn't affected by it, is wrong 16:52:18 if you're going to call the dependency a side-effect, you have a pretty weird definition of side-effect 16:52:29 it has nothing to do with dependency. 16:52:49 elliott: how strict is the first argument to seq? does it only go as far as the first constructor, or does it figure out the value "all the way"? 16:52:53 kallisti: yes it does 16:52:59 ais523: WHNF, like always 16:53:03 why does (a+b) go into an infinite loop if either a or b are infinite loops? 16:53:12 ais523: (so, to the first constructor or a lambda, basically) 16:53:18 ais523: strictness and laziness has nothing to do with side-effects, first of all. 16:53:20 elliott: ah, OK 16:53:23 kallisti: exactly 16:53:29 that's why seq isn't side-effectful 16:53:43 * elliott is just going to keep stating facts rather than actually trying to engage in futile argument.\ 16:53:44 elliott: it has to do with what is computed and what is returned. 16:53:46 s/\\$// 16:54:02 elliott: I admit that seq still feels a bit non-Haskellish to me, but that's not because of side effects, but because it does weird things to eval order 16:54:13 ais523: a lot of people don't like it 16:54:22 elliott: and in this case, seq returns b and forced a. this is /precisely/ why you can't simply optimize seq away because it performs a side-effect unrelated to just evaluating b and returning that. 16:54:23 ais523: Haskell 1.4 was better 16:54:28 ais523: it had class Eval a where seq :: a -> b -> b 16:54:32 and e.g. functions weren't an instance 16:54:40 and every ADT got an Eval instance for free 16:54:51 that was good because fully polymorphic functions didn't get parametricity fucked up 16:55:06 kallisti: you will never understand why you are wrong until you stop thinking in terms of operations like "forced". 16:55:15 kallisti: do you think that (\a b->(b-b)+a)::(Int -> Int -> Int) can be optimised to const::(Int -> Int -> Int)? 16:55:16 there are two levels: semantics, which do _not_ involve things like "forcing" and "mutation" 16:55:22 and implementation, which SOMETIMES INVOLVES MUTATION 16:55:27 elliott: I like finding misconceptions via binary search 16:55:36 GHC mutates TONS of things in the process of evaluating COMPLETELY PURE (even seq-less, if you think that matters) expressions 16:55:38 whether in someone else's view or mine 16:55:53 that does NOT MEAN THOSE EXPRESSIONS MUTATE, the expressions DO NOT HAVE SIDE-EFFECTS 16:56:04 and that is the last I will say on the matter, unless I decide to be a jerk from the sidelines again 16:56:13 which is, admittedly, fairly likely. 16:56:29 ais523: uh, no? 16:56:31 ais523: I'm not sure that works in the general case 16:56:36 kallisti: why not? 16:56:40 ais523: (binary search, I mean) 16:56:47 sometimes people are just wrong all the way down 16:56:56 elliott: indeed, but you can often narrow it down somewhat 16:57:12 ais523: because they don't do the same thing? you're making the assumption that Num obeys any kind of laws. 16:57:24 such as b-b == fromIntegral 0 16:57:31 kallisti: did you see the ::Int? 16:57:36 oh, no. 16:57:38 I'm blind. 16:57:49 right, in general you couldn't, because of polymorphism 16:58:02 > (\a b->(b-b)+a) x y 16:58:03 y - y + x 16:58:07 ais523: I mean, it /could/ be optimized. it would do the same thing. 16:58:07 as expected 16:58:14 kallisti: no it wouldn't 16:58:20 ais523: er, well, right. 16:58:21 what if a is fix id? 16:58:21 strictness 16:58:31 so, would you say that b-b has side effects? 16:58:35 no? 16:58:45 now, if I flip that expression 16:58:58 to (\a b->(a-a)+b)::(Int->Int->Int) 16:59:03 -!- Phantom_Hoover has joined. 16:59:04 I have seq::(Int->Int->Int) 16:59:08 but I can't optimise it to flip const 16:59:19 based on your arguments 16:59:23 ais523: I have never once claimed that seq can be optimized to flip const 16:59:24 also, no side effects 16:59:29 ah, OK 16:59:40 elliott: and in this case, seq returns b and forced a. this is /precisely/ why you can't simply optimize seq away because it performs a side-effect unrelated to just evaluating b and returning that. 16:59:41 ais523: in fact, the reason it can't is because seq has side-effects... 16:59:45 you claimed that it's because it has side effects 16:59:56 whereas I've given an implementation on the integers that doesn't have side effects 16:59:57 correct. 16:59:59 and yet still can't be optimised away 17:00:02 -!- azaq23 has joined. 17:00:05 ais523: okay? 17:00:12 ais523: there are other reasons things can't be optimized. 17:00:19 kallisti: agreed 17:00:25 and those are the reasons that seq can't be optimised 17:00:49 elliott: hmm, I suppose that this means that in languages like Agda, it's possible for an integer to be lazily positive 17:00:50 ais523: oh I see what you're saying. 17:00:58 as in, forced only so far as being positive, rather than to its actual value 17:01:05 because integers actually have type constructors there 17:01:33 ais523: but I still think seq performs a side-effect, because side-effects are related to computing expressions 17:02:04 hmm, now I'm wondering what seq /does/ do if given a function 17:02:09 > seq id 0 17:02:09 0 17:02:18 presumably just ignores it 17:02:20 > seq (fix id) 0 17:02:24 mueval-core: Time limit exceeded 17:02:28 or, hmm, no 17:02:45 wait, fix id isn't afunction 17:02:49 *a function 17:02:53 :t fix id 17:02:53 forall a. a 17:03:04 elliott: hmm, I suppose that this means that in languages like Agda, it's possible for an integer to be lazily positive 17:03:09 > seq (const $ fix id) 0 17:03:10 ais523: Agda doesn't have _|_ 17:03:10 0 17:03:17 so the concept of laziness/strictness doesn't exist 17:03:23 elliott: indeed, it was a different "this" 17:03:28 and I meant in terms of implementation 17:03:33 it's not user-observable at all 17:03:40 ais523: things are naturally forced in Haskell semantics by being referring to in functions, or being evaluated in some way. so being forced as the result of being used in an expression is not a side-effect. I'm not saying "forcing values is a side-effect" I'm saying "forcing values that you don't use as part of an expression that you return is a side-effect" 17:03:55 hmm, does this mean Agda is sub-TC? 17:04:04 (as in, you can't write a program without a proof it terminates?) 17:04:12 kallisti: nothing is forced in Haskell's semantics. 17:04:22 kallisti: well, the argument a /is/ used, that's the point 17:04:27 it's not used for anything, but it's still used 17:04:31 ais523: Agda is sub-TC, yes. 17:04:36 unless you turn off the termination checker. 17:04:46 imagine it being subtracted from itself via a generic magic subtraction operation, that returns 0 if you subtract anything from itself 17:05:21 ais523: ...it's not relevant to the computed result. in much the same way that the act of writing bytes to a file is irrelevant to the result of writeFile 17:05:27 not true 17:05:32 the result of writeFile is an IO action 17:05:37 and all that action does is write bytes to af ile 17:05:38 *a file 17:05:59 writeFile is also referentially transparent, i.e. returns the same action for the same arguments always 17:06:22 elliott: well, writeFile doesn't have side effects; unsafePerformIO does when given its return value, but writeFile doesn't 17:07:16 one possible implementation of IO actions would be as C programs, wouldn't it? and you could define all the functions returning IO actions, and things like >>= for IO, as operating on those programs 17:07:31 and then unsafePerformIO and the runtime would simply run the programs produced 17:07:32 ais523: yep 17:07:37 (it'd be quite a bad impl, but it'd be possible) 17:08:00 ais523: on that riff: http://conal.net/blog/posts/the-c-language-is-purely-functional (in response to people claiming Haskell is purely-functional) 17:08:19 wait, /another/ elliott? 17:08:28 conal elliott is the more famous elliott 17:08:41 there's him and another two elliotts in #haskell at the best of times 17:08:44 well, not the best of times 17:08:47 because one of them is elliottcable 17:09:39 hmm, it's a little wrong; #undef is a purely functional operation in CPP, because it serves to end a scope, rather than do anything fundamentally side-effecty 17:10:15 ais523: nah, you can use it out of order 17:10:22 really? ouch 17:10:27 of course you can... 17:10:33 ...I think you guys have a weird definition of side-effect. 17:10:36 or well 17:10:38 probably a normal one 17:10:40 but the normal one is weird. 17:10:51 kallisti: your definition is incoherent 17:11:01 and makes Haskell-even-without-seq side-effectful 17:11:10 (you would claim it isn't, but that's because your definition is self-contradictory) 17:11:17 *it doesn't 17:11:28 Haskell-even-without-seq is side-effectful... 17:11:51 *-and-IO 17:11:55 "Having a baby is often a occasion whenever you must be careful because the outcomes of earning a mistake might be serious." 17:12:02 ais523: :D 17:12:20 kallisti: well, "pure Haskell without side-effects" has no side-effects, yes. 17:12:28 erm 17:12:32 s/kallisti/elliott/ 17:12:33 kallisti: did you just nickping yourself? 17:12:38 kallisti: yes 17:12:48 wow, elliott and kallisti must be the same person, it's the only way to explain such a mistake 17:12:54 we are. 17:12:56 kallisti: indeed it doesn't: unfortunately, your definition makes it so 17:13:00 (and the only conclusion from that is, that that person is trolling me really heavily) 17:13:15 you just don't realise it, because you don't know what your definition is, because you don't understand it, because you don't understand purity 17:13:26 elliott: ah, because forcing a value as the result of computing it is a side-effect, under my definition, yes? 17:13:34 (except it's not, but please explain) 17:13:39 with a definition of "same arguments always gives same results", seq is perfectly pure 17:13:45 as its result depends only on its arguments a and b 17:13:54 kallisti: nah, ais523 has taken the torch of actually attempting to explain to you _why_ you're wrong 17:13:57 by which I mean 17:14:00 I gave up 17:14:21 elliott: to be fair, I didn't understand at the start of the conversation, I just figured it out pretty quickly 17:14:22 as I said, my claim is not that "forcing a value is a side-effect" 17:14:39 because values are forced all the time when no side-effects are occuring. 17:14:44 ais523: yes, such wonders tend to happen when you start without assuming you're correct :P 17:14:58 Haskell is something that I don't find very intuitive 17:15:37 although I've occasionally wished for Haskelly monads elsewhere (especially for error handling); you could do it in OCaml but you have to lazify everything by hand, which is irritating 17:16:12 (where lazifying is the easiest way to make statements into what are effectively Either actions) 17:17:21 ...but how is... 17:17:40 "this action is performed, and is completely irrelevant to the output of the expression" 17:17:43 not a side-effect? 17:17:46 "action is performed" 17:18:02 elliott: I disagree, as I disagree with the "completely irrelevant" 17:18:04 evaluating a pure value is not an "action" in the side-effectful sense 17:18:12 clearly, you get an infinite loop if a is an infinite loop 17:18:15 thus, a isn't irrelevant 17:18:21 ais523: pinging the wrong person, dude 17:18:31 elliott: I was disagreeing with where you found the error 17:18:38 well, hmm 17:18:39 ais523: I was just disagreeing with a different part. 17:18:49 -!- MSleep has changed nick to MDude. 17:18:49 I think his statement's wrong even without the "action is performed" part 17:19:04 ais523: Were I trying to actually deconstruct kallisti's argument in its entirety, I would have to start by rejecting everything he says, as it is worded in terms of imperative machine operations, not Haskell's pure, timeless semantics. 17:19:18 He would almost certainly interpret this as me trolling him with stubbornness. 17:19:21 So I don't. 17:19:31 elliott: ah okay so forcing a in a `seq` b is not an action, it's just an observable effect of evaluating the expression that has nothing to do with the return value. got it. 17:19:32 kallisti: hmm, to put it a different way: you seem to think that side-effects are defined in terms of "X happens and is not useful", rather than in terms of "X happens and does something not reflected by the return value Y" 17:19:40 kallisti: It has to do with the return value. 17:19:47 If a is _|_, then the return value is _|_. 17:20:05 ais523: you seem to be thinking that I'm thinking the opposite of what I'm thinking, and then go on to describe exactly what I'm thinking to be the thing I should be thinking. 17:20:08 this has happened twice now. 17:20:40 elliott: hmm, is it sanely possible to add T to a language as well as _|_? 17:20:53 ais523: heh 17:21:04 ais523: well, _|_ is the value of every type, I guess T is the value of no type? 17:21:07 then your values would be lattice elements, I think 17:21:11 * elliott PRO MATHEMATICIAN 17:21:13 ais523: they are 17:21:14 elliott: hmm... 17:21:18 ais523: ordered by well-definedness 17:21:24 ezyang has a long post series about this 17:21:30 yep, that makes sense 17:21:35 well, it's only a semilattice in Haskell 17:21:45 right 17:21:55 elliott: can Haskell talk about _|_ in that way... 17:22:02 _|_ is a suitable value for use in any context; whereas T is a value which, if a context accepts that, it'll accept anything 17:22:05 kallisti: We're not Haskell, we're humans. 17:22:15 Haskell's semantics most definitely involve _|_. 17:22:32 kallisti: in general, _|_ is meaningful, but it's impossible for a computer to always detect its existence 17:22:38 elliott: does haskell's semantics involve side-effects? 17:22:42 (and you get an infinite loop if it's there, but can't) 17:23:06 ais523: right 17:23:15 kallisti: No, although the description of how IO is executed does. 17:23:20 hmmm, okay. 17:23:41 I think ghc can detect a few trivial instances of _|_ existing 17:23:44 > 1 / 0 17:23:44 kallisti: Note that there is a function which causes the evaluation of its first argument when forced, but does _not_ return _|_ when the first argument is _|_. 17:23:45 Infinity 17:23:50 > 1::Int / 0 17:23:51 Only unit numeric type pattern is valid 17:24:00 > (1::Int) / 0 17:24:01 No instance for (GHC.Real.Fractional GHC.Types.Int) 17:24:01 arising from a use o... 17:24:11 > (1::Int) / (0::Int) 17:24:12 No instance for (GHC.Real.Fractional GHC.Types.Int) 17:24:12 arising from a use o... 17:24:13 kallisti: That function is "start evaluating the first argument in another thread, and return the second immediately" (it is only distinguishable from flip const when talking about operations, not semantics). 17:24:16 kallisti: AKA par. 17:24:21 kallisti: It is also completely pure and has no side-effects. 17:24:26 elliott: how about... operational semantics? 17:24:28 > (1::Int) 17:24:29 1 17:24:40 aha, division isn't defined on the integers in Haskell 17:24:45 that… makes a lot of sense, actually 17:24:51 kallisti: So if you think the return value matters as to whether something has a "side-effect", you're wrong. 17:24:54 ais523: `div` 17:24:59 > 1 `div` 0 17:25:00 :t div 17:25:00 *Exception: divide by zero 17:25:00 forall a. (Integral a) => a -> a -> a 17:25:10 elliott: and I was thinking that "integer division" quite possibly was 17:25:18 :t quot 17:25:19 forall a. (Integral a) => a -> a -> a 17:25:22 so yes, that's a _|_ that was caught by the compiler, as it's a pretty easy one to catch 17:25:26 > 1 `quot `0 17:25:26 *Exception: divide by zero 17:25:50 hmm, now I'm wondering what split-complex numbers are used for 17:25:53 ais523: N.B. there are actually semantics given to Haskell's _|_s to explain exceptions 17:26:04 elliott: question: is a guaranteed to evaluate before seq returns? 17:26:20 elliott: you mean exceptions are the reason that _|_ is part of the semantics rather than inferred from it? 17:26:25 kallisti: Mu. 17:26:26 I'm not entirely convinced I've parsed your line correctly 17:26:30 kallisti: You're talking about operations again. 17:26:33 ais523: no 17:26:42 ais523: I just mean that we don't say exceptions work because the compiler magically realised _|_ was there 17:26:45 elliott: operations seem particularly relevant to side-effects. 17:26:54 ais523: OTOH, the semantics for exceptions are really kind of gnarly, so we ignore them when not talking about exceptions :P 17:26:58 heh 17:27:04 kallisti: yep, good thing there are no side-effects nivolved 17:27:05 I take it you can't catch an exception in Haskell? 17:27:13 (I'd be pretty surprised if you could, all things considered) 17:27:17 ais523: of course you can 17:27:18 (but Haskell surprises me a lot) 17:27:19 they'd be useless otherwise 17:27:23 oh, ouch 17:27:30 :t Control.Exception.catch 17:27:31 forall a e. (GHC.Exception.Exception e) => IO a -> (e -> IO a) -> IO a 17:27:32 elliott: in the denotational semantics, sure. but in the operational semantics... yes? 17:27:42 :t Control.Exception.throw 17:27:42 forall e a. (GHC.Exception.Exception e) => e -> a 17:27:43 :t Control.Exception.throwIO 17:27:44 forall e a. (GHC.Exception.Exception e) => e -> IO a 17:27:53 kallisti: haskell has no mandatory operational semantics 17:28:02 implementations can do what they will. 17:28:09 if an implementation proves the first argument to seq always terminates, it can discard it. 17:28:13 elliott: oh, catch is an IO action? that makes a lot of sense too 17:28:37 ais523: *a function taking an IO action and a function taking an exception and returning an IO action, and returning an IO action 17:28:38 but yes 17:28:56 elliott: well, I knew I was going to get a correction like that 17:29:06 I should have said that a given try…catch block is an IO action 17:29:14 elliott: I think I'm done pressing the issue. 17:29:28 kallisti: which is not the same thing as realising you're wrong, I presume? 17:29:37 elliott: this conversation has been enlightening. but no, I don't think I'm wrong on this one. 17:29:45 you are 17:29:52 elliott: but I do understand your perspective now. so cool. 17:30:08 it's not 17:30:09 a perspective 17:30:14 it's literally objectively correct 17:30:25 you won't find a single person who knows their shit who will agree with you 17:30:40 that's fine. 17:31:15 yeah. you alone will be correct in your tower of oh shit, somehow I'm a haskell expert by pure chance 17:31:19 elliott: to be fair, I'm not sure that the concept that kallisti calls "side-effect" is useless, but I'm not sure how easy it is to define 17:31:22 ais523: Prelude Control.Exception> catch (print (1 `div` 0)) (\e -> putStrLn $ "Exception: " ++ show (e::SomeException)) 17:31:22 Exception: divide by zero 17:31:24 and it needs a better name 17:31:49 elliott: the IO action was the bit I missed when thinking through it 17:31:51 ais523: elliott: my concept involves operations. (aka what actually happens when you implement things) 17:31:57 ais523: Haskell exceptions are interesting even then because of laziness and and ambiguity 17:32:03 having it as an IO action means that it makes sense to say when it happens 17:32:11 ais523: (1 `div` 0) + undefined -- which exception does this throw? 17:32:13 divide by 0, or undefined? 17:32:15 which gives enough context to know how to catch it 17:32:25 elliott: depends on the impl, I guess 17:32:35 ais523: nope, it's actually formally ambiguous 17:32:42 I suppose an implementation could give guarantees, but it wouldn't /want/ to 17:32:52 ais523: that's basically the reason exception-catching is in IO 17:32:58 if not for that, it would be pure 17:33:04 elliott: I meant unspecified, not impl-defined 17:33:07 right 17:33:43 ais523: Prelude Control.Exception> catch (evaluate [1,2,undefined] >> return ()) (\e -> putStrLn $ "Exception: " ++ show (e::SomeException)) 17:33:43 Prelude Control.Exception> 17:33:50 also, I think if catch were pure, and just caught the existence of an exception rather than a specific exception, you'd need to be careful with seq and similar things to make sure that the exception happened inside the catch rather than outside 17:33:53 Prelude Control.Exception> catch (evaluate (undefined :: [Int]) >> return ()) (\e -> putStrLn $ "Exception: " ++ show (e::SomeException)) 17:33:53 Exception: Prelude.undefined 17:34:25 aha, evaluate only forced it one level 17:34:31 (evaluate is just (\a -> a `seq` return a), except with some extra magic) 17:34:38 (so that evaluate undefined `seq` () === ()) 17:34:47 so the first case didn't exception because it never cared about the elements of the list, just that it had a head and a tail 17:34:47 (i.e. the evaluation only happens when you /execute/ the action) 17:35:06 elliott: I've basically come to the conclusion that I'm talking about something completely different. So it's not so much that I think I've PROVED EVERYONE WRONG. it's just that those people being right and me being right are irrelative 17:35:15 -!- zzo38 has quit (Remote host closed the connection). 17:35:20 elliott: which is ofc perfectly meaningful as an IO action, because the whole point of IO actions is that they happen at a particular time 17:35:35 kallisti: yoru concept is self-contradictory, so it's gonna need a hell of a lot of reworking to make sense. 17:35:49 ais523: well, the point is that they have side-effects 17:35:56 ais523: the same IO action can execute at ten different times, or none 17:36:07 elliott: yep 17:36:17 but each time it's executed, you can say when 17:36:27 I think the point, even more than having side-effects, is that they execute in order 17:36:36 but the side-effects are useful in practice ;) 17:36:46 IO would be useful even if the universe were pure 17:36:51 elliott: I haven't found the contradiction. If you have it I'd like to see, but I doubt you have the patience to go down that route. 17:37:35 (btw, I still haven't figured out how to do IO-style things meaningfully in Feather; the problem's not evaluation order, as that's trivially defined, but other problems) 17:38:06 (it's possible to create a temporal monad that keeps track of meta-time, and it's probably a useful concept, but I want to avoid it if possible) 17:38:21 (especially as it breaks the purity of the language) 17:41:26 elliott: the problem with seq _|_ b = _|_; seq a b = b is that there's no computer that can actually do that. 17:41:38 which, when you're talking about operational semantics, is relevant. 17:41:39 yes there is 17:41:46 my computer does that when I use seq 17:41:47 and also 17:41:53 you never claimed to be talking about operational semantics at the start of this 17:41:57 you just said seq has side-effects 17:41:59 so really uh 17:42:02 shut up about this, you're wrong 17:43:01 elliott: I didn't realize that's what I was talking about until it became apparent that we were talking about different definitions of side-effect. 17:43:22 right: you didn't find out you were wrong, just right in a way we failed to consider. 17:43:31 if only every wrong person could be so lucky 17:43:46 elliott: correct. 17:45:34 `addquote right: you didn't find out you were wrong, just right in a way we failed to consider. 17:45:34 if only every wrong person could be so lucky 17:45:34 Gregor: You have 1 new message. '/msg lambdabot @messages' to read it. 17:45:36 ... 17:45:38 Damn it 17:45:41 742) right: you didn't find out you were wrong, just right in a way we failed to consider. 17:45:44 `delquote 742 17:45:47 ​*poof* right: you didn't find out you were wrong, just right in a way we failed to consider. 17:45:54 Gregor: I might like it more with just that line 17:45:56 not sure though :P 17:46:08 `addquote right: you didn't find out you were wrong, just right in a way we failed to consider. if only every wrong person could be so lucky 17:46:10 742) right: you didn't find out you were wrong, just right in a way we failed to consider. if only every wrong person could be so lucky 17:46:13 * elliott clap 17:46:18 @messages 17:46:18 fizzie said 2h 56m 28s ago: A spammy, useless message. 17:46:30 @tell fizzie SPAM SPAM SPAM SPAM SPAM SPAM SPAM 17:46:31 Consider it noted. 17:46:35 @tell fizzie FRIED EGGS AND SPAM 17:46:35 Consider it noted. 17:50:16 elliott: does side-effect have a formal definition? 17:50:53 referential transparency is a good one. 17:53:28 It blew up the moon, but no value accessible thru my references has changed. 17:54:02 I don't think they're equivalent (aka referential transparency <-> no side-effects ) 17:54:12 or well, I don't think they're related in that way 17:54:14 not equivalent 17:54:21 -!- Phantom_Hoover has quit (Ping timeout: 248 seconds). 17:54:23 Gregor: Yeah, but eventually you call it so much that the computer explodes. 17:54:27 And THEN it stops giving the same results. 17:54:58 This function, on certain inputs, will take more time than the shelf life of the processor. Therefore it has side effects. 17:55:11 Gregor: TOTESg 17:55:27 (I don't actually think referential transparency by itself = purity, and especially not "referential transparency on some hardware", but it's a start :P) 17:56:10 kallisti: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.27.7800 This is apparently the most popular definition. 17:56:22 * kallisti loves popular things. 17:56:53 elliott: This paper should have the subtitle "Baby Don't Hurt Me" 17:57:19 Gregor: Stretching things a bit :P 17:57:37 elliott: AND YET IT IS NOW STUCK IN YOUR HEAD 17:57:50 Gregor: What is the point of turning into a tortured What Is Love reference, even if it doesn't fit at all? 17:57:52 BABY DON'T HURT ME 17:57:54 DON'T HURT ME 17:57:55 NO MO' 17:58:01 * elliott wins you're welcome. 17:58:22 X-D 17:59:05 elliott: that reminds me of Dan Ghica doing things like calling fork() in callbacks in order to break other people's proven security properties 17:59:15 haha 17:59:39 because their formal model didn't allow for /that/ sort of side effect 18:01:22 ais523: all programs are the side-effect of me (or my computer) creating them. 18:01:32 therefore: everything is side-effects. 18:02:19 ais523: arguably, IO with concurrency should have a different monad to IO without concurrency 18:02:22 since they're so different 18:02:42 and a lot of things might want to take actions in the latter as arguments 18:02:52 (with ofc sequentially :: IO a -> ConcIO a) 18:02:57 elliott: hmm, indeed 18:03:04 other way round too? 18:03:12 that's also a meaningful operation 18:03:15 no, that defeats the whole point 18:03:23 because it lets you fork from within a sequential callback 18:03:24 does crashing my computer as the result of a memory link count as a side-effect? :3 it's certainly not related to the return value. 18:03:37 elliott: but you'd have to unfork again before returning 18:03:52 anyway, I'm about to miss a bus, so bye everyone; I'll probably be back later 18:03:55 -!- ais523 has quit (Remote host closed the connection). 18:03:59 ais523: err? fork :: ConcIO a -> ConcIO ThreadId was the operation I was imagining ConcIO would have 18:04:09 in addition to standard boring stuff on ThreadIds, and MVars 18:06:05 -!- MDude has quit (Ping timeout: 248 seconds). 18:06:55 -!- Phantom_Hoover has joined. 18:08:04 what, for some reason hackage isn't responding. 18:12:39 -!- Klisz has joined. 18:16:06 -- Laws: 18:16:06 -- pure x = slide (pure x) x 18:16:06 -- slide fs f <*> slide xs x = slide (fs <*> xs) (f x) 18:16:09 what good laws! 18:16:42 the first one is known as the "pure slide pure" law 18:16:51 and the second one is known as the "slide slide slide" law 18:17:10 they also double as dance moves. 18:18:01 @pl \f g x -> f (g x) x 18:18:01 flip flip id . liftM2 18:18:10 @pl \f g h x -> f (g x) (h x) 18:18:11 liftM2 18:18:24 pure = liftM2 slide pure id 18:18:26 I MADE IT BETTER 18:18:32 pure = slide <$> pure <*> id 18:20:14 elliott: obfuscationist! 18:21:28 > f >>= g 18:21:29 No instance for (GHC.Show.Show (m b)) 18:21:29 arising from a use of `M3862060386... 18:21:33 > f >>= g $ x 18:21:34 Ambiguous type variable `a' in the constraints: 18:21:34 `GHC.Show.Show a' 18:21:34 a... 18:21:42 > f >>= g $ x :: Expr 18:21:43 Ambiguous type variable `a' in the constraints: 18:21:43 `GHC.Show.Show a' 18:21:43 a... 18:21:53 > f >>= g $ x y :: Expr 18:21:54 Couldn't match expected type `SimpleReflect.Expr -> a' 18:21:54 against infe... 18:21:57 serpkweroweirowieriowetioweriwet 18:22:26 oh rite 18:23:54 :t f >>= const g 18:23:54 forall (m :: * -> *) a b. (SimpleReflect.FromExpr (m a), SimpleReflect.FromExpr (m b), Monad m) => m b 18:24:06 > f >>= const g $ x 18:24:06 Ambiguous type variable `a' in the constraint: 18:24:07 `SimpleReflect.FromExpr a... 18:25:17 ah 18:25:20 fungot! 18:25:21 Phantom_Hoover: ' only a bit?' more voices were raised. 18:27:42 > (\x -> "(f " ++ x ++ ")") >>= (\x y -> "(g " ++ x ++ " " ++ y ++ ")") $ "x" 18:27:43 "(g (f x) x)" 18:28:12 pure = pure >>= slide 18:28:17 elliott: ^^^ 18:28:26 oh, indeed. 18:31:55 I wish hackage would stop being down. 18:32:46 -- Laws: 18:32:46 -- fromZip . toZip = toZip . fromZip = id 18:32:46 -- fromZip (pure x) = slide (fromZip (pure x)) x 18:32:46 -- fromZip (toZip (slide fs f) <*> toZip slide xs x) 18:32:46 -- = slide (fromZip (toZip fs <*> toZip xs)) (f x) 18:32:49 my laws got even better. 18:33:10 what the hell. 18:33:15 what am I looking at. 18:33:31 fromZip . toZip = toZip . fromZip = id 18:33:35 that's a good one 18:34:31 How does fromZip make sense for arbitrary arguments? 18:34:42 (I'm just going by the name) 18:34:50 class (Applicative (Zip v)) => Space v a | v -> a where 18:34:50 -- Laws: 18:34:50 -- fromZip . toZip = toZip . fromZip = id 18:34:50 -- fromZip (pure x) = slide (fromZip (pure x)) x 18:34:50 -- fromZip (toZip (slide fs f) <*> toZip slide xs x) 18:34:51 -- = slide (fromZip (toZip fs <*> toZip xs)) (f x) 18:34:53 data Zip v :: * -> * 18:34:55 toZip :: v -> Zip v a 18:34:57 fromZip :: Zip v a -> v 18:34:59 slide :: v -> a -> v 18:35:05 used like so: 18:35:06 data Two = Two {-# UNPACK #-} !Double {-# UNPACK #-} !Double deriving (Show) 18:35:06 instance Space Two Double where 18:35:07 data Zip Two a = TwoZ !a !a 18:35:09 toZip (Two x0 x1) = TwoZ x0 x1 18:35:11 fromZip (TwoZ x0 x1) = Two x0 x1 18:35:13 slide (Two _ x1) y = Two x1 y 18:35:15 instance Functor (Zip Two) where 18:35:17 fmap f (TwoZ x0 x1) = TwoZ (f x0) (f x1) 18:35:19 instance Applicative (Zip Two) where 18:35:21 pure x = TwoZ x x 18:35:22 http://www.textfiles.com/uploads/2001.txt I have no idea what this is but it says "Monad Hate Barrier" 18:35:23 TwoZ f0 f1 <*> TwoZ x0 x1 = TwoZ (f0 x0) (f1 x1) 18:35:27 there are also 159 mentions of the word monad 18:35:51 it's the numerical dictionary! 18:35:54 this is amazing 18:36:12 2001.txt 349098 18:36:13 Soren Greenwood's Conspiracy Theory to Explain all Other Conspiracy Theories (January 10, 2001) 18:36:47 Sgeo: hth 18:37:33 elliott: wow I don't even know how to go about this... 18:37:40 about what 18:37:45 about reading this thing. 18:38:04 "*This* is Yammer's official position on the subject: our goal at Yammer is to revolutionize the way modern workers collaborate and we'll use whatever tools will allow us to iterate faster on that goal. If Scala is that tool, we'll use Scala; if Java is that tool, we'll use Java; if INTERCAL is that tool, we'll use INTERCAL. (We don't expect to have to use INTERCAL; don't worry.)" 18:38:09 where's ais when you need him 18:38:14 kallisti: from top to bottom, one presumes 18:39:49 as far as I can tell it's just putting together loose mental associations until everything becomes a conspiracy theory? 18:40:58 if I ever see "monad hate barrier" I know it has something to do with 151... 18:41:11 -!- derrik_ has joined. 18:41:15 -!- derrik_ has quit (Client Quit). 18:41:54 -!- derrik has quit (Ping timeout: 240 seconds). 18:45:22 -!- monqy has joined. 18:46:37 -!- Phantom_Hoover has quit (Ping timeout: 248 seconds). 18:46:55 @let powerOfTwo n = length . nub $ filterM (const [True, False]) [1 .. abs n] 18:46:56 Defined. 18:47:22 > map powerOfTwo [1..10] 18:47:24 [2,4,8,16,32,64,128,256,512,1024] 18:47:34 elliott: behold, the most efficient way to compute powers of two. 18:48:21 I like the abs. 18:48:35 it's essential. 18:49:17 > 2 ^ (-2) 18:49:18 *Exception: Negative exponent 18:49:23 > 2 ** (-2) 18:49:24 0.25 18:49:31 > powerOfTwo -2 18:49:31 Overlapping instances for GHC.Show.Show (a -> GHC.Types.Int) 18:49:31 arising fro... 18:49:35 > powerOfTwo (-2) 18:49:37 4 18:49:40 SO ACCURATE 18:50:23 > powerOfTwo 0 18:50:24 1 18:51:51 07:09:19: apparently tunes also uses sidereal time. 18:51:55 @tell oerjan WHAT DO YOU HAVE AGAINST GLOGBOT 18:51:55 Consider it noted. 18:51:59 *@ask oerjan WHAT DO YOU HAVE AGAINST GLOGBOT 18:52:01 @ask oerjan WHAT DO YOU HAVE AGAINST GLOGBOT 18:52:01 Consider it noted. 18:52:14 > let twoPower n = [recip, id] !! (fromEnum (n < 0)) . length . nub . filterM (const [True, False]) $ [1 .. abs n] in map twoPower [1..10] 18:52:15 Precedence parsing error 18:52:15 cannot mix `GHC.List.!!' [infixl 9] and `L..'... 18:52:27 > let twoPower n = ([recip, id] !! (fromEnum (n < 0))) . length . nub . filterM (const [True, False]) $ [1 .. abs n] in map twoPower [1..10] 18:52:27 No instance for (GHC.Real.Fractional GHC.Types.Int) 18:52:28 arising from a use o... 18:52:34 bah 18:52:54 > let twoPower n = ([recip, id] !! (fromEnum (n < 0))) . genericLength . nub . filterM (const [True, False]) $ [1 .. abs n] in map twoPower [1..10] 18:52:56 [0.5,0.25,0.125,6.25e-2,3.125e-2,1.5625e-2,7.8125e-3,3.90625e-3,1.953125e-3... 18:52:59 ... 18:53:11 > let twoPower n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . nub . filterM (const [True, False]) $ [1 .. abs n] in map twoPower [1..10] 18:53:12 [2.0,4.0,8.0,16.0,32.0,64.0,128.0,256.0,512.0,1024.0] 18:53:23 much better 18:53:42 > let twoPower n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . nub . filterM (const [True, False]) $ [1 .. n] in map twoPower [1..10] 18:53:43 [2.0,4.0,8.0,16.0,32.0,64.0,128.0,256.0,512.0,1024.0] 18:53:44 -!- MSleep has joined. 18:53:46 erm... now even twice as good! 18:53:49 -!- MSleep has changed nick to MDude. 18:54:05 > let twoPower n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . nub . filterM (const [True, False]) $ [1 .. abs n] in map twoPower -2 18:54:05 Overlapping instances for GHC.Show.Show ([a] -> [a1]) 18:54:06 arising from a use... 18:54:10 > let twoPower n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . nub . filterM (const [True, False]) $ [1 .. abs n] in twoPower -2 18:54:11 Overlapping instances for GHC.Show.Show (a -> a1) 18:54:11 arising from a use of ... 18:54:13 jserjgiuweriuwehriuwheriuhdfiuhweruihweiuhweiruhweriuhwetiuweht 18:54:16 too pointy, make it more pointless 18:54:18 -!- ais523 has joined. 18:54:24 > let twoPower n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . nub . filterM (const [True, False]) $ [1 .. abs n] in (twoPower -2) 18:54:24 Overlapping instances for GHC.Show.Show (a -> a1) 18:54:24 arising from a use of ... 18:54:27 olsner: I'm afraid 18:54:32 > let twoPower n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . nub . filterM (const [True, False]) $ [1 .. abs n] in twoPower (-2) 18:54:33 0.25 18:54:37 I swear I can program guys. 18:54:53 @pl (\n -> ([id,recip] !! (fromEnum (n < 0))) . genericLength . nub . filterM (const [True, False]) $ [1 .. abs n]) 18:54:53 ap ((. (genericLength . nub . filterM (const [True, False]))) . ([id, recip] !!) . fromEnum . (< 0)) (enumFromTo 1 . abs) 18:55:25 doing a conditional by indexing a list? how Pythonic 18:55:44 07:29:57: pikhq_: I knew they were Christian based but not anti-gay 18:55:48 kallisti: http://en.wikipedia.org/wiki/Chick-fil-A#Religious_and_political_views 18:55:56 ais523: "*This* is Yammer's official position on the subject: our goal at Yammer is to revolutionize the way modern workers collaborate and we'll use whatever tools will allow us to iterate faster on that goal. If Scala is that tool, we'll use Scala; if Java is that tool, we'll use Java; if INTERCAL is that tool, we'll use INTERCAL. (We don't expect to have to use INTERCAL; don't worry.)" 18:55:56 where's ais when you need him 18:56:20 -!- derrik has joined. 18:56:21 elliott: I don't expect them to have to use INTERCAL either 18:56:38 ais523: I've used that idiom in several languages actually. 18:56:59 kallisti: most languages have a perfectly usable ternary 18:57:07 NOPE LAME 18:57:14 OCaml has if/then/else; I imagine the same works in Haskell 18:57:32 !perl print (("kill self", "stay alive")[int(rand(6)) > 0]) 18:57:33 >deriv powerOfTwo x 18:57:34 stay alive 18:57:38 > deriv powerOfTwo x 18:57:39 Couldn't match expected type `Data.Number.Dif.Dif b' 18:57:39 against inferr... 18:57:56 @undefine 18:58:08 @let powerOfTwo = ap ((. (genericLength . nub . filterM (const [True, False]))) . ([id, recip] !!) . fromEnum . (< 0)) (enumFromTo 1 . abs) 18:58:09 Defined. 18:58:28 > deriv powerOfTwo (x :: Expr) 18:58:28 No instance for (GHC.Enum.Enum 18:58:29 (Data.Number.Dif.Dif Sim... 18:58:43 > deriv powerOfTwo 4 18:58:44 No instance for (GHC.Enum.Enum (Data.Number.Dif.Dif a)) 18:58:44 arising from a u... 18:59:01 wow amazing 18:59:46 > length . filterM (const [True, False] $ replicate 4 0 18:59:47 : parse error (possibly incorrect indentation) 18:59:52 > length . filterM (const [True, False]) $ replicate 4 0 18:59:53 16 19:01:10 -!- Phantom_Hoover has joined. 19:01:26 > let powerOfTwo n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . filterM (const [True, False]) $ replicate (abs n) Nothing] in powerOfTwo 4 19:01:27 : parse error on input `]' 19:01:33 > let powerOfTwo n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . filterM (const [True, False]) $ replicate (abs n) Nothing in powerOfTwo 4 19:01:34 16.0 19:01:38 > let powerOfTwo n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . filterM (const [True, False]) $ replicate (abs n) Nothing in powerOfTwo -4 19:01:38 Overlapping instances for GHC.Show.Show (GHC.Types.Int -> a) 19:01:39 arising fro... 19:01:44 > let powerOfTwo n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . filterM (const [True, False]) $ replicate (abs n) Nothing in powerOfTwo (-4) 19:01:46 6.25e-2 19:01:53 > 1/16 19:01:54 6.25e-2 19:01:56 ...okay. 19:02:08 @let powerOfTwo n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . filterM (const [True, False]) $ replicate (abs n) Nothing 19:02:08 :2:0: 19:02:08 Multiple declarations of `L.powerOfTwo' 19:02:09 Declared at: ... 19:02:12 @undefine 19:02:13 @let powerOfTwo n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . filterM (const [True, False]) $ replicate (abs n) Nothing 19:02:14 Defined. 19:02:23 > deriv powerOfTwo (x :: Expr) 19:02:24 Couldn't match expected type `Data.Number.Dif.Dif a' 19:02:24 against inferr... 19:02:34 :t powerOfTwo 19:02:35 forall a. (Fractional a) => Int -> a 19:02:49 bah 19:03:13 :t abs 19:03:14 forall a. (Num a) => a -> a 19:03:15 :t genericReplicate 19:03:16 forall i a. (Integral i) => i -> a -> [a] 19:03:16 :t repliate . abs 19:03:17 Not in scope: `repliate' 19:03:49 @undefine 19:04:05 @let powerOfTwo n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . filterM (const [True, False]) $ genericReplicate (abs n) Nothing 19:04:06 Defined. 19:04:18 > deriv powerOfTwo (x :: Expr) 19:04:19 No instance for (GHC.Real.Integral 19:04:19 (Data.Number.Dif.Dif... 19:04:31 I'm shocked 19:04:47 @hoogle (Integral a, Num b) => a -> b 19:04:47 Prelude fromIntegral :: (Integral a, Num b) => a -> b 19:04:48 Prelude (^) :: (Num a, Integral b) => a -> b -> a 19:04:48 Data.List genericIndex :: Integral a => [b] -> a -> b 19:05:10 @hoogle (Integral a, Num b) => b -> a 19:05:10 Prelude ceiling :: (RealFrac a, Integral b) => a -> b 19:05:10 Prelude floor :: (RealFrac a, Integral b) => a -> b 19:05:10 Prelude round :: (RealFrac a, Integral b) => a -> b 19:05:24 yeah... no 19:05:31 > deriv powerOfTwo 5 19:05:32 No instance for (GHC.Real.Integral (Data.Number.Dif.Dif a)) 19:05:32 arising from... 19:05:47 aww. 19:06:21 > round 5 19:06:21 5 19:06:30 :t round 5 19:06:30 forall b. (Integral b) => b 19:06:34 .. -_- 19:07:07 @undefine 19:07:17 @let powerOfTwo n = ([id,recip] !! (fromEnum (n < 0))) . genericLength . filterM (const [True, False]) $ genericReplicate (abs . floor $ n) Nothing 19:07:18 Defined. 19:07:22 > deriv powerOfTwo 5 19:07:24 0.0 19:07:38 > deriv powerOfTwo (x :: Expr) -- Expr is /totally/ a RealFrac 19:07:39 No instance for (GHC.Real.RealFrac SimpleReflect.Expr) 19:07:39 arising from a us... 19:07:42 :( 19:08:36 it should be 19:08:57 @info RealFrac 19:08:57 RealFrac 19:09:01 lambdabot: ah, thanks. 19:09:04 > map (deriv powerOfTwo) [-5.5,-5..5] 19:09:06 [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.... 19:09:19 elliott: I wonder where that's happening 19:09:50 Your function isn't very... nice. 19:09:52 well calculating the length from replicate just gives you a bunch of 1 + 1 + 1 + 1 ... 19:09:53 It has a conditional and all. 19:10:22 so that's probably why it's zero 19:12:38 elliott: what are you talking about this is definitely the best implementation of the base-2 real-except-actually-integer exponential function 19:14:08 > floor (5 :: Int) 19:14:09 No instance for (GHC.Real.RealFrac GHC.Types.Int) 19:14:09 arising from a use of ... 19:14:58 lame 19:20:58 > let multiply x y = genericLength . concatMap ((const .: genericReplicate) x Nothing) $ replicate y Nothing in multiply 2 5 19:20:59 10 19:22:13 > let multiply x y = genericLength . concatMap ((const .: genericReplicate) x undefined) $ replicate y undefined in multiply 2 5 19:22:14 10 19:22:45 fromIntegral = (`genericReplicate` undefined) 19:23:22 er... well 19:23:23 not quite 19:23:27 only works for positive numbers 19:24:04 -!- oerjan has joined. 19:24:53 (+) = (++); (*) = concatMap . const; 19:25:05 haven't quite figured out subtraction. this really only works for positive numbers. 19:25:06 hi oerjan 19:25:21 kallisti: (*) = (>>) too, iirc 19:25:21 oerjan: You have 2 new messages. '/msg lambdabot @messages' to read them. 19:25:54 > length $ replicate 4 undefined >> replicate 5 undefined 19:25:54 20 19:25:59 oerjan: ah, indeed. 19:26:08 this would make sense... 19:26:10 because uh... 19:26:17 (>>) = concatMap . const 19:26:36 :t concatMap . const 19:26:37 forall a b. [b] -> [a] -> [b] 19:26:37 :t (>>) 19:26:38 forall (m :: * -> *) a b. (Monad m) => m a -> m b -> m b 19:26:41 not quite. 19:26:48 elliott: for lists... which is the context here. 19:26:51 not quite. 19:26:55 and (^) = mapM . const 19:26:59 i think 19:27:02 :t mapM . const 19:27:03 forall a (m :: * -> *) b. (Monad m) => m b -> [a] -> m [b] 19:27:20 oh hm no 19:27:38 oerjan: well for powers of two I've been using filterM to compute the power set. 19:27:46 oerjan: concatMapM? 19:28:37 challenge: use this scheme to model negative numbers 19:28:59 :t mapM_ . const 19:29:00 forall a (m :: * -> *) b. (Monad m) => m b -> [a] -> m () 19:29:22 assuming you don't care about the element type 19:29:36 so far the element is undefined 19:29:39 > mapM_ (const [1,2,3]) [1,2] 19:29:40 [(),(),(),(),(),(),(),(),()] 19:29:44 a bunch of undefined 19:30:06 looks good 19:30:06 so that the instance could be made for [a] instead of [()] or something 19:30:27 -!- Klisz has quit (Ping timeout: 244 seconds). 19:30:55 oerjan: I don't think this can work at all with negatives 19:30:58 hm 19:30:59 without drastic changes. 19:31:07 you can construct them with the obvious tuple formation 19:31:09 kallisti: you'd think :P 19:31:11 it may even be elegant 19:32:15 oerjan: oh, you missed the first part. fromIntegral = (`genericReplicate` undefined) 19:33:33 well Either [a] [a] could do negatives... but I don't think it would be very pretty. 19:34:05 also it suffers from negative zero 19:34:11 idea: let n = (replicate n undefined ++) and let -n = drop n 19:34:28 :t drop 19:34:29 forall a. Int -> [a] -> [a] 19:34:36 length n yes 19:34:37 kallisti: ([a],[a]) 19:34:40 (a,b) represents a-b 19:34:50 elliott: oh... nice. 19:34:51 that's the same way you (usually) construct the rationals 19:35:02 :t genericDrop 19:35:03 forall i a. (Integral i) => i -> [a] -> [a] 19:35:07 it has the same problem of infinitely many ways to represent any one given number 19:35:15 but reduction is easy 19:35:32 oerjan: unless we give it an integral instance. you'd want drop (length n) 19:35:50 oerjan: pretty 19:35:55 kallisti: that isn'tw hat he meant 19:35:59 a = b means representation of a is b 19:36:14 negate a = drop (length (a [])) 19:36:22 oh nevermind I see... 19:36:23 except that fails 19:36:27 because it can't negate negatives 19:36:36 oerjan: wouldn't 19:36:39 \a -> (replicate n a ++) 19:36:40 be better 19:36:42 because then you could do like 19:36:46 a False (repeat True) 19:36:51 kallisti: er i was giving the translation from Ints, really 19:36:56 um hmm 19:37:00 a 0 [1..] 19:37:01 rather 19:37:07 > (const (drop 10)) 0 [1..] 19:37:08 [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35... 19:37:18 > (\a -> (replicate 10 a ++)) 0 [1..] 19:37:20 [0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,... 19:37:39 (ofc that cheats by using Integer :P) 19:38:23 you figure out the details ;P 19:38:33 oerjan: well yours _works_ fine. 19:39:00 * oerjan notes that yafgc updates aren't quite as regular as he's used to from his webcomics 19:39:18 if null $ n [undefined] then head $ n LIST_OF_ALL_NATURALS_REPRESENTED_IN_THIS_WAY else drop . length $ n [] 19:39:59 except for oots, which was awful of course 19:40:48 I assume that you're referring to oots's update schedule, and not the content, when you call it "awful" 19:40:57 yes. 19:41:21 * kallisti wasn't aware that there was any reason to read anything other than homestuck. 19:41:54 kallisti: what about #esoteric? 19:42:07 I don't actually read #esoteric 19:42:27 elliott: I /still/ maintain my kallisti = Bjorn comparison 19:42:49 but I wouldn't want to read a book about kallisti 19:42:58 ais523: I don't really get that comparison 19:43:06 kallisti: you wouldn't 19:43:10 nor would Bjorn 19:43:14 elliott: dude I'm super interesting. 19:43:25 -!- Klisz has joined. 19:43:27 a book about me would be amazing 19:43:27 elliott: regarding my anti-glogbot stance, i was actually using it at the time and somehow managed to think i was using tunes because insane timezones were involved 19:43:31 it would be the greatest work of literature. 19:43:35 oerjan: lol 19:44:16 There's already a book about me, at http://codu.org/logs/_esoteric/ 19:44:30 (Note: Jokes aside, I have not in fact told my entire life story here) 19:45:00 indeed, only the embarrassing parts 19:45:02 oh no, there's /more/? 19:45:03 * oerjan runs away 19:45:20 > replicate (-5) undefined 19:45:21 [] 19:45:22 :( 19:45:48 lists should go negative-ways 19:45:54 > drop (-5) [1..] 19:45:55 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28... 19:46:15 kallisti: it actually works as replicate n undefined . drop (-n) 19:46:27 er 19:46:33 needs a ++ somewhere 19:46:46 hmm 19:47:08 ah okay. 19:47:17 but it's not particularly elegant is it? 19:47:23 the representation: yes. the code: no 19:47:34 feel free to create twosided infinite lists :P 19:47:53 that sounds awesome. 19:48:05 valid operation: flipItTurnWays 19:48:37 not WitherShins? (sp?) 19:48:54 no 19:48:59 that's not a joke I'm aware of 19:49:06 flipItTurnWays is much better. 19:49:29 oh well i misread that as TurnWise anyway 19:51:27 for two-way list things, toInteger = genericLength 19:51:41 as negative lengths would be possible. 19:56:57 kallisti, go read some Discworld 20:11:24 I swear I can program guys. <-- NOOOO, don't program me! 20:14:15 > let x = dVar (var "oerjan") in deriv (\x -> x^2 + 2*x + 1) x 20:14:16 2+oerjan+oerjan~~ 20:14:26 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 20:14:30 > let x = var "oerjan" in deriv (\x -> x^2 + 2*x + 1) x 20:14:31 2+oerjan+oerjan 20:14:33 my bad 20:14:43 :t dVar 20:14:43 forall a. (Num a) => a -> Dif a 20:14:50 elliott: I made a cool thing earlier 20:16:34 > let nDerivs f = genericLength . takeWhile (/=0) . iterate df . f $ dVar (x :: Expr) in nDerivs (^2) 20:16:36 3 20:17:18 > let nDerivs f = genericLength . takeWhile (/=0) . iterate df . f $ dVar (x :: Expr) in nDerivs sin 20:17:22 mueval-core: Time limit exceeded 20:17:23 > let nDerivs f = genericLength . takeWhile (/=0) . iterate df . f $ dVar (x :: Expr) in nDerivs (const 4) 20:17:25 1 20:17:32 Deewiant: Ping 20:18:34 actually just iterate df . f $ dVar x by itself is pretty cool. 20:18:38 hey ais523, set tabstop=4 20:18:59 elliott: 4 spaces = 1 indent, 1 tab = 2 indents? 20:19:06 nope, 1 tab = 4 wide 20:19:11 > iterate df . (^2) $ dVar (x :: Expr) 20:19:13 [x * x~~,1 * x + x * 1~~,1 * 1 + 1 * 1~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~~,0~... 20:19:20 indentation I set separately with sw=4 (although this is a flaw of vim that it's set like this) 20:19:21 elliott: that's just broken 20:19:28 > map val . iterate df . sin $ dVar (x :: Expr) 20:19:30 [sin x,1 * cos x,1 * (1 * negate (sin x)),1 * (1 * (1 * negate (cos x))),1 ... 20:19:35 * elliott continues using his broken editor happily. 20:20:08 why is it a flaw of vim that it can set tabs and indentations differently? 20:20:25 most editors can do that, to read code in the common indent = 2 spaces, 4 indents = 1 tab format 20:20:33 (I know it's common because I've seen it in quite a lot of third-party code) 20:20:42 s/third-party/GNU/ 20:20:45 On Linux, should I use emacs from the console or is a more graphical emacs acceptable? 20:20:47 2-spaces is not common in C outside of GNU code 20:20:55 it is used, but not very commonly 20:21:05 Sgeo: If you use a graphical Emacs, weasels will peck at your face. 20:21:05 Sgeo: only legitimate hackers use nano on console. 20:21:10 And we will consider you inferior. 20:21:14 Weasels, that is. 20:21:19 `quote GNU Tar 20:21:21 665) Real Tar is GNU tar. You just ignore whichever features don't make you feel superior enough. 20:22:43 @let nDerivs f = genericLength . takeWhile (/=0) . iterate df . f $ dVar (x :: Expr) 20:22:44 Defined. 20:22:51 elliott: I think 2-char-widths is the most common indentation I've seen for C 20:22:57 whether via spaces or mixed space/tab 20:23:03 although I see 4 from time to time 20:23:18 and occasionally 8 when someone's used only tabs 20:23:24 8 is horrid 20:23:49 elliott: clearly this is the most useful piece of Haskell code written, yes? (nDerivs) 20:24:02 ais523: It's true that if you fudge the numbers with your unpopular opinions, then you can derive incorrect results, yes 20:24:28 elliott: well, what width would you say code's using if it's indented only with tabs? serious question 20:24:52 I think you either have to count it as 8, or ignore it altogether as if it's not 8, there's no information about what it's intended to be 20:24:58 It's not, it's indentation-width agnostic. But what matters for statistics is whatever the majority of its authors uses. 20:25:15 ooh, a tab-width discussion 20:25:20 elliott: no, what the majority of its readers use 20:25:23 olsner: no, i'm not giong to let it develop that far 20:25:36 olsner: it's an indentation-width discussion, which is not quite the same thing 20:25:41 the width of a tab is the width of a tab. 20:25:47 ais523: oh, ok 20:25:58 actually, I'm ending it here since this is boring 20:25:59 -!- GreaseMonkey has joined. 20:26:06 -!- GreaseMonkey has quit (Changing host). 20:26:06 -!- GreaseMonkey has joined. 20:26:07 the file can specify a tab width through a modeline, thereby indicating its indentation width even if it's all just tabs 20:26:25 > text "\t" 20:26:29 olsner: I was thinking about that 20:26:32 olsner: indeed (although the reader is of course not bound to it, it's just to make the developers' job easier) 20:26:35 > text " " 20:26:36 but modelines are getting increasingly rare nowadays 20:26:42 olsner: actually i think that shoudln't be used at all 20:26:47 because it overrides each developer's individual preference 20:26:50 and arguably, if a file is tab-indented, the modeline should say it's tab-indented but not the size of a tab 20:27:14 > text . fix $ (' ':) 20:27:27 kallisti: text is strict 20:27:30 thread killed 20:27:55 bleh, I was looking for statistics but couldn't find them 20:28:13 I wonder if mixed spaces/tabs, in C, is more common than pure tabs 20:28:17 it must be quite close, I imagine 20:28:28 elliott, ais523: The IOCCC submission page has an "additional authors" option. 20:28:32 So, collab is A-OK. 20:28:33 ais523: That term is ambiguous. 20:28:40 elliott: right, just not public publishing 20:28:44 -!- zzo38 has joined. 20:28:52 ais523: *Gregor: 20:28:59 and nothing in the rules forbids public publishing 20:29:00 err, right 20:29:06 I think mixed spaces and tabs is the most universally disliked indentation 20:29:10 Gregor: They have a page? I thought you were meant to use their tool to generate a file to mail. 20:29:19 elliott: hmm, has it changed? there definitely /was/ a rule about using publicly published stuff in a previous year 20:29:25 elliott: no, there's a submission form nowadys 20:29:25 unless you're just mixing styles haphazardly all around 20:29:29 olsner: it's an ambiguous term; I bet ais523 would label tabs-for-indentation, spaces-for-alignment under that 20:29:35 olsner: but that's the /reasonable/ way to use tabs 20:29:46 elliott: They appear to have a page, although the page may ultimately just say "OK, give these options to the tool", I haven't gone through the whole process yet. 20:29:51 and the only tab-based indentation scheme anyone's advocated for years 20:30:21 elliott: actually, I was planning to count tabs-for-indentation, spaces-for-alignment as pure-tabs 20:31:04 although there are problems, such as if you want comments to line up in a correctly indented version of f(); /* comment */ if(x) { g(); /* comment */ h(); } 20:31:54 -!- lambdabot has quit (Ping timeout: 240 seconds). 20:32:03 bye lambdabot 20:32:17 hmm, I generally dislike alignment 20:33:09 * kallisti likes alignment 20:33:14 * elliott generally doesn't align too, but only because text sucks 20:33:26 I'm pretty OCD about aligning things properly. 20:33:33 I don't want to align multiple lines in ()s unless I can make the parentheses as large as the lines. 20:33:50 kallisti: aligning things like assignments is usually Wrong, because you never want to look at it like a table 20:33:54 I'm talking about things like e.g. 20:33:58 int f(int x, int y, ..., 20:34:03 int z, ...) 20:34:05 for declarations 20:34:06 we need a Unicode character for flexible indentation 20:34:28 ais523: U+??? ELASTIC TABSTOP? 20:34:28 elliott: yep, that's easy to align correctly 20:34:33 elliott: well I usually align assignments based on similarity of purpose... 20:34:38 elliott: yes! 20:34:39 *???? 20:34:48 I just find it easier to read when they're aligned. 20:35:00 ais523: the problem is that they aren't reducible to a character, I think 20:35:05 or, hmm 20:35:06 yes they are 20:35:33 ais523: one problem with elastic tabstops is that they force some visual space 20:35:35 so they can't do 20:35:37 int f(int x, int y, ..., 20:35:38 int z, ...) 20:35:54 I'm tempted to say that tabstops beyond the start of a line should have no space after their previous column 20:36:02 so you use two spaces before eacht abstop if you want to space inline comments out 20:37:46 ais523: but anyway, the tab character works for elastic tabstops as used in code 20:38:01 since alignment should never really be semantically meaningful there, like it would be for a table, it degrades gracefully 20:38:51 elliott: the problem is that the viewer would need to recognise it 20:39:06 ais523: nah; using elastic tabstops to view files with old-style tabs works fine too 20:39:06 and I often view code in things that aren't intended specifically for the purpose 20:39:25 tabs at the beginning of the line still work fine, which is 99% of them 20:39:31 elliott: are you going to change the entire installbase of everything - browsers, email clients, IRC clients, etc - to interpret tabs as elastic? 20:39:38 ais523: you don't have to? 20:39:44 elastic tabstops gracefully degrade 20:39:59 no they don't, they line up the things you're elasticating wrong except at the start of a line 20:40:12 also, are too wide at the start of a line 20:40:33 because believe it or not, the vast majority of software currently interprets tabs as 8 regardless of whether you think that's right or not 20:41:41 ais523: (a) that doesn't matter much; being slightly uglier but still making sense is the /definition/ of graceful degradation (b) troll 20:42:24 elliott: but what I mean is, the vast majority of software in existence has no reason to start interpreting tab as meaning something different 20:42:44 if you added it as a new Unicode character, though, they'd start interpreting it correctly over time 20:42:53 haha! 20:42:56 no they wouldn't 20:43:03 elliott: Unicode support has got better over time, has it not? 20:43:16 elastic tabstops are algorithmically non-trivial 20:43:28 oh no, kerio's just started up with the ssh fanboyism again 20:43:52 and "programmers who have compilers fancy enough to do elastic tabstops" is very niche 20:45:23 elliott: OTOH, the whole thing that drives development of most programs is what programmers want 20:45:33 no it isn't 20:45:43 well, hmm 20:45:46 that's one of the falsest things you've ever said 20:45:50 and that's saying something 20:45:51 counterexample: Windows 20:46:01 something no programmer wants 20:46:15 elliott: hmm, I think I may be right if you don't allow for popularity 20:46:21 most programs are written by programmers 20:46:37 "most" over such a large, varied space without some kind of filtering is ridiculous 20:49:18 -!- elliott has quit (Remote host closed the connection). 20:49:54 -!- elliott has joined. 20:50:30 -!- derrik has quit (Quit: :)). 20:52:00 -!- lambdabot has joined. 20:53:00 * elliott finally blocks Flash. 20:53:43 but then... 20:53:48 HOW WILL YOUTUBE? 20:57:10 through newfangles like html5 video, presumably 20:57:53 YouTube doesn't support HTML5 for all videos, I think 20:58:09 Also, there's a way to enable individual flash elements usually 20:58:21 If I didn't think of that, I'd ask how elliott would Homestuck 21:01:26 kallisti: I use a different browser for YouTube (and other video sites) than I do from everything else 21:01:32 that's the simplest solution 21:01:56 .. 21:02:08 is having flash on by default really that big of a deal? 21:02:08 there are others, of course 21:02:17 (I also have a third browser, for accessing Google-related sites) 21:02:54 ais523 is clearly the reincarnation of rube goldberg 21:02:55 kallisti: well 99% of flash files are just for shitty ads 21:03:06 ah see I fix this by not having ads ever. 21:03:24 privoxy: making google chrome usable. 21:03:47 oerjan: I also have a /fourth/ browser for accessing programming language documentation, but that's more about convenience than privacy 21:03:51 also, IE6, for testing sites in IE6 21:06:18 I use this magical thing called adblock 21:09:04 kallisti: it isn't magical; understanding it will make it better 21:09:11 in particular, I use it to block quite a few things that aren't adverts 21:09:12 elliott 21:09:19 it's a generic annoyance-blocker, for me 21:09:33 for the web 21:10:31 ais523: how and this whole time I thought it was voodoo 21:10:35 s/how/wow/ 21:10:51 `quote elliott 21:10:52 188) elliott: i like scsh's mechanism best: it's most transparent and doesn't really serve a very useful feature. \ 191) elliott: it's hard to debug havoc on your mirror if you accidentally hit r, then a character could be multiple words long, depending on the task. \ 200) elliott: My university has two Poultry Science buildings. Two! \ 209) Vorpal loves the sodomy. 21:11:09 kallisti: it basically blocks images or elements by URLs or URL+rules for locating it on a page (ID, etc) 21:11:25 poor Gregor studying in such a fowl place 21:11:25 but basically, you see something that annoys you (particularly an image), you just right-click on it and tell adblock to get rid of it 21:11:45 (what do you _mean_ i used that pun yesterday too?) 21:11:55 oerjan: hmm, that indirectly reminds me of the day there was an enormous gas odoriser leak 21:12:05 that caused a bit of chaos 21:13:08 * oerjan doesn't know what gas odoriser is, but imagines it's something you add to odorless poisonous gas in order to make it noticable 21:13:19 which would explain the chaos 21:13:32 oerjan: not poisonous, it's added to methane 21:13:41 because leaked methane is a huge fire risk 21:13:45 right, explosive would work too 21:14:48 *+e 21:16:06 ais523: ....WOW REALLY? 21:16:08 I HAD NO IDEA. 21:16:50 this whole time I have been using AdBlock and had no clue how it operates, or the features it sports. 21:17:14 bleh, I'd love this all to be non-sarcastic, but I can't imagine it is 21:18:04 this whole time I have been thinking kallisti only spoke in literally truth 21:18:09 ais523: no I really am just as stupid as you think I am. :P 21:18:15 *-ly 21:19:34 oerjan: I was under the impression that every statement on IRC was truthfully spoken. 21:20:10 yeah me too 21:20:24 shocking, isn't it 21:21:22 I am don't know what think 21:21:44 and also everyone always use perfect grammar 21:21:44 "A new study in the Journal of Sexual Medicine said that men who put their penises in animals have a higher likelihood of penis cancer. " 21:21:49 interesting 21:22:17 but who were the control group 21:22:19 kallisti: cause or effect? 21:22:39 ais523: penis cancer increases the chance of bestiality, yes 21:22:47 ais523: are you suggesting that people who develop penis cancer -- yes 21:22:50 what elliott said 21:22:54 elliott: that's not /obviously/ false, right? 21:23:17 "A member of a pro-zoophilia group told The Huffington Post by email that the results of the study should prompt people to take precautions, like using a condom, when having sex with animals." 21:23:21 loooool 21:23:25 ais523: clearly this must be a proper study so it was obviously double-blind with neither the subject nor the experimenter knowing whether what they were fucking was an animal 21:23:26 X-D 21:23:38 But it doesn't cure penis cancer if you do it that way! 21:23:51 oerjan: hmm, what proportion of each group was female? I think I've noticed a potential skew in the statistics 21:24:14 surely this would have been noticed during peer review 21:24:22 ais523: "men who" 21:24:28 bleh 21:24:29 oerjan: no no, neither the subject nor the experimenter knew whether they had penis cancer or not 21:24:42 "We think that the intense and long-term SWA [sex with animals] practice could produce micro-traumas in the human penile tissue. The genital mucus membranes of animals could have different characteristics from human genitalia, and the animals' secretions are probably different from human fluids. 21:24:48 Perhaps animal tissues are less soft than ours, and non-human secretions would be toxic for us." 21:25:00 pleasant imagery 21:25:00 oerjan: unfortunately many of the experimentors later died of this, having not received treatment 21:25:16 SWA practice 21:25:23 just gotta go 21:25:24 practice my SWAs 21:25:52 "Perhaps animal tissues are less soft than ours" <-- this is false, see: toilet paper advets 21:25:53 adverts 21:25:56 * Sgeo remembers reading about fruit flies, or something, and I forget the exact details, but the male's semen could become toxic to the females 21:26:01 elliott: SWA? 21:26:07 puppies and koalas have soft tissues too 21:26:08 * kallisti googled for: mucus membrane goat vagina chemicals 21:26:11 ais523: "We think that the intense and long-term SWA [sex with animals] practice could produce micro-traumas in the human penile tissue. The genital mucus membranes of animals could have different characteristics from human genitalia, and the animals' secretions are probably different from human fluids. 21:26:17 ah 21:26:29 * Sgeo remembers reading about fruit flies, or something, and I forget the exact details, but the male's semen could become toxic to the females 21:26:36 Sgeo googled for: xxx fruit fly 18 or over 21:26:47 elliott: ................ 21:26:53 elliott: that was such a horrible joke. 21:27:00 in fact 21:27:01 you're such a horrible joke 21:27:07 fruit flies rarely live to 18 21:27:12 it crossed the so-horrible-it's-good coundary 21:27:13 ais523: I was thinking of saying that 21:27:16 yes coundary 21:27:19 i recall that non-human mammals have barbed penises but this would be more a problem for bestial women, obviously 21:27:32 elliott: I was actually going to make a joke along those lines earlier, but didn't have a good opportunity 21:27:35 oerjan: that's not a universal thing 21:27:38 thanks for giving me one 21:27:44 ais523: haha 21:27:49 oerjan: I know cats in particular have those. 21:27:59 kallisti: i vaguely thought nearly all mammals did 21:28:10 whereas snails copulate by stabbing each other in the neck 21:28:46 Also some humans. 21:28:50 oerjan: oh hmmm maybe 21:28:59 hmm, snail bestality doesn't sound like fun 21:29:12 oerjan: I think it's common in mammals anyway 21:29:59 gah, now I have a huge urge to reference the hedgehog song 21:30:05 so I will, and see who catches the reference 21:30:21 ais523: i cannot be bothered at all? 21:30:50 oerjan: hmm, the original was a bit more vulgar, but that's close enough 21:31:04 oerjan: apparently the lack of a certain gene removes barbed penises and results in larger brains? or something? 21:31:19 ais523: was that the reference? 21:31:28 (on another note, I love the way that the standard way to indicate that you get a reference is to make a different obscure reference to the same thing) 21:31:39 ais523: oh, i only know it from some discworld books where it may have been bowdlerized 21:31:44 ah, right 21:32:07 I'm referencing the discworld books too, but it almost certainly /was/ bowdlerized in your version 21:32:14 as that seems more likely than antibowdlerizing it in mine 21:32:26 oerjan: http://www.lspace.org/fandom/songs/hedgehogsong.html 21:32:36 _or_ i may simply have misrembered the words 21:32:43 elliott: I take it you searched rather than having the link mesmerized? 21:32:58 ais523: My brain actually stores everything in URL form. 21:33:02 For instance that previous line was 21:33:13 http://ais523.elliott.i.take.it/you/searched?rather=than&having=the#link,mesmerized 21:33:16 bonus points if you give a link to the logs for that line? 21:33:19 oh, boring 21:33:20 I don't see what mesmerification has to do with it though. 21:33:30 ais523: I never said they were /useful/ URLs 21:35:12 now I'm wondering if that URL is valid, but don't want to click it just in case it is 21:35:15 kallisti: _or_ humans just improved on the bonobo culture by making it less painful 21:35:19 take.it is almost certainly a valid domain 21:35:33 it is 21:35:34 it's a 404 21:35:35 but that doesn't say much about what it does with subdomains it doesn't recognise 21:35:39 404 - Questa pagina non esiste o è stata rinominata 21:35:41 404 seems reasonable 21:35:47 take.it is 403 :( 21:35:54 who 403s their homepage? 21:35:58 *bonobo-style, we're not their descendants... 21:36:04 (besides, how do you log in if the homepage is 403?) 21:36:14 (and you aren't using HTTP auth?) 21:36:21 ais523: log in to /what/? 21:36:28 elliott: whatever causes it to stop 403ing 21:36:36 nothing, one presumes 21:36:42 most common 403 reason is lack of auth, isn't it? 21:36:47 no 21:36:51 and you don't 403 an important page like a homepage unless there's some way to view it 21:36:54 most common 403 reason is someone put 403 there 21:36:58 to stop people viewing it 21:37:03 e.g. a subdirectory that isn't meant to be web-exposed 21:37:13 yep, but that doesn't apply to the homepage itself 21:37:17 like internal files for some web application that exists in the web root 21:38:01 yep, but they're unlikely to be called index.html 21:38:10 elliott: URLS should be graph-based instead of strictly trees. 21:38:21 I don't even know what that means exactly. 21:38:58 ais523: yes that is exactly 1 possibility in a set of infinite possibilities 21:39:03 ais523: so not very likely 21:39:06 * kallisti good math 21:39:25 ABSTRACTION IS HARD 21:39:44 kallisti: if the probability really is 1/infinity, the likelihood can still be quite high 21:39:54 elliott: CONCRETE IS ALSO HARD 21:40:02 (for likelihood, just think probability except that you multiply everything by infinity to get it back into non-infinitesimal units) 21:40:08 (well, it's more complicated than that, but it always is, right?) 21:40:27 ..wat 21:40:47 kallisti: ordinary probabilities add to 1, right? 21:40:48 ais523: elliott isn't asking you to kick me, i'm disappoint 21:40:51 likelihoods integrate to 1 21:41:02 ais523: are you just making stuff up 21:41:02 oerjan: I thought concrete was more tough than hard 21:41:05 or is that an actual thing. 21:41:05 kallisti: no 21:41:14 it's a perfectly plausible thing 21:41:18 for, say, probability distributions 21:41:23 which return reals 21:41:24 right but do people call them likelihoods 21:41:29 the chance of getting any particular real is 0 21:41:30 or is just, a... continuous probability distribution. 21:41:45 and that name is used for them sometimes; I've heard "probability density" too, but it's a boring name 21:42:30 right well it's meaningless to talk about the probability of a single real in a continuous distribution 21:43:02 unless the measure has atoms 21:43:23 s/atoms/discrete units/ 21:43:42 well atom is the term usually used in ergodic theory 21:43:54 and probably measure theory 21:43:59 ........... 21:44:02 ergodic? 21:44:13 lebesgue space ftw 21:44:14 kallisti: http://en.wikipedia.org/wiki/Likelihood_function 21:44:15 seriously you have to making that up. -googles- oh, no. 21:44:18 ... 21:44:32 -!- oklopol has changed nick to mathematician. 21:44:34 [elliott@dinky ~]$ grep -r s2w . 21:44:35 ./.bash_history:grep -r map_s2w . 21:44:35 wrong directory 21:44:44 i hope this clears things up 21:44:58 -!- mathematician has changed nick to flyingdick. 21:45:10 this is better thought 21:45:12 *though 21:45:47 f 21:46:43 f 21:47:34 flf 21:47:41 flyingdick: oh my, I didn't realize your credentials. Excuse me for thinking (read: joking about how) ergodic sounds like a made up thing. 21:47:43 f|f|f 21:47:55 oerjan: haha at whatever font you're using 21:47:56 wait what 21:47:58 unless that was deliberate 21:47:59 you're lucky i didn't kick you out of here 21:48:01 asshole 21:48:04 that was just 21:48:06 wrong 21:48:12 ais523: no i just need glasses, obviously 21:48:12 hmm, why doesn't oklopol have op powers 21:48:13 -!- flyingdick has changed nick to oklopl. 21:48:14 there's no way that could go badly 21:48:17 -!- oklopl has changed nick to oklopol. 21:48:21 sorry i was kind of a dick there 21:48:32 -!- elliott has changed nick to oklopl. 21:48:37 yeah i think i should have op powers 21:48:40 hi 21:48:44 -!- oklopl has changed nick to elliott. 21:48:50 yeah but seriously though give oklopol op powers 21:48:51 i would kick everyone who doesn't blindly accept everything i say 21:49:05 oerjan: /msg chanserv #esoteric op oklopol, thanks 21:49:08 especially if they're right 21:49:08 elliott just likes to find excuses to kick me indirectly. 21:49:15 why would he want to kick you 21:49:21 because that's.... what 21:49:24 is that even a question 21:49:37 yes 21:49:45 BECAUSE THIS IS WHAT ELLIOTT DOES. 21:49:46 -!- Klisz has quit (Read error: Connection reset by peer). 21:49:48 it's like an axiom. 21:49:57 like, if there were a typeclass called WantsKick 21:50:00 kallisti is so paranoid 21:50:01 then it would be like 21:50:10 instance WantsKick Elliott Kallisti 21:50:13 elliott wants to kick us and hear the lamentations of our women, that just goes with the evil overlord thing 21:50:23 you don't _have_ women. 21:50:30 details. 21:50:48 also some here do. 21:51:02 some here are actually _married_, unless they've been lying. 21:52:46 -!- Klisz has joined. 21:52:51 oerjan: I'd say the pairing graph for #esoteric is mostly edgeless. 21:53:56 In the area of graph theory in mathematics, a signed graph is a graph in which each edge has a positive or negative sign. 21:53:59 interesting 21:54:10 sign this graph, please 21:54:25 hmmm... but no zero edge? 21:54:40 MY GRAPHLANG HAS A ZERO SIGN 21:54:45 like... whatever the sign of zero is. 21:54:50 but in graph edge form. 21:55:07 past edge = -, present edge = 0, future edge = + 21:55:09 or something 21:55:31 hmm, w2s can go eventually but we need it for now; s2w is used in multiple cases... 21:55:48 but i don't really want _two_ functions to do the same thing 21:57:23 elliott: I thought the Haskell slogan was "there's more than one function to do it" 21:57:31 not haskell 21:58:14 yeah haskell only has the bare minimum, like map, fmap, (.), liftA, liftM and (<$>). 21:58:26 how is (.) like map/fmap? 21:58:38 ais523: (e ->) instance 21:58:41 :t (.) 21:58:41 forall a b (f :: * -> *). (Functor f) => (a -> b) -> f a -> f b 21:58:51 god bless caleskell 21:59:04 calemeriskell 21:59:45 I thought (.) was function composition; is that a special case of a general definition? 21:59:53 Sgeo: updelskell 22:00:18 kallisti, when have I ever trolled you about updates? 22:00:40 Sgeo: why would you confuse yourself with me? 22:00:44 clearly I am doing the trolling. 22:00:53 eiieojwoiiwoijwoijeoiwjow 22:00:55 :) 22:01:01 I just wish I knew why you were doing it 22:01:18 Sgeo: it's because I love you. :3 22:01:20 ais523: that's cale's idea of letting lambdabot have generalized versions of standard functions 22:01:28 :t (++) 22:01:28 forall m. (Monoid m) => m -> m -> m 22:01:32 :t flip 22:01:32 forall (f :: * -> *) a b. (Functor f) => f (a -> b) -> a -> f b 22:01:46 Sgeo: friendship troll 22:01:52 oerjan: hmm 22:02:06 ++ on Monoids disturbs me 22:02:12 wat 22:02:25 (++) should obviously be generalised to monoids 22:02:26 mostly because the monoid version of ++ is mostly just coincidence that append is the most appropriate operation on lists 22:02:35 elliott: yes, agreed; I just disagree with ++ being the name for that 22:02:43 ...why 22:02:43 ais523: then you disagree, and misread my statement 22:02:44 ais523: that's what it was like in haskell 1.4, i think, or maybe it was MonadPlus. 22:02:44 it's great. 22:02:52 oerjan: it was MonadPlus 22:03:01 * elliott would rather remove (++) and make (<>) the monoid operation 22:03:06 elliott: I'd be fine with that 22:03:23 ++ could be MonadPlus and <> could be Monoid 22:03:31 ais523: really? 22:03:35 ais523: (++) doesn't inherently mean append. 22:03:39 it's just two symbols. 22:03:43 hmm, perhaps 22:03:52 kallisti: MonadPlus needs to go away 22:04:03 OCaml uses @ for list append (and its operators aren't polymorphic), I was interesting that it had a one-char name for something that specific 22:04:09 elliott: I disagree, we should have two more of them, and two more Monoids 22:04:16 although I guess it's nice to have with MonadZero, which is nice because you don't need a constraint per a 22:04:34 ais523: you was interesting? 22:04:38 elliott: also n-parameter monoids, for monoids with two type parameters and more. 22:04:44 elliott: interested 22:04:53 also, *you were interesting? 22:05:02 no, you was definitely interesting 22:05:05 grammar transformations of bad grammar has rules! 22:05:44 grammar of bad grammar 22:07:30 ais523: *have 22:08:06 elliott: yep, I Muphried myself somewhat there 22:08:15 which is strange, as I mostly don't get caught in Muphry's Law 22:08:21 :) 22:09:06 oh, youtube redesigned 22:09:09 everything's so different 22:09:15 `? monoid 22:09:17 Monoids are just categories with a single object. 22:09:20 ais523: oh, oops, i was trying to make it incorrect 22:09:49 elliott: they've... Facebookitized it. 22:09:54 what 22:09:55 elliott: what, /again/? 22:10:17 elliott: they're using a similar layout to what facebookuses 22:10:24 chrome users: is chrome adblock or adblock plus for chrome better? 22:10:28 and can either block youtube video ads? 22:10:44 I believe adblock plus can 22:10:55 I dunno anything about chrome adblock 22:10:57 but adblock plus works fine. 22:11:04 it's just called "adblock" 22:11:04 I sometimes forget the internet has ads. 22:11:15 it's more popular than adblock plus, though probably only because it's older 22:11:31 ofc adblock plus is the most popular extension for any browser 22:11:35 elliott: oh wait... 22:11:36 but the codebase is different for chrome, so :P 22:11:40 elliott: no I'm using Adblock apparently 22:11:54 kallisti: right. not the same thing, it rides on having a similar name to the unrelated Firefox extension... 22:12:02 Adblock Plus is the official port 22:12:07 ah 22:12:25 I wonder which is better. 22:12:32 that's what I just wondered. 22:13:29 -!- Ngevd has joined. 22:14:02 oh hmm 22:14:04 -!- Phantom_Hoover has quit (Ping timeout: 244 seconds). 22:14:07 I never did figure out where to put that patch 22:14:10 looks like adblock plus uses the same filtering engine as the firefox version's 22:14:12 Ngevd: what patch 22:14:19 For Dungeons of Drednor 22:14:47 s/dno/dmo/ 22:15:15 elliott: reviews for Adblock Plus seem to suggest that it is better 22:15:16 imagine that. 22:15:22 howso 22:15:37 "Sorry, but i thinks it works fine. I have NO adds on any site. and it is still much faster than addblock! adblock (that without plus) slows down every webpage i visit. ABP ist still "the same" like adthwart (only the laughing devil i miss :) )" ;; this person seems too stupid to trust 22:15:39 -!- boily has quit (Quit: WeeChat 0.3.6). 22:16:12 meh, it seems better 22:16:13 * elliott installs 22:16:16 lol 22:16:27 elliott: it's a good thing you consulted an expert opinion 22:16:33 better against the adds 22:16:57 "Block ads inside YouTube videos" yay 22:17:27 -!- Jafet has quit (Quit: Leaving.). 22:18:00 they both more or less use the same filters. 22:18:08 though Adblock seems to have more foreign language filters in the checklist 22:18:15 CHAINSAW EVERYONE AND CHAINSAW EVERYTHING 22:18:25 oklopol: i agree, someone op oklopol 22:18:26 oerjan: op oklopol 22:18:29 ais523: op oklopol 22:18:58 well really i deserve ops, i've been here longer than anyone else 22:19:00 elliott: just because someone's stupid doesn't mean they're wrong 22:19:32 ais523: very true, but they don't seem articulate enough about their technical experience to have judged it correctly 22:19:48 yep, so if they're right, it's by chance 22:19:51 and "Sorry, but i thinks it works fine." seems to imply it's a reaction to a negative review, which makes me trust it less 22:21:17 olsner: You use vim, right 22:21:24 elliott: I do indeed 22:21:41 olsner: do you move with vikeys or numpad? 22:21:43 olsner: What indentation style do you use 22:21:51 ais523: vim does numpad? 22:22:04 oh, numpad has arrow keys without numlock 22:22:06 ais523: usually arrow keys :> 22:22:08 you can't go diagonally though 22:22:15 elliott: the discussion came up in #nethack recently, and someone said they used numpad for vim but vikeys for nethack 22:22:31 haha 22:22:35 joking, surely? 22:22:39 olsner: olsner: What indentation style do you use 22:22:53 elliott: I don't think so 22:23:08 elliott: I use tabs as though there spaces. 22:23:10 ais523: what was kerio ssh-fanboying about, btw? 22:23:14 so usually 8 tabs per indent 22:23:18 let's see... sw=4 ts=4 sts=4 noet cinoptions={0,:0,t0,g0,^0,e0,n0,p2s,(2s,f0 cinkeys=0{,0},0),:,0#,!^F,o,O,e 22:23:25 olsner: no, that was a non-vim question :) 22:23:30 I guess that's the relevant part of my vimrc for indentation style 22:23:43 help vim scares me. 22:23:46 vim scares me more than emacs. 22:23:50 I actually know at least one person, probably more, who's a casual vim fanboy (think offhand Emacs-bashing and using vim at every opportunity) yet spends their time moving around with the arrows in insert mode 22:24:11 elliott: and asking if there was an ssh port for the amiga, when the topic came up about how good it was at playing nethack 22:24:19 ais523: I can yell at them for you, if you'd like 22:24:30 topic's changed, unfortunately 22:24:34 you could yell at him on general principles 22:24:35 I meant 22:24:35 I actually know at least one person, probably more, who's a casual vim fanboy (think offhand Emacs-bashing and using vim at every opportunity) yet spends their time moving around with the arrows in insert mode 22:24:40 oh 22:24:42 that's real-life knowing 22:24:47 so you'd have to come to Birmingham 22:24:48 oh 22:24:49 my condolences 22:24:53 ais523: I do quite a bit of arrow-moving in Emacs when I probably could avoid it sometimes. 22:24:56 * elliott adds to "list of reasons to avoid birmingham" 22:25:03 elliott: heh 22:25:05 -!- Phantom_Hoover has joined. 22:25:29 the person I have in mind is my other boss (I have two part-time jobs, he's the boss for half the teaching one rather than Dan who's the boss for the other half + the PhD) 22:25:35 -!- pikhq has joined. 22:25:52 -!- pikhq_ has quit (Read error: Operation timed out). 22:26:02 -!- Ngevd has quit (Quit: dredmor time). 22:26:24 hmm, is Dredmor good enough that I should buy it, I wonder? opinions of the channel? 22:26:26 and how much time is left? 22:26:44 elliott: oh and google has once again changed 22:26:55 elliott: I never learned what the style is called 22:26:59 ais523: I haven't played it yet, but have you played any introversion games? 22:27:03 but the one with braces on their own lines and unindented, tab indented, tabs at 4 spaces (obv. works fine for other tab widths...) 22:27:08 I'm not sure; probably not 22:27:15 olsner: Any alignment? 22:27:17 unless I've played one without mentally noting the developer, which is possible 22:27:17 ais523: Buy it 22:27:18 olsner: gross 22:27:29 elliott: no, I just indent continuations by one or two indents 22:27:35 olsner: I prefer the open brace on the same line as the statement 22:27:41 ais523: Uplink is amazing, Darwinia is meant to be even more amazing but I haven't played it yet, DEFCON is cool 22:27:48 ais523: DID YOU SEND A PAPER TO STACS 22:27:56 oklopol: I don't think so 22:27:58 ais523: 5 days are left 22:28:12 -!- oerjan has quit (Quit: Good night). 22:28:20 do you know stacs? i suppose it might be for more theoretical stuff than yours 22:28:31 elliott: gah, they sent me an email in Markdown, that's almost enough to boycott them 22:28:33 oklopol: I don't 22:28:44 ais523: err, Markdown was intended to be suitable for emails 22:28:48 -!- Patashu has joined. 22:29:03 ais523: but who did? 22:29:08 elliott: Humble Bundle 22:29:15 elliott: it would be cool if df allowed you to have more control over how your soldiers fight 22:29:16 and () around URLs is just so ugly 22:29:19 * elliott receives those as HTML mail 22:29:22 elliott: maybe with like... scripts. 22:29:27 ais523: that's why you use the alternate link syntax 22:29:30 simple declarative scripts 22:29:35 elliott: that one was using []() 22:29:36 elliott: have I answered your question now? :) 22:29:39 that you can turn on and off. like "fighting styles" 22:29:43 is /that/ enough of a reason to hate the email? 22:29:44 olsner: yes, unfortuantely it means you're useless 22:29:51 ais523: no 22:30:23 oh noes! he said I'm useless 22:31:00 olsner you know you alright. 22:31:04 useless sounds fun when you pronounce the use as though it were the verb use 22:31:13 yooze instead of yoose. 22:31:30 also different emphasis 22:31:41 -!- Klisz has quit (Ping timeout: 248 seconds). 22:31:44 wait, I know! 22:31:48 -!- Klisz has joined. 22:31:53 gah, seems that Amazon is memorizing my credit card number too 22:32:04 elliott: what use did you hope to have of me? 22:32:06 in /addition/ to running no security checks on the card number 22:32:09 well isn't that nice, you don't have to give it to them every time 22:32:12 ais523: it just /really/ wants everything to be convenient for you doesn't it? 22:32:20 err, debit card 22:32:28 olsner: if you used tabs-for-indentation-spaces-for-alignment and vim 22:32:45 kallisti: it's reasonable from Amazon's point of view, but not from the bank's 22:32:50 elliott: I use all-spaces, out of habit from my Python days. 22:33:03 ais523: fuck the bank. :P 22:33:05 kallisti: you also don't use vim afaik 22:33:16 elliott: what makes vim important here? 22:33:18 I think I've only seen alignmentism together with fundamentalist spaceism 22:33:29 kallisti: you don't know 22:33:42 elliott: wow you have amazing deduction skills. 22:35:19 oh well, I believe it has become DS9 time again 22:35:25 olsner: is "alignmentism" kind of like "being really OCD about aligning things"? 22:35:28 because I'm that. 22:35:59 I might switch to tabs though. it makes more sense to me. 22:36:15 tab-indents with spaces for alignment 22:36:16 kallisti: something like that yes 22:36:40 elliott: I'm also considering boycotting Introversion for making every single image on their webpage set a cookie 22:37:25 ais523: oh no, not cookies 22:37:43 kallisti: there is no reason to set a cookie in more than one image from the same domain in a page 22:37:57 and it aggravates people who approve/disapprove all cookies manually 22:38:02 I too am really concerned about this common nearly unavoidable feature of modern websites. 22:38:12 ais523: maybe you shouldn't do that. that sounds terrible. 22:38:14 kallisti: cookies can be useful, when they have a reason to exist 22:38:28 like, basically every webpage starts with you clicking a bunch of dialogs right? 22:38:34 the only sensible use of setting a cookie in an image that I've seen is Wikimedia's cross-site logon thing, though 22:38:42 kallisti: far from every, maybe about 5-10% 22:38:53 most of them are well-designed cookie-wise, and only require a couple of allow/deny 22:39:14 quite a lot of sites set two cookies then modify one; I think it's some sort of anti-bot mechanism 22:40:23 elliott: hmm, Uplink's premise seems very mindlessly destructive 22:40:33 all the Introversion advertising just implies to me "this is not the sort of game ais523 would enjoy" 22:40:47 * elliott has never once looked at the advertising. 22:41:07 * kallisti has adblock installed in his brain. 22:41:32 if I go to the mall, then the people trying to advertise stores just disappear when they start talking to me. 22:41:46 I'd say only 99% is mindless destruction 22:41:52 (note: I don't actually go to the mall, but it's happened before) 22:42:01 ais523: anyway, Darwinia is one of the best-reviewed games I've ever heard of, if that means anything 22:42:07 hmm 22:42:07 ais523: best game ever is magicka 22:42:14 I suppose I'd prefer to trust reviewers I trust 22:42:20 elliott, is it safe to say that 1% of Uplink is NOT mindless destruction? 22:42:29 I bought Advance Wars based entirely on the recommendation of Teletext's computer game review column 22:42:35 and then went and bought all its sequels 22:42:37 magicka is 100% careful deliberate mindless destruction 22:42:40 Uplink would be hard to play if you just mindlessly destroyed thinsg. 22:42:47 Generally people who want files stolen don't want you just to trash a machine. 22:42:58 elliott, I'm in particular referring to plot 22:43:01 elliott, is it safe to say that 1% of Uplink is NOT mindless destruction? 22:43:20 Sgeo: Umm, not the Arunmor storyline? 22:43:22 Phantom_Hoover is typing. 22:43:25 It's more than possible to go through the game having never deleted anything, although I think the story does require it. 22:43:31 elliott, I was referring to that in particular 22:43:38 "Half the plot" = 1% of the game 22:44:05 ISTR that the Arunmor storyline requires at least one destructive attack. 22:44:13 elliott: didn't you know that plot is only like 2% of a game? 22:44:34 ais523, there you go. Half the plot, minus a bit, is not mindless destruction 22:44:55 haha 22:45:03 magicka is probably better than uplink 22:45:09 ais523: anyway, even if the /idea/ is mindless destruction, the gameplay isn't 22:45:10 I base this on my extensive knowlege of uplink 22:45:12 (not really) 22:45:16 Oh, wait, no it doesn't. 22:46:02 It requires that you destroy Arunmor's ISM as a false flag operation, but that's hardly mindless destruction. 22:46:13 GAH SPOILERS EVERYTHING IS RUINED 22:46:41 Honestly, hardly any of Uplink is mindless destruction. 22:46:59 It's not like even Andromeda hire you to FUCK SHIT UP. 22:47:38 Yeah they do, they just think the shit is pernicious. 22:48:45 ais523, anyway, Darwinia is extremely good. 22:49:05 I can't even seem to get started with Darwinia 22:49:15 * Sgeo sucks at Darwinia. Can barely do the tutorial 22:49:28 You can't make it through Garden? 22:49:31 Seriously? 22:49:48 The level which consists of "create squad, right click until virii are gone." 22:50:10 Sgeo: don't ever play starcraft. 22:51:51 The virii keep killing my squad 22:52:12 It took a while before I worked out that I needed to make a squad 22:52:22 * Sgeo is easily amused by the Darwinia intros 22:52:28 Sgeo, did you know that there are these things called ranged attacks. 22:52:46 You can use them to pick the virii off before they get near enough to damage your squad. 22:53:42 Phantom_Hoover: real-time strategy? 22:53:57 It's kind of a mixture, I suppose. 22:54:19 Darwinian control is RTS, but I still haven't reached the point where that's meant to come in. 22:54:28 I think I just came up with the worst game idea ever: Mario Party MMO 22:54:53 Otherwise, it's kind of a top-down shooter thing? 22:55:33 * Sgeo decides that playing Darwinia windowed is not feasible 22:56:52 Phantom_Hoover: a mixture with which? 22:57:10 kallisti: there's a game mode in Pokémon HeartGold/SoulSilver which is pretty much exactly that 22:57:11 Yay wireless headphones 22:57:14 but with Pokémon instead 22:57:15 Top-down shooter thing. 22:57:29 Sgeo, I managed fine. 22:57:50 ais523, you directly control squads by left clicking on destinations and right clicking to fire. 22:58:22 hmm, like an RTS except requiring more micromanagement 22:58:27 You control Darwinians by promoting one of them to an officer, and controlling that through a similar method to a squad, except all the commands tell the Darwinians where to go. 22:58:51 Not really; it's designed so you only use one squad at a time. 22:59:16 They have autofire, but it's basically useless. 22:59:41 bleh, my TV Tropes links-clicked-per-page rate is now sufficiently below 1 that I can never stay there very long 23:00:18 ais523, probably the best way to see what the gameplay's like is just to play the first level, which is short and extremely easy if you're not Sgeo. 23:00:27 * Phantom_Hoover → sleep 23:00:27 ais523: which mode is the mario party mmo? 23:00:28 -!- Phantom_Hoover has quit (Quit: Leaving). 23:00:31 but that'd mean downloading and installign and running the game 23:00:40 olsner: is there a way to stop vim from creating the .swp files 23:00:44 coppro: oh, I've forgotten what it's called, but it has Poké Floats in it 23:00:47 i keep getting OMG SWAP FILE when i open a vim 23:00:54 ais523: that's pretty much exactly how starcraft works. left click to move right click to fire. 23:01:13 ais523: that's a smash bros stage 23:01:36 coppro: I know, it's based on the Pokémon game mode (all smash bros stages but final destination are references to /something/) 23:02:11 Hanenbow I don't think is a reference to anything in the Nintendo universe. 23:02:19 but it's kind of a special stage. 23:02:28 also, just to nitpick, Battlefield isn't based on anything. 23:03:14 oh nevermind 23:03:22 Hanenbow (pronounced Hay-nin-bow) is a new unlockable stage in Super Smash Bros. Brawl. It comes from a music-themed Nintendo DS game, which features extensive interactivity with the microphone; called Electroplankton. 23:03:38 coppro: found it: Wi-fi Plaza 23:03:48 http://bulbapedia.bulbagarden.net/wiki/Wi-Fi_Plaza 23:05:03 hmm, I hate booleans 23:05:22 elliott: use Maybe () instead? 23:05:39 elliott: use const and flip const instead. 23:05:40 heh 23:05:43 much better. 23:05:46 those are just church booleans! 23:05:50 EVEN BETTER 23:07:14 elliott: OK, use 1 and 2 then, and make it arbitrary which is true and which is false depending on what you want to use them for 23:07:26 23:07:30 these are all just different representations of booleans ;P 23:07:31 *:P 23:07:48 elliott: OK, then, use 01XLHWU- 23:08:00 hmm, I've probably forgotten a possible value there 23:08:02 elliott: use Maybe Bool instead 23:08:02 "The ulimit -v command can be used with ASan-ified binaries. However, you should remember that ASan consumes 16 terabytes of virtual memory for shadow state and the ulimit -v value should be set accordingly." 23:08:13 elliott: three-value logic ftw 23:08:26 elliott: or use integers for many-valued logic!!! 23:08:29 kallisti: VHDL std_logic beats three-value logic out the water 23:08:45 it models error conditions for booleans as well as the usual values 0 and 1 23:08:54 oh, and Z 23:08:58 01XLHWZU- 23:08:59 there we go 23:09:01 nine-valued booleans 23:09:05 ais523: also unknown 23:09:12 that's U, one presumes 23:09:41 not quite; U means unknown state at power on, - means a value that's being disregarded (i.e. don't know and don't care) 23:09:52 either is a reasonable description of unknown 23:11:11 Are any of them mu? 23:11:18 mu is a !boolean 23:11:34 elliott: if you solve the halting problem you can just use terminate and non-terminate 23:11:48 that's another representation of a boolean! 23:11:55 Well yes, it's not boolean, that's why it's included~ 23:12:03 elliott: I'm not sure I understand what you want to replace booleans with then. 23:12:04 Or should be. 23:12:04 MDude: nope, the problem with mu is that it unasks the question, and the hardware equivalent would be sending electrons in the other direction 23:12:16 except that typically, electrons flow one way for true and the other way for false 23:12:29 ais523: ONLY TYPICALLY!!! 23:12:40 kallisti: I never even said I wanted to, I just said I hate booleans 23:13:42 I thought mu was more just "your question is stupid presumes something that is wrong". 23:13:51 -!- Klisz has quit (Quit: You are now graced with my absence.). 23:13:56 your grammar is stupid presumes something that is wrong :D 23:14:00 The most important thing to remember is: Don't Panic. Or at least, panic at your leisure. 23:14:06 * Sgeo remembers a post on Less Wrong 23:14:46 -!- Klisz has joined. 23:14:52 elliott: dude I just figured out natural language 23:15:00 so basically you use a clever evaluation strategy. 23:15:16 for example: "your mom" evaluates to the value "your mom" 23:15:28 which can then be composed with other expressions 23:15:40 hmm, this is annoying 23:15:54 http://lesswrong.com/lw/po/three_dialogues_on_identity/ 23:16:02 ais523: quick, should I worry about a duplicate hashtable lookup? 23:16:22 elliott: nah it's still O(1) 23:16:25 elliott: if you're not using a cryptosecure hash, yes 23:16:32 (:P) 23:16:35 you're going to get collisions in practice 23:16:45 ais523: err, wait, what? 23:16:47 it's OK to use an inefficient resolution mechanism unless you have a very small hashtable, though 23:17:01 elliott: I don't think anyone uses cryptohashes for hash tables 23:17:07 ... 23:17:10 but, you never know, with enough memory/disk space you /could/ 23:17:33 -!- sebbu has quit (Ping timeout: 248 seconds). 23:17:36 ais523: are you sure you haven't misread my statement? 23:17:36 and for something like git/sg's stores by hash, it makes sense 23:17:39 elliott: no 23:17:46 ais523: try looking at it again 23:17:58 I'm having difficulty parsing "duplicate hashtable lookup" 23:18:23 aka two identical hashtable lookups to do one operation 23:20:41 oh dear, I killed the wrong chromium proecss 23:22:44 it can recover, right? 23:22:57 no, it was the root one 23:23:50 elliott: if Firefox gets accidentally killed, even the whole thing, it can go back to the point it was at upon restart 23:24:02 often with a confirmation in case one of the pages crashes it again 23:24:05 so can chrome 23:24:17 yep, that's what I was referring to, I'd be shocked if Chrome couldn't 23:27:10 -!- sebbu has joined. 23:27:10 -!- sebbu has quit (Changing host). 23:27:11 -!- sebbu has joined. 23:28:20 ais523: pls reassure me that hashtable lookups are fast 23:28:34 elliott: they're almost as fast as array lookups on modern processors 23:29:29 ais523: but that's one, two, three, four, five -- five array lookups in total!! five duplicated array lookups! 23:30:10 elliott: wow, I wouldn't have expected /you/ to reference Sesame Street 23:30:35 Was that even aired in the UK? 23:30:38 (which was recentishly in the news because someone hacked their YouTube channel to show hardcore porn) 23:30:41 pikhq: indeed, on Channel 4 23:30:51 * elliott wasn't doing it intentionally, but I think there was some kind of ... subconscious resonant recognition before he hit enter. 23:31:07 I was actually counting them out. 23:31:19 pikhq: doesn't sesame street air /everywhere/? (also, "was"?) 23:31:39 elliott: I'm not sure if it still airs nowadays in the UK 23:31:42 admittedly, I haven't checked for years 23:32:44 elliott: Eh, could be. I'm not in the habit of monitoring where children's programming is aired. 23:33:19 /* relies on implementation-defined arithmetic shift behaviour */ 23:33:20 I like how I leave comments for things like this but gleefully name new types foo_t 23:35:34 bool world_handle_chunk(jint x0, jint y0, jint z0, jint xs, jint ys, jint zs, struct buffer zb, struct buffer zb_meta, struct buffer zb_light_blocks, struct buffer zb_light_sky, bool update_map); 23:35:40 I can't help but feel this function needs a few more parameters. 23:36:34 bool world_handle_chunk(struct world_handle_chunk_args); There you go. 23:36:34 wait, why is it never called with the last parameter set to false... 23:36:45 pikhq: that's fewer! 23:37:18 And then you can call it with world_handle_chunk((struct world_handle_chunk_args){ ... }) 23:37:30 (pointless unless you want a lot of things to be 0, of course) 23:43:29 -!- MSleep has joined. 23:45:49 -!- ais523 has quit (Ping timeout: 248 seconds). 23:46:53 -!- MDude has quit (Ping timeout: 248 seconds).