00:00:13 oerjan: you mean, looking at the value at a cursor? 00:00:26 that's not bad 00:00:47 well, finding the neighboring Seq's and stuff 00:01:01 oh, OK 00:01:06 so accessing the value at a cursor is still O(1)? 00:01:09 oh hm 00:01:17 well yeah that should be possible 00:01:29 right 00:01:58 * elliott is probably more interested in the mutation performance :P 00:03:40 well to move a cursor along an edge, you would need to look up the neighboring Seq's and adjust them 00:04:29 oh in addition to neighboring Seq's there may also be neighboring collapsed trees with no other cursors adjacent 00:04:57 i may not be following as closely as i thought >:) 00:05:04 so do you have any idea what this would look like for an actual tree structure? 00:05:23 i think this may be a graph minor construction 00:05:51 erm 00:08:39 oerjan: so basically each Seq can have up to 2 cursors as parents? 00:08:43 -!- TeruFSX has quit (Read error: Connection reset by peer). 00:08:45 *-.-.-*-.-. *-* 00:08:45 | -> | 00:08:45 .-*-.-.-* *-+-* 00:08:49 CakeProphet: yes 00:09:12 oerjan: that's pretty :') 00:09:23 the left part is the original tree with *'s as real cursors, the right is the collapsed tree, + is a virtual cursor 00:10:15 ok 00:11:34 oerjan: what would be wrong with a BST of cursors that point to Seq leaves? (I don't think this terminology makes sense when dealing with graphs but whatever) 00:11:39 each of the right part - and | would be a Seq of the lines collapsed to it. oh hm i guess that doesn't show how there might be additional trees on those lines that are collapsed 00:11:47 what's a BST again 00:11:51 binary search tree. 00:12:15 well that's something like what i'm imagining 00:12:33 that is exactly what I'm imagining. :P 00:12:58 I guess you could use a 2-3 tree or some variation of a BST. 00:13:09 well it's just a dictionary? 00:13:20 ah, yes. 00:14:42 if by dictionary you mean a map implemented as a binary search tree. :) 00:14:59 that's afaik what haskell's Data.Map is. 00:15:05 yes. 00:15:29 wait so what about... Seq Cursors? 00:15:43 wat 00:15:46 no? 00:15:46 okay. 00:16:39 as in use a 2-3 finger tree to store a sequence of cursors, which point to two sub Seqs. 00:17:39 * oerjan head no wrap again 00:18:04 oerjan: ignore that silly CakeProphet dude and tell me more :D 00:19:45 (*)(-.-.-)(*-.-.) *-* 00:19:45 (|) -> | 00:19:45 (.-*-)(.)(-.-)(*) *-+-* 00:19:58 \ o / 00:20:04 How does that bot work? 00:20:09 that shows precisely what part of the original is included in each char 00:20:14 on the right 00:20:16 ^celebrate 00:20:16 \o| |o| |o/ \m/ \m/ |o/ \o/ \o| \m/ \m/ \o| |o| |o/ 00:20:16 | | | `\o/´ | | | `\o/´ | | | 00:20:16 >\ |\ /< | /< /´\ >\ | >\ /< /| 00:20:16 (_|¯`\ /´\ 00:20:16 |_) (_| |_) 00:20:20 shachaf: like that. 00:20:33 shachaf: also that's a human being not a bot. how rude! 00:20:42 \o/ 00:20:42 | 00:20:43 /`\ 00:20:46 oh oops 00:20:52 elliott: sorry, typo there 00:21:12 (*)(-.-.-)(*-.-.) *-* 00:21:12 (|) -> | 00:21:12 (.-*)(-)(.)(-.-)(*) *-+-* 00:21:21 oerjan: ok 00:21:36 oerjan: this is more efficient the closer each cursor is, right? 00:21:50 erm how so? 00:22:03 oh, hmm, no 00:22:06 i was misreading it :) 00:22:20 HASH TABLE OF CURSORS MUTABILITY YEAAAAH 00:22:23 the idea of the Seq's and collapsed subtrees is to make the parts between cursors O(1) to move in 00:22:45 well for a certain value of "1" 00:22:50 oerjan: right 00:23:40 * CakeProphet writes a O(1) hash function that sleeps for 3 years before returning 1. 00:24:13 IT'S PRACTICALLY INSTANT. 00:24:54 O(noes) 00:25:03 ...As they say on the Internet. 00:25:24 I don't think you should ignore constant factors when your constant factor is 5 trillion. 00:25:27 silly Big O notation. 00:25:35 `quote O\(slow\) 00:25:37 276) [on egojoust] The fact is that EgoBot's % handling is O(slow) and O(big), and mine isn't. 00:25:53 -!- augur has quit (Remote host closed the connection). 00:25:57 `quote themselves 00:26:00 No output. 00:26:05 `quote norway 00:26:07 No output. 00:26:13 `quote lunch 00:26:15 No output. 00:26:19 Useless bot. 00:26:26 `quote fuck 00:26:28 225) I love the way zzo38's comment was cut off after the f of brainfuck that's just the most hilarious place to cut it off in a discussion about censorshi \ 275) oerjan: Tell us what (a(b{c}d)*2e)%2 expands to <-- ababcdbcdedbabcdbcdede, i think oerjan: What - the - fuck \ 297) okay see in my head it went, you send from your other number smth like "i'd certainly 00:26:36 `addquote `quote themselves No output. `quote norway No output. `quote lunch No output. Useless bot. 00:26:38 718) `quote themselves No output. `quote norway No output. `quote lunch No output. Useless bot. 00:26:43 `quote themselves 00:26:44 `quote norway 00:26:45 718) `quote themselves No output. `quote norway No output. `quote lunch No output. Useless bot. 00:26:46 `quote lunch 00:26:47 718) `quote themselves No output. `quote norway No output. `quote lunch No output. Useless bot. 00:26:48 718) `quote themselves No output. `quote norway No output. `quote lunch No output. Useless bot. 00:26:58 useful bot 00:27:01 `removequote `quote themselves No output. `quote norway No output. `quote lunch No output. Useless bot. 00:27:03 ​/home/hackbot/hackbot.hg/multibot_cmds/lib/limits: line 5: exec: removequote: not found 00:27:10 `delquote `quote themselves No output. `quote norway No output. `quote lunch No output. Useless bot. 00:27:11 No output. 00:27:13 `ls bin 00:27:15 ​? \ @ \ addquote \ allquotes \ calc \ define \ delquote \ etymology \ forget \ fortune \ frink \ google \ json \ k \ karma \ karma+ \ karma- \ learn \ log \ logurl \ macro \ marco \ paste \ pastekarma \ pastelog \ pastelogs \ pastenquotes \ pastequotes \ pastewisdom \ ping \ prefixes \ qc \ quote \ quotes \ roll \ runperl \ toutf8 \ translate \ translatefromto \ translateto \ units \ url \ wl \ word \ wtf 00:27:19 oerjan: please kick elliott for spam 00:27:23 also shachaf 00:27:28 Also CakeProphet. 00:27:29 :< <-- grumpy old man 00:27:30 `quote CakeProphet 00:27:32 141) how does a "DNA computer" work. von neumann machines? CakeProphet, that's boring in the context of DNA. It's just stealing the universe's work and passing it off as our own. \ 142) CakeProphet: reading herbert might be enlightening in one hand he held a long worm can be greased. twice i got it nearly there, and the protector of cattle. mars is 00:27:51 oerjan: the idea is basically to turn a tree with a bunch of cursors into a tree of /just/ the cursors, retaining their sort of "relative positions", right? 00:28:03 and those cursors contain the bits of the tree they're focusing on, sort of 00:28:31 yeah 00:28:41 (*)(-.-)(*)(-.-.-.) *-* 00:28:42 (|) -> | 00:28:42 (.-*)(-)(.)(-.-)(*) *-+-* 00:29:05 let |x| = abs x; o = -5 in |o| 00:29:05 | 00:29:05 /< 00:29:07 oerjan: this is a Seq zipper, right? 00:29:12 that's what the previous should become if we move the upper right * cursor one step left 00:29:51 shachaf: one day Haskell will DWIM. 00:29:52 now the middle | Seq line contains -.-.-. 00:29:54 oerjan: (i forgot which structure you were zippering :P) 00:30:16 | 00:30:22 dammit 00:30:38 * | 00:30:45 CakeProphet: One day it will DWIM; I dearly hope that the day will never come when it DWYM, though. 00:30:52 zippered finger trees. 00:30:56 oerjan: kick shachaf for interrupting your diagram 00:31:07 CakeProphet: Seq /is/ a finger tree 00:31:09 so there's an actual tree in one of the Seq elements on the way 00:31:14 elliott: /really/? 00:31:16 * CakeProphet gasps. 00:32:34 therefore, hash tables are arrays. 00:33:03 Table# 00:33:15 elliott: i'm zippering a plain unrooted tree, essentially 00:33:22 oerjan: ok 00:33:41 adding labels and typesafeness left as an exercise for the reader >:P 00:33:51 oerjan: when do you get to defining adts >:) 00:34:11 LEFT AS AN EXERCISE FOR THE READER, I SAID 00:34:35 oerjan: :'( 00:34:41 oerjan: Why aren't you in #haskell these days? 00:34:58 dammit, oerjan has roped me into listening to one of his long monologues and getting /nothing/ useful out of it :P 00:34:59 * shachaf checks #haskell. you mean line this....once oi am on unix command line to do this .....ghci -package gtk ? 00:35:02 Hmm. 00:35:07 *MWAHAHAHA* 00:35:36 oerjan: im going to cry at you now instead of replying to anything you say. 00:35:37 oerjan: cry 00:36:03 Sounds to me, oerjan, like elliott mad 00:36:19 Sounds to me, elliott, like u mad 00:36:26 well there's a sort of dynamicity at the point of mapping back from the collapsed tree to the original which i'm not quite sure how to handle 00:36:53 CakeProphet: ><{{{}::LLKLMH@A;'`hi`1 s 00:37:06 like, to get full typesafeness we'd need some kind of parametric Seq 00:37:39 and with things in a map it might involve actual Dynamic 00:38:14 unsafeCoerce 00:38:23 oerjan: hm do you need an indexed map 00:38:53 oh and it might be necessary to invent id's for the cursors 00:38:54 oerjan: i.e. lookup :: k a -> Map k a -> Maybe a 00:38:57 elliott: Did you see ddarius's puzzle about IORef in #haskell recently? 00:38:58 or similar 00:39:01 shachaf: No. 00:40:01 do { r <- newIORef (return ()); writeIORef r (join (putChar '*' >> readIORef r)); join (readIORef r) } 00:40:20 The puzzle went "where does the recursion come from?". 00:40:27 Or something along those lines. 00:41:39 shachaf: I... 00:41:59 shachaf: It comes from executing the result of reading r depending on the value inside r. 00:42:04 Which it executes. 00:42:08 And so on. 00:42:13 Right, but there's no recursive definition there. 00:42:25 And yet it's non-terminating. 00:42:28 How does that happen? 00:42:31 shachaf: There sort of is; it's using the IORef as a definition. 00:42:32 there's a cyclic structure created by mutation 00:42:40 Yeah. 00:42:53 OK, but why are you allowed to create a cyclic structure? 00:43:09 because IO etc 00:43:17 Well, it works with ST too. 00:43:18 shachaf: As opposed to...? 00:43:22 Can you model this with State, for instance? 00:43:24 because that's easy with IORef? 00:43:42 You can do a mono-typed STRef with State, so yes. 00:43:43 heh 00:43:50 Since only one relevant reference type is used here. 00:44:00 *x = &x //weeeeeeeee 00:44:04 elliott: OK, can you do it with State, then, without using any recursion? 00:44:53 shachaf: main = runStateT (do { put $ join (liftIO (putChar '*') >> get); join get) (return ()) 00:44:54 ? 00:45:06 shachaf: main = runStateT (do { put $ join (liftIO (putChar '*') >> get); join get }) (return ()) 00:45:22 Occurs check: cannot construct the infinite type: 00:45:22 m1 = StateT (m1 ()) m0 00:45:22 :-( 00:45:49 Oh. 00:45:53 shachaf: You just need a newtype wrapper. 00:46:01 newtype Foo = Foo (StateT Foo IO) 00:46:03 > runRWS (do put (join (tell "*" >> get)); join get) undefined undefined 00:46:04 Occurs check: cannot construct the infinite type: 00:46:05 m 00:46:05 = 00:46:05 Control.Mona... 00:46:13 elliott: Can you get the IO out of this, please? 00:46:15 :t runRWS 00:46:16 forall r w s a. RWS r w s a -> r -> s -> (a, s, w) 00:46:19 * shachaf should never have brought up IO. 00:46:27 shachaf: What kind of effect do you want, then? Just plain _|_? 00:46:31 Sure. 00:46:43 _|_ without recursion is accomplishment enough. :-) 00:46:56 > undefined 00:46:57 *Exception: Prelude.undefined 00:47:02 * CakeProphet feels accomplished 00:47:06 @slap CakeProphet 00:47:06 * lambdabot karate-chops CakeProphet into two equally sized halves 00:47:12 shachaf: Lesse... 00:47:40 s/sse/ssee/ 00:47:47 Anyway, yes, that was recursive. :-) 00:47:59 -!- hagb4rd has quit (Ping timeout: 240 seconds). 00:48:02 shachaf: i think the only reason my RWS version doesn't work is that the state is contained in the monad type, unlike for IO, so it needs a newtype wrapper 00:48:30 otherwise i think it is in spirit the same as the IO one 00:48:46 shachaf: Done. 00:48:52 ewtype Foo a = Foo { unFoo :: State (Foo ()) a } 00:48:52 test = Foo $ do 00:48:52 put $ Foo (get >>= unFoo) 00:48:52 get >>= unFoo 00:48:55 *Main> evalState (unFoo test) undefined 00:48:55 Loading package transformers-0.2.2.0 ... linking ... done. 00:48:58 s/ewtype/newtype/ 00:49:05 Well, you're using a recursive newtype. 00:49:21 shachaf: So is IO. 00:49:26 IORefs are just magical. 00:49:49 * elliott isn't sure exactly what you're getting at here. 00:50:22 What's recursive about STRef? 00:50:42 shachaf: ST has a store of STRefs which you instantiate polymorphically to make them include an ST. 00:50:58 shachaf: the problem is that only IO and ST allows you to make state that doesn't show up in the type of the monad 00:50:58 But fine, I'll whip up a version without that. 00:51:21 that is why they don't need a newtype 00:51:27 oerjan: Right. 00:51:37 Actually I can't, I'd need unsafeCoerce I think. 00:51:44 Unless, hmm... 00:51:50 shachaf: But yeah, what is the point actually meant to be? 00:52:27 elliott: maybe Dynamic is sufficient? 00:52:48 oerjan: Hmm, right 00:52:51 * elliott tests 00:54:13 No instance for (Typeable1 00:54:13 (StateT Dynamic Data.Functor.Identity.Identity)) 00:54:14 Hmph. 00:54:17 * elliott newtype 00:55:39 Can't make a derived instance of `Typeable1 (StateT a m)': 00:55:39 `StateT' has arguments of kind other than `*' 00:55:39 In the stand-alone deriving instance for `Typeable1 (StateT a m)' 00:56:03 * elliott makes own monad 00:59:13 shachaf: Done. 00:59:59 shachaf: http://hpaste.org/54087 01:01:44 shachaf: HAPPY NOW? 01:02:07 shachaf: (I note that you can implement Y without explicit value or type recursion using Dynamic too.) 01:02:57 oerjan: SO N-CURSOR ZIPPERS 01:04:10 elliott: I will substitute for oerjan 01:04:13 shachaf: Also, I believe this means you can do recursion with "just" the FFI, and with "just" Chans and forkIO. 01:04:14 so basically like 01:04:17 n-cursor zippers 01:04:19 are like zippers 01:04:22 but with n cursors. 01:05:11 you can even do recursion with "just" recursion. 01:05:26 indeed! 01:05:30 so oerjan, n-cursor zippers 01:05:54 i sense some recursoring 01:07:03 very funny. HELP ME OUT, I AM AT WAR WITH FINNS. 01:07:57 maybe we could do a zipper of the collapsed tree to easily move to the cursor we want to concentrate on >:) 01:08:33 oerjan: :D 01:09:06 -!- tiffany has quit (Quit: nyu~). 01:10:21 then we wouldn't need a dictionary to get back to the original tree. although we still need some map to tell the path to each cursor. ouch. 01:11:17 and that map would change as cursors move 01:11:59 especially since the shape of the collapsed tree also can change 01:12:02 oerjan: what, exactly, kind of dictionary do you need? 01:14:17 oh hm. maybe we could put signposts in the virtual cursor data to tell how to move to another cursor - only the next step, so changes are still local 01:14:37 a zipper of the zipper starts looking sane... 01:15:06 coooool 01:16:31 elliott: http://dl.dropbox.com/u/16495819/lolncursor.png 01:16:32 oh, this would get O(n) in the number of cursors if they're laid out on a line 01:16:35 Nobel Prize plz 01:16:46 oerjan: O(n) to do /what/? 01:17:00 CakeProphet: now tell me how to reposition cursor 3 before cursor 2 01:17:23 do lots of swappy things. 01:17:52 CakeProphet: the cursors are not necessarily ordered in that way. 01:18:06 that's the whole point of this collapsed tree thing 01:18:19 -!- derdon has quit (Remote host closed the connection). 01:18:23 hmmmmmmmm 01:18:26 okay 01:18:59 elliott: to move from one cursor to another if you have to pass all the others, if they're extremes on a line 01:19:16 with the zipper of zipper idea 01:19:35 how do you intend to access the cursors? 01:19:37 oerjan: ah. that's probably not hugely problematic, i think the most number of IPs any funge program has is like 60,000, and that's pathological 01:19:42 random access, sequentially, ???? 01:19:47 a few hundred at most is all i care to optimise for 01:19:58 by an identifier, by an index? 01:21:01 CakeProphet: round-robin, for my usecase 01:21:06 ah 01:21:28 well you could just decouple the subsequences... 01:21:32 basically a Seq of zippers. 01:21:37 on the same list. 01:21:51 i'll let oerjan respond to you >:) 01:21:57 oerjan: but anyway, what kind of dictionary /did/ you need? 01:22:37 elliott: at this point, i think you only need dictionaries or something for the signposts 01:22:51 oerjan: I meant to avoid the zipper-zipper inefficiency, but ok 01:22:58 a signpost would tell for each real cursor what direction to go in 01:22:59 oh. 01:23:07 psh Seq of zippers is mad efficient. 01:24:52 so, a virtual cursor node would need to contain some data: a list of adjoining trees without cursors in them, a list of adjoining Seq's to other cursors, and some tag to tell which nearest neighbors are in which relation to each other in the original QuadTree. and possibly the signpost map. 01:25:36 oh and the adjoining Seq's would of course "end" in cursor-cursors with the zipper zipper idea 01:25:40 -!- augur has joined. 01:25:51 oerjan: ok 01:26:17 also a ref to the mutable 2D array that it can use to mutate the fungespace and move IPs in constant time. 01:26:47 >:> 01:26:48 if you don't do the zipper of zipper idea, you need to handle the collapsed tree in some other way, perhaps using some graph library. 01:27:10 oerjan: ok, stick with zipper of zipper i guess :P 01:27:14 it sounds easier 01:27:19 s/zipper/Seq/ 01:27:32 * oerjan swats CakeProphet -----### 01:28:42 WLIIA REPORT AS OF 1x15: Absolute winner is still Wayne Brady with an incredible 3,003,530.5 points. Absolute average episode winner is also Wayne with 250,294.2 points. Logarithmic winner is Ryan Stiles in a come-from behind victory with 82, barely beating out Colin's 80.6. Logarithmic average episode winner for performers appearing in >1 episode is Wayne with 6 log-points per episode. 01:29:05 ? 01:29:16 CakeProphet: I'm watching all of Whose Line is it Anyway and tallying the points. 01:29:28 elliott: clearly Wayne Brady is the best choice for implementation of n-cursor zippers. 01:29:35 Gregor: white people love Wayne Brady. 01:29:49 * shachaf return 01:30:23 * CakeProphet CakeProphet >>= eat soup 01:30:26 erm 01:30:30 * CakeProphet >>= eat soup 01:31:14 * shachaf shachaf shachaf * 01:31:22 Gregor: First, why the heck are you doing that? 01:31:46 Second, :) 01:32:59 pikhq_: As an excuse to watch WLIIA :P 01:33:08 Good reason. 01:34:17 oerjan: go on : 01:34:17 :P 01:34:51 Gregor: the handsome black man is the best to watch. 01:35:00 also Drew Carrey may have a mancrush on him 01:37:03 y :: (Typeable c, Typeable b) => (b -> c) -> c 01:37:07 shachaf: My fixed-point combinator is swell. 01:37:51 swellest 01:38:01 the basic NW, NE, SW, SE, FromNW, FromNE, FromSW, FromSE directions from QuadTrees still apply to all of this, i think. 01:38:12 * CakeProphet >>= eat soup >>= feelMMM 01:38:15 mmm 01:38:18 mmm 01:38:20 oerjan: ok 01:39:25 a cursor cursor would go in one of those. if one of the four first, it would be sort of like a QuadTree, if one of the four latter, like a Cursor in our previous discussions 01:39:50 -!- augur has quit (Remote host closed the connection). 01:41:19 there would be two types of such, those with a (virtual) cursor at the other end, and those without. the latter would actually _be_ QuadTrees and Cursors of our previous talks. 01:41:26 oerjan: I think you guys are overcomplicated this.. 01:41:50 CakeProphet: present your solution or shut up and stop butting in :P 01:41:55 the former would contain a Seq, a new direction, and a virtual cursor node. 01:42:16 OMG, owcc is SO FRIGGIN' SLOW 01:42:32 the terminology of this is definitely going to hell. 01:42:35 elliott: Lest you're not up to date: x86[_64], SPARC, MIPS[el] 01:42:42 Not as big a list as I'd like :( 01:42:55 Gregor: I was up to date. Make it work on ARM and PPC. :p 01:42:55 Also, tcc seems to exclusively generate retarded function prologues. 01:42:57 oerjan: yes, quite 01:43:04 oerjan: maybe some ADT definitions would help >:) 01:43:13 also, in principle we would want type parametrized Seq's so we could actually keep things typesafe 01:43:35 elliott: With -O2: 7b: 81 ec 00 00 00 00 sub $0x0,%esp 01:44:02 elliott: what I had in my diagram. just do swappy stuff when you need to rearrange cursors. 01:44:11 CakeProphet: What the fuck is "swappy stuff"? 01:44:33 if that's too inefficient, just do a Seq/container-of-preference of zippers because. 01:44:41 some kind of PSeq f a b which is a chain of f a c1, f c1 c2, ..., f cn b 01:44:55 elliott: Swell as in unsafeCoerce? 01:45:04 shachaf: Nah, the next best thing. 01:45:05 f would be a gadt, i think 01:46:07 elliott: Dynamic = unsafeCoerce. 01:46:37 * oerjan is worried that part needs ContextKinds 01:46:44 er 01:46:50 *ConstraintKinds 01:47:27 elliott: rearrange the cursors so they're in order, concat and move stuff around. profit. 01:48:08 if what's between two cursors isn't relevant, just do the Seq of zippers. that's more efficient. 01:49:16 y :: forall a. (Typeable a) => (a -> a) -> a 01:49:16 y f = fromDyn' (magic (toDyn magic)) 01:49:16 where magic :: Dynamic -> Dynamic 01:49:16 magic x = toDyn (f (fromDyn' (dynApp x (toDyn x)))) 01:49:19 shachaf: It doesn't work :-( 01:49:44 CakeProphet: A Seq of zippers doesn't let you mutate, which is the whole bloody point. 01:49:58 elliott: Why are you using Dyn instead of just recursive types? 01:50:01 elliott: but assuming the cursors are IPs then I'm guessing they only move around in increments of 1? 01:50:13 shachaf: To prove you can do fix without type or value-level recursion. 01:50:21 CakeProphet: I really can't be bothered explaining this to you? 01:50:21 By using unsafeCoerce. 01:50:31 shachaf: Yes, except it's safeCoerce. 01:51:14 @let safeCoerce :: a -> a; safeCoerce x = unsafeCoerce x 01:51:16 Defined. 01:51:48 > safeCoerce 5 01:51:54 mueval: ExitFailure 1 01:51:54 mueval-core: Time limit exceeded 01:51:56 lambdabot..... 01:52:15 > safeCoerce 5 01:52:15 :t safeCoerce 01:52:17 forall a. a -> a 01:52:17 5 01:52:25 @src safeCoerce 01:52:28 Source not found. Are you on drugs? 01:52:35 * oerjan facepalm 01:52:40 cake "whats paying attention" prophet 01:53:04 whats paying attention? 01:53:16 oh no...... 01:54:00 I often make fools of yourself. 01:54:14 yes 01:54:48 monqy avoids making fools of yourself by only talking when he is not a fool. 01:54:53 good strategy. 01:55:57 monqy is never fool 01:59:09 therefore monqy only talks. 02:01:38 Gregor "unrelated" Richards 02:03:53 HEYO 02:04:05 O YEH 02:04:10 The very first instance of Scenes from a Hat (in spite of it being a staple of the show) is in the 16th episode. 02:05:18 -!- CakeProphet has changed nick to RogerG\unhere. 02:05:39 bye roger g 02:06:32 Argh, how do I stop making owcc do semi-clever inter-procedural optimization >_> 02:07:34 does owcc have -O0 02:07:44 Gregor: write inefficient code. 02:07:50 and it will negate the effect. 02:08:02 don't have procedures 02:08:29 Have enough procedures that owcc overflows something. 02:09:01 -!- Slereah_ has joined. 02:10:40 -!- Slereah has quit (Ping timeout: 255 seconds). 02:10:51 monqy: Doesn't work with -O0 because it generates subl $0, %esp 02:11:35 Gregor: ... 02:11:46 pikhq_: Yup. 02:12:04 owcc... 02:12:24 -!- RogerG\unhere has quit (Ping timeout: 252 seconds). 02:12:36 bye roger g 02:13:17 monqy: OpenWatcom. 02:13:42 Oklahoma Workers' Comensation Court 02:14:04 Old Whitgiftians Cricket Club good 02:15:08 The code it produces for MS-DOS executes very fast[citation needed]. It was one of the first compilers to support the Intel 80386 "protected mode"[citation needed]. 02:15:11 thanks wikipedia 02:15:59 It's ye old Watcom compiler, GPL'd. 02:21:37 OK, so far nothing but gcc can make my JIT work X-P 02:21:41 Everything else is SO CLOSE and yet so far. 02:21:47 Compiler suggestions? 02:22:19 tcc? 02:22:32 If you can compile it with otcc even better. 02:22:49 tcc always generates subl $0, %esp 02:22:57 otcc likewise? :( 02:23:03 Haven't tried it. 02:23:12 It probably does. 02:23:21 Seeing as it's what tcc came from. 02:23:42 Still, it'd be pretty spiffy to compile with a previous entry to IOCCC. 02:24:59 True ... 02:25:17 I wonder if with sufficient cleverness I could do epilogue detection only and leave in the prologues and partial epilogues for everything ... 02:25:53 OR I could be REALLY stupid and just assume that your epilogue is either one or four bytes and no other size :P 02:28:20 Nope, wouldn't work on SPARC :P 02:29:32 (Or anything else with delay branches ... ) 02:33:24 BUT, if I assume that on all CISC platforms (all one of them), I may be in luck. 02:41:19 HEYOOOOO 02:43:14 OpenWatcom :) 02:43:29 And probably TCC 02:47:09 Gregor: By doing what 02:52:28 Yup, works on TCC too :) 02:52:33 elliott: Making my heuristics much more stupid. 02:52:40 lol 02:52:50 elliott: On platforms I determine to be CISC, I blindly assume the epilogue is always one byte and the prologue is zero. 02:55:16 -!- MDude has changed nick to MSleep. 02:57:07 -!- calamari has joined. 02:57:23 Gregor: How do you determine ciscness? 02:57:34 elliott: Odd-sized functions. 02:57:45 That's it? 02:57:46 Yup 02:58:12 I'm not exactly aiming for coding perfection here :P 02:58:13 an odd heuristic 02:58:26 oerjan: AND YET: It works :) 02:59:21 oerjan: ADTS PLZ 02:59:37 i knew i'd regret that pun 03:02:50 And now to lament the lack of -mbuild-constants for ARM :( 03:14:33 oerjan: :| 03:14:42 it's tricky 03:14:53 pah :P 03:15:29 oerjan: btw the space is actually finite 03:15:39 (Int32,Int32)-indexed 03:16:03 -!- pikhq has joined. 03:16:09 ic, well that's just having some top node 03:16:12 -!- pikhq_ has quit (Ping timeout: 260 seconds). 03:17:06 yeah 03:17:20 not like you can allocate that much anyway 03:17:33 so might as well just leave it out 03:18:30 data MetaCursor srcdir = MCPlain (PlainCursor srcdir) | forall dest. MCPath (MetaPath src dest) MetaNode dest 03:18:48 ooh, that looks cool 03:19:53 oerjan: s/srcdir/src/g right? 03:20:00 oh hm 03:20:11 or the reversze 03:20:14 *-z 03:20:29 then you vneed to rename dest >:) 03:20:33 gah 03:20:34 src is nicer anyway 03:21:34 data FromNW; data FromNE; data FromSW; data FromSE; data NW; data NE; data SW; data SE -- src and dest should be one of these 03:22:08 ok 03:25:35 PlainCursor From{NW,NE,SW,SE} is basically our old Cursor and PlainCursor {NW,NE,SW,SE} is a QuadTree, i think 03:25:57 gadts then :P 03:26:00 yeah 03:26:16 i forget our old cursor but i'll look it up when i need it 03:26:32 *(MetaNode dest) -- forgot parens above 03:26:37 Aaah, earl grey. 03:27:56 oerjan: btw just out of curiosity, does it help optimise the metazipper thing if you know i always access cursors in round-robin 03:28:17 not round-robin in order of space; in order of creation 03:28:24 ic 03:28:47 OK, I may have this working on ARM, and only 85% incurably stupid. 03:29:15 oerjan: i'll shut up :) 03:29:56 that means you basically wants CakeProphet's Seq of zippers in ther somehow ;P 03:30:05 *+e 03:31:27 might as well just continue as-is :P 03:32:11 MetaNode dest represents a node containing a virtual cursor, with incoming edge as dest 03:32:20 Damn it, now how did this break on MIPS >_> 03:33:24 oerjan: ok 03:34:18 oh hm 03:34:21 -!- augur has joined. 03:35:11 MNFromNW :: { neNeighbor :: MetaCursor NE, ... but what should be the _up_ cursor... 03:35:53 i think it needs to be split. ah! 03:36:12 data From; data To; data NW; ... 03:36:34 :D 03:36:48 oerjan: From dir 03:36:53 and To dir 03:36:56 no 03:37:00 ? 03:37:07 oh well maybe 03:37:17 -!- augur has quit (Remote host closed the connection). 03:37:33 i was thinking of them as separate arguments, but i guess that works too 03:38:09 ah 03:39:33 MNFromNW :: { neNeighbor :: MetaCursor (To NE), swNeighbor :: MetaCursor (To SW), seNeighbor :: MetaCursor (To SE), up :: MetaCursor (From dir), signPost :: SignPost } -> MetaNode (From NW) 03:39:57 not sure that's the right syntax 03:40:19 i think its {a::b} -> {c::d} -> ... 03:40:25 but i prefer yours :) 03:40:28 oh 03:42:50 MNToNW :: { ... like above but with all five neighbors and no up } 03:42:57 oh hm 03:43:02 obviously then 03:43:20 what is dir in MNFromNW 03:43:21 MNTo :: { ... } -> MetaNode (To dir) 03:43:28 ah 03:43:50 NW then 03:43:56 it doesn't need a different constructor for different ones on the To 03:44:03 *MNTo 03:45:11 the dir in the up field of MNFromNW is arbitrary, since we don't know which direction this node is from the up node 03:45:22 oerjan: you mean all 4 neighbours right? 03:45:25 and ah 03:45:28 oops :P 03:47:47 elliott: So yeah, +ARM anyway :P 03:48:10 Gregor: +ARM-MIPS 03:48:23 elliott: I'm fixin' MIPS :P 03:49:18 MetaPath src dir is tricky. it should be a chain of, hm, PathNode s d, using some kind of Seq which _ideally_ would be parametrized such that only consecutive PathNodes need to match in types 03:50:43 does that really matter for internals? : 03:50:45 :P 03:50:46 oh and it should probably have a tag so you could consider one as "reversed", for when you "metazip" around it 03:51:04 -!- augur has joined. 03:51:42 without needed to _actually_ traverse and reverse the pathnodes 03:51:45 *needing 03:51:50 right 03:52:24 well if you don't do that then of course the typesafe directions break down inside these paths. 03:52:33 hm right 03:52:39 go ahead, then :P 03:52:55 (i am simply assuming the existence of such a Seq) 03:53:20 which i think i called PSeq above 03:54:26 data MetaPath src dir = MP (PSeq PathNode src dir) | MPReversed (PSeq PathNode dir seq) 03:54:35 ok 03:55:08 the reversing thing might be better to put into pseq itself but never mind that for now... 03:55:58 well i was just assuming a PSeq which did the minimal change to Seq to make it parametric 03:56:15 right 03:56:30 hm... 03:56:46 s/seq/src/ :p 03:57:06 oops 03:59:02 PN_ToNW_ToNW :: { neNeighbor :: PlainCursor (To NE) } -> { swNeighbor :: ... } -> { seNeighbor :: ... } -> PlainNode (To NW) (To NW) 03:59:44 similarly for PN_To**_To** 03:59:55 ok. (i preferred the previous syntax :P) 04:00:31 PN_To**_From** is illegal 04:01:02 elliott: I officially have no clue why MIPS is broken :P 04:01:39 PN_FromNW_FromNW :: { neNeighbor :: ..., swNeighbor :: ..., seNeighbor :: ... } -> PlainNode (From NW) (From NW) 04:02:01 same arguments, actually, it's conceptually the reversed version of the first one 04:02:30 and so PN_From**_From** in general 04:03:39 -!- madbr has joined. 04:03:47 PN_FromNW_ToNE :: { swNeighbor :: PlainCursor (To SW), seNeighbor :: PlainCursor (To SE), up :: PlainCursor (From dir) } -> PlainNode (From NW) (To NE) 04:04:07 and PN_From**_To** in general, except not with the two directions equal 04:04:22 i think that's all for PlainNode 04:06:30 back, sorry 04:06:42 SignPost would be a map whose keys are real cursors and whose values are Maybe Direction 04:06:56 oerjan: re: to/from, couldn't you have ... -> PlainNode (tofrom NW) (tofrom NW) >:) 04:07:01 just kidding >_> 04:07:18 AAAAAAAAAAAAAAAAAAAAAA 04:07:37 Direction would be a value form of the To dir, From dir things. 04:07:44 right 04:08:05 oerjan: (more seriously, it seems to me like a type AllDirectionsBut wrapper dir would cut down on lots of duplication) 04:08:32 maybe. note that the PN_From**_To** miss _two_ directions. 04:08:37 ah 04:08:45 what's a real cursor? the previous Cursor? PlainCursor? 04:09:32 your ip id, i think 04:09:43 oerjan: oh, so just an identifier? ok 04:10:01 and a value of Nothing indicates that it's at _this_ node 04:10:14 oerjan: (i am half-considering putting the rest of the IP data into this structure, since it's basically tracking my IPs anyway...) 04:10:16 while Just dir indicates where to start going to find it 04:10:51 ah in that case you could use Either IpData Direction for the values, i guess 04:10:57 right 04:11:11 i am shocked to find myself actually understanding all this. 04:11:21 yay 04:11:48 elliott: It's some weird interaction between unconditional jumps and conditional jumps >_O 04:13:17 oerjan: i thought i had lost all hope of understanding after last time's 15 constructors :D 04:13:26 :P 04:14:24 elliott: AHAAAAAAAAAAAAA scratch registers boo. 04:14:35 oops, s/PlainNode/PathNode/g in some of the above 04:14:46 oerjan: oh. now it makes even more sense! 04:15:15 yay 04:15:26 oerjan: er, that's not it, right? 04:16:04 i think PathNode has 44 constructors. 04:16:11 lol 04:16:28 elliott: s/scratch/argument/ in fact :P 04:16:36 Gregor: heh 04:16:52 oerjan: i will probably try and abstract that out so it only needs one constructor per valid to/from pai :P 04:16:52 r 04:16:54 i suppose your AllDirectionsBut is a must 04:16:57 but yes, go on 04:17:17 well, i think that's most of it? 04:17:55 hm 04:18:14 elliott: Fixt. 04:18:20 oerjan: if I asked you how to implement "go west in currently-focused cursor" would you disown me? 04:18:48 maybe if you insisted on all the details 04:19:25 heh 04:19:31 oerjan: you navigate between cursors /spatially/ in this, right? 04:19:37 that seems to make navigating in some other order a pain 04:19:54 well yeah? 04:20:26 oerjan: well like i said, my IPs are used round-robinly :P 04:21:01 well yeah i didn't do any attempt to optimize that order 04:21:19 or any order, really 04:21:27 oerjan: right 04:21:34 oerjan: but i'm not sure how you do it at /all/ 04:21:42 it seems like you'd have to try every cursor until you found the one you care about 04:25:05 data MetaContext = MetaContext { nwNeighbor :: MetaCursor (To NW), ..., up :: MetaCursor dir, signPost :: SignPost } -- it occurs to me that some field name disambiguation will be needed 04:25:20 anyway, say that's the current focused context 04:25:46 first, look in the signPost to find out where the ip you want to be at is 04:26:17 if it's here, you're set... 04:26:24 ah! right 04:26:30 OK, that makes sense now 04:26:37 how do you go east >:) 04:27:34 hm assuming you're focused at the ip... 04:27:41 look at the up 04:28:10 oerjan: btw i am not looking forward to figuring out how to mutate within the 128x128 area :P 04:28:20 I think I'll have to just check every other IP 04:28:31 I don't really want to add caches to a structure this complex 04:28:35 erm, as in 04:28:38 because other IPs could be there too 04:28:50 assuming that's actually possible with yours... 04:29:14 ah 04:30:45 oh hm 04:31:12 i have not properly considered the actual _leaf_ nodes, where the 128x128 data would reside 04:31:34 well except for the PlainCursor ones, but they don't contain real cursors 04:31:46 so we have a zipper for trees with no top or bottom? :P 04:35:59 -!- madbr has left. 04:36:10 elliott: ARM goes all the way up to -O3 (with -fno-toplevel-reorder) 04:36:19 X-D 04:37:02 MNLeaf :: { area :: Array "whatever", signPost :: SignPost } -> MetaNode (To dir) 04:37:14 may be what is needed 04:37:23 Array "whatever" 04:37:25 good array 04:37:33 best array 04:37:46 oerjan: ok so what if i actually put this into a file and tried to make it all typecheck :P 04:38:14 well as i said i have not kept all field names distinct between data types, so fix that :P 04:39:40 oerjan: ok [CRACKS KNUCKLES, PUTS BASEBALL CAP ON BACKWARDS, STARTS UP EMACS, CHEWS ON GUM, DISOWNS AUTHORITY + PARENTS] time to ROCK!!!!!! 04:39:43 i am such a serious person 04:39:54 http://thc.org/root/phun/unmaintain.html 04:39:56 either that 04:40:02 or write all your code in INTERCAL 04:40:47 oerjan: so wait, are plain [NW][SE] ever used, or is it always within either From or To now? 04:41:41 er 04:41:44 [NS][EW] 04:41:48 elliott: I can't get IOCCC 2001 bellard to run :( 04:41:59 Gregor: Surprising :P 04:42:11 i cannot recall 04:42:31 oerjan: oh you actually got the gadt record syntax almost right 04:42:33 oerjan: Foo { ... } :: A 04:42:50 ah 04:42:51 PlainCursor From{NW,NE,SW,SE} is basically our old Cursor and PlainCursor {NW,NE,SW,SE} is a QuadTree, i think 04:43:02 oerjan: does that still use plain directions or is the QuadTree case in a To? 04:43:11 in a To 04:43:40 oerjan: ok. now to find your old Cursor :P 04:43:40 so you don't need to list all 04:43:47 unless you recall it :P 04:44:35 well it should be very similar to MetaNode 04:44:50 MetaNode (From ...) 04:44:50 Nov 14 03:03:10 data QuadCursor t = FromNorth { southChild :: t, eastChild :: t, westChild :: t, up :: QuadCursor (QuadBranch t) } | FromSouth ... 04:44:58 oerjan: is it just that but with NW/SE etc. instead of North/South? 04:45:27 that first one was in error, i corrected it to NW/SE later 04:45:56 well not _exactly_ that, it's all gadts now :P 04:47:07 -!- calamari has quit (Quit: Leaving). 04:47:53 PCFromNW { neNeighbor :: PlainCursor (To NE), swNeighbor :: ..., seNeighbor :: ..., up :: PlainCursor (From dir) } -> PlainCursor (From NW) 04:48:41 PCLeaf :: { area :: Array "whatever" } -> PlainCursor (To dir) 04:48:46 something like that 04:48:50 oerjan: i'm on to PathNode, FWIW 04:49:07 ok 04:49:14 oerjan: wait, what happened to the QuadTree case? 04:49:32 PlainCursor From{NW,NE,SW,SE} is basically our old Cursor and PlainCursor {NW,NE,SW,SE} is a QuadTree, i think 04:49:54 PCTo :: { neNeighbor :: ..., ... } -> PlainCursor (To dir) 04:50:05 would be that and PCLeaf 04:50:11 "However, for GADTs there is the following additional constraint: every constructor that has a field f must have the same result type (modulo alpha conversion)" 04:50:16 boo, I need different field names for each signpost 04:50:20 oerjan: ah, ok 04:50:27 darn :( 04:51:00 that sounds most annoying 04:51:10 oerjan: is PCTo just PlainCursor (To dir) for each dir? 04:51:31 also, I need a name for (From dir)/(To dir), like dir is for all the directions. origin? 04:51:31 um yes 04:51:56 oerjan: not From? ok 04:52:27 i gave PCFromNW above, the rest of the Froms should be like that. 04:52:32 right 04:53:25 oerjan: oh hm. (From foo)/(To foo) are directions 04:53:29 it's the foos that need a name 04:53:34 I...think? 04:53:37 help : 04:53:38 :( 04:53:48 no, NW/SE/NE/SW are definitely directions, so I do need a name 04:54:11 heh 04:55:13 oerjan: quick, name (From dir)/(To dir) :-( 04:56:18 Direction would be a value form of the To dir, From dir things. 04:56:27 aaaaargh, you've been calling both of them directions all this time 04:56:31 oerjan you're awful :( but uh thanks 04:56:34 pretty much 04:57:09 oerjan: come on come on gimme a name gimme a name :( 04:57:21 Exit 04:57:30 ok 04:58:44 oerjan: woo, just PathNode to go 04:59:30 oerjan: hm MetaContext is new, right? 04:59:39 MNLeaf :: { area :: Array "whatever", signPost :: SignPost } -> MetaNode (To dir) 04:59:45 oerjan: er is this required as well as the leaf in PlainCursor? 05:01:21 PN_ToNW_ToNW :: { neNeighbor :: PlainCursor (To NE) } -> { swNeighbor :: ... } -> { seNeighbor :: ... } -> PlainNode (To NW) (To NW) 05:01:21 similarly for PN_To**_To** 05:01:25 oerjan: the **s here have to be equal, right? 05:02:52 agh 05:02:54 PN_FromNW_FromNW :: { neNeighbor :: ..., swNeighbor :: ..., seNeighbor :: ... } -> PlainNode (From NW) (From NW) 05:03:02 oerjan: and are these PlainCursor (To ...)s or PlainCursor (From ...)s? 05:03:04 the neighbours, that is 05:03:19 elliott: yes, MNLeaf is for a leaf that is a virtual cursor 05:03:35 (which means it's a real one, if you don't have extraneous virtual ones) 05:03:39 -!- SgeoN1 has quit (Read error: Connection reset by peer). 05:03:58 -!- SgeoN1 has joined. 05:04:11 no, the **s don't have to be equal 05:04:48 they are PlainCursor (To ...)'s 05:04:51 data PathNode src dest where 05:04:51 PNToTo :: PlainCursorTosWithout2 a b -> PathNode (To a) (To b) 05:04:51 PNFromFrom :: PlainCursorTosWithout2 a b -> PathNode (From a) (From b) 05:04:51 PNFromTo :: PlainCursorTosWithout2 a b -> PlainCursor (From dir) -> PathNode (From a) (To b) 05:04:52 there, I think 05:06:11 note that PNFromTo should have a /~ b 05:06:40 oerjan: ... you realise expressing that constraint is a pain :P 05:06:49 thankfully possible since we only have four directions... 05:07:01 yeah, you may consider it optional 05:07:27 oerjan: hm would it be more convenient as a class constraint on the constructor, or as an actual type 05:07:34 where the latter is a GADT 05:07:38 with the obvious constructors 05:07:52 (i'm thinking, for the operations on these) 05:10:12 oerjan: ooh, convenient, all the "...s without dir" use (To dir) as the type argument >:) 05:10:25 oerjan: ...i feel really bad about wanting to exploit this, but it's sort of integral to the nature of a neighbour right?! reassure me 05:15:44 oerjan: um ok i need guidance 05:15:52 oerjan: it would be really bad to save on constructors by having 05:15:56 hm? 05:16:02 Foo :: NeighboursWithout2 t a b -> NeighbousrWithout2 t b a 05:16:03 right? :p 05:16:09 usage-wise 05:17:11 oerjan: right?? :'( 05:17:21 i already have 05:17:22 Neighbours2Same :: Neighbours1 t dir -> Neighbours2 t dir dir 05:17:23 :p 05:18:04 i think my brain is a bout fried for today 05:20:01 -!- oerjan has quit (Quit: Good night). 05:20:13 psht! 05:21:38 -!- copumpkin has joined. 05:24:43 $ wc -c jitchards.c 05:24:43 1984 jitchards.c 05:25:18 Best filesize. 05:28:37 -!- nys has quit (Quit: night). 05:39:50 elliott: Did you ever answer my question about cookies? 05:39:58 Which question? 05:40:00 Oh, that lambdabot one? 05:40:08 They're certainly not UK-cookies. 05:40:26 Do they exist in the UK? 05:41:13 I've never come across one? I don't know that they don't, though. 05:41:20 "Fortune cookies, while largely an American item, are occasionally seen in other countries, most often at Chinese restaurants. Fortune cookies have been distributed in Canada, the United Kingdom, Australia, New Zealand, India, Brazil, Mexico, France, The Netherlands and Germany." 05:41:39 fortune cookies are weird 05:41:46 I don't like them 05:42:07 monqy: theyre ghosts (boo) 05:42:18 :o 05:43:08 Gregor: BTW, if all goes horribly wrong you might get an actual UMLBox user soon. 05:43:19 Gregor: I've suggested it to the tup developer to solve a certain problem and he thinks it looks promising :P 05:51:58 Hey shachaf! I'm going to make you look in the other direction again. 05:51:59 *PSeq> :t pfoldr 05:52:00 pfoldr 05:52:00 :: (forall a b c. path a b -> result b c -> result a c) 05:52:00 -> (forall a. result a a) 05:52:00 -> PSeq path src dest 05:52:00 -> result src dest 05:52:05 Brought to you by the Power of unsafeCoerce(tm). 05:52:30 elliott: Beeping me in IRC has approximately the opposite effect, as you are well aware. 05:52:46 * shachaf is now blind. 05:52:47 Yes, but it lets you know so that you can look away more /intentionally/. 05:53:08 *PSeq> :t pfoldr (<|) empty 05:53:08 pfoldr (<|) empty :: PSeq path src dest -> PSeq path src dest 05:53:08 Wow, it actually works. 05:53:09 * shachaf doesn't know the context of elliott's type. 05:53:30 Hmm, why don't Seqs have pfoldfromtheend? 05:53:35 Er, without the p. 05:53:45 elliott: However, using type variable names longer than a single character is very unHaskelly of you. 05:54:35 shachaf: Yeah, I got tired of it being unreadable. :-( 05:54:51 data PViewL path src dest where 05:54:51 PEmptyL :: PViewL path a a 05:54:51 (:<) :: path src mid -> PSeq path mid dest -> PViewL path src dest 05:54:51 It's pretty much sacrilege. 05:55:11 * shachaf wonders what elliott is doing but doesn't want to read backlog. 05:55:23 haskellworldproblems, eh? 05:55:43 shachaf: (PSeq path src dest) is basically (path src a, path a b, path b c, path c d, path d dest). 05:55:49 shachaf: Except an arbitrary number of those, obviously. 05:55:56 And it's a Seq, so fast access from the end too. 05:56:22 shachaf: It's used in oerjan's fancy n-cursor quadtree zipper construction. 06:07:11 shachaf: ENJOY: http://hpaste.org/54095 06:07:21 "is this correct?" -- yes it is, I'm an idiot. 06:11:28 there are two esolangs on the wiki named 'clue' but neither has to do with Clue/Cluedo 06:11:50 one should be made, where all legal syntax is of the form 'X, in the Y, with the Z' 06:12:15 would it do anything interesting 06:12:45 oh man what if it was an really verbosse brianfuck derivative 06:12:57 equivalent 06:13:23 monqy: :-( 06:13:26 thing in the thing with the thing -> a brainfuck comand,. depending on what the things are.... 06:13:38 elliott: Look at what DCliche and monqy is doing. 06:13:40 s/is/are/ 06:13:48 shachaf: monqy is On Our Side, don't you worry. 06:13:53 He is a True Patriot. 06:13:56 * shachaf isn't sure what Our Side is. 06:14:01 true patriots side 06:14:07 * shachaf is not a true esolanger. 06:14:10 Well, we don't like brainfuck derivatives much, I would suppose. 06:14:17 I was imagining one or more of them could be variables 06:14:25 The most esoteric language I know is, like, Haskell, man. 06:14:29 perhaps being vaguely similar to SPL 06:14:38 is haskell esoteric......... 06:14:42 Fine, C++. 06:15:42 monqy: (I didn't say it was, anyway.) 06:15:51 @tell Phantom__Hoover Check your lambdabot mail as Phantom_Hoover. 06:15:52 Consider it noted. 06:15:55 @tell Phantom_Hoover Say the following to lambdabot, please: 06:15:55 Consider it noted. 06:16:28 what does it take to know c++? (I may or may not know c++.) 06:16:30 @tell Phantom_Hoover @tell elliott Hey, you should try and coerce the GHC API into doing that hole-checking thing sometime. By sometime, I mean now; past you gets to decide exactly when you do things, those are the rules. 06:16:30 Consider it noted. 06:16:42 Behold my @tell-myself-without-getting-lambdabot-to-bug-me-immediately-after mechanism. 06:17:13 phantom_hoover best mechanism 06:17:27 phantom "best mechanism" hoover 06:17:39 Phecanism. 06:18:01 elliott: I doubt you're going to do it as soon as you get that message. 06:18:06 So you might as well not have done it at all. 06:18:22 shachaf: The idea is mostly so that I don't forget about it. 06:18:31 @tell elliott Hey, you should try and coerce the GHC API into doing that hole-checking thing sometime. By sometime, I mean now; past you gets to decide exactly when you do things, those are the rules. 06:18:31 Consider it noted. 06:18:37 No. 06:18:38 elliott: You have 1 new message. '/msg lambdabot @messages' to read it. 06:18:42 See what you did? 06:19:23 @tell elliott Hey, you should try and coerce the GHC API into doing that hole-checking thing sometime. By sometime, I mean now; past you gets to decide exactly when you do things, those are the rules. 06:19:23 Consider it noted. 06:19:30 * shachaf decides to stop. 06:19:32 @tell shachaf u mad 06:19:32 Consider it noted. 06:19:33 @tell shachaf u mad 06:19:33 @tell shachaf u mad 06:19:33 @tell shachaf u mad 06:19:33 Consider it noted. 06:19:33 @tell shachaf u mad 06:19:33 Consider it noted. 06:19:33 @tell shachaf u mad 06:19:34 Consider it noted. 06:19:34 Consider it noted. 06:19:34 Consider it noted. 06:19:38 ENJOY, FRIEND 06:19:38 elliott: You have 1 new message. '/msg lambdabot @messages' to read it. 06:19:42 NOOOOOOOOOO 06:19:44 @messagse 06:19:47 @messages 06:19:48 Maybe you meant: messages messages? 06:19:52 shachaf said 24s ago: Hey, you should try and coerce the GHC API into doing that hole-checking thing sometime. By sometime, I mean now; past you gets to decide exactly when you do things, those are 06:19:52 @messages 06:19:54 the rules. 06:19:56 You don't have any new messages. 06:20:04 Fine, fine I get it. 06:20:05 the rules. 06:20:22 @remember monqy the rules. 06:20:32 @remember monqy the rules. 06:20:32 I will remember. 06:20:43 @forget monqy the rules. 06:20:44 Done. 06:20:45 @quote monqy 06:20:45 Plugin `quote' failed with: getRandItem: empty list 06:20:47 @quote monqy 06:20:47 Plugin `quote' failed with: getRandItem: empty list 06:20:51 @quote ehird 06:20:51 ehird says: 2009: The Year of the Combinatorial Explosion of Haskell Web Frameworks. Also, the Linux Desktop. 06:20:53 @remember monqy the rules. 06:20:53 It is forever etched in my memory. 06:21:04 @quote ehird 06:21:05 ehird says: 2009: The Year of the Combinatorial Explosion of Haskell Web Frameworks. Also, the Linux Desktop. 06:21:09 @quote elliott 06:21:09 elliott says: Only two things in the universe are certain: Death, and two of the libraries you've decided to use taking different types of ByteString. 06:21:12 @quote elliott 06:21:13 elliott says: i'm here to prove theorems and compile code and I'm all out of code 06:21:15 @quote elliott 06:21:15 elliott says: I have weird mental spheres that I divide all my coding into and that determine editor and the like 06:21:21 What? 06:21:23 @quote elliott 06:21:23 elliott says: Top universities now employ people to watch infomercials all day to find the latest mysteries. 06:21:26 @quote elliott 06:21:27 elliott says: Only two things in the universe are certain: Death, and two of the libraries you've decided to use taking different types of ByteString. 06:21:32 I have a lot of quotes. 06:21:38 @quote monqy 06:21:39 Plugin `quote' failed with: getRandItem: empty list 06:21:47 @quote Darth_Cliche 06:21:47 No quotes match. 06:21:49 @remember monqy the rules. 06:21:49 It is forever etched in my memory. 06:21:53 shachaf is a bad man. 06:21:55 @quote DCliche 06:21:56 No quotes match. Maybe if you used more than just two fingers... 06:22:09 @quote monqy 06:22:10 Plugin `quote' failed with: getRandItem: empty list 06:22:14 the rules... 06:22:36 @remember monqy the rules. 06:22:36 I will remember. 06:22:37 @quote monqy 06:22:37 monqy says: the rules. 06:22:48 the rules. 06:22:50 @tell Phantom_Hoover Remind me to "@remember monqy the rules." because shachaf is a bad person. 06:22:50 Consider it noted. 06:22:57 :-( 06:22:58 @remember elliott @remember @remember @remember 06:22:59 I will never forget. 06:23:00 @remember elliott @remember @remember @remember 06:23:00 I will remember. 06:23:01 @remember elliott @remember @remember @remember 06:23:01 Good to know. 06:23:02 @remember elliott @remember @remember @remember 06:23:02 Okay. 06:23:05 okay 06:23:05 @quote elliott 06:23:05 That... 06:23:06 elliott says: @remember @remember @remember 06:23:08 No. 06:23:12 @forget elliott @remember @remember @remember 06:23:12 Done. 06:23:23 /nick Phantom_Hoover; /msg lambdabot @messages 06:23:28 elliott: Well, you keep spamming @remember 06:23:35 @forget elliott @remember @remember @remember 06:23:36 Done. 06:23:37 @forget elliott @remember @remember @remember 06:23:37 Done. 06:23:38 @forget elliott @remember @remember @remember 06:23:38 DCliche: shachaf keeps spamming @forget. In PRIVATE. 06:23:39 Done. 06:23:47 elliott: That ain't spamming! 06:23:50 elliott: Not as annoying as publically ;p 06:24:03 @forget DCliche 06:24:03 Incorrect arguments to quote 06:24:07 @forget DCliche forever 06:24:07 No match. 06:24:27 @quote shachaf 06:24:27 shachaf says: We used to have a big collection of them but most of them got wiped in the Great Lambdabot Wipe of Every Few Months. 06:24:33 @quote elliott 06:24:34 elliott says: Top universities now employ people to watch infomercials all day to find the latest mysteries. 06:25:31 @quote monqy 06:25:31 Plugin `quote' failed with: getRandItem: empty list 06:25:44 shachaf you are scum. 06:25:47 AND I AM LEAVING. 06:25:51 -!- elliott has quit (Quit: Leaving). 06:26:01 Aw, and I was about to start singing. 06:26:14 scum songs 06:26:22 -!- elliott has joined. 06:26:26 hi 06:26:30 monqy and the rules. monqy and the rules. It's monqy, it's monqy and the rules rules rules rules... 06:26:40 NOTE TO SELF: 06:26:41 newtype SupplyT s m a = SupplyT { unSupplyT :: (forall r. (s -> SupplyT s m r) -> SupplyT s m r) -> m a } 06:26:45 -!- elliott has quit (Client Quit). 06:26:48 bye 06:27:01 @tell elliott newtype SupplyT s m a = SupplyT { unSupplyT :: (forall r. (s -> SupplyT s m r) -> SupplyT s m r) -> m a } 06:27:04 Consider it noted. 06:27:17 @quote elliott 06:27:22 elliott says: @remember @remember @remember 06:27:39 remember remember remember: never forget 06:27:56 @forget elliott @remember @remember @remember 06:27:56 Done. 06:28:00 rip 06:28:04 @quote elliott 06:28:04 elliott says: I have weird mental spheres that I divide all my coding into and that determine editor and the like 06:28:14 how is that a quote... 06:28:33 @quote DCliche 06:28:34 DCliche says: @remember elliott @remember @remember @remember 06:28:41 good quote 06:29:40 @quote Patashu 06:29:41 No quotes match. This mission is too important for me to allow you to jeopardize it. 06:29:47 rofl 06:30:25 DCliche: How many times did you @remember that? 06:30:32 @remember what 06:30:32 Incorrect arguments to quote 06:30:49 DCliche: elliott @remember @remember @remember 06:31:15 I'll be back in half an hour or so, I need to count 06:35:53 46 apparently, not as many as I expected 06:36:19 @quote lambdabot 06:36:19 lambdabot says: Done. 06:36:22 @quote lambdabot 06:36:23 lambdabot says: why on the earth whould I slap dons with a wet trout 06:42:22 -!- DCliche has quit (Quit: You are now graced with my absence.). 06:47:55 https://upload.wikimedia.org/wikipedia/commons/2/23/Xiaoerjing-Ekzemplafrazo.svg Anyone care to guess the language? (note: I can just about guarantee you'll get it wrong) 06:56:52 pikhq: The filename is a bit of a hint. 06:56:57 shachaf: Is it? 06:57:31 Well. I suppose it is. 06:58:05 I guessed that "Xiaoerjing" was vaguely Chinese-related before looking it up. 06:58:16 Still, WTF. 06:58:47 ? 06:59:11 That's fucking Mandarin, the fuck. 07:07:57 western china? 07:20:12 -!- GreaseMonkey has quit (Quit: The Other Game). 07:42:27 I would have guessed that "Xiaoerjing" would be vaguely oerjan-related. 07:43:48 -!- Zuu has quit (Read error: Connection reset by peer). 07:45:59 -!- SgeoN1 has quit (Ping timeout: 240 seconds). 07:48:51 -!- Zuu has joined. 08:21:03 -!- CakeProphet has joined. 08:21:03 -!- CakeProphet has quit (Changing host). 08:21:03 -!- CakeProphet has joined. 08:32:04 fungot 08:32:06 CakeProphet: madam president, may i offer my congratulations on his excellent report inviting us to reflect a vision of the future constitutional treaty. yet again we are suffering from this. allow me to intervene in this region where there is overcapacity, fishermen who can no longer stand by while saddam hussein keeps playing these games. last month the commission presented its legislative proposals for the 18 council regulat 08:33:37 ^style 08:33:37 Available: agora alice c64 ct darwin discworld europarl* ff7 fisher fungot homestuck ic irc iwcs jargon lovecraft nethack pa sms speeches ss wp youtube 08:33:55 ^style speeches 08:33:56 Selected style: speeches (misc. speeches from Project Gutenberg) 08:33:57 fungot: hi 08:34:04 fungot: why do you not love me? :( 08:34:10 -!- CakeProphet has changed nick to ElliotDrone1. 08:34:14 fungot: hi 08:34:15 ElliotDrone1: mr. chairman and fnord am very glad to be able to violate the ordinary rules of composition as well as society has its pleasures; as from the city. 08:34:18 -!- ElliotDrone1 has changed nick to CakeProphet. 08:42:31 fungot: oh? 08:42:32 CakeProphet: if i had written it all out the day before the furnace, so a fancy may be said that a man who had neglected his studies were fnord by the restless bed of fnord and i recollect that the most audacious libels on royal majesty have passed without notice; that the most audacious libels on royal majesty have passed without notice; that the most intense terrors." 09:17:53 -!- monqy has quit (Quit: hello). 10:04:00 -!- hagb4rd has joined. 10:42:30 -!- copumpkin has quit (Ping timeout: 248 seconds). 10:42:55 -!- copumpkin has joined. 11:05:21 -!- derdon has joined. 11:43:08 -!- aloril has quit (Ping timeout: 240 seconds). 11:56:31 -!- aloril has joined. 12:21:30 -!- augur has quit (*.net *.split). 12:21:31 -!- twice11 has quit (*.net *.split). 12:21:31 -!- yorick has quit (*.net *.split). 12:21:57 -!- augur has joined. 12:24:06 -!- twice11 has joined. 12:24:43 -!- yorick has joined. 12:55:52 -!- boily has joined. 13:04:05 -!- pikhq_ has joined. 13:04:24 -!- pikhq has quit (Ping timeout: 258 seconds). 13:25:32 -!- Patashu has quit (Ping timeout: 240 seconds). 13:35:26 -!- Phantom_Hoover has joined. 13:37:59 -!- copumpkin has quit (Ping timeout: 248 seconds). 13:38:23 -!- copumpkin has joined. 13:44:22 -!- MSleep has quit (*.net *.split). 13:44:22 -!- Zwaarddijk has quit (*.net *.split). 13:48:30 -!- MSleep has joined. 13:48:30 -!- Zwaarddijk has joined. 14:04:40 -!- copumpkin has quit (Ping timeout: 252 seconds). 14:05:04 -!- copumpkin has joined. 14:29:02 -!- Zwaarddi1k has joined. 14:33:47 -!- MSleep has quit (*.net *.split). 14:33:47 -!- Zwaarddijk has quit (*.net *.split). 14:52:24 -!- copumpkin has quit (Quit: Computer has gone to sleep.). 15:08:27 fungot: is it okay if I pretend to have a conversation with you? 15:08:29 tswett: there is one honest and industrious neighbours rather than among rioters and vagabonds. this matter is as much a theory of government in opposition to their prayer. when the question is not, i am fnord. fnord patron ( rousseau) et fnord fnord quod fnord urbi. 15:08:49 Uh... 15:08:50 ^style 15:08:50 Available: agora alice c64 ct darwin discworld europarl ff7 fisher fungot homestuck ic irc iwcs jargon lovecraft nethack pa sms speeches* ss wp youtube 15:08:56 Is that so. 15:09:03 ^style ss 15:09:04 Selected style: ss (Shakespeare's writings) 15:09:12 Mm, no. 15:09:21 ^style homestuck 15:09:21 Selected style: homestuck (Homestuck pages 1901-4673) 15:09:29 fungot: no spoilers, please. 15:09:30 tswett: the only sad part is how easy it's going to be a long day. though it is pretty conceivable that i will remain an impeccable leader for a span. he is the first and they get progressively more difficult to reach a very high rolls he was lucky. my lusus sucks, what a terrible idea. leave me alone. 15:09:41 -!- derrik has joined. 15:10:01 fungot: oh, come on. You're a terrible leader and you deserve to have such a sucky lusus. 15:10:01 tswett: john, try to stop me i dare you. published by major developers, was given a name! you've been eating it all day. and it might help you take a picture of a fella all worked! you love your scribblepad. 15:10:54 fungot: I guess I will, then. Even my scribblepad easily matches you... what kind of lame weapon do you have allocated, anyway? 15:10:55 tswett: this is it, like an apple or that it is your backup hat. problem solved, you guess. at the last minute she flung through skaian defense. what a royal mess of his lovely new horseleather bib. it just so happens that today, the 13th of april. another day of uneventful but highly satisfying 15:11:01 fizzie, how does it feel to be a major developer? 15:11:02 Phantom_Hoover: You have 4 new messages. '/msg lambdabot @messages' to read them. 15:11:23 An apple. Yes, I can surely defeat someone armed with only an apple. 15:12:08 What if they're armed with that sword alone? 15:15:49 What sword? 15:17:32 -!- copumpkin has joined. 15:33:27 tswett, that sword alone! 15:33:36 It can't stop, you know. 15:34:21 I'm afraid I'm not familiar with the sword you speak of. 15:53:49 -!- MDude has joined. 15:56:46 HEY GUYYYYYYS best VAX simulator? 16:06:38 -!- sebbu2 has joined. 16:08:49 -!- sebbu has quit (Ping timeout: 276 seconds). 16:17:59 -!- elliott has joined. 16:21:03 08:34:10: -!- CakeProphet is now known as ElliotDrone1. 16:21:04 elliott: You have 2 new messages. '/msg lambdabot @messages' to read them. 16:21:04 CakeProphet: die 16:28:39 15:56:46: HEY GUYYYYYYS best VAX simulator? 16:28:41 Gregor: Dyson? 16:28:49 Good ol' Phantom_Hoover here? 16:28:57 Gregor: MORE SERIOUSLY, probably SIMH? 16:29:01 Top on Google. 16:29:06 Also it does PDPs. 16:29:35 You can tell it's good because it's unpronounceable. 16:29:48 Wait, my name has an mh in it... 16:32:09 (I tried to change my name to Ford_Prefect here, and then to Ix, but they're both in use.) 16:37:14 "Note that the K combinator is operationally similar to \x y . x" — Haskell wiki. 16:37:18 Similar? 16:38:17 Phantom_Hoover: SKI calculus isn't defined in terms of the lambda-calculus. 16:38:33 Sure, but operationally they're identical. 16:39:09 Well, yes. 16:39:20 Phantom_Hoover: But you have to define a system with both of 'em to say things like that. 16:39:29 Otherwise it's not clear what "identically" means at all. 16:40:45 Oh god, I nearly used a hyphen rather than a diaeresis. 16:40:54 You almost weren't terrible. 16:41:14 I WILL TAKE MY DIAERESES TO THE GRAVE 16:42:07 Diaeresae. 16:42:12 Sorry, Ï WÏLL TÄKË MŸ DÏÄËRËSËS TÖ THË GRÄVË 16:43:13 Phantom_Hoover: Ah. 16:44:41 s/W/Ẅ/g;s/H/Ḧ/g 16:45:12 I was going to try them on all the consonants, but I couldn't be bothered. 16:46:36 Deewiant: Hey WISE GUY, I've got a TEAM OF PHDS working on my N-CURSOR ZIPPER SPARSE DISCERETE INFINITE LAHEY-SPACE INTERFACE 16:46:39 SO HA HA HA 16:47:19 Hope it works out for you 16:47:49 Deewiant: I'VE USED ABOUT SEVEN GADTS AND UNSAFECOERCE, IT FUCKING BETTER 16:54:33 elliott: YeahOK, SIMH seems like the way. Unfortunately PDP's will never be supported, I need too much memory :P 16:54:39 lol 16:54:54 Gregor: So, three kilobytes? 16:55:46 I haven't measured, actually :P 16:55:50 But probably ~10M 17:00:01 elliott: Anyway, I feel VAX would be a nice topper for my JIT :P 17:00:42 Gregor: I can't help but feel you'd do better if your language was less boring :P 17:00:52 That's a point ... 17:00:55 What shall I add? 17:01:17 I'd think more along the lines of "change" than "add", but that's probably way too much work at this point :P 17:01:30 But a lot of the winning IOCCC entries do something fairly impressive even apart from their code. 17:01:35 You still deserve to win though :P 17:01:56 I think the "fairly impressive" part is that it JITS EVERYWHERE :P 17:02:13 Well, yeah, but you can't tell that just from running it, and it's no flight sim :P 17:02:26 BTW you should integrate this technology into Fythe! :p 17:02:34 lol 17:05:56 -!- quintopia has quit (Ping timeout: 260 seconds). 17:15:54 -!- quintopia has joined. 17:15:54 -!- quintopia has quit (Changing host). 17:15:54 -!- quintopia has joined. 17:19:28 -!- monqy has joined. 17:21:50 hi monqy 17:24:11 -!- Zuu has quit (Ping timeout: 244 seconds). 17:29:28 -!- augur has quit (Remote host closed the connection). 17:33:28 Deewiant: BEHOLD YOUR DEFEATER: http://sprunge.us/MfXU 17:34:21 It has been beheld 17:35:09 Deewiant: There is noooo way you properly beheld that in the time it took you, did you even NOTICE the unsafeCoerce? 17:35:12 The rank-2 fold?? 17:35:27 I missed the unsafeCoerces, noticed the fold though 17:37:38 hi 17:38:30 hi monqy you behold too http://sprunge.us/MfXU 17:38:47 Deewiant: Also this is only a quadtree, it's going to require something even more ridiculously involved for something decent :-/ 17:39:00 Plus the fact that I don't actually have the algorithms to move the cursors about yet 17:39:01 May I recommend a bucket PR-CIF k-d tree 17:39:39 Deewiant: Maybe 17:39:51 Deewiant: I'd rather not use something that wants a dynamic array, at least 17:40:05 Also I'll have to use something slightly different from anything you say to establish my superior thinking 17:40:17 Actually hmm 17:40:25 Deewiant: You use a dynamic array just so you can load the whole file into one, don't you 17:40:27 That's sneaky 17:40:29 Sneaky and deceitful 17:41:17 I can't do that since the file isn't rectangular 17:41:28 Deewiant: I don't mean directly 17:41:38 Deewiant: I just mean, you do it so that you don't have to deal with cross-array boundaries during file loading 17:41:39 Then yes 17:41:46 Sneaky, and wrong 17:42:10 Well, in a sense I have to deal with them, if there're arrays already there 17:42:41 Deewiant: Well, yes, but it still speeds up your initial load 17:43:04 I guess I'll have to resolve myself to being slower on Mycology and faster on Fungicide 17:43:08 s/resolve/resign/ 17:43:15 Compared to something like a hash table, it should, yes 17:43:57 Deewiant: Compared to the structure you have but with fixed-size arrays :P 17:44:58 Compared to that too, it should, yes 17:45:12 The whole point was to not use fixed-size arrays :-P 17:45:33 Until it turned out that not having the compiler optimize x*C into a shift-and-add was a bottleneck 17:46:56 Deewiant: I don't see how dynamic arrays really help much, if you have a fancy k-d tree 17:47:03 Or other sufficiently smart space :P 17:47:10 Certainly the indexing is a lot more trivial 17:47:54 Maybe they don't, it was more of a matter of principle 17:48:08 lol 17:48:43 Deewiant: Thankfully I think this n-cursor setup doesn't actually really have that much overhead over mutation, so ha 17:49:25 (It basically cuts off the tree at each point where a cursor is, zips those at the cursor, and then arranges the whole thing into a zipper) 17:49:27 (Sort of) 17:49:31 Point being to one-up cfunge's "lol here's a int[1024*256], turns out it's fast to do stuff in that" with "I have no constants in my funge-space implementation and it's faster than yours"; unfortunately that didn't quite work (see x*C optimization) 17:49:51 Heh 17:50:14 Deewiant: You're still slower on Mycology, right :-) 17:50:17 (And there were and still are other, different constants) 17:50:22 elliott: AFAIK I'm faster on everything 17:50:43 On full Mycology, I might be somewhat slower only due to executing more fingerprint tests 17:50:45 How the heck do you beat it on Mycology; just your ridiculous fingerprint and stack microoptimisations? 17:50:54 It's not like your fungespace will help any :P 17:51:17 My fungespace is effectively the same and other than that, maybe those play a part, dunno :-P 17:54:33 Actually, I think I'm still slower on fungot's underload interpreter; can't remember for sure 17:54:33 Deewiant: that is a winner's attitude, and there is no particularly good human translation for this concept. a concept usually denoted by a single, linear concept. a concept usually denoted by a single, linear concept. a concept usually denoted by a single, linear concept. a concept usually denoted by a single, linear concept. a concept usually denoted by a single, linear concept. a concept usually denoted by a single, linear c 17:55:08 :D 17:56:37 Deewiant: What you need to do is implement UNDL 17:56:47 For AUA (Advanced Underload Acceleration(tm)) 17:59:37 Deewiant: I... why am I actually considering implementing that 17:59:55 -!- augur has joined. 18:01:15 Couldn't say 18:16:15 "Here is a PoC for four new buffer overflows in GIMP. Compile it 18:16:15 with open-cobol." 18:16:20 Now that's what I like to hear. 18:17:03 Hmph, it's not proper COBOL. 18:17:07 It's just a glorified cat. 18:17:10 Without the loop. 18:31:27 elliott: cat repl.jch hello.jch gorepl.jch | ./jitchards 18:31:31 Hello, world! 18:31:37 Gregor: Wow :P 18:31:45 Gregor: It's... not a repl without a prompt, y'know :P 18:31:47 Also, what's gorepl. 18:32:08 elliott: 1) It has a prompt, I'm just suppressing it by catting shit in, 2) gorepl says "now run the function you loaded as main" 18:32:21 Gregor: Wait, it /detects whether stdin is a tty/? 18:32:27 No 18:32:35 You'd have to cat repl.jch - | ./jitchards normally 18:32:41 How does it suppress the prompt then :P 18:32:56 Oh, you mean it would show a 'put ur code here lol> ' thing 18:33:01 Well that's boring and stupid. 18:33:09 Gregor: Don't call it a REPL then :P 18:33:17 FINE, I'LL ADD A PROMPT 18:33:22 !bf_txtgen > 18:33:27 ​34 ++++++++++[>++++++>+>><<<<-]>++.>. [55] 18:33:30 Gregor: You might also want to add the "read" and "loop" part so you don't have to cat - :-) 18:33:42 I GUESS you can forego a tape debug output? 18:33:49 The whole system only reads from stdin, and it does loop X_X 18:33:58 Gregor: Don't use bf_txtgen for single chars 18:34:09 http://esolangs.org/wiki/Brainfuck_constants 18:34:12 > ord '>' 18:34:13 62 18:34:14 elliott: It's two chars 18:34:21 ++++[>+<++++]>- 18:34:30 elliott: It's two chars 18:34:32 > ord ' ' 18:34:34 32 18:34:40 ++++[>+<++++]>-.[-]++++[>++++++++<-]>. 18:34:44 ...OK, I guess bf_txtgen wins this time :P 18:34:46 Congrats, it's longer. 18:35:05 HEYWAIT 18:35:14 REPL = Read Eval Print Loop THERE IS NO "PROMPT" HERE 18:35:35 what 18:35:35 No, there isn't, but every REPL in the history of ever has had a prompt. 18:35:38 yes 18:35:38 My repl is 100% REPL satisfaction except for the P :P 18:35:48 REPL should print a prompt 18:35:52 its userfriendly 18:35:54 Oy vey 18:36:02 Gregor: R, E, P, L are necessary but not sufficient conditions :P 18:40:39 ... lol bf_txtgen ignored my space and put a newline :P 18:47:29 Gregor: I bet EgoBot is the one ignoring the space :P 18:47:41 Probably 18:59:54 04:25:05: data MetaContext = MetaContext { nwNeighbor :: MetaCursor (To NW), ..., up :: MetaCursor dir, signPost :: SignPost } -- it occurs to me that some field name disambiguation will be needed 19:00:00 well this is going to need oerjisambiguation >:( 19:00:33 elliott: lullll my circularity changes broke SPARC somehow :P 19:00:41 lol 19:00:49 Gregor: Did you ever get it working on Itanium 19:00:57 elliott: I don't have a working simulator. 19:01:05 Gregor: MMIX? 19:01:17 elliott: Now there's a nice'n 8-D 19:01:34 Gregor: Test with jsmmix :P 19:01:34 elliott: Except I have no stdlib, so can't really test >_> 19:01:49 Gregor: More seriously, Alpha? 19:02:12 elliott: IIRC the only reason I haven't tried Alpha is that I was too lazy to build a cross compiler. 19:02:19 X-D 19:07:33 Argh, I forgot how awful GHC's API is. 19:12:20 elliott: Fixed SPARC. 19:12:26 Woot 19:13:50 The problem was very stupid, it was variable shadowing :P 19:14:00 I didn't think it was so sensitive to this kind of change X-D 19:15:01 | | Target Architecture (alpha) ---> | | 19:15:05 | | Bitness: (32-bit) ---> | | 19:15:08 Uhhh, crosstool-ng? 19:15:12 alpha ain't gonna be 32-bit 19:21:19 Deewiant: So does mushspace do k-d things or is it just capable of doing so without API changes in the future 19:21:33 It should be capable 19:21:41 mushspace == CCBI 19:22:22 Deewiant: Right, just checking that it won't speed things up massively in the short term before Shiro takes the lead :P 19:36:11 -!- ais523 has joined. 19:36:48 hi ais523 19:37:25 hi elliott 19:38:54 http://sprunge.us/AXOB 19:40:06 elliott: ^ 19:40:38 ais523: glanced at file list, eyes hit upon the source directory, tab closed 19:40:44 haha 19:40:46 OK, wtf variant of the Alpha do I need to select X_X 19:40:55 call of link remains. perhaps this is the end... 19:41:18 elliott: don't worry, it's sane 19:41:23 it's only very tangentially related to Feather 19:41:29 the name of the language is Not Even Feather 19:41:33 -!- CakeProphet has quit (Read error: Operation timed out). 19:41:36 ais523: That's, uh, a very minimal syntax. 19:41:43 yep 19:41:45 it's just sexps 19:41:48 those are really easy to parse 19:41:48 ais523: Actually I think it shares a syntax with Qq. 19:41:58 s/Qq/qq/ 19:42:03 the parser would be even simpler if I didn't try to do type inference in it 19:42:16 `addquote the parser would be even simpler if I didn't try to do type inference in it 19:42:23 719) the parser would be even simpler if I didn't try to do type inference in it 19:42:57 ais523: hmm, is it sufficiently Not Feather that my apparent inability to find any self-modification is expected? 19:43:20 yes 19:43:25 it doesn't have self-modification 19:43:52 ais523: how is it Not Entirely Not Feather, then? 19:43:53 NEF's a language designed for use as the backend of Feather interpreters 19:43:56 -!- Darth_Cliche has joined. 19:44:01 ah 19:44:03 is it complete? 19:44:06 it's TC 19:44:17 although a little tricky to avoid writing infinite loops in it 19:44:25 I mean, is further expansion planned? 19:44:41 also, someone should write a safe unsharchiver 19:44:45 no, unless I find a good way to make evaluation less eager 19:44:50 like how JSON was originally parsed with eval() and then people wrote real parsers 19:45:10 ais523: grrr, sharbomb 19:45:17 sorry; aren't they usually? 19:45:20 maybe 19:45:32 anyway, the main weird feature of the language is "overeager" evaluation 19:45:44 ais523: is that the same as superstrict? 19:45:48 i.e. doing reduction inside lambdas 19:45:53 yep 19:45:54 (which tends to make things like Y diverge) 19:46:12 ais523: hmm, I think reimplementing this would be simpler than installing an OCaml compiler 19:46:16 * elliott does so 19:46:22 configure: error: The alphaev6 is not supported. 19:46:23 WTF GLIBC 19:46:31 what, reimpls, or installs OCaml? 19:46:32 It said that for alphaev4, alphaev5 too 19:46:35 ais523: former 19:46:39 heh 19:46:58 it's mostly a proof-of-concept interp 19:47:14 ais523: hmm, what's the difference between Var1 and Var2? 19:47:16 anyway, what I really need to show that NEF has fit its concept correctly is to write a self-interp with eigenratio 1 19:47:33 elliott: which argument it refers to 19:49:19 the language has exactly two types: 1, which takes an argument of type 2, and 2, which takes two arguments, of type 2 and 1 respectively 19:49:40 functions never return, so it doesn't make sense to say that the return value has a type 19:50:05 elliott: are you at least reimplementing it in Haskell? 19:50:56 it should be possible to translate more or less directly, as apart from the I/O right at the start and some debug output, that interpreter is pure 19:51:37 back 19:51:44 ais523: yep 19:51:54 ais523: so is Var1 a variable reference to a variable of type 1? 19:52:04 yep 19:52:18 ais523: cool, I can represent the types in Haskell then 19:52:43 ais523: hmm, and Call1 calls a 1 with a 2? 19:52:50 and Call2 calls a 2 with a 2 and a 1? 19:53:13 Call2 takes three arguments; the first is the variable holding the function to call (of type 1), and the other two are its arguments, of types 2 and 1 respectively 19:53:17 *(of type 2) 19:53:20 and Call1 is analogous 19:53:23 ais523: why can't the function be an expression instead? 19:53:26 is that fundamental? 19:53:33 that's the main unusual feature of NEF 19:53:36 right 19:53:54 ais523: what is the return type of a 1? 19:53:56 and a 2? 19:54:00 or can they return either 1s or 2s? 19:54:00 there isn't one, they never return 19:54:07 no function ever returns in NEF 19:54:12 ais523: well, OK, what is the type of 2(2,1)? 19:54:16 erm 19:54:17 there isn't one 19:54:20 where i use integers to mean "something of that type" 19:54:28 ais523: then how do you pass a 2 or a 1? 19:54:35 by getting it from a variable? 19:54:39 if so, surely it should be Call1 of (int * int) 19:54:41 either that, or by giving a template 19:54:44 and Call2 of (int * int * int) 19:54:50 ais523: that's not in the program type :) 19:54:59 let me try to explain the language, rather than you to reverse-engineer it from the impl 19:55:10 probably a good idea 19:55:24 basically, if I write (a b c), that can be interpreted as \0.a(b,c) 19:55:35 well, \-1.a(b,c) 19:55:38 the numbers are relative to parens 19:55:44 so (0 0) = \x.x 19:55:50 wait 19:55:50 ais523: is it de bruijn or reverse de bruijn? 19:56:08 umm, I forget which way is which 19:56:26 but (0 0) always means \v c.c(v) 19:56:35 ais523: in de bruijn, 0 is the innermost var 19:56:39 in reverse de bruijn, 0 is the outermost 19:56:43 (de bruijn is much nicer) 19:56:55 and likewise, (0 (0 1)) means \x c.c(\y d.d(x)) 19:56:59 so 0 is innermost 19:57:48 forward de bruijn, then 19:59:13 ais523: but, ehh, is the only reason you have the arguments be programs instead of variable numbers so that you can use Exit and Error there? 19:59:22 or can you actually nest calls and that's what this template stuff is? 19:59:48 elliott: it's basically the same as giving a literal lambda as an argument to something 19:59:57 i.e. the arguments are either variables or function literals 20:00:07 and function literals can be very complex 20:00:20 (by "variable" I mean "lambda variable", btw, not the assignable sort) 20:00:22 ais523: OK, let me get a straight answer: is Call1 (n, Call2 ...) ever valid? 20:00:34 yes 20:00:42 so is Call1 (n, Call1 …) 20:00:43 ais523: what about Call1 (n, Call1 ...)? 20:00:45 OK 20:01:00 then indeed, i do not understand the language :) 20:01:16 I have a few examples 20:02:04 (0 0) is how you compile i into NEF; (0 (0 1)) acts like k; (0 (0 (2 0 (2 1 (1 0 2))))) acts like s; (0 (1 0) 0) acts like call/cc 20:02:21 elliott: Ohhey, it works on PPC and I never even did any work to make it, err, work there. 20:02:21 I get I and K but not the others, although S looks familiar 20:02:28 I think implementing it will probably be the first step in understanding it; it tends to be with languages this simple 20:02:30 Gregor: Neat 20:02:48 ais523: but I believe this means I can't actually do the type trick I was planning :) 20:02:58 indeed, I tried to do that trick too 20:03:05 but it doesn't work 20:03:07 ais523: what type does exit take? 1 or 2? 20:03:19 exit's of type 1 20:03:28 ais523: no it isn't 20:03:31 ais523: it isn't a program 20:03:32 so it has no type 20:03:39 ais523: in (Exit p), what type must p have? 20:03:49 elliott: it takes one argument of type 2; that's the definition of being type 1 20:04:00 ais523: it doesn't take an argument at all, because it's not a program! 20:04:03 it's a function from program to program 20:04:08 no it isn't 20:04:10 Call1 (Exit, ...) # not valid 20:04:17 ais523: it is, I'm looking at your ADT /right now/ 20:04:20 -!- derrik has quit (Quit: /clear). 20:04:20 elliott: Call1 (Call1, ...) # not valid 20:04:28 yes, which is why Call1 doesn't have a type 20:04:30 because it's not a program 20:04:47 and yet Call1 (0, Var2 0) is a program 20:04:54 ...yes? 20:05:00 (Exit p) is a program, obviously 20:05:03 Exit isn't 20:05:05 ah, right 20:05:15 therefore Exit doesn't have a type, because a type is something programs have 20:05:23 in that case, Exit takes a program of type 2 and returns a program of type 1 20:05:40 right; and I assume Error is a program of type 1 or 2, i.e. polymorphic? 20:05:52 nah, Error is me getting rid of code duplication 20:05:58 it's of type 1, always 20:06:07 OK 20:06:14 data T1 20:06:15 data T2 20:06:15 data Exp t where 20:06:15 Var :: Var t -> Exp t 20:06:15 Call1 :: Var T1 -> Exp T2 -> Exp ??? 20:06:15 Call2 :: Var T2 -> Exp T1 -> Exp T2 -> Exp ??? 20:06:17 Exit :: Exp T2 -> Exp T1 20:06:17 because I use the same codepaths for type 1 stuff (that don't have a type 1 arg) and type 2 stuff (which does have a type 1 arg) 20:06:19 Error :: Exp T1 20:06:21 this is why the trick fails :) 20:06:23 you can't fill in ??? 20:06:35 and just stick in Error as the type 1 arg 20:06:41 if I understood the language, I could probably do a better trick to reify the types, but I don't understand it well enough to do that now 20:06:43 ais523: ewwwww 20:06:47 ais523: I'm not going to have Error 20:06:53 I know >:) 20:06:57 elliott: I didn't think you would 20:07:12 ais523: btw, why is it (Exit of program) instead of just Exit, used like Call1 (Exit, p)? 20:07:49 elliott: the given program is executed to calculate the return value 20:08:00 ais523: and so it would be with Call1 (Exit, p), no? 20:08:09 or is this me not understanding the semantics again :) 20:08:20 the problem with the understanding-by-implementation approach is that it involves implementation 20:08:29 it's a side-effect of being hypereager 20:08:43 suppose Exit ends up being substituted into the first position of a Call 20:08:51 it can't be there, so needs to be evaluated immediately, but without exiting the program 20:09:06 so the argument to Exit's basically there to defer the evaluation 20:09:49 heh 20:09:54 I think the language probably needs a strictifier, incidentally, it'd avoid this sort of problem 20:10:09 and make writing safe infinite loops rather easier 20:10:13 ais523: Is Error something inherent to the language or just a way to get nicer reports than non-halting? 20:10:15 but you wouldn't have to expand the language syntax at all 20:10:33 elliott: Error isn't inherent to the language, it's simply there because I'm lazy 20:10:37 erm 20:10:39 ais523: Exit, I mean 20:10:40 you can write an impl without it, and probably produce nicer error messages 20:10:40 sorry! 20:11:00 http://i.imgur.com/1uOhf.png ;; this is the first time I have ever used three windows in Emacs 20:11:30 oh, basically, the input is a type 2 program and its type 2 arg; Exit is the type 1 arg it's given when it starts executing 20:11:48 so it wouldn't be needed if you didn't care about your programs being able to terminate 20:12:02 you could just use type 1 programs rather than type 2 programs as the initial input 20:14:30 elliott: OK, new reason for not testing on Alpha: I can't get a bloody cross-compiler at all >_< 20:15:25 ais523: I need a wider screen to do this three-pane coding :( 20:15:41 elliott: I typically split one of the halves horiziontally when doing three-pane 20:15:47 * elliott just switched to that 20:15:55 well, with a horizontal divider 20:17:04 ais523: Partial list of words I don't know the meanings of in the slightest: ig, incg, decg, substat 20:17:29 btw, it's entirely possible to write a program that doesn't type, such as (0 0 (0 0 0)); atm, I detect type errors at runtime rather than statically 20:17:53 anyway, incg and decg are basically used to adjust open terms 20:17:55 inside substat 20:18:24 and substat itself does substitutions in the typical lambda-calculusy way 20:18:47 ais523: huh? you don't need substitutions with de bruijn 20:19:10 elliott: how are you going to implement an application of a lambda otherwise? 20:19:32 ais523: you use a linked list; cons onto it when you do a call, and just index it when a variable is looked up 20:19:40 var 0 = car, var 1 = cadr, etc. 20:19:57 elliott: but what if that variable hasn't been evaluated yet? 20:19:57 and, ofc, you don't need alpha renaming 20:20:01 hypereager, remember? 20:20:08 ais523: what about it? 20:20:22 -!- Phantom__Hoover has joined. 20:20:31 http://i.imgur.com/1uOhf.png ;; this is the first time I have ever used three windows in Emacs ← You've never used Proof General? 20:20:31 Phantom__Hoover: You have 1 new message. '/msg lambdabot @messages' to read it. 20:20:43 Phantom__Hoover: That doesn't couuunt. 20:20:56 XD 20:21:03 elliott: example: I just gave (0 (0 (2 0 (2 1 (1 0 2))))) and (0 0) as input to the interpreter (s and i) 20:21:12 and here's the debug output: 20:21:15 (0c (0c (2v 0v (2v 1v (1v 0v 2c))))) [(0c 0v), (exit 0v)] 20:21:17 (exit 0v) [(0c (1v 0v (1v 0v 1c))), error] 20:21:18 (0c (1v 0v (1v 0v 1c))) 20:21:39 -!- Phantom__Hoover has changed nick to Phantom___Hoover. 20:21:41 you know that's not going to help me; ais523: if you mean that you have to evaluate expressions before consing them, so what? 20:21:43 -!- Phantom_Hoover has quit (Ping timeout: 248 seconds). 20:21:47 you can do that easily 20:21:49 Hmm. 20:21:53 elliott: no, you have to cons them before knowing what they are 20:21:59 elliott, shoddy. 20:22:02 -!- Phantom___Hoover has changed nick to Phantom_Hoover. 20:22:06 ais523: oh, right; that's easy 20:22:08 Phantom_Hoover! 20:22:15 ais523: you just use a linked list of (Maybe Exp) instead 20:22:17 shachaf! 20:22:20 Nothing means you don't know what it is yet 20:22:28 Phantom_Hoover: Don't you owe me a message or two? 20:22:30 elliott: but how can you tell which Nothing is which afterwards? 20:22:43 ais523: what? 20:22:46 @tell shachaf friendship message 20:22:47 Consider it noted. 20:22:59 here: in the above example, I start with (0 (0 (2 0 (2 1 (1 0 2))))), then substitute in (0 0) and exit 20:23:09 and get exit (0 (1 0 (1 0 1))) 20:23:45 basically, we're substituting for the first 2 in (0 (2 0 (2 1 (1 0 2)))) 20:23:47 you're just going to keep quoting programs at me you know I can't yet read, right? anyway, the whole point is, if you get Nothing, abort reduction of that variable 20:23:54 but failing that, you can have (Either Int Exp) instead 20:24:00 if you want to keep track of them 20:24:04 -!- tiffany has joined. 20:25:46 elliott: OK; so suppose I want to evaluate the following open term: (0 0) applied to 0 and (2 1 (1 0 2)); that's going to give me ((2 1 (1 0 2)) 0), but I don't know what the 2 at the start refers to 20:25:53 because it refers beyond the start of the expression 20:26:00 hmm, let me translate into lambda calculus 20:27:08 -!- oerjan has joined. 20:27:30 wait, I'm confused 20:27:33 hi oerjan 20:27:40 hello 20:28:03 I'm pretty certain your suggestion is incorrect, but need a bunch of calculation to work out why 20:28:27 ais523: lol 20:28:40 oerjan: i implemented your cursor stuff and PSeq, just without any operations :P 20:28:54 oerjan: also, turns out what i thought the gadt record syntax was is deprecated, you were right with Foo :: { ..., ... } -> R 20:29:07 elliott: I think it's because it gets the evaluation order wrong 20:29:31 elliott: No, it's Foo :: { a :: Int } -> { b :: Char} -> R, isn't it? 20:29:34 ais523: I refuse to believe you have an evaluation scheme which cannot be implemented with an environment and absolutely requires substitution; that's patently ridiculous 20:29:42 ais523: even if my specific solution doesn't work 20:29:59 elliott: aha. i noticed wrt PSeq you said something about unsafeCoerce :P 20:30:08 elliott: there probably is a way to do it with an environment, just not the way you suggested 20:30:08 shachaf: Nope. 20:30:11 i guess that may be the simplest way to implement it 20:30:23 oerjan: yes, I didn't feel like implementing my own finger trees :P 20:30:34 but I fear it'd get exponentially complex to maintain the environment 20:30:51 -!- Zuu has joined. 20:31:17 ais523: I doubt it 20:31:38 elliott: Ugh. 20:31:43 ais523: I don't see why Unknown doesn't work; if you get Unknown back, then behave as you would with an unsubstituted variable reference in a substituting implementation 20:31:46 You're right. 20:31:57 elliott: let's see… suppose I have \x.(… some expression containing a call of x …), and apply a value to it 20:32:10 * shachaf thinks GADT syntax and regular syntax could be unified into something better pretty easily. 20:32:40 so, I have one append-only stack (because no returns) that contains the values of open terms in the current expression 20:32:59 and then, I have to traverse the inside of the brackets to find all uses of x in call position, and evaluate them immediately 20:33:01 oerjan: zipper.hs: http://sprunge.us/BDYL 20:33:05 oerjan: PSeq.hs: http://sprunge.us/IBPQ 20:33:20 ais523: mmhm 20:33:31 so what stack do I use to evaluate /those/? 20:33:38 and what do I put on it? 20:34:25 ais523: say the environment for ((\x. ... (x e) ...) xv) is [a,b,c]; the environment for evaluating (x e) is [xv,a,b,c] 20:34:57 say x = \q.u 20:34:59 hmm… that breaks the links between numbers and positions in the list 20:35:11 then the environment for evaluating u is [e,a,b,c] 20:35:13 because scoping 20:35:15 ais523: no it doesn't 20:35:26 ais523: [xv,a,b,c]!!0 = xv 20:35:29 [xv,a,b,c]!!1 = a 20:35:33 elliott: what if I have ((\x. … ( … (x e )) …) xv) 20:35:36 de bruijn is retained 20:35:49 ais523: calls don't introduce new bindings, so that's irrelevant 20:35:56 I'm going to need to use [xv,?,a,b,c] as the list 20:36:09 what? 20:36:15 wait, no, [?,xv,a,b,c] 20:36:25 elliott: think of it in number terms; x won't be 0 inside (x e) 20:36:28 it'll be some larger number, like 2 20:36:45 ais523: no it won't, unless by "..." you meant "... that includes a lambda" 20:36:50 elliott: err, right 20:36:57 all open parens imply a lambda in NEF 20:37:04 so counting parens and counting lambdas comes to the same thing 20:37:18 ais523: so what you're discovering is, parsing an expression containing variables into de bruijn requires a map from variable name to integer 20:37:27 and each integer increases for each new lambda 20:37:31 shocking 20:37:44 however, unrelated to the semantics of a language coded directly in de bruijn 20:38:01 elliott: we're talking about the implementation 20:38:26 yes, and you have successfully confused the issue by using named variables which has somehow turned into a point involving conversion to de bruijn 20:38:36 which is irrelevant since named variables feature nowhere except in your attempted explanation afaict 20:39:02 elliott: I was going on /your/ example 20:39:08 because you refuse to read examples involving numbers 20:40:25 ais523: if it were de bruijn lambda calculus i would understand perfectly 20:40:39 but I do "refuse" (am unable to) understand examples in a language I'm in the process of trying to understand, yes 20:40:48 it sort-of is, just with a weird evaluation order 20:40:54 what syntax do you want for de bruijn lambda calculus? 20:41:48 exp := int | '(\' exp ')' | '(' exp exp ')', with omitted parens for repeated left-associative application, and whitespace to separate integers? 20:42:05 and parens on outermost lambdas omittable, etc. 20:44:35 ah, OK 20:45:34 NEF's syntax is basically that, except that it uses (…) rather than (\…), and that a lambda can take two arguments instead of one; both of the arguments has the same number, and it works out which is being referred to by the type 20:45:57 well, OK; I certainly have a better understanding of the lambda-calculus though 20:48:08 *First time looking at VAX* I like how VAX is clearly the primary influence for x86 :P 20:48:46 Gregor: http://esolangs.org/wiki/User:Ian#DEC_VAX 20:48:58 Gregor: ("Other Neat CPUs" section is great also) 20:49:45 Gregor: CALLG is really cool, hardware varargs :P 20:49:49 POLYx is also hilarious 20:50:05 "CASEx has a format like this: selector.rx, base.rx, limit.rx, displ[0].bw, ..., displ[limit].bw The instruction has "limit+3" operands. Not only can the VAX not tell how long the instruction is until it's completely decoded, it can't even tell how many operands it has! The whole thing can be 4GB long. Technically it can be 8GB long, but the VAX only has 4GB of addressing space." 20:50:18 Incidentally, my JIT currently does not (seem to?) work on VAX, and I think I know why, but not how to fix it ... 20:50:19 ais523: well, go on 20:50:33 err, I'm in the middle of something else 20:50:39 I get distracted easily 20:50:41 heh 20:50:43 Also, NetBSD VAX = yesssssssssssssss 20:50:45 Gregor: Try it on this: http://esolangs.org/wiki/Talk:Timeline_of_esoteric_programming_languages#AS.2F400 20:51:42 oerjan: did you look :P 20:51:52 elliott: in your foldr, i think the (forall a. result a a) can simply be result dest dest 20:52:00 elliott: Need compiler and simulator (also, CISC is usually the easiest, I think the issue with VAX is that it has markers at the beginning of functions which are not valid instructions but need to be there (?????)) 20:52:22 oerjan: hmm, so it can. that seems really ugly: why can't it be result src src, too? 20:52:44 Gregor: Not *really*; x86 was more influenced by earlier Intel designs than anything else. That said, CISC had a lot of crazy stuff. 20:52:50 Also, yay 32-bit PDP-11! 20:53:04 elliott: Yup, my generated code totally has halts in it :P 20:53:30 Gregor: hmm, is VAX the architecture that didn't have a stack, but rather stored return addresses just before the start of a function? 20:53:57 ais523: ... I can't imagine so, that wouldn't work with C very well. Recursion and what have you. 20:54:17 it didn't, IIRC 20:54:40 I doubt it. 20:54:44 elliott: result src src would be for foldl, obviously... it's what replaces the right and left end, respectively. 20:54:56 oerjan: oh, right 20:55:09 hmm, but isn't AS/400 or i that thing that has a machine-independent binary format and is currently implemented using POWER7? 20:55:11 oerjan: what's weird about seqs is that they have, I think, four folds 20:55:20 oerjan: foldr, foldl, foldrFromRight, foldlFromRight 20:55:32 heh 20:55:33 Seeing as the PDP-11 used a stack, and the VAX started as a 32-bit PDP-11. 20:55:48 oerjan: although, I suspect that foldr == foldlFromRight and foldl == foldrFromRight in results, just not in semantics 20:55:52 err 20:55:55 oerjan: as in, evaluation semantics 20:56:15 elliott: presumably it may matter in thunk buildup 20:56:22 oerjan: right, that's what I meant 20:56:36 oerjan: incidentally, i note that one can have a PSeq of PSeqs... 20:56:43 i.e. (PSeq (PSeq path) src dest) 20:56:48 oerjan: which got me wondering what Mu PSeq is >:) 20:57:05 oerjan: unfortunately I think it's just data Foo = Foo | Bar Foo Foo 20:57:21 and there's no value with src =/= dest 20:58:16 elliott: in fact you would probably want foldl to be fromRight by default, since the other options just add thunks needlessly; the ' versions though would go the other way for both foldl and foldr. 20:58:25 oerjan: right 20:59:32 also, who's this "Ian"? I'd like him to explain why CASEx needs to be completely decoded to know how many operands it has 20:59:50 elliott: PSeq is sort of a * -> * -> * type transformer 20:59:54 olsner: esowiki guy, ping him on his talk page or use the wiki email thing? 21:00:00 oerjan: indeed 21:00:14 oerjan: incidentally, you can't implement Show (PSeq path src dest) because you need (forall a b. Show (path a b)) :-( 21:00:15 afaict, limit is the third operand and should say exactly how long the rest of it is 21:00:19 elliott: oh and one other thing i thought of, you could make a Category instance for PSeq 21:00:23 oerjan: ooh 21:00:24 elliott: meh, can't be bothered logging in 21:00:27 oerjan: shiny 21:00:29 I probably even have an account 21:00:46 elliott: it's sort of a free category on the path type 21:01:06 oerjan: i wonder if it's an arrow... arr seems tricky, maybe it's an arrow if the path is 21:02:33 oerjan: it's a super pretty structure 21:03:49 elliott: i think your Mu PSeq is more than that; it would allow constructing empty PSeq's at all nesting levels wouldn't it, so it would work similarly to building up set theory from empty lists. oh hm you could never get a PSeq a b for a /~ b, i think, so it may be equivalent to Mu Seq. 21:04:11 oerjan: that's what i said 21:04:15 data Foo = EmptyList | Cons Foo Foo 21:04:35 [[],[],[]] = Cons EmptyList (Cons EmptyList (Cons EmptyList EmptyList)) 21:04:36 etc. 21:04:42 elliott: well if you consider cons lists equivalent to Seq's... 21:04:47 well ok 21:04:55 @src foldl' 21:04:56 foldl' f a [] = a 21:04:56 foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs 21:05:00 darn, they just use an ugly let too 21:05:42 oerjan: yikes, I'm not sure foldr' is possible 21:05:48 oerjan: because of the fiddly parametrisation 21:06:04 elliott: you might implement Show if you made a Show2 class for path 21:06:08 oerjan: indeed 21:06:17 (***) :: PSeq path a b -> PSeq path b' c' -> PSeq path (b, b') (c, c') 21:06:20 oerjan: wow that's pretty 21:06:23 it's like simulwalking!! 21:06:28 ...not sure it's possible though 21:06:31 because what if the lengths differ 21:09:19 why would foldr' (and equivalently foldl') not work? 21:09:23 oerjan: because 21:09:27 Expected type: result a a 21:09:27 Actual type: result mid dest 21:09:27 In the second argument of `foldr'', namely `z'' 21:09:27 In the second argument of `seq', namely `foldr' f z' ps' 21:09:33 where z' = f pn z from the right 21:10:11 ...oh i see 21:10:18 you can relax the type 21:10:29 how? 21:10:35 foldr :: (forall a b c. path a b -> result b c -> result a c) -> (forall a. result a a) -> PSeq path src dest -> result src dest 21:10:43 (just pasting to get something to edit) 21:10:50 I already releaxed foldr to result dest dest 21:10:53 and this doesn't work with that 21:10:56 or the quantified version 21:11:12 foldr :: (forall a b c. path a b -> result b c -> result a c) -> result dest end -> PSeq path src dest -> result src end 21:11:27 _that_ might work, and even with foldr' 21:12:09 same error: 21:12:11 Expected type: PSeq path src mid 21:12:11 Actual type: PSeq path src dest 21:12:11 In the third argument of `foldr'', namely `ps' 21:12:11 In the second argument of `seq', namely `foldr' f z' ps' 21:12:15 oh hm 21:12:22 that's not the same error but it's still a mismatch 21:12:23 ? 21:12:35 foldr' 21:12:35 :: (forall a b c. path a b -> result b c -> result a c) 21:12:35 -> result dest end 21:12:35 -> PSeq path src dest 21:12:35 -> result src end 21:12:36 foldr' f z ps = 21:12:38 case viewr ps of 21:12:40 PEmptyR -> z 21:12:41 oh hm 21:12:42 ps' :> pn -> 21:12:44 let z' = f pn z 21:12:46 in z' `seq` foldr' f z' ps 21:12:48 /home/elliott/Code/shiro/PSeq.hs:98:31: 21:12:50 Couldn't match type `dest' with `mid' 21:12:52 `dest' is a rigid type variable bound by 21:12:54 the type signature for 21:12:56 foldr' :: (forall a b c. path a b -> result b c -> result a c) 21:12:58 -> result dest end 21:12:59 elliott: foldr :: (forall a b c. path a b -> result b -> result a) -> result dest end -> PSeq path src dest -> result src 21:13:00 -> PSeq path src dest 21:13:02 -> result src end 21:13:04 at /home/elliott/Code/shiro/PSeq.hs:93:1 21:13:06 `mid' is a rigid type variable bound by 21:13:08 a pattern with constructor 21:13:10 :> :: forall (path :: * -> * -> *) src dest mid. 21:13:12 PSeq path src mid -> path mid dest -> PViewR path src dest, 21:13:14 in a case alternative 21:13:16 at /home/elliott/Code/shiro/PSeq.hs:96:5 21:13:18 Expected type: PSeq path src mid 21:13:20 Actual type: PSeq path src dest 21:13:22 In the third argument of `foldr'', namely `ps' 21:13:24 In the second argument of `seq', namely `foldr' f z' ps' 21:13:26 Failed, modules loaded: none. 21:13:28 oerjan: wat 21:13:30 oerjan: "-> result dest end ->" 21:13:40 er oops 21:13:50 foldr :: (forall a b c. path a b -> result b -> result a) -> result dest -> PSeq path src dest -> result src 21:14:04 foldr', presumably 21:14:17 it is slightly awkward if you actually _want_ a type with dest in it, i guess... 21:14:19 Expected type: PSeq path src mid 21:14:19 Actual type: PSeq path src dest 21:14:19 In the third argument of `foldr'', namely `ps' 21:14:19 In the second argument of `seq', namely `foldr' f z' ps' 21:14:26 (because of wrong type argument order) 21:14:43 oerjan: otoh it does work as a type for foldr 21:14:43 foldl wouldn't have _that_ problem 21:14:47 but not for foldr' 21:14:57 oerjan: but then foldr (<|) empty doesn't type 21:14:58 so lol 21:15:15 indeed, wrong type argument order 21:15:27 the changing argument doesn't get last 21:16:33 oerjan: foldl' doesn't type either 21:16:40 also, the arguments always change with (<|) 21:16:42 apart from path 21:18:13 elliott: oh you have a bug 21:18:25 oerjan: ok tell me but beforehand 21:18:28 look at this 21:18:29 foldr (>>>) id 21:18:30 :: Category path => PSeq path src dest -> path src dest 21:18:31 in z' `seq` foldr' f z' ps should be in z' `seq` foldr' f z' ps' 21:18:32 that is beautiful :') 21:18:46 oerjan: oh 21:18:49 will that fix things? :P 21:18:56 let's hope :P 21:19:21 nope 21:19:30 D: 21:19:48 oerjan: oh wait 21:19:55 oerjan: i think what needs changing is the type of f 21:19:57 oerjan: to go /backwards/ 21:20:42 oerjan: i'm not sure what that looks like, though :P 21:22:11 oerjan: argh, here's another bug for you 21:22:13 singleton :: path a a -> PSeq path a a 21:22:19 oerjan: how stupid can I be?? 21:24:21 oerjan: omg omg omg 21:24:26 oerjan: 21:24:27 instance (Arrow (~>)) => Arrow (PSeq (~>)) where 21:24:27 arr = singleton . arr 21:24:27 first ps = 21:24:27 case viewl ps of 21:24:27 PEmptyL -> empty 21:24:29 pn :< ps' -> first pn <| first ps' 21:25:24 oerjan is not nearly excited enough. 21:26:23 maybe not. 21:26:43 does that foldr' compile (although with warning) if you remove the empty branch? 21:27:32 oerjan: i'll try. but dude, PSeq is an arrow transformer!!! 21:28:01 -!- Ngevd has joined. 21:28:04 oerjan: no 21:28:10 Expected type: PSeq path src dest 21:28:10 Actual type: PSeq path src mid 21:28:10 In the third argument of `foldr'', namely `ps'' 21:28:10 In the expression: foldr' f (f pn z) ps' 21:28:14 (yeah yeah I know it's not strict yet :P) 21:28:40 oerjan: you know, I could just unsafeCoerce this through 21:28:55 it's obviously a valid implementation 21:30:01 >_> 21:31:11 oerjan: you realise viewl/viewr unsafeCoerce already :P 21:31:34 oerjan: hm i note that there are two possible Categories for PSeq 21:31:38 oh hm is it complaining about the foldr' being used with polymorphic recursion, _despite_ having a type signature? 21:31:44 instance Category (PSeq path) where id = empty; (.) = flip (><) 21:32:00 instance (Category path) => Category (PSeq path) where id = singleton id; (.) = fold blah blah 21:32:09 oerjan: no, it's complaining because _ps' does not match the zero passed_ 21:32:53 hm... 21:33:41 app :: (ArrowApply (~>)) => PSeq (~>) (PSeq (~>) b c, b) c 21:33:43 THIS WILL BE FUN 21:35:41 elliott: what is your current code for foldr' ? 21:35:57 oerjan: i rewrite it every time you come up with another idea. do you just want a file with foldr' in it? :P 21:36:13 -!- boily has quit (Ping timeout: 252 seconds). 21:36:29 i just want to see if you broke it in some way i haven't seen while fixing my bug reports :P 21:36:30 -!- copumpkin has changed nick to luke-sr. 21:36:42 charming :P 21:36:46 one second 21:36:56 hmm I have to write basically (PSeq (~>) b c, b) ~> c 21:37:17 -!- luke-sr has changed nick to copumpkin. 21:37:39 oerjan: http://sprunge.us/cjcR 21:37:39 -!- Patashu has joined. 21:38:03 ok, I have (b ~> c, b) ~> c 21:38:10 and I need to turn that into (PSeq (~>) b c, b) ~> c 21:38:40 so... app . first f 21:38:56 elliott: you removed the end type again, i believe that's essential 21:39:14 oerjan: oh, right. 21:39:20 oerjan: i told you it doesn't type with that, either, but ok i'll try 21:39:35 yes, but with that _and_ the ps fixed to ps' ? :P 21:39:55 oerjan: you'll never believe it 21:40:00 hm? 21:40:07 oerjan: it works :P 21:40:11 * elliott generalises foldr's type to that too 21:40:11 yay :P 21:41:26 for foldl and foldl' you can give result just one type argument, i think, because the fixed src is in the right place to be combined into result 21:42:29 oerjan: huh, so you can. 21:42:35 oerjan: that upsets me though :( it's so inconsistent 21:42:52 -!- DCliche has joined. 21:43:27 oerjan: :'( 21:43:37 oerjan: it also feels wrong that the more natural fold is the one which needs more gunk 21:43:41 you can do that with foldr[']? too, but then as you say foldr (>>>) id won't type 21:44:08 oerjan: not foldr (<|) empty either 21:44:49 PSeq (~>) (b, d) (c, d) -> PSeq (~>) b c 21:44:50 aaaaaaaa 21:44:56 because the type variable you want to combine is in the last place 21:45:18 wat 21:45:25 oh the loop 21:45:26 oerjan: loop :: a (b,d) (c,d) -> a b c 21:45:30 instance ArrowLoop (->) where 21:45:30 loop f b = let (c,d) = f (b,d) in c 21:45:41 god knows how to implement it for paths :P 21:45:48 i suppose i want to tie each node to itself? 21:45:54 or do i want to tie each node to the next node, and the last to the first... 21:46:02 -!- Darth_Cliche has quit (Ping timeout: 244 seconds). 21:46:18 you'd want to tie the final node to the first one? 21:46:32 oerjan: that's what I said 21:46:38 either that, or tie each node to itself, which seems useless 21:47:30 does arrowloop have any laws 21:47:36 monqy: "ow" 21:47:42 (probably yes but they're in a paper) 21:47:46 it's entirely lawless and evil 21:47:49 Learnt about Matrices in maths today 21:48:03 Finally figured out what they're up to 21:48:06 exciting?? I dislike matrices. yukce 21:48:19 They were kinda dissapointing 21:48:24 oerjan: oh well, I'll stick to the easy ones (ArrowZero, ArrowChoice) 21:48:26 what did you expect 21:48:32 matrices are cool. just use a more interesting underlying ring :P 21:48:39 monqy, I dunno, something interesting 21:48:43 elliott: Works on Alpha with no changes. 21:48:48 Ngevd, you did graphs before matrices???? 21:48:49 oerjan, I don't think I need that at AS level 21:48:49 oerjan: hmm... 21:48:53 Phantom_Hoover, yup 21:48:56 oerjan: I think you might want singleton id == empty 21:48:57 oerjan: for PSeqs 21:49:01 oerjan: there is nothing you can do to make matrices cool sory :( 21:49:07 oerjan: when the path is a category 21:49:08 elliott: Have I mentioned that this JIT is magic and amazing :P 21:49:13 Gregor: Yes. 21:49:29 elliott: if you do that, you need to elude _all_ singleton id's 21:49:35 oerjan: yeah :P 21:49:36 kinda tricky 21:49:44 oerjan: ok, so this is a decent PSeq 21:49:51 oerjan: now it need to be applied >:) 21:49:58 oerjan: oh yeah, about MetaContext 21:50:09 04:25:05: data MetaContext = MetaContext { nwNeighbor :: MetaCursor (To NW), ..., up :: MetaCursor dir, signPost :: SignPost } -- it occurs to me that some field name disambiguation will be needed 21:50:12 oerjan: are all neighbours present here? 21:50:17 or is one elided? 21:51:05 all, i should think... 21:51:10 oh hm 21:51:21 there needs to be a Leaf version of that too 21:51:21 oerjan: well the next question is "wtf is dir" 21:51:51 elliott: the usual, the direction this node is in relation to its parent 21:51:54 elliott: hmm, I think you could make a stack-based solution work, but it's dubious that it's better than substitution in this case 21:52:03 oerjan: so quantified? 21:52:06 elliott: oh should probably be From dir 21:52:15 as far as I can tell, substitution is more space-efficient and equally time-efficient 21:52:26 oerjan: what does the leaf version look like? 21:52:30 Ngevd, wait, have you learnt matrix multiplication? 21:52:36 ais523: well, OK 21:52:41 elliott: it has no neigbors, i'd think 21:52:48 only the up and the signPost 21:52:50 oerjan: so just (MetaCursor dir, SignPost)? 21:52:50 ok 21:53:02 oerjan: what's the non-leaf case? aka name the constructor :P 21:53:09 the problem is that the stack would only ever be pushed, and you'd have to GC the bottom of the stack when it went out of scope, which is nontrivial to determine 21:53:19 Phantom_Hoover, just today 21:53:36 Ngevd, matrix multiplication is the worst. 21:53:41 it's awful 21:53:45 It's messed up 21:53:47 InternalContext ? 21:53:52 not really messed up 21:53:54 just awful 21:54:01 I need to stare into space for a minute to remember which way round everything is. 21:54:05 I keep losing track of it 21:54:05 yeah 21:54:19 oerjan: um i was hoping for something short to compliment MCLeaf 21:54:31 I think I've been taught it three different times by now. 21:54:47 Sounds like you have a very good maths teacher 21:55:01 We've been taught simultaneous equations a few dozen times 21:55:56 Have you done them with MATRICES? 21:56:21 Not yet 21:56:32 We've been hinted at that we will shortly 21:56:35 > let mult m1 m2 = [[sum$zipWith(*)r1 c2 | c2 <- transpose m2]| r1 <- m1] in mult [[1,0],[0,2]] [[1,2,3],[4,5,6]] 21:56:36 [[1,2,3],[8,10,12]] 21:56:47 oerjan: MCFrom? MCTo? work with me here :P 21:56:57 argh, the MC prefix clashes with MetaCursor 21:56:58 oh hm 21:57:04 MCInner 21:57:07 -!- pikhq has joined. 21:57:14 -!- pikhq_ has quit (Ping timeout: 258 seconds). 21:57:33 Ngevd, and then, through some process that was never adequately explained to me, you use them for cross products. 21:57:37 data MetaNode exit where 21:57:37 MNFrom :: Neighbours1 MetaCursor dir 21:57:37 -> MetaCursor (From dir) 21:57:37 -> SignPost 21:57:37 -> MetaNode (From dir) 21:57:38 MNTo :: Neighbours MetaCursor -> SignPost -> MetaNode (To dir) 21:57:40 MNLeaf :: LeafData -> SignPost -> MetaNode (To dir) 21:57:42 data MetaContext where 21:57:44 MCMInner :: Neighbours MetaCursor 21:57:46 -> MetaCursor (From dir) 21:57:48 -> SignPost 21:57:50 -> MetaContext 21:57:52 MCLeaf :: MetaCursor (From dir) -> SignPost -> MetaContext 21:57:54 oerjan: somewhat of a resemblance 21:57:56 s/MInner/Inner/ 21:58:17 And *then* you get to the second-order non-homogeneous differential equations god I hate second-order non-homogeneous differential equations. 21:58:29 elliott: yes, the difference is MetaNode has a distinguished exit 21:58:37 ais523: an answer to the question "What exactly the error message is?" seen on a mailing list: "It's about glib lib." 21:58:44 oerjan: right 21:58:57 oerjan: it feels like i'd have half the types if everything took a list of directions to exclude on the type level :P 21:59:12 Phantom_Hoover, I'm scared 21:59:13 heh 21:59:20 Ngevd, YOU SHOULD BE 21:59:33 > length "irregularwebcomic" 21:59:34 17 21:59:50 That was irrelevant to this conversation 22:01:09 oerjan: ok, you know what the next question is (or do you??) 22:01:46 * oerjan afraid 22:02:33 oerjan: I need a space to play around with :P 22:02:49 my leaf data is just String, so "" will work there, my IpId is just Int so that's easy, and my IpData is Double which can just be whatever 22:03:00 what type do i want as the top-level "space with n cursors"? 22:03:34 MetaContext was sort of what i imagine as the "start-from-here" type 22:03:41 ok 22:04:04 oerjan: Leaf or Inner? :P 22:04:17 Okay, if I ever say I'm going to install Haiku, can someone tell me I've already got the ISO and the image, and I need an SD card larger than 16MB 22:04:34 Leaf probably, since you would start on some actual befunge or what-it's-you're-doing cell spot 22:04:46 oerjan: right 22:05:30 oerjan: the SignPost should just be (Map.singleton 0 (Left pi)), right? if the IP ID is 0 and the data is pi 22:05:38 elliott: ah, might want a LeafData in the MCLeaf too 22:05:41 ok :P 22:06:00 yeah i'd think 22:06:11 alright, all I need is a MetaCursor (From dir) now 22:06:29 data MetaCursor src where 22:06:29 MCPlain :: PlainCursor src -> MetaCursor src 22:06:29 MCPath :: MetaPath src dest -> MetaNode dest -> MetaCursor src 22:06:37 oerjan: you'll never guess what the next question is 22:06:38 and since you're starting with only a cursor there, that MetaCursor should be MCPlain 22:07:22 ok, and the type tells me I need PCFrom 22:07:30 MCPath only starts being used once you have two real cursors in different spots 22:08:06 oerjan: hmm, I can get to the neighbours afterwards, but what should the PlainCursor of the same type that PCFrom wants be? 22:08:11 oh, that's going upwards, right? 22:08:16 as in, going "larger" 22:08:27 yeah 22:08:39 oerjan: so it should be circular? 22:08:42 so From something 22:08:44 because i have a completely empty space right now 22:08:49 i.e. 22:08:51 pc = PCFrom undefined pc 22:08:55 PCFrom :: Neighbours1 PlainCursor dir 22:08:55 -> PlainCursor (From dir) 22:08:55 -> PlainCursor (From dir) 22:09:26 -!- Ngevd has quit (Quit: Goodbye). 22:09:54 well not entirely circular, things have types that change between the levels... 22:10:02 oerjan: um that is impossible 22:10:04 -> PlainCursor (From dir) 22:10:04 -> PlainCursor (From dir) 22:10:06 exact same type 22:11:01 oh hm so it is 22:11:28 i guess the level types got forgotten in the transition to this. maybe just as well :P 22:11:52 oerjan: i'm not sure that would even work :P 22:12:03 oerjan: it could be polymorphically recursive anyway i think 22:12:06 oh there's probably _some_ way 22:12:30 ok, so now I need a (Neighbours1 PlainCursor dir) 22:12:43 let's pick dir ~ NW :P 22:12:53 so (Neighbours1 PlainCursor NW) 22:12:56 Neighbours1NW :: t (To NE) -> t (To SW) -> t (To SE) -> Neighbours1 t NW 22:13:06 oerjan: time for polymorphic recursion, right? 22:13:12 (Neighbours1NW pc pc pc) 22:13:21 oh, no! 22:13:23 pc is a PCFrom 22:13:24 I need a To 22:13:33 PCTo :: Neighbours PlainCursor -> PlainCursor (To dir) 22:13:33 PCLeaf :: LeafData -> PlainCursor (To dir) 22:13:47 oerjan: ok, help me out here :P I want an infinite space with "" on all the leaves 22:13:48 i'm not sure i understand your Neighbors1 stuff 22:13:59 oerjan: Neighbours1 t dir is just t (To dir') for all dir ~/~ dir' 22:14:15 to abstract all the "twenty constructors because we have a neighbour for every other direction" crap 22:14:23 oh hm 22:14:37 elliott: there's an error there i think 22:14:42 oh no 22:15:15 the dir in the second argument to PCFrom is the up dir, so should be unrelated to the others 22:15:16 oerjan: i was curious indeed because it seemed like I either had to make a finite space or have no leaves 22:15:33 iiuc 22:15:42 one second then 22:16:17 PCFrom :: Neighbours1 PlainCursor dir 22:16:17 -> PlainCursor (From dir') 22:16:17 -> PlainCursor (From dir) 22:16:18 oerjan: yus? 22:17:37 yeah 22:17:39 test :: MetaContext 22:17:39 test = LeafCtx "" mc (SignPost $ Map.singleton 0 (Left pi)) 22:17:39 where mc = MCPlain pc 22:17:39 pc = PCFrom (Neighbours1NW pc' pc' pc') pc 22:17:39 pc' :: PlainCursor (To dir) 22:17:40 pc' = PCLeaf "" 22:17:43 oerjan: that's an infinite space of ""s, right? 22:18:25 that's wrong though, the pc part 22:18:46 oerjan: :( 22:19:00 you need to include the level as an Int argument or something, so you know how far to go _down_ again before hitting leaves 22:19:32 so mc = MCPlain (pc 0) 22:19:58 oerjan: hmm, and what does pc look like then? 22:20:08 what program are you discussing, btw? Shiro? 22:20:15 pc n = PCFrom (Neighbours1NW (pc' n) (pc' n) (pc' n)) (pc (n+1)) 22:20:31 pc' 0 = PCLeaf "" 22:20:33 ais523: yes 22:21:01 oerjan: ok 22:21:10 oerjan: pc' n? 22:21:21 pc' n = PCTo (pc' (n-1)) (pc' (n-1)) (pc' (n-1)) (pc' (n-1)) 22:21:28 or something like that 22:21:42 oerjan: (and out of curiosity, what kind of space did I produce with my erroneous version? it certainly /types/ 22:22:29 a space where you go up just fine, but where going down from anywhere other than the "trunk" gives you a leaf _immediately_ 22:22:33 i think. 22:22:43 *down to 22:22:53 oerjan: ah. 22:22:58 oerjan: that doesn't sound like normal 2d space :-) 22:23:06 indeed not :P 22:23:23 oerjan: imagining that is hurting my head :P 22:24:09 it's like shrinking every quadtree region other than those containing your starting point into a single leaf 22:24:48 test :: MetaContext 22:24:48 test = LeafCtx "" mc (SignPost $ Map.singleton 0 (Left pi)) 22:24:48 where mc = MCPlain (pc 0) 22:24:48 pc n = PCFrom (Neighbours1NW (pc' n) (pc' n) (pc' n)) (pc (n+1)) 22:24:48 pc' :: Int -> PlainCursor (To dir) 22:24:49 pc' 0 = PCLeaf "" 22:24:51 pc' n = PCTo (Neighbours (pc' (n-1)) (pc' (n-1)) (pc' (n-1)) (pc' (n-1))) 22:24:53 oerjan: success 22:25:02 ah 22:25:22 oerjan: I would use Integer, but... good luck allocating that much 22:26:07 oerjan: ok, so now for the question that will make you _really_ hate me. 22:26:12 if you gave To and From type level integer arguments... >:) 22:26:23 oerjan: how do I make the focused cursor go east? :-) 22:26:36 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 22:27:16 well, in this case you'd first go up, then To NE 22:29:02 oerjan: so would it be MetaContext -> MetaContext? 22:29:08 i guess 22:30:02 oerjan: reassuring :P 22:30:09 food -> 22:32:22 elliott: Don't read too much into this question, but which words are absolutely fundamental to Forth? 22:32:50 Gregor: Forth as in "like ANS Forth", or "like /Forth/" as in "particularly high in Forthiness"? 22:32:58 (colorForth is more /Forth/ than ANS Forth, but not very ANS Forth at all) 22:33:07 elliott: Basically Forth flavored. 22:33:08 Heh, the sun's core produces about as much heat per cubic metre as a compost heap. 22:33:17 Gregor: But take a look at jonesforth, and previous IOCCC entry -- what was it called -- fifth? 22:33:26 Gregor: http://www.ioccc.org/1992/buzzard.2.design 22:33:28 elliott: But was it a JIT :P 22:33:38 Gregor: See also other buzzard files in http://www.ioccc.org/1992/ 22:33:43 Gregor: And all Forths are JITs. 22:34:06 Gregor: Erm, buzzard.2 that is. 22:34:11 elliott: They certainly ought to be, but if there's already been a JIT in IOCCC, URGGGGGGH 22:34:27 And http://www.ioccc.org/1992/third of course. 22:34:31 Gregor: Well, no. 22:34:32 Gregor: A threaded code JIT is a little bit different from what you're doing, of course. 22:34:37 Gregor: buzzard is just a freaky-deaky little thing. 22:34:50 A threaded-code JIT ain't a JIT, it's a bytecode interpreter. 22:34:56 BAH 22:35:04 Thee and thy making more sense than I 22:35:06 Gregor: A bytecode interpreter that doesn't have an interpreter loop... 22:35:10 s/Thee/Thou/ 22:35:15 elliott: So? 22:35:27 Gregor: An interpreter loop is sort of the defining feature of an interperter. 22:35:37 elliott: (I mean, it's good fun, but "So?" in the not-competing-with-my-niche sense) 22:35:44 Gregor: Well, sure. 22:35:53 Gregor: "Traditionally" JITting Forth is pretty heretical, anyway :P 22:36:08 elliott: Oh, it has an interpreter loop. Which has been placed at the end of every primitive. :P 22:36:12 Gregor: Pretty sure first (buzzard.2) has an interpreter loop for the threaded code, anyway. 22:36:30 I was just thinking that really there's nothing at this point that's holding me to my particularly-bad language choice. 22:37:06 Gregor: I think the judges might be unimpressed with "minimalistic Forth-like with most primitives implemented in itself", since that's exactly what FIRST/THIRD did so spectacularly :P 22:37:11 And in under 500 bytes. 22:37:17 (With indentation etc.!) 22:37:25 Gregor: So, change your language, but probably not to something Forthy. 22:37:30 Fair 'nuff. 22:37:48 Go more functional. 22:37:59 (note: don't) 22:38:01 I don't think his JIT would be any good at that :P 22:38:07 Indeed it would not. 22:38:16 elliott: He'd also want a GC if he wanted to do it right. :P 22:38:18 Gregor: ...OTOH, a mini-Lispalike might be interesting :P 22:38:24 >_> 22:38:33 Lisp isn't exactly a functional language anyway. But I realise you have biases :P 22:38:34 Aaaand, if you pull off a GC in the size restrictions, you are God. 22:38:45 Yeah, the GC is the real thing thar :P 22:38:50 Ehhhhhh 22:38:55 Lisp programs don't cons THAT much. 22:38:58 * Gregor taps his foot ... 22:39:09 Especially if you offer mutation of conses. 22:39:09 Yeah, I'm gettin' awfully close to the size restriction as stands. 22:39:13 1888 bytes at last count. 22:39:47 Gregor: I still think if you can't impress people with an interesting language, impressing them with an end result is almost as good. 22:39:55 i.e. Write a program that does something fancy :P 22:41:09 Gregor: Do you manually turn full.c into jitchards.c? 22:41:11 Harsh. 22:42:13 elliott: Uhhh, thusfar all I've done is selected areas of code in visual mode and G-Q in vim. 22:42:24 X-D 22:42:39 Gregor: Not true: You use 9<<25 in jitchards.c but W in full.c 22:42:53 elliott: I haven't updated jitchards.c in a while. 22:45:06 Gregor: Whoops, accidentally forked jitchards :P 22:45:13 * elliott deletifies. 22:45:37 elliott: >_> Does bitbucket let me prevent that I wonder 22:45:45 Gregor: It was privately, since I didn't futz with the boxes. 22:45:51 Ah 22:45:58 Gregor: (It was only slightly "accidental" :P) 22:47:39 Gregor: BTW, I would test with gcc 3 too >_> 22:48:05 Gregor: I find it really hard to believe that IOCCC isn't run on some ancient IRIX box :P 22:48:17 EVEN IF THEY DO HAVE A TWITTER 22:48:27 X-D 22:49:10 Gregor: "On the Vax main is called with 22:49:10 the calls instruction which uses the first word of the subroutine as a 22:49:10 mask of registers to be saved. So on the Vax the first word can be anything." 22:49:19 -- http://www.ioccc.org/1984/mullender.hint, the famous "main is a string" prorgam, referenced from the FAQ 22:49:22 Gregor: That explains your VAX troubles :) 22:49:42 elliott: I fixed my VAX troubles (now I'm having different VAX troubles) 22:49:50 VAX troublen. 22:53:03 Gregor: Come on, laugh :'( 22:54:12 Wow, IOCCC have a standard entry format :P 22:54:16 As in, custom file format... 22:56:56 "mentioning your name or any identifying information in the remark section (or in the C code for that matter) - we like to be unbiased during the judging rounds; we look at the author name only if an entry wins" 22:56:56 Heh 22:57:23 Gregor: Looks like you can't submit a makefile, just makefile lines 22:58:03 -!- Darth_Cliche has joined. 22:58:28 * Phantom_Hoover → sleep 22:58:29 -!- Phantom_Hoover has quit (Quit: Leaving). 22:58:38 Ooh, they tell you to test on a UNIX or POSIX-conforming machine. Gregor: You're going to have to test it on OS X. 22:58:47 Wait. 22:58:56 Interix 22:58:57 It says conforming, not "said to be conformant by people with money". 22:59:04 Gregor: Your chances of fulfilling their guidelines are 0. 22:59:36 "Your entry must compile with GCC and run under at least one flavor of UNIX (e.g. Linux or Solaris). To improve chances to win, it should work under both BSD and SysV style UNIX (think stty cbreak), and should not depend on endianness." 22:59:42 Aww, "style". 22:59:46 I was hoping they tested on real live SysV. 23:00:47 what is stty cbreak and why would it be relevant for an ioccc entry? 23:01:19 "$BSD = -f '/vmunix'; 23:01:19 if ($BSD) { 23:01:19 system "stty cbreak /dev/tty 2>&1"; 23:01:19 } 23:01:19 else { 23:01:19 system "stty", '-icanon', 23:01:21 system "stty", 'eol', "\001"; 23:01:23 }" 23:01:25 -- ancient perl faq 23:01:27 Presumably you have to do the latter on sysv 23:01:33 -!- DCliche has quit (Ping timeout: 260 seconds). 23:01:43 IOCCC entries are allowed to call system() 23:01:56 mmkay... the question is, what does it do? :) 23:02:33 Puts the terminal into rare mode, methinks 23:02:42 As in, ^C and the like still send signals, but apart from that it's raw and unbuffered 23:02:59 So, useful for console tricks and the like 23:03:45 http://www.opensource.apple.com/source/gnuzip/gnuzip-28/gzip/zmore.in oh my god, is this real 23:09:08 Funny, I call that "less". 23:09:28 Yay, LESSOPEN. 23:15:31 hey oerjan 23:15:35 EAST >:) 23:17:26 ais523: i note that NEF might give you problems whenever you neeed a circular structure 23:20:34 "Your entry must compile with GCC and run under at least one flavor of UNIX (e.g. Linux or Solaris). To improve chances to win, it should work under both BSD and SysV style UNIX (think stty cbreak), and should not depend on endianness." // nothing I do is especially OS-dependent. 23:20:40 elliott: I see no reason why it wouldn't work on SysV. 23:21:06 More like System... SUCKS 23:23:08 ais523: hmm, why does substat take both v and c? 23:23:12 ais523: or is one of them always Error? 23:25:27 -!- augur has quit (Remote host closed the connection). 23:25:32 it takes both v and c when substituting in a type 2 value; and v and error when substituting in a type 1 value 23:25:41 to avoid code duplication 23:26:52 ais523: wait, type 2 values have two values? 23:27:07 hmm, substituting "in" 23:27:10 wait, hmm 23:27:27 ais523: do the two arguments to a type-2 function have the same number? 23:27:38 elliott: yes, at definition site 23:27:41 and which is used depends on context 23:28:02 aha, what's happening is that substat is doing two substitutions simultaneously, one on c, one on v 23:28:02 ais523: context being, the type it's used in? 23:28:07 yep 23:28:10 OK 23:28:21 you can always tell what type something is from where it is in the program, and the two args always have different types 23:28:35 the interp I pasted actually adds a suffix, "c" for type 1 or "v" for type 2 23:28:44 (because suffixing numbers with numbers doesn't really work well) 23:28:57 * elliott thinks you should call the types c and v instead 23:29:12 elliott: OK, it seems my biggest VAX bug was outright stupidity. 23:29:37 elliott: Using e where I meant x, thereby making the place I'm JITting into point off into the text segment. 23:30:40 I mean, c and v are much nicer names than 1 and 2. Probably. 23:32:38 ais523: Actually I'm just going to call them c in v in my implementation. 23:32:40 You can't stop me. 23:32:42 * elliott rebel 23:32:48 fair enough 23:33:02 1 and 2, I find more memorable, because 1 args and 2 args 23:34:24 ais523: (VarC 0) is always illegal in the body of a c-lambda right? 23:34:29 because it only has one argument, of type V 23:34:45 elliott: if 0 refers to the c-lambda itself, yes 23:34:58 it's obviously legal if there are other lambdas in between, so that 0 has a different referent, and refers to a v-lambda 23:35:09 that's not what "refers to" means, your terminology is awful 23:35:43 err, refers to the variables of the c-lambda 23:35:46 (which there is only one of) 23:36:35 elliott: ... ... actually it doesn't work on OS X :P 23:36:39 Gregor: lol 23:37:36 some sort of anti-JIT security feature? 23:37:59 ais523: Nope, just more nonsense. 23:38:23 ... 23:38:23 00001f1a leave 23:38:23 00001f1b ret 23:38:23 00001f1c calll 0x00037f14 23:38:45 "I thought I'd just call this absolute address after returning. Made sense at the time. Good luck finding an epilogue here. 23:38:47 " 23:39:30 callllllllll 23:39:47 monqy: Dood, it's gonna call the HELL out of that function. 23:40:07 what IS that function 23:41:04 presumably the function that gets called after a return statement returns 23:41:16 it probably says "error: backwards return" or something like that 23:41:25 error: help 23:41:38 maybe os x has built-in coroutine support 23:41:44 you can "ter" to jump to just after the last ret 23:41:53 and it restores the registers and shit, by using a spaghetti stack 23:42:07 and that's calling the "resumed non-coroutine" function 23:42:09 makes perfect sense! 23:45:59 ais523: hmm, I think substat is doing the work of about three functions :P 23:46:11 yep, seems about right 23:46:17 it was four or five earlier but I realised I didn't need some of htem 23:46:18 *them 23:47:08 elliott: Out of curiosity, have you tried to run my JIT? 23:47:10 ais523: you only ever need one function, actually! 23:47:15 Gregor: Hell no; should I? 23:47:18 elliott: 'cuz so far all I really know is that it works on all these systems for me :P 23:47:56 Gregor: I'm on boring x86-64/Linux/gcc 4.6 23:48:15 Gregor: Try it on ZETA C 23:48:23 lol 23:48:27 Yeah, that'll work well. 23:48:36 Gregor: Bignum int, pointers are cons pairs... what could go wrong? 23:49:45 try it in bcc (a 16-bit C compiler) 23:49:49 (that, umm, only understands K&R, I think) 23:50:24 ais523: That's actually a decent idea 23:50:32 Gregor: Do that (it has a flag to automatically run unprotoize before compilation) 23:51:01 elliott: sizeof(int) must be frightening 23:51:17 ais523: 16-bit won't ever work. 23:51:44 TIL that pikhq is frightened of 2 23:51:54 ais523: Bignum int. 23:52:03 oh, I see 23:52:09 wrong context 23:53:52 ais523: 2 is pretty terrifying 23:54:31 Incidentally, there are less-shitty i86 compilers out there :P 23:54:51 i.e. owcc (wow, it's amazing to categorize owcc as LESS shitty than anything) 23:54:58 s/i\.e\./e.g./ 23:56:04 ais523: so, the Exp inside a CallC -- sorry, the program inside a Call1 -- has a new binding in scope, right? 23:56:22 and the programs inside a Call2 each have a new c binding and a new v binding with the same number (the same binding on each arm?) 23:56:29 yep, I think so 23:56:50 -!- ais523 has quit (Quit: 2). 23:57:08 /quit 2