00:00:35 <oerjan> bsmntbombdood: See the Minsky machine article on the wiki
00:06:00 <bsmntbombdood> although, it would be nice if they didn't have to be multiplied/divided by an arbitrary constant
00:11:48 -!- sebbu2 has quit ("Leaving").
00:12:15 <oerjan> I think http://en.wikipedia.org/wiki/Counter_machine#Two-counter_machines_are_Turing_powerful is related.
00:13:34 <oerjan> Basically, the third step can be alternatively seen as reducing to a single counter with extra operations.
00:22:03 -!- ShadowHntr has joined.
00:53:49 -!- Figs_ has joined.
00:59:19 -!- Figs has quit (Read error: 110 (Connection timed out)).
01:20:46 -!- Sgeo has joined.
01:35:56 -!- calamari has quit ("Leaving").
01:46:52 -!- dog4 has quit ("over and out.").
02:00:18 <oklopol> the wiki is sloooooooooooooooooooooooooooooow :<
02:08:40 -!- Pikhq has joined.
02:27:28 <oklopol> ~raw privmsg #esoteric :bar
02:27:49 <oerjan> ~exec self.raw("PRIVMSG #esoteric :bar")
02:27:55 <bsmnt_bot> SyntaxError: EOL while scanning single-quoted string
02:28:21 <oklopol> i'm too slow... maybe it's time to sleep :)
02:28:49 <oklopol> hmm who am i kidding, i just drank almost a liter of coffee :F
02:29:31 <oklopol> i'll try anyway, night -------->
02:29:45 <bsmntbombdood> I'm wondering about extracting caffeine from tea/coffee
02:30:09 <oklopol> might be cheaper than pills
02:30:56 <oerjan> ah, coffee. _that's_ what i need.
02:31:58 <bsmntbombdood> I read something about dissolving it in ethanol, filtering the solution, evaporating, recrystalizing the residue in a solution of ethanol and water
02:33:19 <oerjan> given that those pills probably _are_ extracted from coffee..
02:33:54 <bsmntbombdood> The method used there is probably not feasible on the small scale
02:40:36 <Figs_> in less than 200 bytes of code
02:40:40 <Figs_> http://rafb.net/p/orWqgE84.html
02:41:16 <Figs_> my output is smaller than my source :P
02:42:36 <Figs_> I could have made a smaller example
02:42:47 <Figs_> but I like my print function
02:43:05 <bsmntbombdood> function pointers in asm are just the address where the code starts, no?
02:44:00 <Figs_> what I did was reserve a word for the address of the function I wanted to call
02:44:18 <Figs_> first I set it to the address of the HELLO proc
02:44:39 <Figs_> and then later in my MAIN proc, I switch it with the address of GOODBYE
02:44:46 <Figs_> but since I call it the same way both times
02:45:03 <Figs_> I've effectively got a function pointer
02:45:27 <Figs_> and I could replace the functionality of VMSG at any point
02:45:53 <Figs_> this is why I started working on asm again
02:46:00 <Figs_> so much easier to use this than C
02:46:22 <Figs_> not for the print stuff
02:46:35 <Figs_> but just for the function pointer stuff
02:46:38 <Figs_> it's so much easier
02:47:11 -!- jix has quit ("This computer has gone to sleep").
02:49:07 -!- wooby has joined.
02:50:00 <Figs_> on the other hand... I do weird stuff
02:50:31 <Figs_> I should have said C++
02:51:28 <Figs_> What I guess I mean is, a lot of things like changing around the interfaces of functions
02:52:06 <Figs_> a decent amount of it
02:52:20 <Figs_> mostly, they put too many things in the same place without thinking how all the pieces interact
02:52:27 <Figs_> (patching the language)
02:53:02 <Figs_> templates, multiple inheritance, variadic functions from C, etc
02:53:34 <Figs_> I've found some behavior that is just *weird*
02:53:48 <Figs_> because it uses so many features of the language at the same time
02:53:53 <Figs_> you have no idea what it is doing
02:54:26 <Figs_> let me see if I can find my code...
02:54:38 <Figs_> it had to do with operator overloading and templates, I think...
02:55:35 <oklopol> Figs_ you've already shown some pretty weird stuff :)
02:57:31 <Figs_> am I showing up as Figs_ again?
02:57:34 -!- Figs_ has changed nick to Figs.
02:58:37 <oklopol> hmm, i'll retry the sleeping thing -------->
03:01:30 -!- Pikhq has quit ("Leaving.").
03:02:19 <Figs> I can't find it
03:09:15 -!- Pikhq has joined.
03:26:15 -!- gg_ has joined.
03:31:40 <Figs> or New Jersey?
03:32:48 <Figs> Virginia, but pretty close to DC, yeah
03:33:14 <gg_> Oregon and NJ aren't that close though :)
03:33:32 <gg_> but, Oregon.
03:33:44 <Figs> a trace route gives me eugine, and then something, and then a firewall? and then you
03:34:06 <Figs> but when I looked it up, I got new jersey :P
03:35:43 <Figs> I get Comcast Region NJ when I use locators :P
03:37:40 <gg_> That shouldn't make any difference :)
03:38:10 <Figs> you would think
03:38:13 -!- Sukoshi has quit ("とても変な夢を見た、あの20分眠間に。").
03:38:28 <gg_> I'm talking about whether it's OR or NJ.
03:38:50 * Pikhq envies Sukoshi's Japanese IME magic
03:38:58 <Figs> I think we're talking about two different things
03:39:50 * gg_ is bored, but hungry too.
03:40:03 <Figs> I was that way until recently
03:40:11 <Figs> and then I remedied it with some yogurt
03:40:25 <Figs> now I'm just bored
03:40:42 <Figs> I should probably finish one of the projects I've started
03:40:48 * Figs is bad about that
03:41:12 <Figs> I do get a bit distracted by tangents :P
03:41:33 * Figs wonders why he is criticising himself in public
03:41:42 <gg_> tangents? as in math?
03:42:49 <Figs> Working on a program to chat online... and then going off to write a compiler, getting bored working on the parser, so start working on asm to impliment function pointers...
03:43:32 <Figs> I just finished that last one
03:43:40 <Figs> I should probably finish the first bi
03:43:45 <Figs> since its the easiest
03:43:51 <Figs> and I've been working on it since January
03:44:27 <Figs> I just really don't like programming in GM any more :P
03:44:32 <Figs> it's too limiting
03:44:56 <gg_> never heard of it.
03:45:00 <Figs> Most people haven't
03:45:05 <Figs> www.gamemaker.nl
03:45:20 <Figs> they're going through a little insanity at the moment with version 7.0
03:45:42 <Figs> I've been using it since about 3.0
03:45:49 <Figs> and I'm about ready to move on
03:46:12 <Figs> except that it just does so much to reduce the complexity of apps...
03:46:22 <Figs> until you find something you can't do
03:46:28 <Figs> then it gets to be annoying as hell
03:46:45 <Figs> I mean, it has functions like,
03:47:00 <Figs> draw_text("whatever string",x,y);
03:47:18 <Figs> you don't have to do anything with the window handling
03:47:51 <Figs> has timers up to I think 10 or 12 built in for each object you define
03:47:58 <Figs> if you need them
03:48:13 <Figs> automatic game loop
03:48:27 <Figs> although you can modify the behavior if need be
03:48:41 <Figs> it was designed for teaching programming concepts in an interesting way
03:48:56 <Figs> but the community is basically pushing for it to become a general purpose dev tool
03:49:13 <Figs> but that's probably more than you ever cared to know :P
03:49:45 <gg_> heh no it's good to know that... but I don't think I'll ever write a game (coz I'll probably never finish it!)
03:49:52 <gg_> at least if it's a "real" game.
03:50:09 <Figs> I doubt I will
03:50:14 <CakeProphet> it looks kind of weird... like graphical C.
03:50:36 <Figs> you can do the entire thing with buttons and drag and drop
03:51:00 <Figs> and then move onto a scripting language inside once you need the more powerful features
03:51:17 <Figs> most of the community seems to be in the 10-20 range
03:51:40 <Figs> pre-college, and, in too many cases, pre-manners :P
03:52:47 <Figs> I like a lot of stuff that GM does
03:52:55 <Figs> (probably since I learned how to program in it)
03:53:05 * gg_ goes to do a little bit more stumbling in firefox (that's how I ended up here anyway) before running for some food...
03:53:16 <Figs> yeah, that's how I got here too :)
03:53:42 <Figs> If you like language design, it's a good place to be
03:53:44 <CakeProphet> I basically just downloaded a Python interpreter... scanned through the turotial in a confused manner... and started playing around.
03:53:45 <gg_> I kinda like this place, so I'll probably see you guys later.
03:54:22 <Figs> In GM, each object effectively has code that gets executed each step (step event)
03:54:38 <Figs> there are create events, destroy events, keyboard press/release/check events
03:54:59 <Figs> you can add 'methods' by defining user events
03:55:04 <Figs> but the documentation on this isn't very good
03:55:10 <Figs> and it's not very easy (I think)
03:55:19 <Figs> though I have done it a couple times
03:55:39 <Figs> it effectively has 2 types of data
03:55:43 <Figs> strings and reals
03:56:07 <CakeProphet> from Python I read up on Perl, Lisp, a little bit of C++, then I discovered esolangs, Smalltalk, Ruby, and then too many to count from there.
03:56:21 <Figs> how many do you know well?
03:56:34 <CakeProphet> I've never actually used anything but Python... but I'd like to move to something new once I'm not so busy with my current project (a MUD)
03:56:46 <CakeProphet> ...I only know the surface of those langs.
03:56:55 <Figs> I have a friend who is writing a MUD...
03:56:58 <CakeProphet> well... except esolangs... which are easy to pick up usually.
03:57:41 <Figs> I know 2.5 languages well
03:58:15 <Figs> I almost never do anything with pure C
03:58:37 <Figs> but it would not be too hard for me to use it
03:58:47 <Figs> I can code in Java... because I know C and C++
03:58:56 <Figs> because I don't know it deeply
03:59:00 <CakeProphet> Most of those languages I know quite well... I'm just completely unfamiliar with the builtin libraries and stuff.
03:59:22 <Figs> (but I do know enough to confuse my friend who is in AP Computer Science :P)
03:59:24 <CakeProphet> I read a lot of language specs... I can just never find the time to use them.
03:59:29 <Figs> do-while loops, ftw
04:00:12 <Figs> I know enough about the C-derived languages that I can effectively work in any of them with a reference manual, google, and a decent amount of time
04:00:29 <Figs> (by my standards of 'decent' ;P)
04:00:54 <Figs> I started playing around with Prolog a bit a couple days to a week ago
04:00:58 <Figs> and it was hard
04:01:06 <Figs> because I'm so used to C-derived programming
04:02:00 <Figs> Assembly is a pain in the ass though
04:02:08 <Figs> because there are endless levels of it
04:02:43 <Figs> I know enough that I can write interesting ways to do hello-world programs
04:03:08 <Figs> but how do those characters end up in the console?
04:03:17 <Figs> I sort of know
04:03:25 <Figs> but not enough to figure it out from scratch
04:04:26 <Figs> it gives you a bit more appreciation for what Windows actually gets right
04:06:24 <Figs> they have an os
04:06:41 <Figs> that is basically works with most hardware reasonable well
04:07:35 <Figs> security flaws aside
04:07:46 <Figs> it mostly does what it is supposed to
04:08:16 <Figs> I talked to a friend of mine who was working on an OS
04:08:52 <CakeProphet> -nod- OS is a pretty big chunk of features. :)
04:09:05 <lament3> Figs: yes, but so does every other OS
04:09:31 <Figs> DOS doesn't do what windows does
04:09:38 <lament3> it's not much of an achievement to have a properly functioning multitasking OS
04:10:01 <lament3> when people say "windows sucks", they are not comparing it with DOS (usually)
04:10:23 <Pikhq> Actually, IMO, DOS *is* a better OS than Windows (from a usability standpoint).
04:10:23 <lament3> windows is a multitasking operating system that sucks
04:10:31 <lament3> DOS is not a multitasking operating system at all
04:10:36 <lament3> so it's not very fair to compare them
04:11:20 <CakeProphet> Figs, yeah... watch out here - we're fuill of Linux patriots.
04:11:25 <Pikhq> DOS does what you tell it to do. Windows does jack.
04:11:39 <Figs> Where's your properly functioning multitasking OS rivalling windows, lament?
04:11:46 <CakeProphet> Mention Windows at all with a grain of positiveness and you shall be PUMMELED. :)
04:11:55 <Pikhq> lament3: DOS is, for a singletasking OS, nice. . .
04:12:03 <Pikhq> Especially the more modern FreeDOS. . .
04:12:20 <Pikhq> Figs: It's called "UNIX".
04:12:24 <lament3> Pikhq: i would strongly disagree with that, OS is shit, but i am not aware of any better alternatives, because the whole notion of a "single-tasking OS" is fairly ridiculous
04:12:52 <Pikhq> lament3: Nah, single-tasking OSes were quite common in the early days of computing.
04:13:07 <Pikhq> *cough*batch computing*cough*
04:13:17 <lament3> Pikhq: you mean, early days of personal computers
04:13:34 <Figs> Pikhq, I meant _lament3_'s own personally written Windows rival
04:13:52 <lament3> Figs: why do you want me to write a windows rival? I don't understand your point.
04:14:18 <Figs> [17:07:23] lament3: it's not much of an achievement to have a properly functioning multitasking OS
04:14:27 <CakeProphet> now now everybody... let's turn the thermostate down a touch. :/
04:14:38 <lament3> Figs: you were saying how you appreciated how windows "got things right" in terms of talking to hardware
04:14:56 <Pikhq> Figs, writing an implementation of the UNIX kernel is considered a rite of passage for UNIX hackers. . .
04:15:09 <CakeProphet> Windows sucks, Windows is great, Lament needs to write his own OS, Lament doesn't need to write his own OS, vim is superior to emacs and vice versa. ALL THINGS ARE TRUE IN THE FACE OF A WINDOWLESS ROOM.
04:15:09 <lament3> Figs: first of all, it didn't - in that unix does it much more sanely; but second of all - it's not much of an achievement for something to do the very bare basics of what it's supposed to do
04:15:35 <Pikhq> And the UNIX kernel, by itself, does multitasking (fine, needs a process to fork();. . .)
04:15:40 <lament3> Figs: i'm not saying it's easy to write an OS
04:16:02 <lament3> Figs: i'm saying it makes no sense to praise windows for something it absolutely has to do as an OS
04:16:31 <lament3> it's like saying "hey, it's a pretty crappy plane, but you have to give it credit - it flies". Of course it flies. Duh. It's a plane.
04:16:51 <CakeProphet> ...I think he was just praising Windows for existing... not necessarily for being better than other OSes. Let's all settle down a bit.
04:16:54 * Pikhq is saying it doesn't take arcane wizardy to do so; just about a year or so's work for a single coder (for very simple definitions of "OS")
04:16:54 <Figs> I didn't say it was "good" :P
04:17:10 <Figs> Just that I'm impressed that it gets itself to work
04:17:27 <Figs> and how much is going on and has to be dealt with
04:17:31 <lament3> Pikhq: probably less than that. There're textbooks on how to do it.
04:18:01 <CakeProphet> ...this conversation reminds me of "attachment causes suffering".
04:18:16 <Figs> Cake, I'm not really praising windows :P
04:18:27 <Pikhq> lament3: That's "from scratch, with nothing more than the ability to do ASM and C".
04:18:29 <lament3> i will stop opening attachments then
04:18:45 <lament3> Pikhq: you cheat quite a bit by allowing yourself to use C :)
04:19:02 <lament3> but yeah, there're textbooks on how to do that.
04:19:10 <Pikhq> So, Windows is a bit like a dog that can dance: it's not that it does it well, but that it does it at all?
04:19:30 <CakeProphet> more or less... an attachment to any ideology (be it Windows-hating or Windows-loving... or Islam or a great love for Emacs)
04:19:46 <Figs> it's more like the dog that can dance that's made billions and billions of dollars
04:20:09 * CakeProphet sesnses a proprietary software conversation coming.
04:20:10 <Figs> GNU/Linux is just as impressive (if not more so for working better)
04:20:11 <lament3> not sure how that's relevant to the conversation
04:20:45 <lament3> in a very real sense, Windows is a better OS than linux
04:21:05 <lament3> it's more user-friendly :)
04:21:11 <Figs> I agree with that
04:21:13 * Pikhq considers GNU/Linux a good deal more impressive, for being made mostly off of the effort of people who care about programming
04:21:22 <Figs> but Linux does some stuff much better
04:21:34 <Pikhq> . . . this, of course, is because I'm one of the users that Windows is distrustworthy of. ;)
04:21:38 <lament3> Pikhq: windows programmers don't care about programming? :)
04:21:52 <Pikhq> lament3: They're doing it because it's a *job*.
04:22:51 * CakeProphet trashes the sidewalks and dances around in circles rubbing his bellybutton
04:23:09 <Pikhq> And GNU/Linux has been developed in large part by people who design stuff simply because that's *what they like to do*.
04:23:10 <Figs> heh, I didn't mean to open this whole can of worms
04:23:29 <Figs> I was just appreciating modern OSes. Windows in particular since I'm most familiar with it.
04:23:39 <CakeProphet> I think vim... is probably the best text editor out there for developers.
04:24:01 <Figs> What, no notepad? :P (jk)
04:24:14 <Pikhq> I think that the only manly editor is a dick-controlled electromagnet to write bits on the drive.
04:24:17 <CakeProphet> and emacs... is a terrible mishmash of shortcut keys and an ancient funky AI language with too many parenthesis
04:24:25 <lament3> at least appreciate something useful, like photoshop :)
04:24:27 <Figs> dick-controlled O.o???
04:24:35 <Figs> photoshop is annoying
04:24:50 <Figs> I mean, the back-end stuff is impressive
04:24:55 <Pikhq> CakeProphet, Lisp is ancient simply because *it has lasting power*.
04:25:00 <Figs> but I really hate their interface
04:25:08 <Pikhq> Figs, the "dick controlled" part is just to make it truly manly. XD
04:25:16 <Figs> oh, I thought that was a typo
04:25:39 <CakeProphet> Lisp is the worst thing to happen to comptuer programming since.... COBOL.
04:25:55 * CakeProphet snickers and hides in the bushes as chaos ensues.
04:25:57 <Pikhq> Which is *really* odd, since Lisp predates COBOL.
04:26:13 <Figs> Lisp is what... `58?
04:26:15 <Pikhq> Lisp hails from the 50's.
04:26:30 <CakeProphet> -snicker- you're making this too easy for me.
04:26:54 <Figs> he's trolling, Pikhq :P
04:27:02 <lament3> Figs: look at how unix does hardware. The whole "everything is a file" thing.
04:27:39 <Pikhq> Figs: I'm fond of troll-baiting. Adds activity to the room.
04:28:12 <CakeProphet> I've been liking Perl a lot lately... which made me realize that, for the most part, the "everything is a <something>" languages are fairly annoying.
04:28:14 <Pikhq> CakeProphet: Yeah. Stuff sort of evolved onto UNIX without thought towards the /dev/ stuff. . .
04:28:24 <Figs> I agree with that
04:28:26 <Figs> but for hardware
04:28:29 <Pikhq> Thus why CakeProphet doesn't like Lisp. . .
04:28:32 <Figs> it (usually) makes more sense
04:28:45 <CakeProphet> Pikhq, I like Lisp... it's pretty and easy to learn...
04:28:53 <Figs> if I can write to the screen as if it was a file
04:29:03 <Figs> if I can write to an internet connection as if it was a file
04:29:04 <CakeProphet> but... it's a tad too fanatical for my tastes.
04:29:07 <Figs> it makes life a lot easier
04:29:18 <Pikhq> Figs: I get the feeling you'd like the Hurd. . .
04:29:21 <Figs> but of course, there's always going to be something that fucks it up :P
04:29:38 <Figs> I rather dislike the everything is ___.
04:29:47 <Figs> but for hardware, it seems convenient
04:30:01 <Figs> for software, it isn't right.
04:30:09 <CakeProphet> well yeah... most hardware has some sort of IO quality... that can be dubbed down to the operations of a file.
04:30:34 -!- lament3 has changed nick to lament.
04:30:40 <Pikhq> The Hurd is mostly just "hardware is a file, and hell. . . The hardware over in that computer way over there is *also* a file."
04:31:07 <Figs> what exactly is this Hurd?
04:31:10 * CakeProphet is conceptualizing an OS himself... but it'll be a while before he can attempt to even start on it.
04:31:23 <Pikhq> It's the GNU Project's take on a kernel.
04:31:39 <Figs> I think I get it
04:31:59 <Figs> distributed computing
04:32:04 <Pikhq> Unfortunately, it's got some political issues preventing some coders from actually getting stuff *in CVS*.
04:32:44 <Pikhq> I think that Plan9 is a better OS for that sort of thing. . . It's actually got active development, and has things generally implemented better.
04:32:51 <Figs> who the hell came up with recursive acronyms? :P
04:33:03 <CakeProphet> Linux could do better... I think... with high-level structures.
04:33:14 <Pikhq> Plan9, BTW, is the successor to UNIX. ;)
04:34:07 <CakeProphet> The everything is a file thing sort of drops out any possibility for data structured files... and table-ish files.
04:34:55 <Figs> I've seen 'everything is a table' languages too :P
04:34:59 <CakeProphet> You can't say "hey this is a tree" or "hey this is a table"... without forcing every program that reads it to do some parsing.
04:35:39 <CakeProphet> ...and there's no versioning system... to keep track of old edits.
04:36:16 <Figs> have you guys tried writing a general purpose tree?
04:36:31 <Figs> (slightly different topic)
04:36:57 <Figs> like, a C++ style library for tree structures like vectors, lists, maps, etc
04:37:16 <Figs> it's a pain in the ass!
04:37:32 <CakeProphet> well.... Lisp is pretty well-suited for trees... it uses linked lists internally.
04:38:00 <CakeProphet> or you could get all hyper-OO and make a tree object... if you're bat-fucking insane.
04:38:12 <Figs> I've done it CP :P
04:38:47 <Figs> using Boost::Any to defeat the type system
04:39:35 <CakeProphet> Python defeats C's type system by representing everything as pointers.
04:39:59 <Figs> I should learn python then
04:40:12 <Figs> they stole my idea! (before I had it, even)
04:40:33 <Figs> I could probably learn it quickly enough
04:40:42 <CakeProphet> ..kind of bland though... but easy to write.
04:41:17 <Figs> I need to get around to learning all these scripting languages
04:41:23 <Figs> Lua, Python, Perl, Tcl
04:41:51 <Figs> Javascript (yes, I don't know javascript! Can you believe it?)
04:42:10 <Pikhq> I recommend Tcl. :)
04:42:13 <Figs> I'm just too lazy to learn it
04:44:03 <Figs> http://rafb.net/p/QXov1k68.html
04:45:17 <Figs> output of the program, btw, is:
04:45:18 <Figs> a(b(d(i,j,k),e),c(f,g,h))
04:45:18 <Figs> a(b(d(i,j,k),e),c(f,g,h),a(b(d(i,j,k),e),c(f,g,h)))
04:46:35 <CakeProphet> I'd have trouble calling Python a "scripting language".... as I've never actually used it to write "scripts" (programs that you'd call to do simple tasks from a shell)
04:47:01 <Figs> it's interpretted, right?
04:47:19 <CakeProphet> a little of both.... but it's considered interpreted.
04:47:48 <Figs> what C++ really needs is a type-traits system
04:48:12 <Figs> typed data is not a bad thing
04:48:39 <Figs> you can do that in some cases
04:48:43 <Figs> but it isn't the answer to everything
04:48:52 <Pikhq> What C++ really needs is one function:
04:49:05 <Pikhq> void dwim(void); // Do what I mean
04:50:11 <Figs> It makes more sense to me to have types, because then you can be sure that you're actually dealing with data properly
04:50:38 <CakeProphet> I'm just not exactly sure what static typing is supposed to accomplish... other than maybe some pre-run errors...
04:50:42 <Figs> take the example of those guys who were working on that probe that screwed up
04:50:50 <Figs> because one part of the team was working in metric units
04:50:55 <Figs> and the other in imperial units
04:51:05 <CakeProphet> dynamic typing doesn't mean "no types at all".
04:52:13 <Figs> all it does is it adds a layer of checking to make sure you're using things the way they are supposed to be used.
04:52:25 <Figs> what I mean is...
04:52:38 <Figs> suppose you get a great new function to convert objects
04:52:48 <Figs> and it's expect you to hand it a plate
04:52:55 <Figs> and you give it a banana
04:53:14 <Figs> you'll get shit all over the floor
04:53:24 <CakeProphet> you either A. intended for it to do something or B. something will screw up and you'll know about it.
04:53:47 <Figs> you don't always know about it
04:53:55 <Figs> most problems in a program are my own mistakes :P
04:54:03 <Figs> I'd rather find them as quick as possible, wouldn't you?
04:54:17 <Figs> rather than testing, testing, testing to make sure data is moving around right
04:54:48 <Figs> that's what I hated about whatever that program was called (second version of Klik but before Fusion or whatever)
04:54:59 <Figs> GamesFactory or something
04:55:03 <Figs> you'd play the game
04:55:13 <CakeProphet> see.... types don't really mean anything...
04:55:15 <Figs> and when it encountered an unknown event, it'd prompt you what to do
04:55:53 <Figs> I'm talking about typing where typing matters: putting in things you expect into interfaces and getting things back out from interfaces that you expect...
04:56:24 <Figs> if you're trying to call a function to print a string
04:57:02 <Figs> it's much more convenient to be able to know that it takes a _____ rather than a _____.
04:57:26 <Figs> I admit, it makes less sense for some applications than others
04:57:41 <CakeProphet> but see.... what if you have something that acts exactly like a string... but it isn't really a string. Are you supposed to create an entirely different library for this string-like thing when you could easily borrow functions that strings use?
04:57:44 <Figs> C/C++'s got it wrong
04:58:07 <Figs> you say it has the traits of a string when you interface with it by X
04:58:51 <Figs> that's why C++ has type conversion operators
04:59:14 <Figs> glad you enjoy :)
04:59:24 <CakeProphet> Figs, all of that sort of just sounds like "ways around static typing".
04:59:44 <bsmntbombdood> 10 times, (play 2 octave harmonic scale, each note .015 seconds)
05:00:04 <Figs> it's a way of keeping static typing where you want static typing, and removing it, but only where you need to remove it and explicitly say how it deals with it
05:00:27 <Figs> its essentially more control
05:00:59 <CakeProphet> welll... a lot of dynamically typed languages are starting to move towards optional static typing... which I think makes more sense.
05:01:17 <Figs> which is basically what I'm saying
05:01:24 <Figs> the point that C missed
05:01:30 <Figs> because it's not designed for it
05:01:37 <Figs> is type traits
05:01:50 <Figs> (actually, they were hacked back in by the boost guys but I've never been able to get them to work properly)
05:01:53 <CakeProphet> Perl is going towards optional static typing... and there's talk about it for Python 3 (thought currently no demonstrations of how it would work)
05:02:16 <Figs> you already gave the exact example
05:02:25 <Figs> of why type traits are essential
05:02:36 <CakeProphet> I'd go with just pure duck typing with optional type checks/conversions on function signatures.
05:02:37 <Figs> I have a function that deals with ____.
05:02:45 <CakeProphet> none of this "typed variables" mumbo jumbo. :)
05:02:46 <Figs> XYZ is a lot like ____, I wish it could deal with it too
05:03:13 <Figs> cake, how do you deal with objects of complex type in duck-typing systems?
05:03:30 <Figs> what I like about C is that I can do
05:03:41 <Figs> struct Employee
05:04:17 <Figs> no, I just tryed putting in //etc directly
05:04:27 <Figs> and had to type out the /msg #esoteric
05:04:41 <Figs> forgot about that
05:04:41 <Pikhq> I'm used to just hitting "/ /..."
05:05:48 <Figs> what's the point of using OO if you can't keep related information together?
05:05:55 <Figs> that's not really OO
05:06:05 <Figs> the problem is
05:06:07 <CakeProphet> what I like about duck typing... is that I can sketch up a class with read() and write() methods and pretty much plug it in anything that expects a file and have it work as I expect it to.
05:06:33 <Figs> ok, now you're getting into what I'm talking about
05:06:41 <CakeProphet> I can replace stdin and stdout with my own special classes... and every read and write operation will be changed.
05:06:42 <Figs> except I deal with things a bit differently
05:07:05 <Figs> currently, in type systems, the way to say things are related is to inherit
05:07:12 <Figs> X inherits from Y
05:07:18 <Figs> and shares its interface
05:07:58 <Figs> it's a pain in the ass if I write code that expects an object with read() and write() but gets one that doesn't
05:08:21 <Figs> well, how would your code react to it?
05:08:26 <Figs> most likely throw an exception
05:08:30 <Figs> or some equivalent
05:08:49 <Figs> which means you have to keep checking for the error
05:08:52 <CakeProphet> You'd just get an error something and the program would exit. Fix it.. and move on.
05:08:58 <CakeProphet> The world doesn't end if you get a runtime error. ;)
05:09:02 <Figs> that's what I object to.
05:09:15 <Figs> is having to go through
05:09:19 <Figs> FIND the error
05:09:26 <Figs> (by accident, most likely)
05:09:34 -!- ShadowHntr has quit ("End of line.").
05:10:01 <oerjan> well, in Ocaml you can sketch up a class with read and write methods and plug it into anything which expects that. It's still statically typed.
05:10:13 <Figs> compile errors say, "Oh, there's something wrong with this program go fix it now"
05:10:14 <CakeProphet> bsmntbombdood, from what I understand you can't pass arbitrary types through functions without there being some inheritance relation of some kind defined.
05:10:21 <Figs> instead of waiting for me to run into it
05:10:24 <Figs> assuming that I do
05:10:38 <CakeProphet> Figs, that's not any different than a runtime error... you're just compiling instead of running.
05:10:39 <Figs> (if I don't, John Doe down the road probably will after I release my project)
05:10:53 <Figs> I want the error when I compile :)
05:11:21 <bsmntbombdood> in python, you forget to import a module and it ends up showing up at runtim
05:11:22 <Figs> the first is that I KNOW there's a problem
05:11:36 <Figs> as soon as I try test
05:11:43 <Figs> not 30 minutes later
05:11:47 <CakeProphet> -shrug- most errors I get in Python are obviously bad... those I KNOW there's a problem.
05:11:53 <Figs> after doing X,Y,Z and a ton of other stuff
05:12:02 <Figs> where the error could be _anywhere_
05:12:21 <Figs> for some types of problems,
05:12:28 <Figs> you don't get an exception and an exit
05:12:34 <Figs> because of the way the system is designed
05:12:46 <Figs> in Game Maker, variables can be either strings or reals
05:12:55 <CakeProphet> Figs, some simple problem solving can usually find the source of the error. sure, it might require some thinking... but it's usually pretty obvious.
05:12:58 <Figs> but they are not explicitly declared as one or the other
05:13:33 <Figs> I can't count the number of times I've done something stupid like trying to show a message containing a number without first telling it to convert its representation
05:13:41 <Figs> and it doesn't usually crash when I do that
05:13:49 <Figs> I just get the mysterious message "0"
05:13:58 <Figs> instead of whatever I expected it to output
05:14:15 <Figs> that's the behavior it's supposed to do because of its weak type system
05:14:48 <Figs> (the error system is a different issue)
05:14:54 <Figs> actually I think I need to go for a while...
05:15:14 <Figs> (shower, and my dad's probably gonna get mad at me for staying up so late... again...)
05:15:31 <Figs> I'll come back if I can to chat about this more, since this is really useful for me
05:31:31 <Figs> I was misunderstanding what you meant by duck typing
05:31:46 <Figs> I was thinking of something different
05:33:43 <Figs> I need to learn OCaml
05:36:11 <Figs> I don't know how much I like dynamic typing
05:36:19 <Figs> but I like the ideas behind duck typing
05:36:40 <Figs> and I'd prefer to have as much as possible of it dealt with at compile time
05:42:01 -!- wooby has quit.
05:42:40 <Figs> like, saying a function takes as argument any object that can be used with ToString()
05:44:53 <Figs> any object that can be use with ToString(), has a method foo() and a member variable bar.
05:45:20 <Figs> essentially, you specify interfaces
05:46:08 <Figs> the nice thing about that is
05:46:16 <Figs> if you have a library from VenderX
05:46:29 <Figs> you can make it work with VenderY's library easily
05:46:38 <Figs> by specifying ways to convert
05:48:13 <Figs> lets say VenderX provides a cross-platform error handling and logging library
05:49:13 <Figs> and VenderY is a game inventory system that produces ErrorTransactional objects when you try to buy or sell something you can't afford
05:49:57 <Figs> buy* (drop the 'or sell' ... that didn't make sense :P)
05:50:16 -!- Sgeo has quit ("Leaving").
05:50:49 <Figs> let's also say, like in most proprietary C libraries, you can't modify the definition of ErrorTransactional or the code in the logging/error routines
05:52:38 <CakeProphet> -nod- what did you think I meant by duck typing?
05:53:01 <Figs> if the language lets you specify a way to interpret ErrorTransactions as XErrorString...
05:53:13 <Figs> (or whatever the other proprietary format is)
05:53:40 <Figs> I was thinking of a different sort of weakly typed system, I don't remember the name (if it has one)
05:54:04 <CakeProphet> http://deadbeefbabe.org/paste/4188 <-- a very simple Tree like structure in Python
05:54:58 <Figs> not sure I understand it
05:55:25 <Figs> (I don't know python's syntax)
05:56:04 <Figs> class Tree(list):
05:56:12 <Figs> I assume you're declaring the clas Tree
05:56:16 <Figs> but what is the (list)?
05:56:21 <Figs> derives from list?
05:56:35 <gg_> man if there's one thing I like about Python, it's the fact that indentation is enforced.
05:56:51 <gg_> makes it look clean.
05:57:23 <gg_> (yeah, I just jumped out of nowhere)
05:57:59 <Figs> I think I'm gonna go to sleep
05:59:10 -!- Figs has left (?).
06:00:59 <CakeProphet> it's nice... but it's probably one of the few things I like.
06:01:11 * CakeProphet is starting to get sick of his own native language. :(
06:02:45 <CakeProphet> my main complaint about Python is that it doesn't give you... any options.
06:03:05 <CakeProphet> The entire design goal is "there is one obvious way to do it"...
06:03:42 <CakeProphet> heh... I haven't figured out how you would use a real for loop any different.
06:03:52 <CakeProphet> I almost always see it used just as pythons for loop.
06:04:16 <CakeProphet> syntax constructs are trivial... I just dislike the entire design method... if doesn't let the programmer choose what they want to do.
06:05:14 <bsmntbombdood> loop through a list, if the current item is 0, skip the next one
06:05:19 <Pikhq> bsmntbombdood: Inherited from gaim.
06:05:59 <CakeProphet> well... yeah I guess... a weird requirement... but I suppose it would be more difficult.
06:06:56 <CakeProphet> for item in (x for index,x in enumerate(SomeList) if index != 1): ...a bit long-winded, but do-able.
06:07:55 <CakeProphet> you mean... if the current ITEM... not the current index.
06:08:20 <CakeProphet> ...you could use a variable in the loop to keep track of the condition.
06:09:07 <CakeProphet> (always annoys me when I say "you can't do this" and then someone finds an ugly workaround as thought it were compensation)
06:09:56 <CakeProphet> ...ideally there should be multiple forms.
06:10:14 <CakeProphet> as I'd die before I had to type out C-style for loops each time I meant to use them like Python for loops.
06:10:27 <CakeProphet> ...but not having the option at all isn't good either.
06:38:26 <GregorR> Pikhq: Care to give me an opinion on something I'm mulling over for Plof2?
06:39:23 <GregorR> Pikhq: I'm trying to free up the + operator on objects so that operator overloading will be useful, but that means I don't have an operator for object combination. I'm thinking of using the null operator, e.g. var A = :[...]; var B = :[...]; var C = A B;
06:39:38 <GregorR> Anyone else can feel free to chime in too :-P
06:40:23 <GregorR> bsmntbombdood: That doesn't really make any sense for the language. That being said, if a function consists only of a single expression, it just returns the value of that expression, as in functional languages.
06:41:07 <GregorR> Oh wait, you mean my object combination suggestion?
06:41:13 <oerjan> hm... what is the : operator?
06:41:44 <GregorR> oerjan: It's not an operator, it's a modifier. :[...] is an object, [...] is an associative array (I don't like this and will probably change it, but this reflects the current state of the language :P)
06:41:51 <Pikhq> Gregor: I don't really like that idea. . . ~ operator?
06:42:09 <Pikhq> Yeah, go for a null op.
06:42:23 <oerjan> what about letting A : B be object combination?
06:42:24 <Pikhq> var D = :[...] :[...]; I assume makes sense?
06:42:48 <GregorR> oerjan: Confusing with ternary condition: foo ? bar : baf
06:43:03 <GregorR> [Yes, I buckled and added ternary conditionals :(]
06:43:14 <oerjan> ah, but in that case nullary will _also_ confuse it
06:43:32 <GregorR> That syntax is meaningless at the moment.
06:43:42 <bsmntbombdood> if if can return a value, you don't need ternary ?
06:43:44 <Pikhq> I fail to see how the null op would confuse it.
06:43:47 <GregorR> bsmntbombdood: I'm trying to reduce the number of special compiler-provided functions.
06:44:07 <GregorR> oerjan: : [ is not the same as :[
06:44:25 <GregorR> oerjan: In the same way that 1 - -3 is not the same as 1-- 3
06:44:57 <GregorR> And anyway, like I said, I don't like that particular syntax, it will probably change ;)
06:45:23 <GregorR> bsmntbombdood: "if if can return a value, you don't need ternary ?" < this makes no sense at all
06:45:41 <bsmntbombdood> if "if" can return a value, you don't need ternary "?".
06:46:26 <GregorR> Well, if is a function in the Plof standard namespace which is provided by the compiler ... I'm just trying to reduce the number of those. I suppose nobody really cares except me, so maybe I need to not do that ^^
06:46:39 <bsmntbombdood> C needs ternary "?" because you can't say x = if(p){..}else{...}
06:47:43 <GregorR> You're dancing on the functional side of the functional-imperative gap, I'm dancing on the imperative side.
06:47:53 <Pikhq> I, personally, don't like having a huge amount of builtins.
06:48:04 <GregorR> Hence why I was removing one :-P
06:48:05 <Pikhq> I *like* being able to see the interface in stdlib.plof.
06:48:12 <oerjan> you could have a +: operator.
06:48:36 <GregorR> oerjan: For object combination?
06:48:45 <GregorR> bsmntbombdood: I intend to.
06:49:01 <bsmntbombdood> I would like to see the ability to overload _any_ operator
06:49:10 <GregorR> oerjan: How is that different from Pikhq's earlier ~ suggestion?
06:49:29 <Pikhq> The main issue with ~ is that it's used in C as a bitwise operation. . .
06:49:33 <GregorR> bsmntbombdood: Well, there are two operators that it makes NO sense to overload with how Plof works: assignment and object combination.
06:52:41 <Pikhq> It's 20070401. What do you expect?
07:59:59 -!- clog has quit (ended).
08:00:00 -!- clog has joined.
08:19:12 -!- wooby has joined.
08:47:39 -!- oerjan has quit ("leaving").
08:50:38 -!- wooby has quit.
08:51:32 -!- wooby has joined.
08:51:39 -!- wooby has quit (Remote closed the connection).
09:08:59 <GregorR> My cats are playing an April fool's day joke on me O_O
09:39:19 -!- sebbu has joined.
09:43:15 -!- nazgjunk has joined.
10:52:32 -!- dog4 has joined.
11:19:45 -!- anonfunc has joined.
12:01:09 -!- ais523 has joined.
12:19:49 -!- nazgjunk has quit ("Bi-la Kaifa").
12:34:11 -!- helios24_ has joined.
12:34:51 -!- helios24 has quit (Read error: 113 (No route to host)).
12:40:10 <EgoBot> help ps kill i eof flush show ls bf_txtgen usertrig daemon undaemon
12:40:12 <EgoBot> 1l 2l adjust axo bch bf{8,[16],32,64} funge93 fyb fybs glass glypho kipple lambda lazyk linguine malbolge pbrain qbf rail rhotor sadol sceql trigger udage01 unlambda whirl
12:41:18 <EgoBot> 118 +++++++++++++++[>+++++>+++++++>+++>++++++++<<<<-]>---.>----.+++++++..+++.>-.------------.>-.<<.+++.------.--------.>+. [294]
12:42:24 <ais523> ~bf +++++++++++++++[>+++++>+++++++>+++>++++++++<<<<-]>---.>----.+++++++..+++.>-.------------.>-.<<.+++.------.--------.>+.
12:55:41 -!- wooby has joined.
12:59:52 <oklopol> i should never leave this channel unguarded :)
13:00:57 * oklopol started his day with a bit of coding :P
13:00:59 <oklopol> http://www.vjn.fi/pb/p622623512.txt
13:02:32 <oklopol> conceptually trivial, but without any kind of syntax highlighting my feeble brain gets quite overloaded
13:03:11 <ais523> I don't recognize the language
13:03:26 <oklopol> python, and because no one is going to read that, it's brianfuck with lambdas
13:03:35 <oklopol> ...why is it always brian?
13:04:23 <oklopol> that was too easy... i though i'd be busy for hours :\
13:04:39 -!- anonfunc has left (?).
13:04:47 <oklopol> i'd like to know how oerjan did that with unlambda
13:05:44 <oklopol> unfortunately i don't have the faintest clue how to do anything with unlambda even though i know most of the language
13:05:59 * ais523 has a P`` interpreter in Unlambda somewhere
13:06:22 <ais523> I generated it from a lambda-calculus version, though, so it's crappy auto-generated Unlambda
13:06:50 -!- jix has joined.
13:07:29 <oklopol> hmm, i could convert that to pure lambda...
13:07:56 <oklopol> actually, i won't, i have a better idea
13:08:51 <wooby> anyone tinkered with javascript?
13:09:19 <ais523> I wrote the reference Underload implementation in JavaScript
13:10:43 <wooby> it's interesting i think lol
13:11:10 <ais523> it's good as a counterexample to all the statments Java and UML teachers make about object-oriented programming
13:11:29 <ais523> the concept of a two level class/object hierarchy is outmoted
13:11:51 <ais523> in JavaScript, you can come up with one-level or three-level or any-number-of-level hierarchies
13:16:08 <wooby> i'm working on a preprocessor in JS that lets you use most of the java oop keywords though lol
13:41:24 -!- anonfunc has joined.
13:42:19 * ais523 has just written Brainfuck in Thutu2
13:42:22 <ais523> http://pastebin.ca/419548
13:43:00 <ais523> compiled into Perl, it's http://pastebin.ca/419550
13:43:50 -!- ais523 has quit ("in search of lunch").
15:07:34 <CakeProphet> ...it looks like ais523 discovered prototype OO. :P
15:13:49 -!- Pikhq has quit (Read error: 110 (Connection timed out)).
15:27:03 -!- Sgeo has joined.
15:42:28 -!- Pikh1 has joined.
15:42:40 -!- Pikh1 has changed nick to Pikhq.
15:43:07 <Sgeo> I pledge, for this year, to only learn programming languages that an employer will be likely to have me use.
15:43:09 <Sgeo> Who is with me?
15:45:57 <Pikhq> Realise that some employers will be willing to let you code in esolangs: they don't understand jack, anyways.
16:08:12 <oklopol> haha, that'd be so cool :D
16:08:37 <oklopol> i big 3d-game programmed in bitwise cyclic tag
16:11:08 -!- ais523 has joined.
16:11:19 <ais523> msg nickserv identify 523kk
16:11:38 <ais523> Damn, I'll have to change my password now
16:11:52 <oklopol> yeah... we'd so take your auth
16:13:03 * Pikhq contemplates writing a word processor in BFM using PESOIX. :p
16:13:15 <ais523> I've changed it now anyway, just in case a logreader decides to impersonate me
16:13:19 <ais523> (as unlikely as that seems)
16:15:21 * ais523 was trying to release the latest version of INTERCAL
16:15:28 <ais523> but failed due to the lack of anywhere to put it
16:16:16 <ais523> so it's safely cooped up on my hard drive now, unable to unleash its esotericness on the world
16:16:43 <ais523> I still sent a slightly modified version of my prepared message to alt.lang.intercal anyway though, letting people know why they couldn't obtain it
16:16:44 -!- jix has quit (Read error: 104 (Connection reset by peer)).
16:17:35 <Pikhq> How's about posting it in alt.lang.intercal?
16:20:26 <ais523> you can't post binaries to a text newsgroup
16:20:33 <ais523> and besides it's over 300KB long
16:20:52 <ais523> (even when compressed)
16:22:51 <Pikhq> Carrier pigeon? :p
16:25:23 -!- jix has joined.
16:27:58 <ais523> one of the only IP standards with an average packet return time of 5222806.6 milliseconds
16:30:15 <Pikhq> Read the implementation.
16:33:20 <CakeProphet> ...I've never actually had a programming job before.
16:33:23 -!- bsmntbom1dood has joined.
16:33:36 -!- jix has quit (zelazny.freenode.net irc.freenode.net).
16:33:36 -!- Pikhq has quit (zelazny.freenode.net irc.freenode.net).
16:33:37 -!- GregorR has quit (zelazny.freenode.net irc.freenode.net).
16:33:37 -!- bsmntbombdood has quit (zelazny.freenode.net irc.freenode.net).
16:33:46 -!- jix has joined.
16:33:46 -!- Pikhq has joined.
16:33:46 -!- GregorR has joined.
16:35:24 <CakeProphet> If there's anything I could turn into a career... it's programming. Especially since you can do it at home.
16:40:26 -!- Pikhq has quit (zelazny.freenode.net irc.freenode.net).
16:40:26 -!- jix has quit (zelazny.freenode.net irc.freenode.net).
16:40:26 -!- GregorR has quit (zelazny.freenode.net irc.freenode.net).
16:40:27 <ais523> there should be more of a market for esolang programmers
16:40:45 -!- GregorR has joined.
16:40:45 -!- jix has joined.
16:40:45 -!- Pikhq has joined.
16:41:00 <ais523> the original INTERCAL manual suggests that INTERCAL may be useful for maintaining job security
16:42:19 <ais523> because nobody else will be able to edit your code
16:57:51 -!- Pikhq has quit (zelazny.freenode.net irc.freenode.net).
16:57:51 -!- jix has quit (zelazny.freenode.net irc.freenode.net).
16:57:51 -!- GregorR has quit (zelazny.freenode.net irc.freenode.net).
16:59:25 -!- GregorR has joined.
16:59:25 -!- jix has joined.
16:59:25 -!- Pikhq has joined.
17:44:57 -!- Pikhq has quit (zelazny.freenode.net irc.freenode.net).
17:44:57 -!- jix has quit (zelazny.freenode.net irc.freenode.net).
17:44:57 -!- GregorR has quit (zelazny.freenode.net irc.freenode.net).
17:46:28 -!- GregorR has joined.
17:50:01 -!- jix has joined.
17:50:01 -!- Pikhq has joined.
18:02:04 * SimonRC likes this AFJ: http://www.msnbc.msn.com/id/17879317/site/newsweek/
18:11:35 -!- Sukoshi has joined.
18:17:01 -!- Sgeo has quit ("Leaving").
18:19:41 <ais523> anyway, my INTERCAL distribution finally found a host: http://intercal.freeshell.org/download
18:29:00 -!- Pikhq has quit (zelazny.freenode.net irc.freenode.net).
18:29:00 -!- jix has quit (zelazny.freenode.net irc.freenode.net).
18:35:27 -!- jix has joined.
18:36:38 <SimonRC> this one is even better: http://news.bbc.co.uk/1/hi/uk/6515701.stm
18:47:27 -!- ais523 has quit ("I spend all this trouble registering so I can have a quit message, and then I don't want to put anything in it").
19:00:33 -!- dog4_ has joined.
19:09:14 -!- dog4 has quit (Connection timed out).
19:27:43 -!- Pikhq has joined.
19:30:42 <Sukoshi> I use a mice for like, 5 activities.
19:32:01 <Sukoshi> Maybe I can release RUT today.
19:32:13 <Sukoshi> If exams weren't coming up, I could spend more time.
19:32:45 -!- nazgjunk has joined.
19:33:25 -!- bsmntbom1dood has changed nick to bsmntbombdood.
20:43:04 -!- Arrogant has joined.
20:48:32 -!- lament has changed nick to Eidplos.
21:19:05 -!- Figs has joined.
21:38:49 -!- calamari has joined.
21:42:34 -!- Arrogant has quit (Read error: 60 (Operation timed out)).
21:52:01 -!- Sgeo has joined.
22:01:10 -!- anonfunc has quit.
22:05:03 -!- Eidplos has changed nick to lament.
22:08:04 <Figs> http://religiousfreaks.com/2007/03/02/religious-freaks-distraught-over-miracle-pizza-pan/
22:28:24 <Figs> http://www.biggeekdaddy.com/sitebuilder/images/Virgins_in_Heaven-637x242.jpg <-- wtf?
22:30:08 <Figs> http://www.cooperativeindividualism.org/calvin-on-scientific-law.gif
22:55:02 -!- oerjan has joined.
22:59:15 -!- nazgjunk has quit (Read error: 104 (Connection reset by peer)).
22:59:40 -!- nazgjunk has joined.
23:26:56 -!- nazgjunk has quit (Remote closed the connection).
23:39:42 -!- richie12790 has joined.
23:40:33 -!- richie12790 has left (?).
23:56:17 <Pikhq> I've seen multiple implementations.