00:07:57 <shachaf> ?? ?@ ?run var$intercalate " \\ " . map (\x -> "(@run var . (\\(w:ws) -> w ++ ':' : ' ' : (map (\\c -> if c == 'M' then '-' else c) . takeWhile (/= '/') . head . filter (\"/\" `isInfixOf`) $ ws)) . words $ @show @metar "++x++")") . words $ ?show ENVA LLBG
00:07:58 <lambdabot> Plugin `compose' failed with: Missing ')' in nested command
00:08:25 <shachaf> ?? ?@ ?run var$intercalate " \\ " . map (\x -> "(@run var . (\\(w:ws) -> w ++ ':' : ' ' : (map (\\c -> if c == 'M' then '-' else c) . takeWhile (/= '/') . head . filter (\"/\" `isInfixOf`) $ ws)) . words $ @show @metar "++x++")") . words $ ?show ENVA LLBG
00:08:26 <lambdabot> Plugin `compose' failed with: Missing ')' in nested command
00:08:38 <shachaf> Is it a line length thing that makes it only work in /msg?
00:09:05 <shachaf> ?? ?@ ?run var$intercalate " \\ " . map (\x -> "(@run var . (\\(w:ws) -> w ++ ':' : ' ' : (takeWhile (/= '/') . head . filter (\"/\" `isInfixOf`) $ ws)) . words $ @show @metar "++x++")") . words $ ?show ENVA LLBG
00:09:07 <lambdabot> Plugin `compose' failed with: Missing ')' in nested command
00:09:47 <shachaf> oerjan: help figure out twh hth thx
00:14:46 <oerjan> well there is a shorter limit in public, at least
00:15:35 <shachaf> Oh, I bet it's an internal thing in lambdabot where it generates a long line containing a lot of duplicates of the code.
00:15:57 <shachaf> What I did was silly anyway.
00:20:27 -!- impomatic has quit (Ping timeout: 276 seconds).
00:25:51 <oerjan> (it's always too late)
00:28:13 <shachaf> you could write a command that looks at the hg log to see which file the last command created/modified
00:32:34 <\oren\_> shachaf: ooh, someone actually uses that upside down &? I'm glad I added it.
00:32:46 <shachaf> \oren\_: Of course. It's a very important character.
00:32:57 <shachaf> \oren\_: But in IRC I usually just write #
00:36:10 <\oren\_> b_jonas: that reminds me, I have a ttf version of your font that I generated in the same manner as my font.
00:37:01 -!- tromp has joined.
00:40:34 -!- lambda-11235 has joined.
00:41:47 <oerjan> @tell hppavilion[1] <hppavilion[1]> int-e: Did I make the math joke wrong? <-- that was so wrong that i bet you think there are three words in the english language.
00:42:39 <oerjan> @tell hppavilion[1] damn i did _that_ wrong. also https://xkcd.com/169/
00:43:38 <oerjan> @tell hppavilion[1] or wait, did i. confused now.
01:18:25 -!- lynn has quit (Ping timeout: 250 seconds).
01:21:40 -!- bb010g has joined.
01:25:53 -!- Phantom_Hoover has quit (Read error: Connection reset by peer).
01:26:33 -!- augur has quit (Remote host closed the connection).
01:28:16 -!- augur has joined.
01:44:18 -!- ayeelmao has joined.
01:55:28 <hppavilion[1]> I just realized I don't know the rigorous meaning of "irrational number"
01:55:35 <lambdabot> oerjan said 1h 13m 47s ago: <hppavilion[1]> int-e: Did I make the math joke wrong? <-- that was so wrong that i bet you think there are three words in the english language.
01:55:35 <lambdabot> oerjan said 1h 12m 55s ago: damn i did _that_ wrong. also https://xkcd.com/169/
01:55:35 <lambdabot> oerjan said 1h 11m 56s ago: or wait, did i. confused now.
01:56:15 <hppavilion[1]> Oh, right, it's one that cannot be expressed as a ratio of integers
01:59:52 <lambda-11235> hppavilion[1]: https://en.wikipedia.org/wiki/Dedekind_cut. That's one definition.
02:00:20 -!- AlexR42 has joined.
02:00:26 -!- MoALTz has quit (Ping timeout: 244 seconds).
02:00:33 <oerjan> i don't trust people who are online but 56 mins idle >_> <_<
02:00:50 <oerjan> hppavilion[1]: would you like to be added to the dontaskdonttelllist
02:01:02 <lambda-11235> Also, https://en.wikipedia.org/wiki/Cauchy_sequence.
02:01:10 <HackEgo> dontaskdonttelllist: quintopia coppro myname
02:01:25 <hppavilion[1]> I'm just going with the points-on-a-line definition
02:02:19 <oerjan> indeed, complex numbers that aren't real are also irrational
02:02:23 <lambda-11235> There was a haskell library that implemented infintely precise real numbers using cauchy sequences.
02:02:38 <oerjan> which is a little silly for things like 1 + 2i
02:02:54 <oerjan> there's probably a term for those
02:03:32 <oerjan> which means both a and b are rational in a+bi
02:03:32 <shachaf> or even gaussian integer hth
02:03:48 <shachaf> oh, 1 + 2i was jsut an example
02:03:58 <shachaf> i can't be bothered to logread four lines up
02:04:07 <oerjan> shachaf: i know, it's _so_ tiring
02:05:12 <oerjan> > pi :: CReal -- lambda-11235
02:05:13 <lambdabot> 3.1415926535897932384626433832795028841972
02:05:27 <oerjan> not sure if that one uses cauchy sequences
02:05:37 <hppavilion[1]> oerjan: I've always thought that math should be more modular/adjective
02:05:45 <oerjan> it _doesn't_ use continued fractions afair
02:06:03 <hppavilion[1]> oerjan: Instead of having joint-together names, we should prioritize inventing new adjectives to apply to existing objects
02:06:05 <shachaf> It uses a special kind of Cauchy sequences.
02:06:30 <oerjan> hppavilion[1]: i don't understand what you mean
02:06:49 <shachaf> Quickly-convergent Cauchy sequences.
02:07:14 <shachaf> Cauchy sequences that converge whenever aren't very useful for computing.
02:08:26 <hppavilion[1]> oerjan: Instead of the phrase "Gaussian Integer", meaning a+bi where a and b are integers, we'd just have the adjective "Gaussian x", meaning a+bi where a and b are members of the xes
02:08:52 <oerjan> hppavilion[1]: hm and that's precisely how it works with rationals, what's the problem
02:08:57 <shachaf> Hmm, maybe it doesn't exactly.
02:09:33 <shachaf> oerjan: there are way too many things that are called "gaussian" for this scheme to work hth
02:09:43 <shachaf> https://en.wikipedia.org/wiki/List_of_things_named_after_Carl_Friedrich_Gauss
02:10:06 <hppavilion[1]> oerjan: Well I haven't heard of "Gaussian rationals"
02:10:18 <oerjan> shachaf: but these gaussian distributions a + bi are so quantum!
02:10:32 <oerjan> hppavilion[1]: neither had i until i just guessed it
02:10:34 <hppavilion[1]> oerjan: And this way, we could have worse things like the "Gaussian Strings" or something awful like that, for example
02:11:29 <shachaf> oerjan: The real scow of CReal is that it only computes up to 40 digits normally.
02:12:29 <lambdabot> "3.1415926535897932384626433832795028841971693993751058209749445923078164062...
02:13:03 <shachaf> I wish lambdabot still had unsafeCoerce so I could examine CReals.
02:13:04 <oerjan> > showCReal 1000 (pi^2)
02:13:06 <lambdabot> "9.8696044010893586188344909998761511353136994072407906264133493762200448224...
02:13:11 <oerjan> > last $showCReal 1000 (pi^2)
02:14:04 <lambdabot> git clone https://github.com/lambdabot/lambdabot
02:14:43 <oerjan> @tell int-e @version should say which ghc version it's compiled with twh
02:15:18 -!- AlexR42 has quit (Quit: My Mac has gone to sleep. ZZZzzz…).
02:15:56 <oerjan> shachaf: pretty sure there's some remaining unsafeCoerce bug ...
02:18:31 -!- andrew__ has joined.
02:19:23 <oerjan> :t coerce -- this is some silly lensy thing isn't
02:19:24 <lambdabot> (Functor f, Contravariant f) => f a -> f b
02:21:08 * oerjan is forgetting his orange juice
02:23:13 <oerjan> > typeRep (Proxy :: Proxy (() :: Constraint)) == typeRep (Proxy :: Proxy ())
02:25:23 <oerjan> that type family bug i found obviously won't work in lambdabot
02:30:27 -!- ineiros has quit (Ping timeout: 248 seconds).
02:41:37 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
02:44:30 -!- andrew__ has quit (Remote host closed the connection).
02:46:31 -!- andrew_ has joined.
02:49:34 -!- hppavilion[2] has joined.
02:52:00 -!- andrew_ has quit (Ping timeout: 246 seconds).
03:08:29 -!- andrew_ has joined.
03:08:31 -!- hppavilion[2] has changed nick to hppavilion[1].
03:09:09 -!- AlexR42 has joined.
03:17:55 -!- hppavilion[1] has quit (Ping timeout: 248 seconds).
03:25:49 -!- augur has quit (Ping timeout: 250 seconds).
03:38:04 -!- AlexR42 has quit (Quit: My Mac has gone to sleep. ZZZzzz…).
03:39:21 -!- hppavilion[1] has joined.
03:43:02 -!- joaeos has joined.
03:49:06 -!- joaeos has quit (Ping timeout: 276 seconds).
03:53:40 -!- joaeos has joined.
03:56:25 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
03:56:49 -!- augur has joined.
03:59:27 <joaeos> this esolang thing is quite a brainfuck
04:00:03 -!- joaeos has left ("Leaving").
04:01:17 -!- \oren\_ has quit (Ping timeout: 260 seconds).
04:02:04 -!- \oren\ has joined.
04:05:50 -!- sebbu has quit (Ping timeout: 248 seconds).
04:07:18 -!- AlexR42 has joined.
04:08:23 -!- hppavilion[1] has joined.
04:30:03 -!- oerjan has quit (Quit: Got it).
04:52:53 -!- AlexR42 has quit (Quit: My Mac has gone to sleep. ZZZzzz…).
04:56:51 -!- FreeFull has quit (Read error: Connection reset by peer).
04:57:18 -!- FreeFull has joined.
04:58:27 -!- Alcest has joined.
05:21:34 -!- benderpc_ has joined.
05:22:00 -!- benderpc_ has quit (Changing host).
05:22:01 -!- benderpc_ has joined.
05:22:02 -!- augur has quit (Remote host closed the connection).
05:22:11 -!- benderpc_ has changed nick to bender.
05:27:00 -!- XorSwap has joined.
05:36:35 -!- XorSwap has quit (Quit: Leaving).
06:02:33 -!- sebbu has joined.
06:02:45 -!- hppavilion[1] has quit (Ping timeout: 246 seconds).
06:05:11 -!- augur has joined.
06:11:57 -!- hppavilion[1] has joined.
06:39:54 <lambda-11235> hppavilion[1]: What's that? Are you interested in agrarian studies?
06:40:39 <hppavilion[1]> (http://catseye.tc/view/emmental/tests/Emmental.markdown)
06:41:04 <b_jonas> \oren\: an, nice! is that a vector-only ttf version, or a ttf with bitmap/graymap included?
06:41:20 <hppavilion[1]> lambda-11235: http://catseye.tc/view/emmental/README.markdown
06:42:30 <b_jonas> \oren\: and is it a repeatable enough conversion that you'll be able to recreate it easily later in the far future when I make an updated version of my font with more characters and modified images of the existing characters?
06:44:03 <lambda-11235> hppavilion[1]: Don't know emmental, but I do now. Also, agrarian means relating to agriculture or farming.
06:45:34 -!- lambda-11235 has quit (Quit: Good night.).
06:49:04 -!- MoALTz has joined.
06:58:49 <hppavilion[1]> lambdabot: Wait, no, mascarpone was the one I was going for
06:59:52 <hppavilion[1]> @tell lambda-11235 It's mascarpone, not emmental, that I was going for. Mascarpone is Emmental's successor.
07:03:17 -!- nzt-fish has quit (Ping timeout: 260 seconds).
07:12:11 -!- ineiros has joined.
07:25:29 <b_jonas> Heh, on http://www.questionablecontent.net/cast.php , May is missing the header for her name (he's above Steve)
07:35:56 -!- mroman has joined.
07:41:02 -!- augur has quit (Remote host closed the connection).
07:44:25 -!- andrew_ has quit (Read error: Connection reset by peer).
07:47:26 -!- andrew has joined.
07:52:49 -!- tromp has quit (Remote host closed the connection).
07:58:10 -!- lynn has joined.
08:36:55 -!- J_Arcane has quit (Ping timeout: 252 seconds).
08:37:28 -!- lynn has quit (Ping timeout: 252 seconds).
08:44:04 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
08:53:20 -!- tromp has joined.
08:58:30 -!- tromp has quit (Ping timeout: 276 seconds).
09:43:07 -!- \oren\ has quit (Ping timeout: 260 seconds).
09:44:09 -!- \oren\ has joined.
10:23:37 -!- jaboja has joined.
10:36:47 -!- \oren\ has quit (Ping timeout: 260 seconds).
10:37:19 -!- \oren\ has joined.
10:51:35 <HackEgo> [wiki] [[Special:Log/newusers]] create * Whonut * New user account
11:00:59 <HackEgo> [wiki] [[Talk:Bitoven]] https://esolangs.org/w/index.php?diff=46474&oldid=43177 * Whonut * (+323) Asked about what is syntactically meaningful in Bitovem
11:15:54 -!- ayeelmao has left.
11:26:56 -!- boily has joined.
11:36:45 <lambdabot> shachaf asked 11h 42m 10s ago: pizza must be poutine its place
11:37:20 <boily> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhellochafAAAAAAAAAAAAAAAAAAAAAAAAmapoleAAAAAAAAAAAAAAAARGH!
11:41:42 <lifthrasiir> I have some serious bug that is really hard to catch with examples at my disposal
11:47:22 -!- jaboja has quit (Ping timeout: 260 seconds).
11:54:18 -!- tromp has joined.
11:58:53 -!- tromp has quit (Ping timeout: 250 seconds).
11:59:59 -!- AnotherTest has joined.
12:16:45 -!- boily has quit (Quit: REGULATED CHICKEN).
12:33:39 -!- andrew has quit (Remote host closed the connection).
12:42:52 <Taneb> The issue, of course, with generated brainfuck programs, is that they tend to end up being quite long
12:43:08 <Taneb> That is, naturally, why we are generating them in the first place rather than writing them ourselves
12:43:22 <Taneb> This means they can take a long time to run in the interpreter you are using
12:44:39 -!- bender has quit (Quit: Leaving).
13:10:43 -!- tromp has joined.
13:15:10 -!- tromp has quit (Ping timeout: 248 seconds).
13:17:58 -!- jaboja has joined.
13:43:29 -!- Treio has joined.
13:57:55 -!- Treio has quit (Quit: Leaving).
13:58:12 <Taneb> Well, I've worked out why it's not working
13:58:35 <Taneb> I'm using an if-else construct that uses two temporary cells
13:58:43 <Taneb> I'm using a whole bunch of nested ifs
13:58:49 <Taneb> Using the same temporary cells
14:00:02 <Taneb> So, I need to design a case-switch statement
14:01:32 -!- jaboja64 has joined.
14:05:18 -!- jaboja has quit (Ping timeout: 248 seconds).
14:16:32 -!- `^_^v has joined.
14:20:20 -!- bender|_ has joined.
14:20:40 -!- bender|_ has quit (Changing host).
14:20:40 -!- bender|_ has joined.
14:20:48 -!- bender|_ has changed nick to bender.
14:23:52 <Taneb> Oooh, http://calmerthanyouare.org/2016/01/14/control-flow-in-brainfuck.html has a guide
14:39:40 -!- tromp_ has quit (Read error: Connection reset by peer).
14:40:57 -!- tromp_ has joined.
14:44:57 -!- jaboja64 has quit (Ping timeout: 276 seconds).
14:44:57 -!- earendel2 has quit (Ping timeout: 276 seconds).
14:48:36 -!- joaeos has joined.
14:48:49 -!- bb010g has quit (Quit: Connection closed for inactivity).
14:51:41 -!- J_Arcane has joined.
14:54:07 -!- lambda-11235 has joined.
15:06:28 -!- earendel has joined.
15:16:46 -!- J_Arcane has quit (Ping timeout: 252 seconds).
15:18:26 -!- izabera has changed nick to anbppomced.
15:20:27 -!- anbppomced has changed nick to izabored.
15:22:25 -!- mroman has quit (Quit: Lost terminal).
15:25:06 -!- atslash has joined.
15:26:21 -!- joaeos has quit (Ping timeout: 248 seconds).
15:28:22 -!- izabored has changed nick to izabera.
15:37:54 -!- contrapumpkin has joined.
15:40:42 -!- copumpkin has quit (Ping timeout: 260 seconds).
15:56:50 <Taneb> I could do with a variant of brainfuck that is coupled direct read-access to a whole bunch of data involved in the brainfuck, as well as variables, but it can only be used for debugging
15:58:07 -!- lambda-11235 has quit (Quit: Bye).
16:03:11 -!- nzt-fish has joined.
16:10:53 <Taneb> quintopia: I want an extension of brainfuck with more facilities for debugging
16:11:29 <Taneb> Because reasoning about a 9000 line brainfuck program is less than fun
16:18:17 -!- impomatic_ has joined.
16:28:07 <quintopia> Taneb: is it not enough just to be able to step through it looking at the tape?
16:33:40 <Taneb> quintopia: it's far too long, alas
16:42:29 -!- tromp has joined.
16:47:09 -!- tromp has quit (Ping timeout: 276 seconds).
16:55:45 -!- augur has joined.
16:57:32 <quintopia> Taneb: what about tracking certain tape cells the way you can track variables in most debuggers?
16:57:52 <Taneb> quintopia: I want to do some things fancier than that
16:58:17 <Taneb> Like "make sure the cell reached at this instruction is the same cell as this one"
16:58:29 <Taneb> When that loop runs hundreds of times in different places
16:59:42 -!- bender has quit (Ping timeout: 248 seconds).
17:02:09 -!- `^_^v has quit (Ping timeout: 246 seconds).
17:03:45 -!- `^_^v has joined.
17:07:33 -!- Veltas has quit (Remote host closed the connection).
18:00:51 <quintopia> Taneb: that sounds like breakpoints with IP tracking
18:01:29 <Taneb> I also want to, to some extent, specify this in the program itself
18:04:12 <quintopia> it wouldnt be the first time someone added debug codes to a language
18:05:00 -!- augur has quit (Read error: Connection reset by peer).
18:05:51 -!- lambda-11235 has joined.
18:05:59 -!- augur has joined.
18:17:50 -!- spiette has joined.
18:29:49 -!- augur has quit (Remote host closed the connection).
18:40:38 <HackEgo> [wiki] [[Humo]] https://esolangs.org/w/index.php?diff=46475&oldid=46473 * Fpetrola * (+81)
18:41:46 <HackEgo> [wiki] [[Humo]] https://esolangs.org/w/index.php?diff=46476&oldid=46475 * Fpetrola * (-65)
18:42:30 <HackEgo> [wiki] [[Humo]] https://esolangs.org/w/index.php?diff=46477&oldid=46476 * Fpetrola * (-7)
18:43:13 <HackEgo> [wiki] [[Humo]] https://esolangs.org/w/index.php?diff=46478&oldid=46477 * Fpetrola * (+97)
18:45:09 <HackEgo> [wiki] [[Humo]] https://esolangs.org/w/index.php?diff=46479&oldid=46478 * Fpetrola * (+1)
18:45:58 <HackEgo> [wiki] [[Humo]] https://esolangs.org/w/index.php?diff=46480&oldid=46479 * Fpetrola * (+18)
18:46:13 -!- `^_^v has quit (Ping timeout: 250 seconds).
18:46:47 <HackEgo> [wiki] [[Humo]] https://esolangs.org/w/index.php?diff=46481&oldid=46480 * Fpetrola * (-18)
18:47:31 -!- clog has quit (Ping timeout: 250 seconds).
18:47:54 -!- Yurume has quit (Ping timeout: 268 seconds).
18:47:54 -!- lifthrasiir has quit (Ping timeout: 268 seconds).
18:48:09 -!- lifthrasiir has joined.
18:48:26 -!- `^_^v has joined.
18:49:11 -!- Yurume has joined.
18:49:38 -!- copumpkin has joined.
18:49:41 -!- impomatic has quit (Ping timeout: 250 seconds).
18:49:41 -!- nisstyre_ has quit (Ping timeout: 250 seconds).
18:50:19 -!- hppavilion[1] has joined.
18:50:50 -!- hppavilion[2] has joined.
18:50:59 -!- contrapumpkin has quit (Ping timeout: 250 seconds).
18:53:07 -!- tjt263_ has joined.
18:54:34 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
18:54:38 -!- nisstyre_ has joined.
18:56:11 -!- fungot has quit (Ping timeout: 250 seconds).
18:58:23 -!- pdxleif has quit (Ping timeout: 268 seconds).
18:59:22 -!- idris-bot has quit (Quit: Terminated).
19:01:57 -!- impomatic has quit (Ping timeout: 260 seconds).
19:09:47 -!- zzo38 has joined.
19:12:12 -!- lleu has quit (Read error: Connection reset by peer).
19:13:00 -!- llue has joined.
19:13:00 <b_jonas> Taneb: could you use my font for something?
19:13:01 <Taneb> b_jonas, I'm almost there
19:13:01 -!- sebbu2 has joined.
19:13:01 <b_jonas> Have you compressed all of it to brainfuck code that fits a single IRC line yet?
19:13:40 <b_jonas> Or at least all but the glyphs at control character positions?
19:14:03 -!- sebbu has quit (Ping timeout: 276 seconds).
19:14:07 <b_jonas> The glyphs at the latin-1 high controls are probably mostly useless.
19:16:00 -!- MoALTz has quit (Ping timeout: 276 seconds).
19:25:40 -!- zgrep has quit (*.net *.split).
19:25:40 -!- Elronnd has quit (*.net *.split).
19:25:40 -!- lambdabot has quit (*.net *.split).
19:25:40 -!- Lymia has quit (*.net *.split).
19:25:40 -!- haavard has quit (*.net *.split).
19:25:41 -!- shikhin has quit (*.net *.split).
19:25:41 -!- sewilton has quit (*.net *.split).
19:30:51 -!- J_Arcane has joined.
19:31:29 -!- zgrep has joined.
19:31:29 -!- Elronnd has joined.
19:31:29 -!- lambdabot has joined.
19:31:29 -!- Lymia has joined.
19:31:29 -!- haavard has joined.
19:31:29 -!- shikhin has joined.
19:31:29 -!- sewilton has joined.
19:31:37 <hppavilion[2]> lambda-11235: Nothing; just writing a JS parser library
19:34:18 -!- nycs has joined.
19:36:22 -!- `^_^v has quit (Ping timeout: 252 seconds).
19:36:36 -!- nycs has quit (Client Quit).
19:37:57 -!- `^_^v has joined.
19:45:15 <impomatic_> There's a Core War tournament in a few weeks if anyone's up for it? http://corewar.co.uk/easter2016.htm
19:45:50 * izabera read it as code war and thougth it was a hackaton
19:47:13 -!- ais523 has joined.
19:53:49 -!- oerjan has joined.
19:55:04 <zzo38> Probably a better way to do colors with Xlib would be using the standard colormaps, although TrueColor should probably be used instead if possible. Anyways it would then have to check if the default visual matches the standard colormap, and other stuff too
19:57:35 <ais523> zzo38: is the standard colormap for xterm the same as that for X?
20:06:10 <myname> just invert the show function :p
20:06:15 -!- spiette has quit (Ping timeout: 246 seconds).
20:06:33 <hppavilion[2]> I'm considering giving up and using a pre-made library
20:07:36 <myname> https://jeltsch.wordpress.com/2013/04/27/a-taste-of-curry/
20:09:09 <zzo38> Maybe it can also be use with Node.js too
20:10:12 <hppavilion[2]> zzo38: I mean, if it works in JS it should work in Node
20:10:21 <hppavilion[2]> myname: My main goal is to reimplement Thoof in a browser
20:11:27 <hppavilion[2]> myname: You use s/// notation to define axioms and compose substitutions to make theorems
20:12:07 -!- lambda-11235 has quit (Quit: Bye).
20:12:35 <b_jonas> hppavilion[2]: sure, that's why we have ayacc
20:12:51 <b_jonas> for writing parsers not from scratch
20:13:09 <hppavilion[2]> b_jonas: I was writing a Yacc-like library so I wouldn't have to write them from scratch
20:13:26 <b_jonas> hppavilion[2]: ayacc is exactly one of those yacc-like libraries
20:13:28 <hppavilion[2]> b_jonas: I implemented the parser combinator library, now I'm debugging it be implementing an actual parser in it
20:13:35 <b_jonas> I recommend it if you want yacc-like parsing
20:13:44 <b_jonas> which of course can depend on what it is that you have to parse
20:14:01 <b_jonas> do we have a wisdom for it?
20:14:13 <HackEgo> ayacc is ais523's yacc parser generator implementation, get it from http://nethack4.org/media/alex/ayacc/ayacc.pl
20:14:16 <b_jonas> fungot, is HackEgo always this slow?
20:14:35 <ais523> b_jonas: it's often slow when it hasn't been used for awhile
20:14:43 <ais523> occasionally to the extent of actually timing out
20:14:56 <ais523> hppavilion[2]: ayacc isn't exactly a library, it's a Perl script
20:15:09 <ais523> it's intended as an implementation of POSIX yacc
20:15:18 <ais523> you give it a grammar as input
20:15:23 <ais523> and it outputs a program that does parsing
20:15:29 <ais523> currently it only supports output in C and Perl
20:15:44 <ais523> /but/ it is designed to easily be made to generate output in other languages
20:16:21 <ais523> you basically give it a dictionary of program fragments that it can assemble a program out of
20:17:05 <zzo38> That is, if it is pure JavaScript that does not use DOM and so on then it can work on browser and Node
20:17:22 <zzo38> (As well as other programs that use JavaScript)
20:17:44 <ais523> hppavilion[2]: most yacc implementations work by filling in a template file
20:17:48 <hppavilion[2]> zzo38: Do you know of any Javascript parser generator libraries or pure parser generators?
20:17:53 <ais523> ayacc's a bit different, it generates code rather than data
20:20:21 <oerjan> <hppavilion[2]> b_jonas: I was writing a Yacc-like library so I wouldn't have to write them from scratch <-- with all due respect, if you have trouble writing parsers from scratch, then there is _no_ way you're qualified to write a yacc-alike hth
20:20:59 <oerjan> because no hand-written parser can ever be as confusing as LALR(1) parsing QED
20:21:16 -!- spiette has joined.
20:23:30 <oerjan> although i have a hunch you meant something like parsec-alike instead
20:24:13 -!- hppavilion[2] has quit (Ping timeout: 252 seconds).
20:25:15 <ais523> oerjan: I don't find LALR(1) that confusing
20:25:39 <l0de> Yes hello, l0de here
20:25:48 -!- Sprocklem has joined.
20:25:49 <l0de> Anyone looking forward to the equinox rituals?
20:27:04 <HackEgo> This channel is about programming -- for the other kind of esoterica, try #esoteric on EFnet or DALnet.
20:27:19 <b_jonas> oerjan: yes, sadly the “parser combinator library” hints for taht
20:30:17 <zzo38> A LALR(1) parser generator for C programs is Lemon, although that is C rather than JavaScript programming
20:30:48 <b_jonas> zzo38: yes, I know, but I agree with ais523 in that ayacc is better than lemon in basically everything
20:31:01 -!- hppavilion[1] has joined.
20:31:02 <ais523> do I know what lemon is?
20:31:24 <b_jonas> ais523: what? haven't we already talked about that one related to ayacc?
20:31:28 <zzo38> l0de: I have no ritual of equinox at this time. (Although I do agree that it should be a holiday)
20:31:35 <ais523> that's why I asked rather than saying I didn't know what it was
20:31:49 <oerjan> <ais523> /but/ it is designed to easily be made to generate output in other languages <-- . o O ( underlambda? )
20:31:49 <b_jonas> ais523: I think you do know
20:32:27 <ais523> oerjan: well it possibly has more of a chance than anything else :-P
20:32:47 <ais523> actually the model it uses maps onto underlambda very well
20:32:57 <ais523> even unlambda, in fact
20:33:00 <b_jonas> ais523: lemon is the yacc-like but not really compatible one that (a) outputs a re-entrant parser that doesn't use the C-stack but a separately allocated stack, and (b) its grammars mandatorily use a different syntax than yacc's $1 to access the values of symbols inside blocks
20:33:08 <ais523> the main difficulties would be syntactic
20:33:21 <ais523> I figured it was something like that purely from you comparing it to ayacc
20:34:05 <b_jonas> ais523: http://www.sqlite.org/src/doc/trunk/doc/lemon.html
20:34:34 <b_jonas> ais523: mind you, it probably did make sense for them to develop lemon if ayacc wasn't available
20:34:57 <b_jonas> it's still better in some things than bison, and it serves their needs well
20:35:13 <oerjan> <ais523> oerjan: I don't find LALR(1) that confusing <-- yes but you eat graphs for lunch hth
20:35:58 <b_jonas> And it's definitely much better than handwriting a parser of course.
20:36:52 <zzo38> I happen to like that (a) difference from yacc especially, it mean you can even use more than one parser simultaneously in the same program too, as well as that you can call the parser for each token and that is how it work.
20:38:06 <b_jonas> The problem is that we have these nice theoretic constructions like yacc parsers, but then people invent languages that aren't LR, and that can be parsed only with gross hacks, and in the end the parser you get is so ugly that you can't prove anything about how it works and when it will break.
20:38:32 <b_jonas> LALR(1) parser generator itself is great, I like it, although I don't claim to completely understand the theory.
20:38:41 <b_jonas> The part where it gets bad is the stupid languages.
20:39:53 <b_jonas> zzo38: funnily, bison is somewhat closer to that than ayacc is, at least ayacc with the C backend, because bison also outputs a parser that doesn't use the C stack, I think
20:40:45 <ais523> b_jonas: I've been considering allowing LALR(2), etc., in ayacc too
20:41:04 <ais523> perhaps with some minimization to merge identical states
20:41:19 <ais523> although it's unclear how you'd follow the POSIX rule to only read input if absolutely necessary, that might make it more complex
20:41:39 <b_jonas> zzo38: but luckily using the C stack isn't such a big problem, because at least it doesn't use global variables and has other promises, so we can break out of a parser, we can run more than one in parallel using threads or coroutines, and we could even develop a new backend that doesn't use the C stack.
20:42:03 <ais523> oerjan: b_jonas: you know how you can implement mathematical regular expressions using NFAs, and how those can be converted to DFAs in order to create an efficient compiled representation of the regular expression?
20:42:11 <ais523> LALR is basically that but for stack machines
20:42:40 <b_jonas> ais523: those grammars I'm thinking about aren't LALR(n) for other n either. the ones that are LALR(2) but not LALR(1) can generally be turned to LALR(1) with some small amount of preprocessing of the input stream with a DFA.
20:43:31 -!- lynn has joined.
20:44:07 <ais523> most yacc impls will, if you give the -v or equivalent argument, list all the possible NstackA states that correspond to one DstackA state
20:44:41 <ais523> so that helps to understand what's going on
20:44:47 <ais523> (ayacc is one such impl)
20:46:39 <b_jonas> ais523: yes, a good quality debug output from ayacc certainly helps develop and debug grammars and prove things about it
20:46:59 <b_jonas> as in, more than just telling me whether there's a conflict or not
20:47:03 -!- clog has joined.
20:47:58 <ais523> b_jonas: it also helps debug ayacc
20:48:05 <ais523> I worked on its debug output quite a lot for that reason
20:49:45 <b_jonas> ais523: can it also help debugging new ayacc output template thingies?
20:50:15 <ais523> only by comparing what it says the code structure should be to what was actually output
20:50:23 <ais523> however, a mistaken template will normally just cause a syntax error
20:50:42 <ais523> it's basically literally transforming the final automaton shown in ayacc's .output file into a series of code fragments via substitution
20:50:44 <b_jonas> Sadly I don't think I'm going to play with ayacc in the near future. I have too many other things to do.
20:52:27 -!- spiette has quit (Ping timeout: 246 seconds).
20:56:42 -!- tjt263_ has quit (Changing host).
20:56:42 -!- tjt263_ has joined.
20:58:19 -!- atslash has quit (Quit: This computer has gone to sleep).
21:04:52 -!- carado has joined.
21:09:34 -!- spiette has joined.
21:13:02 <b_jonas> ais523: oh, that reminds me. ayacc already clearly states that the parts of ayacc that it outputs are under public domain. is there a statement somewhere about what license the other parts of ayacc are available under?
21:13:27 -!- lynn_ has joined.
21:13:39 -!- lynn has quit (Disconnected by services).
21:13:43 -!- lynn_ has changed nick to lynn.
21:13:43 <b_jonas> This isn't urgent or anything, but it would be useful if you specified.
21:13:53 <ais523> huh, it looks like I forgot the license notice
21:13:55 <b_jonas> Like, released it under some license.
21:13:57 <ais523> I think I was planning GPLv3
21:14:12 <ais523> but atm it's default-all-rights-reserved
21:14:29 <ais523> (because I forgot to license it under anything else)
21:14:54 <b_jonas> but in the future I'd like something that gave me more rights than defaults-all-rights-reserved
21:16:19 <ais523> I'm not working on ayacc at the moment
21:16:21 <ais523> but remind me next time I do
21:18:28 <b_jonas> I'll try, but I might forget
21:19:07 -!- p34k has quit.
21:21:27 -!- AnotherTest has quit (Ping timeout: 276 seconds).
21:24:41 -!- I has joined.
21:25:05 -!- I has changed nick to Guest46248.
21:25:06 -!- p34k has joined.
21:25:39 <b_jonas> ais523: I hope the GPL would work in such a way on ayacc such that (1, more importantly) an ayacc-specific input grammar file is only an input to ayacc, not a modification to it that is required to be licensed under the GPL if you want to distribute it, and
21:26:36 <b_jonas> (2, less importantly) ayacc isn't considered part of a program that uses ayacc to generate its parser, so that the program can be put under a GPL-incompatible but GPL-like sticky copyleft license that requires the full source of the program to be provided.
21:26:51 <b_jonas> It's clear that the _output_ of ayacc isn't covered, my question is about the input.
21:26:56 -!- tjt263_ has quit (Quit: part).
21:26:59 <ais523> b_jonas: the situatoin is the same as with gcc, I believe
21:27:15 <ais523> which doesn't place any requirements on its input
21:27:29 <ais523> besides, the fact that ayacc implements POSIX yacc is a pretty good argument that its input isn't copyright-affected by ayacc
21:27:35 <ais523> as it'd be valid POSIX yacc input too
21:28:53 <b_jonas> ais523: sure, but (1) I specifically said ayacc-specific grammar, and for point (2) that isn't relevant because bison is under the GPL too.
21:29:21 <ais523> b_jonas: no it isn't, bison has an exception
21:29:27 <ais523> basically because bison skeletons are copied into the output verbatim
21:30:46 <b_jonas> Bison has an exception to make its _output_ free from copyright stickiness, right? Same as how gcc has an exception for some parts of libgcc or whatever that often gets linked into the output but isn't covered by the "System Libraries" clause.
21:32:36 <b_jonas> But sure, gcc is probably a very good precedent.
21:35:50 <b_jonas> Hmm… maybe we could abuse the nethack4 bug tracker for tickets about ayacc eventually.
21:36:01 <b_jonas> It already works for aimake I think.
21:38:51 <izabera> https://test.drownattack.com/?site=https://www.intesasanpaolo.com my bank ;-;
21:40:07 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
21:43:00 <int-e> oerjan: fwiw it's ghc 7.10.2; I didn't see a reason to update to ghc 7.10.3
21:43:15 <b_jonas> As for ayacc, I tried to write a translator or compiler thingy that originally tried to emit readable code. I mostly failed, though part of that was that I didn't develop it much after the deadline.
21:43:53 <int-e> is aimake a(imake) or ai(make)?
21:44:10 <b_jonas> That project was http://www.math.bme.hu/~ambrus/pu/olvashato/ of course
21:44:15 <b_jonas> int-e: I think it's (ai)make
21:44:27 <b_jonas> what would "imake" even mean?
21:44:35 <ais523> int-e: it's (ai)(make)
21:44:35 <Taneb> int-e, I always assumed it was an artificially intelligent version of make
21:44:39 <int-e> I guess it would be spelled Imake
21:44:47 <ais523> ai can either stand for artificial intelligence or (ai)s523
21:45:01 <int-e> "imake is a build automation system written for the X Window System."
21:45:31 -!- hppavilion[1] has joined.
21:46:40 <b_jonas> hmm... does the first "a" in "ayacc" stand for something in particular then?
21:46:48 <ais523> matches the first a in ais523, that's about it
21:47:58 <b_jonas> and I guess ancurses would sound lame, unlike uncurses
21:52:03 <ais523> it's called uncursed, it's just a nethack-related pun
21:52:12 <ais523> sticking an "a" at the start is boring if you could do a pun instead
21:53:27 -!- mtve has quit (Ping timeout: 260 seconds).
21:53:47 <oerjan> b_jonas: hey is that you discussing grade skipping with scott a.
21:55:11 <b_jonas> oerjan: yes, I'm that b_jonas. and it's probably not one of my most insightful comments.
21:55:24 <b_jonas> not even among the ones on that blog
21:55:52 <oerjan> i just had a hunch and was wondering
21:56:05 <oerjan> (and you didn't use b_)
21:56:21 <b_jonas> in some places I'm just jonas
21:56:24 <b_jonas> which isn't nearly as unique
21:56:39 <b_jonas> I'm practically the only b_jonas out there, but there are other people using "jonas"
22:00:00 <b_jonas> oerjan: worse, on some places, I have used both jonas and b_jonas, because I forgot which one I used.
22:02:03 -!- augur has joined.
22:05:32 -!- lynn_ has joined.
22:06:01 <b_jonas> oerjan: this one really gives it away that at least some of the "jonas" comments are by me by the way => http://www.scottaaronson.com/blog/?p=2011#comment-154279
22:07:43 -!- lynn has quit (Ping timeout: 250 seconds).
22:10:05 <oerjan> i am not sure if i followed that thread
22:34:46 -!- Guest46248 has quit (Quit: Leaving).
22:43:55 -!- `^_^v has quit (Quit: This computer has gone to sleep).
22:44:13 -!- ais523 has quit.
22:49:12 -!- spiette has quit (Ping timeout: 276 seconds).
23:02:09 -!- p34k has quit.
23:05:55 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
23:41:22 -!- lynn_ has quit (Ping timeout: 260 seconds).
23:45:01 -!- hppavilion[1] has joined.
00:07:49 <shachaf> Taneb: are you able to predict questions before they're asked of you?
00:08:08 <Taneb> Also, I have a brainfuck program that generates ASCII art banners!
00:08:24 -!- boily has joined.
00:08:48 <Taneb> b_jonas, thanks! :D
00:08:49 <HackEgo> lambdabot: @@ @@ (@where weather) CYUL ENVA ESSB KOAK
00:08:51 <lambdabot> CYUL 020000Z 03010KT 10SM -SN OVC052 M10/M13 A3006 RMK SC8 SLP183 \ ENVA 012350Z 17020G34KT CAVOK 01/M07 Q0994 RMK WIND AT 670FT 17035G47KT \ ESSB 012350Z AUTO 12006KT 9999 OVC021/// M01/M05 Q1009 \ KOAK 012353Z 27010KT 10SM FEW100 FEW180 20/10 A3013 RMK AO2 SLP202 T02000100 10217 20167 56006
00:09:12 <lambdabot> shachaf said 3h 36m 23s ago: do not @messages-loud this message twh
00:09:27 <boily> hellochaf. too late.
00:09:29 -!- Phantom_Hoover has joined.
00:09:42 <Taneb> izabera, would you mind terribly if I use arin.ga to paste a rather large amount of brainfuck?
00:12:11 <Taneb> Screw it, it's better to ask forgiveness than permission
00:12:54 <hppavilion[1]> Taneb: Yeah, but it's only easier if you don't explicitly say that to the person you would be getting permission (and will be asking for forgiveness) from
00:13:02 <hppavilion[1]> So here's a project to recruit more people to the #esoteric empire
00:14:26 * hppavilion[1] waits patiently for someone to respond so he knows that he's talking to something other than an empty room
00:16:24 <int-e> why, are you afraid of echoes?
00:17:47 <boily> hppavellon[1]. there's tofu in my mouth; I can't answer readily.
00:18:18 <hppavilion[1]> int-e: I'd rather not talk at all that talk and have it get buried and ignored
00:18:28 <shachaf> That's what usually happens.
00:18:58 <shachaf> oerjan: Oh, I got some intuition for par the other day.
00:19:08 <shachaf> but it turned out to be kind of scow tdnh
00:19:19 * boily does not mapole shachaf
00:19:25 <hppavilion[1]> So the idea is to create some simple (not 100% insane, but strange enough to be intriguing) esolangs that are practical to use
00:19:30 <Taneb> brainfuck program I "wrote": https://arin.ga/FQLSPy/
00:20:01 <hppavilion[1]> And publish them together with some project revolving around tehm
00:21:00 <hppavilion[1]> They would be published on some blog (as opposed to esolangs.org, which defeats the purpose) with hopes of attracting new people, eventually to the point that we can do esolangs4charity or something like that
00:22:04 <int-e> . o O ( moaronic spelling )
00:22:17 <hppavilion[1]> An example of a language is a declarative language/machine called TurMinsFuck, which is exactly what it sounds like
00:22:58 <boily> we will Conquer the World, one Eggplant at a Time!
00:23:08 <hppavilion[1]> A side effect is that esolangs will show people how to implement languages, so we'll get MOAR non-esoteric languages too
00:24:00 <hppavilion[1]> The aforementioned language is JSON-based, to ease implementation. The goal of users is to write a simple pseudo-OS in it
00:25:13 <int-e> so how many of hppavilion[1]'s ideas have materialized so far?
00:31:36 -!- tromp has joined.
00:31:52 <Taneb> I'm really proud I got his program working
00:33:14 <int-e> Taneb: that looks horrible :)
00:33:41 <int-e> also... <> ... doesn't look so useful :)
00:34:00 <Taneb> I've been focusing on getting it working, not getting it looking nice
00:34:08 <Taneb> There's a whole bunch of <> and I think some +-
00:34:21 -!- lambda-11235 has joined.
00:34:42 <Taneb> Generates ASCII art banners
00:35:48 <Taneb> It takes a string in input and prints a rendering of that string using just space and #
00:36:50 <Taneb> Using the font b_jonas is designing
00:39:31 <hppavilion[1]> One type of brainfuck derivative I could never hate is one that uses novel data structures or types as its primitive- either instead of the tape or instead of the integers
00:42:42 -!- idyllei has joined.
00:47:54 <Taneb> prooftechnique, one b_jonas designed and shared with me
00:48:04 <hppavilion[1]> Taneb: At least run bf.replace('<>', '') on the program...
00:48:05 <Taneb> I'm afraid I've lost the appropriate links
00:48:40 <Taneb> At the very least, it was more immediately available
00:49:27 <hppavilion[1]> prooftechnique: What do you think would be good for an esolang practical enough that people can use it, but esoteric enough to be interesting?
00:49:27 <Taneb> I really hope I win this competition
00:50:12 <Taneb> hppavilion[1], my uni's electronics society is running a brainfuck programming competition
00:50:23 <Taneb> My ego demanded I demonstrate I'm the best in my uni at brainfuck
00:50:53 <hppavilion[1]> prooftechnique: I made a proof assistant based on s/// notation already :)
00:51:11 <Taneb> hppavilion[1], well, the deadline is just listed as "the 2nd of March", and I submitted this at 00:15
00:51:38 <Taneb> I've submitted solutions for all the easier challenges, though
00:51:51 <hppavilion[1]> Taneb: Wait, but does that mean at the beginning or end of march 2?
00:52:14 <hppavilion[1]> Taneb: As in, your own idea for a freestyle competition
00:52:15 <Taneb> I presume not the latter as the winner is announced at 2
00:52:36 <int-e> tsk, the program overflows when given a 0xFF character as input
00:52:51 <Taneb> It wasn't my idea, but I think I'm the only person who attempted it
00:53:16 <Taneb> hppavilion[1], Haskell script
00:53:42 <Taneb> It's got a fairly regular structure, it's just really tedious and finicky
00:53:55 <Taneb> There's a whole load of improvements I can make
00:53:58 <hppavilion[1]> Taneb: Did the competition include specifications about the particular bf dialect?
00:54:23 <hppavilion[1]> Taneb: I recommend you start maintaining it as FOSS and get it included in some distribution of Linux as a standard command xD
00:54:27 <Taneb> 32 bit word size, EOF is no change, 30000-length tape aborting on memory error
00:54:40 <int-e> characters 3,4,5,6 look so asymmetric
00:54:54 -!- idyllei has quit (Quit: Leaving).
00:56:31 <int-e> (I did this: for i in $(seq 255); do echo $i; echo ${i}P | dc | ./a.out banner.bf; done ... where a.out is a brainfuck interpreter)
00:56:42 <Taneb> hppavilion[1], for the purpose of this competition the reference interpreter is https://copy.sh/brainfuck/
00:56:43 <int-e> I should use printf.
00:57:21 <int-e> (but it's an 8 bit version)
00:57:35 <Taneb> int-e, it should work fine on an 8-bit interpreter
00:58:02 <int-e> Taneb: it does, except for character 255
00:58:19 <Taneb> Ah, shit, I can see why that would happen
00:58:33 <Taneb> hppavilion[1], depends on your brainfuck implementation
00:58:45 <Taneb> Give it input as normal for your implementation
00:59:12 <Taneb> There's a little input box under the output box
00:59:34 -!- Phantom_Hoover has quit (Read error: Connection reset by peer).
01:00:44 <hppavilion[1]> prooftechnique: An example of a language of that form is a TM+MM+BF description language
01:00:47 <Taneb> It's for now All Rights Reserved probably
01:01:17 <Taneb> Please don't redistribute it without asking me
01:01:32 <hppavilion[1]> Taneb: You should FOSS it when the competition ends and start actively maintaining it as a joke.
01:01:54 <hppavilion[1]> Taneb: What strategies are used to generate BF as such? Is there something I could read on this?
01:02:17 -!- Opodeldoc has joined.
01:02:31 <Taneb> hppavilion[1], I'm using a couple things from around the internet and a lot of things on the inside of my head
01:03:08 <lifthrasiir> bf program is not very hard to write (assuming you know some essential tricks like [-]) as long as you don't need arrays
01:03:10 <Taneb> I linked something this afternoon about brainfuck control structures
01:03:22 <Taneb> lifthrasiir, this... this uses arrays
01:04:02 <lifthrasiir> Taneb: to be exact, free-form arrays? I guess you store your text up somewhere and seek to the beginning or end by [<] or [>]
01:04:12 <prooftechnique> Was it oerjan who determined that 3-cell BF is Turing complete?
01:04:14 <Taneb> lifthrasiir, sort of ish
01:04:18 <Taneb> prooftechnique, yeah
01:04:30 <hppavilion[1]> Taneb: If one were to make a brainfuck that was made for much easier development (while still remaining esoteric), what instructions and changes do you think would be crucial?
01:04:33 <lifthrasiir> explicit arrays are harder, and multiple arrays at once are much harder
01:04:36 <Taneb> lifthrasiir, I'm actually storing 20 copies of each character, with a bunch of cells of working space
01:05:21 <Taneb> hppavilion[1], I think it would require enough changes to be not brainfuck at all any more before it's easy to use
01:05:31 <lifthrasiir> I guess I would have used a pair of cells instead, but yeah, that shouldn't really matter
01:05:34 <Taneb> I don't program in brainfuck because it's easy
01:05:40 <Taneb> I program in it because it's hard
01:06:00 <Taneb> lifthrasiir, and then I'm doing [<<...<<] with 200 or so <s
01:06:10 <hppavilion[1]> Taneb: For example, a language for OS development based on BF
01:06:25 <lifthrasiir> Taneb: yeah that becomes a problem when you have 20 copies of them
01:07:34 <Taneb> hppavilion[1], an easier way to do conditionals
01:07:50 <Taneb> The [-[-[-[-[-[-[-[-[-[-[-[-[-s in my program are setting up for a form of case statement
01:09:21 <tswett> I think a "brainfuck assembly language" would be nice. Some language whose purpose is to specify exact brainfuck programs.
01:09:42 <hppavilion[1]> Taneb: Perhaps something a bit JSONy? {case: code; case: code; case: code...}
01:09:59 <Taneb> That doesn't seem to me to be in the spirit of brainfuck
01:10:07 <tswett> hppavilion[1]: then I want to see it.
01:10:08 <hppavilion[1]> Taneb: I agree, but it was the best I could think of
01:12:00 <Taneb> tswett, what I'd like is some sort of specification and verification system for brainfuck
01:12:11 <tswett> Say, does anyone know about that "fantasy game console"? It's like an emulator of an old video game console, except it was designed from scratch instead of actually emulating any particular console.
01:14:05 <tswett> Do what the cool kids do—say three lines just milliseconds apart.
01:14:07 <hppavilion[1]> Taneb: Perhaps just {...} instructions that are like [] but } doesn't jump back (essentially, a NOP that other instructions move based on)
01:14:07 -!- deltab has quit (Ping timeout: 260 seconds).
01:14:35 <hppavilion[1]> tswett: I see it took you a while to copy the newline character
01:14:38 -!- deltab has joined.
01:14:49 <tswett> hppavilion[1]: come up with a nonsense word please.
01:15:49 <tswett> So that I can use it to name my software project.
01:16:24 <tswett> It's a bunch of mathematics written in Coq.
01:17:15 <Taneb> The feeling where you've been trying hard for a while to get something to work
01:17:23 <Taneb> And you don't know what to do next
01:17:27 <Taneb> Is kind of frustrating
01:19:00 <hppavilion[1]> tswett: You should prove something in Thoof when it's ready
01:20:20 <hppavilion[1]> Are any of the trig functions functionally complete for the trig functions?
01:21:16 <tswett> Well, it's pretty easy to write all of them in terms of the sine function.
01:21:31 <hppavilion[1]> tswett: In a way a computer can efficiently calculate?
01:21:35 <tswett> cos(x) = sin(pi/2 - x), I think it is.
01:22:04 <Taneb> hppavilion[1], is division availabe
01:22:09 <tswett> Then tan(x), sec(x), csc(x), and cot(x) can all be written as ratios of sin(x) and cos(x).
01:22:31 <Taneb> Then sin, cos, sec, csc
01:23:07 <hppavilion[1]> tswett: Would a BF-inspired proof assistant be at all a good idea?
01:23:40 <tswett> First, do one inspired by C.
01:23:55 <tswett> If that turns out to have been a good idea, go and do it for BF.
01:23:58 <hppavilion[1]> tswett: I did one inspired by Thue and it works pretty well
01:24:29 <hppavilion[1]> tswett: Well, it wouldn't be much like BF; it'd have the tape and such, but not the imperative structure
01:25:16 <Taneb> I'm heading to bed now
01:25:21 <hppavilion[1]> Basically, you create a series of axioms- known strings and substitutions- then you apply the known axioms to known strings until you get a goal string
01:26:25 <hppavilion[1]> You can also do things like @<axiom/theorem/lemma> to apply an axiom/theorem/lemma as a fixpoint, which applies it to the string until it stops changing
01:27:16 <hppavilion[1]> And there's ?<thelemax>, which yields the set of the current string AND the current string when you apply thelemax
01:27:32 <hppavilion[1]> (thelemax is short for theorem/lemma/axiom, and is used a lot in the docs)
01:27:55 <hppavilion[1]> tswett: So you prove things by substituting using PCRE regexes on a known string, and you get new strings that represent your proof
01:28:29 <hppavilion[1]> tswett: Though future versions will support regex styles other than PCRE- e.g. Pure Kleene Regexes and standard regexes
01:29:44 <hppavilion[1]> tswett: Best of all, I even have a Thoof interpreter working, partially
01:30:14 <tswett> All right, I see what you're doing here.
01:30:21 <tswett> Do you know what a formal system is?
01:30:37 <oerjan> <hppavilion[1]> tswett: I think someone did that already <-- pikhq's bfm which was renamed to something else - pickle?
01:32:25 <hppavilion[1]> tswett: https://github.com/ZodiacWorkingGroup/Thoof
01:33:02 <hppavilion[1]> tswett: Note that y/// and ?<thelemax> don't yet work; I just added them today
01:33:11 <hppavilion[1]> (well, y/// might not have been today, but I think it was)
01:33:57 <hppavilion[1]> tswett: construct.thoof is the file with the working, tested code in it
01:34:33 <tswett> Now, Thue is already a language for specifying formal systems.
01:35:41 <tswett> Nah, lemme keep typing.
01:35:55 <tswett> You've taken Thue, extended it, and also built a system for specifying specific Thue derivations.
01:36:13 <tswett> So if you want to do the analogous thing for brainfuck, you'll build a system for specifying specific brainfuck derivations.
01:36:14 <hppavilion[1]> (One problem with IRC: None of the "x is typing" stuff fancy new chat things have)
01:36:27 <oerjan> <hppavilion[1]> (thelemax is short for theorem/lemma/axiom, and is used a lot in the docs) <-- i'm pretty sure that word belongs in the other #esoterics hth
01:36:27 <tswett> And that raises a question: what is a brainfuck derivation?
01:37:01 <hppavilion[1]> tswett: So "specific Thue derivations" means what exactly?
01:37:17 <tswett> Specific ways of following the rules with a given start string in order to end with a given end string.
01:37:18 <hppavilion[1]> tswett: Also, note that you have to call substitution rules manually; they aren't automated
01:37:30 <tswett> Right. The derivation is the sequence of calls.
01:37:48 <tswett> There are two "problems" with the idea of a brainfuck derivation.
01:37:56 <hppavilion[1]> You can still call them in Thue-like fashion, by putting the desired ruleset in a theorem and fixpointing it (@)
01:38:13 <tswett> One is that brainfuck, unlike Thue, is deterministic. Given a starting state and a program, there's only one way that you can proceed.
01:38:56 <hppavilion[1]> Unless you mean Thue is probabilistic, which is implementation-defined
01:39:55 <tswett> And the other "problem" is that brainfuck code works by taking a starting tape state (or tape segment state) and ending with another tape (segment) state.
01:40:26 <tswett> Now, resolving the first "problem" seems easy, I think. Just add more instructions, which are nondeterministic.
01:40:48 <hppavilion[1]> tswett: I can't tell what you mean by "deterministic" and "nondeterministic" here, based on what I assume they mean
01:40:56 <tswett> As for the second "problem"... I'll tell you what I can tell you and I'll let you run with it.
01:41:34 <tswett> "Deterministic" means "given the state for a time step, there is at most one possible state for the following time step".
01:42:18 <hppavilion[1]> tswett: I was thinking deterministic was non-probabilistic, but a search tells me probabilistic is a subset of nondeterministic
01:42:55 <tswett> Yeah. A nondeterministic system simply says something like "proceed to either A or B". A probabilistic system, on the other hand, says something like "proceed to A with probability 0.5, B otherwise".
01:42:59 <hppavilion[1]> tswett: So in this case, nondeterministic is like Algebra where you can rewrite in multiple different ways?
01:43:18 <tswett> Yeah, I'd say algebra is an example of a nondeterministic system.
01:44:01 <tswett> Thue and brainfuck both involve a concept which is ubiquitous in programming, and also elsewhere in mathematics. They both involve specifying ways of going from one state to another state.
01:44:19 <hppavilion[1]> tswett: So can you clarify the second problem? I don't quite get it
01:44:50 <tswett> In Thue, what the "states" are and what the "ways of going" are are pretty straightforward. The "states" are the various strings that you can have as... y'know, the program state.
01:44:55 <tswett> And the "ways of going" are the individual rules.
01:45:33 <tswett> In brainfuck, it's a little more subtle. The "states" are states of the tape... but are they states of the entire tape, or states of just pieces of the tape?
01:45:58 <tswett> The easiest answer is "they're states of the entire tape". And that's a totally valid answer.
01:46:07 <hppavilion[1]> So it's like how different code will use different areas of the tape?
01:46:19 <tswett> Something like that... probably.
01:46:45 <tswett> But the problem with "they're states of the entire tape" is that... well, it's that every single piece of code has to be seen as affecting the entire tape.
01:46:52 <tswett> Which might be a little inflexible.
01:47:00 <hppavilion[1]> tswett: I mean the fact that, without running code, you can't determine what cells will and will not be used
01:47:25 <hppavilion[1]> tswett: Perhaps I could do something with a 2-tape
01:47:35 <tswett> Lemme work with an example.
01:47:41 <tswett> Consider the following piece of brainfuck code: +
01:48:02 <hppavilion[1]> Where you have 8 cells that each rule can use, and at the end (and only at the end) of a rule, you transition to another group of 8 cells
01:48:13 <tswett> Here's what that code does, under the "states of the entire tape" choice:
01:48:54 <hppavilion[1]> That way, you can guarantee that the code will only use those 8 cells
01:48:56 <tswett> It takes a tape, and returns a tape where the active cell is the same cell as in the original tape, and all of the cells have the same value, except that the active cell contains a value equal to one plus its prior value.
01:49:06 <tswett> Here's what that code does, under the "states of just pieces of the tape" choice:
01:49:15 <hppavilion[1]> It's not just brainfuck that lets you do math, the idea is it's something novel that is vaguely inspired by brainfuck
01:49:20 <tswett> It takes a tape cell, and returns a cell containing a value equal to one plus the prior value.
01:49:38 <hppavilion[1]> tswett: Yes, I get it. I think that's what I said earlier
01:49:52 <tswett> The latter style is easier to talk about because it just doesn't mention the rest of the tape at all.
01:50:53 <tswett> So, here's how I think it's going to look.
01:50:54 <hppavilion[1]> With BF\IO, you pretty much can't determine what cells a fragment of code will modify (given the current active cell number and the fragment) short of running the code
01:51:10 <hppavilion[1]> And especially if the area of the tape has potentially been modified before
01:51:10 <HackEgo> [wiki] [[Dis]] https://esolangs.org/w/index.php?diff=46482&oldid=30820 * 94.12.170.129 * (-2) fixed the wayback link
01:51:13 <tswett> Axioms are pieces of extended-brainfuck code.
01:51:25 <tswett> Theorems have three pieces.
01:51:59 <tswett> First, the starting state of the tape segment. Second, the ending state of the tape segment. Third, a way of using axioms to get from the starting state to the ending state.
01:52:27 <tswett> And that's pretty much that.
01:52:56 <hppavilion[1]> Let me read back, I may have accidentally expunged crucial information from my short-term memory
01:53:12 <tswett> Now, there are two ways of taking theorems and getting new theorems. First, you can take a theorem with a given ending state, and another theorem whose starting state is the same, and string those two theorems together.
01:53:34 <hppavilion[1]> tswett: The "state" is the values on a tape fragment, correct?
01:53:39 <tswett> Second, you can take a theorem and add additional cells to the beginning and/or end of the starting and ending states.
01:53:56 <tswett> So if (0) -> (3) is a theorem, then (0,42) -> (3,42) is also a theorem.
01:54:29 <hppavilion[1]> tswett: So the start -> end part isn't stored, because of the large number of possible transitions?
01:54:59 -!- FreeFull has quit (Remote host closed the connection).
01:55:15 <tswett> Well, like I said, a theorem has those three pieces: starting state, ending state, and sequence of... steps. Storing the theorem means storing all three of those pieces.
01:56:09 <hppavilion[1]> tswett: So a theorem stores a relation between two values and a list of thelemax references?
01:56:32 <hppavilion[1]> Basically, a constrained in value and an equation that you run on that value to calculate the out value
01:57:06 <tswett> Right, except I don't think the word "equation" is the right word there.
01:57:29 <tswett> It'll be a program, or a sequence of programs, where you specify choices for all of the nondeterministic bits of the program.
01:57:32 <hppavilion[1]> tswett: That message just referred to the relation
01:58:00 <tswett> In that case, yeah, exactly.
01:58:13 <tswett> You're actually getting ahead of what I was saying—which is good.
01:58:37 <hppavilion[1]> tswett: Also, do you have any suggestions for things to make Thoof better (based on what you've heard), or any other languages that could be made into proof assistants after I do this?
01:58:39 <tswett> So far I'd only mentioned theorems with one specific in value and one specific out value. But it makes sense to extend that as much as you like.
01:58:52 <tswett> Thoof is the proof system inspired by Thue?
01:59:26 <tswett> Hmm. Not sure about Thoof, but let me think about other languages to make into proof assistants.
01:59:36 <tswett> If you're insane, try ///.
01:59:53 <tswett> Whose wiki page is, of course: http://esolangs.org/wiki////
02:00:18 -!- AlexR42 has joined.
02:00:24 <hppavilion[1]> tswett: Isn't that what I did? Or is /// self-modifying?
02:00:27 <tswett> Consider doing it for Unlambda.
02:00:32 <tswett> /// is self-modifying.
02:00:58 <tswett> Unlambda and /// are both deterministic. But, as always, it's easy to make a deterministic language non-deterministic: just add additional instructions.
02:01:22 <tswett> Or, here's how I'd suggest making /// nondeterministic.
02:01:46 <tswett> Currently, the specification says that when you're performing a substitution, you find the first instance of the pattern string and replace it with the replacement string.
02:01:46 <hppavilion[1]> Then again, unlambda practically already /is/ a proof assistant
02:02:05 <tswett> Here's the nondeterministic version: find *any* instance of the pattern string and replace it with the replacement string.
02:02:30 <hppavilion[1]> And let the mathgrammer choose which instance it is?
02:02:38 <tswett> So the program "/***/zebra/*****" could output "zebra**", "*zebra*", or "**zebra".
02:02:57 <tswett> In /// as it is, there's only one possible output: "zebra**".
02:03:01 <hppavilion[1]> tswett: Perhaps I should just put that in Thoof? For simplicity?
02:03:11 <hppavilion[1]> tswett: I mean, thoof isn't meant to be uber-minimal
02:03:47 <tswett> I assumed that you already had that as a feature, actually.
02:03:59 <hppavilion[1]> tswett: As it is, thoof just replaces the first instance of the regex with its substitution when it's called
02:04:31 <tswett> So what do you do if you want to replace a different instance instead?
02:04:48 <hppavilion[1]> tswett: You make sure the regexes and strings are set up so that you don't xD
02:04:55 <hppavilion[1]> tswett: But that's a good point that I didn't think of
02:05:15 <tswett> Yeah, I'd definitely put that in Thoof for simplicity.
02:05:33 <tswett> Unless, of course, you like the complications produced by not having that in Thoof.
02:06:07 <hppavilion[1]> thelemax{n} replaces the nth instance, thelemax{:n} replaces all up to the nth instance, thelemax{n:} replaces all starting with the nth instance, and thelemax{n} replaces the nth instance, thelemax{:n} replaces all up to the nth instance, thelemax{n:m} replaces all starting at n and ending at m?
02:07:45 <tswett> I think I like that. Also allow the user to specify multiple non-contiguous instances: {1,6,7,10000}
02:08:00 <tswett> Here's a question: how many instances of "***" are there in "******"?
02:08:04 <tswett> In my opinion, there are four.
02:08:38 <tswett> Likewise, three instances of "abba" in "abbabbabba".
02:08:43 <hppavilion[1]> tswett: The thing will go with overlapping matches, for generality
02:09:08 <tswett> If the user tries to replace two overlapping instances simultaneously, that's probably an error.
02:09:21 <hppavilion[1]> tswett: I thought of letting Thoof use a small unix-like filesystem to store data too xD
02:10:09 <tswett> Now, what happens if, in the string "abbabbabbabbabbabbabbabbabbabbabbabbabbabbabbabba", I use thelemax{3:5}, where my thelemax turns "abba" into "jonsi"?
02:10:17 <oerjan> replace what thou wilt shall be the whole of the instance
02:10:32 <tswett> Is that an error, since instances 3 and 4, and likewise 4 and 5, are overlapping?
02:11:27 <hppavilion[1]> tswett: The third and fourth instances of abba are replaced with jonsi. What else would happen?
02:11:56 <hppavilion[1]> tswett: Note that it terminates one instance early, like in Python
02:12:22 <tswett> You could say it's an error. You could also say that, going from left to right, it chooses all of the instances that don't overlap with a previously chosen instance.
02:12:35 <tswett> In which case you could have syntax for deciding whether you want to go from left to right, or from right to left.
02:12:56 <hppavilion[1]> tswett: negative numbers work from the right, like in Python
02:13:07 <hppavilion[1]> Because it makes sense and there's no reason not to
02:13:44 <hppavilion[1]> (There's no confusion because you can't use a variable or anything in {}, as the only variables are theorems/lemmas/axioms, which can't be numbers)
02:14:23 <tswett> I guess it could just be a matter of {3:5} versus {5:3}.
02:14:35 <hppavilion[1]> Perhaps [] should be non-overlapping, while- oh, yeah, good point
02:22:08 <boily> . o O ( banananananananana... )
02:22:29 <hppavilion[1]> boily: I once wrote a program with the express purpose of doing that
02:27:31 <boily> Mr. Hppavilion[1]'s Patented Banana Proliferaton Programme, Enhanced With the Purest of Potassiums. Guaranteed to Cure your Personal Ailments!
02:28:05 -!- andrew_ has joined.
02:28:35 <oerjan> surely that should be Dr. Hppavilion[1]
02:28:53 <boily> hppavilion[1]: are you a doctor? are you even a mister?
02:29:10 <oerjan> he does look misterious
02:29:18 * boily lightly prods hppavilion[1] with his mapole, just to make sure
02:30:58 <boily> that pun registered at least 0.8 shachafs.
02:36:47 <boily> I think hppavilion[1]'s secret is now uncovered. he isn't human, or at least appröximatively human.
02:37:25 -!- boily has quit (Quit: CYCLOPEAN CHICKEN).
02:48:07 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
02:50:38 -!- andrew_ has quit (Ping timeout: 248 seconds).
03:00:36 -!- bender|_ has joined.
03:04:07 -!- andrew_ has joined.
03:14:01 -!- hppavilion[1] has joined.
03:17:45 <HackEgo> [U+1E27 LATIN SMALL LETTER H WITH DIAERESIS]
03:18:55 -!- AlexR42 has quit (Ping timeout: 252 seconds).
03:23:58 -!- FreeFull has joined.
03:47:52 -!- augur has quit (Remote host closed the connection).
04:08:00 -!- oerjan has quit (Quit: leaving).
04:41:38 -!- augur has joined.
04:49:24 -!- bender|_ has changed nick to bender.
04:49:33 -!- bender has quit (Changing host).
04:49:33 -!- bender has joined.
04:50:44 <bender> It's been a long time since I did esoteric stuff
04:51:13 <HackEgo> bender: Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
04:56:49 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
04:58:40 <zzo38> Which one did you do in past (if any)?
04:59:36 <shachaf> Do you have any tricks for linear logic?
05:04:40 <zzo38> I would want to add into JavaScript a goto command which can implement a kind of "evasive exception", for example: function test() { again: xyzzy(()=>{goto again;}); return 1; } It cannot be caught by "catch" blocks, but "finally" can still partially catch it. What is your opinion of this?
05:05:31 <zzo38> (Of course it won't work if the that function that does goto again is called after test function returns; it such case it is error and is caught by a catch block.)
05:05:54 <shachaf> Why not make it work the second time, so you get a continuation thing?
05:07:28 <zzo38> I think JavaScript does not use continuations? But if it can be made to do so, then it might. However, then there is the case if a different part of the program does not want it to work a second time.
05:09:27 <zzo38> For generator functions it is a bit more easily though
05:12:44 <zzo38> (Jumping into any block is also going to be error, but depending how it is written it may be a syntax error which is seen before the program is executed.)
05:15:13 <zzo38> Anyways, "return" means the function is finished and is not allowed to continue, isn't it?
05:18:33 <zzo38> Note that in the example given, the "again" is local to the instance of the function call, as if it was "var x" and it passed a function that mentions "x", it is the "x" of this function call, too (but that is a variable and doesn't need the function to continue after it returns in order to use that variable)
05:19:28 <zzo38> If you would write "goto again;" outside of the function definition then the label called "again" is not in scope so it is an error.
05:19:36 -!- impomatic has quit (Ping timeout: 246 seconds).
05:20:39 <zzo38> Having "goto" would also make it easier for a JavaScript program to compile other stuff into a JavaScript program (such as with "new Function").
05:21:34 -!- impomatic_ has quit (Ping timeout: 248 seconds).
05:22:09 <zzo38> How else would you do it? One idea would be to first convert the other code into basic blocks, but and then what?
05:25:37 -!- augur has quit (Remote host closed the connection).
05:30:42 -!- augur has joined.
05:35:31 -!- hppavilion[1] has joined.
05:37:11 <shachaf> oerjan: whoa whoa whoa, the whole !A -o B and !A -o ?B thing makes perfect sense
05:37:23 <shachaf> and also presumably A -o ?B for dual intuitionistic logic
05:38:12 <hppavilion[1]> I want to start implementing software in abstract machines...
05:45:53 <zzo38> What kind of abstract machines?
05:49:08 -!- andrew__ has joined.
05:52:09 -!- andrew_ has quit (Ping timeout: 246 seconds).
05:58:31 <hppavilion[1]> Perhaps a programming language for constructing pseudo-operating systems where various components are first-class objects?
06:12:34 -!- pdxleif has joined.
06:20:19 -!- MoALTz has joined.
06:21:39 <hppavilion[1]> tswett: You're still online. Is this because you never log off but are currently sleeping, or are you actually on?
06:34:31 -!- AnotherTest has joined.
06:34:50 <hppavilion[1]> Ugh, with my current setup it'll be a huge pain in the ass to properly make Thoof work
06:41:45 -!- AnotherTest has quit (Ping timeout: 276 seconds).
06:50:50 -!- augur has quit (Remote host closed the connection).
06:53:33 <b_jonas> Taneb: do you properly do unicode CNF normalization on the string before you get the glyphs from the font?
06:55:44 -!- heroux has quit (Ping timeout: 260 seconds).
06:57:50 -!- heroux has joined.
06:58:54 -!- lambda-11235 has quit (Quit: Bye).
07:05:59 <b_jonas> zzo38: re evasive exceptions: perl has exactly that. there are some compications if you want to exit through xs functions (depending on how exactly they call back to perl), sort blocks, regex code blocks, and other strange constructs. You may be able to leave with an exception, a goto, both, or neither, depending on the construct and the version of perl.
07:06:49 <b_jonas> zzo38: ruby also sort of has something like this, in that there are more things than exceptions that you can throw, and a catch catches only exceptions, but I'm not sure there's a finally construct that catches all the others. There's no full-powered goto though.
07:10:26 <b_jonas> zzo38: specifically, things you can throw are exceptions, four loop control statements which act on the function that got passed the lexically curretn ruby-like yield callback block as a yield argument (break (=perl's last), next, redo, retry (jumps to before the function call)), function return, plus internal fatal error thingies like out of memory that you can't catch.
07:11:15 -!- lynn has joined.
07:13:05 <b_jonas> zzo38: there's also a callcc, which is nastier. I think it makes a copy of the C stack or something. I think it still tries to run some finalize blocks, but I'm not sure if there's a corresponding scheme-like on-enter block too.
07:13:20 <b_jonas> For search, finally is called ensure in ruby.
07:14:07 <b_jonas> Ruby's non-exact gc (at least in ruby 1.8, I don't know if they replaced it) helps this sort of thing of course.
07:40:23 <prooftechnique> b_jonas: Taneb mentioned your font, and I was curious to see it
07:44:49 -!- earendel has quit (Ping timeout: 248 seconds).
07:44:49 -!- staffehn has quit (Ping timeout: 248 seconds).
07:45:43 -!- staffehn has joined.
07:47:21 -!- tromp has quit (Remote host closed the connection).
07:51:46 -!- earendel has joined.
07:54:01 -!- bender has quit (Ping timeout: 250 seconds).
07:54:28 -!- mroman has joined.
08:10:13 -!- bender has joined.
08:10:23 -!- bender has quit (Changing host).
08:10:23 -!- bender has joined.
08:11:07 -!- lynn has quit (Read error: Connection reset by peer).
08:15:36 <hppavilion[1]> prooftechnique: Do you do a lot of stuff with Proof Assistants? Your name implies you might
08:16:42 <prooftechnique> prooftechnique: I wouldn't say a lot. I do like to play with them, though.
08:17:18 <prooftechnique> I actually work at a design firm, right now, so the use case for proof assistants rarely comes up. :|
08:31:31 <prooftechnique> Though if GSS were a little more ready, I could conceivably make use of a constraint solver :D
08:33:56 <hppavilion[1]> Sorry, you didn't ping me so I missed the messages xD
08:45:08 <Taneb> b_jonas, hell no, I just take the first 256 glyphs in the font and hope they're in the right order
08:46:16 <hppavilion[1]> prooftechnique: I'm looking for something novel to prove with, I was just seeing if you could help xD
08:47:49 -!- tromp has joined.
08:52:34 <prooftechnique> hppavilion[1]: I'm still kind of fascinated by Lemuridae, to be honest.
08:53:03 -!- tromp has quit (Ping timeout: 276 seconds).
08:56:04 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
09:16:27 -!- FreeFull has quit (Ping timeout: 276 seconds).
09:46:49 -!- AnotherTest has joined.
09:59:20 -!- jaboja64 has joined.
10:15:11 -!- hppavilion[1] has joined.
10:22:58 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
10:41:46 -!- primo has joined.
10:48:33 -!- tromp has joined.
10:52:51 -!- tromp has quit (Ping timeout: 248 seconds).
10:57:35 -!- lynn has joined.
11:25:07 -!- J_Arcane has quit (Ping timeout: 252 seconds).
11:25:23 -!- boily has joined.
11:39:33 <boily> question of the day: if I don't have any massages, did shachaf write anything?
11:44:31 -!- primo has left ("Leaving").
11:49:21 -!- tromp has joined.
11:53:43 -!- tromp has quit (Ping timeout: 252 seconds).
11:54:41 -!- mtve has joined.
11:56:41 -!- bender has quit (Ping timeout: 250 seconds).
11:59:01 -!- ais523 has joined.
12:02:50 -!- jaboja has joined.
12:05:18 -!- jaboja64 has quit (Ping timeout: 248 seconds).
12:14:14 -!- jaboja has quit (Ping timeout: 260 seconds).
12:22:01 -!- boily has quit (Quit: PACKET CHICKEN).
12:28:31 -!- bender has joined.
12:46:28 -!- jaboja has joined.
12:47:26 -!- andrew__ has quit (Remote host closed the connection).
12:51:28 -!- AnotherTest has quit (Ping timeout: 252 seconds).
13:02:46 -!- ais523 has quit (Ping timeout: 244 seconds).
13:19:37 -!- bender has quit (Ping timeout: 240 seconds).
13:20:32 -!- bender has joined.
13:45:13 -!- tromp has joined.
13:57:22 -!- tromp has quit (Remote host closed the connection).
14:00:05 <HackEgo> [wiki] [[Special:Log/newusers]] create * RaHorakhti * New user account
14:10:47 -!- p34k has joined.
14:13:53 -!- FreeFull has joined.
14:17:41 -!- jaboja has quit (Ping timeout: 244 seconds).
14:35:05 <Taneb> I think that brainfuck program I shared in the early hours of this morning may be one of the longest ones in existence
14:49:15 -!- `^_^v has joined.
14:56:05 -!- bender has quit (Ping timeout: 250 seconds).
14:57:51 -!- tromp has joined.
15:02:22 -!- tromp has quit (Ping timeout: 252 seconds).
15:03:31 -!- oerjan has joined.
15:13:42 -!- MaskedFox has joined.
15:21:07 -!- spiette has joined.
15:27:00 -!- MaskedFox has quit (Ping timeout: 252 seconds).
15:27:06 <lifthrasiir> Taneb: https://arin.ga/FQLSPy/ ? it is just over 200K, which is not really the biggest
15:28:03 <oerjan> <shachaf> oerjan: whoa whoa whoa, the whole !A -o B and !A -o ?B thing makes perfect sense <-- i fear that we have lost shachaf
15:28:27 <HackEgo> [wiki] [[Q]] N https://esolangs.org/w/index.php?oldid=46483 * RaHorakhti * (+2813) Created page with "The Qabalah language ('''Q''') is not only an esoteric programming language, but it is also an [[Category:Occult languages|occult programming language]]. The first version of..."
15:29:19 <izabera> oooh, an esoteric esoteric programming language
15:30:34 <izabera> ...which only looks esoteric, not esoteric esoteric
15:31:34 <HackEgo> [wiki] [[Q]] https://esolangs.org/w/index.php?diff=46484&oldid=46483 * RaHorakhti * (+1)
15:32:26 <izabera> like, esoteric in both senses
15:33:07 <HackEgo> [wiki] [[Category:Occult languages]] N https://esolangs.org/w/index.php?oldid=46485 * RaHorakhti * (+83) Created page with "Occult languages are esoteric languages that also has an occult focus of some kind."
15:33:51 -!- idris-bot has joined.
15:34:52 <HackEgo> [wiki] [[Special:Log/delete]] delete * Oerjan * deleted "[[Category:Occult languages]]": Creating category without discussion against [[Esolang:Policy]]
15:35:02 <oerjan> the foot, it came down hth
15:35:39 <HackEgo> [wiki] [[Language list]] https://esolangs.org/w/index.php?diff=46486&oldid=46472 * RaHorakhti * (+8)
15:42:00 <HackEgo> [wiki] [[Q]] https://esolangs.org/w/index.php?diff=46487&oldid=46484 * RaHorakhti * (-1)
15:44:59 <tswett> @tell hppavilion[1] I never log off (if I can help it).
15:45:42 <HackEgo> [wiki] [[User:RaHorakhti]] N https://esolangs.org/w/index.php?oldid=46488 * RaHorakhti * (+135) Created page with "My name is Per Löwgren, you can find some of my work at [https://bitbucket.org/perlowgren BitBucket]. I've created the language [[Q]]."
15:46:27 -!- earendel has quit (Ping timeout: 246 seconds).
15:50:57 -!- lambda-11235 has joined.
16:06:54 -!- mroman has quit (Quit: Lost terminal).
16:07:16 -!- spiette_ has joined.
16:07:55 -!- p34k has quit.
16:08:03 <HackEgo> [wiki] [[Q]] https://esolangs.org/w/index.php?diff=46489&oldid=46487 * RaHorakhti * (-62)
16:08:04 -!- spiette has quit (Disconnected by services).
16:08:12 -!- spiette_ has changed nick to spiette.
16:11:55 -!- p34k has joined.
16:12:50 -!- haavardp has joined.
16:14:06 -!- shikhin_ has joined.
16:14:28 -!- sewilton_ has joined.
16:15:32 -!- sewilton has quit (Ping timeout: 264 seconds).
16:15:33 -!- lambdabot has quit (Read error: Connection reset by peer).
16:15:33 -!- zgrep has quit (Ping timeout: 264 seconds).
16:15:34 -!- shikhin has quit (Read error: Connection reset by peer).
16:15:34 -!- Elronnd has quit (Ping timeout: 264 seconds).
16:15:34 -!- haavard has quit (Ping timeout: 264 seconds).
16:15:34 -!- zgrep has joined.
16:15:43 -!- zgrep has quit (Changing host).
16:15:43 -!- zgrep has joined.
16:17:19 -!- sewilton_ has changed nick to sewilton.
16:17:54 -!- Elronnd has joined.
16:18:40 -!- lambdabot has joined.
16:33:33 <HackEgo> [wiki] [[Esolang:Policy]] https://esolangs.org/w/index.php?diff=46490&oldid=43620 * Oerjan * (+8) Make it clearer this points to where discussions should happen
16:34:34 -!- augur has joined.
16:47:30 -!- oerjan has quit (Quit: Later).
16:55:25 -!- augur has quit (Remote host closed the connection).
16:56:00 -!- augur has joined.
16:57:40 -!- augur has quit (Read error: Connection reset by peer).
16:58:01 -!- tromp has joined.
16:58:15 -!- augur has joined.
16:58:25 -!- augur has quit (Remote host closed the connection).
17:02:24 -!- tromp has quit (Ping timeout: 246 seconds).
17:25:50 -!- AnotherTest has joined.
17:29:00 -!- Sprocklem has quit (Ping timeout: 246 seconds).
17:40:45 -!- Opodeldoc has quit (Ping timeout: 250 seconds).
17:43:34 -!- jaboja has joined.
18:02:36 -!- hppavilion[1] has joined.
18:11:04 -!- earendel has joined.
18:20:55 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
18:22:47 -!- spiette has quit (Ping timeout: 250 seconds).
18:23:25 -!- spiette has joined.
18:24:11 -!- Opodeldoc has joined.
18:50:34 -!- zadock has joined.
19:05:26 -!- hppavilion[1] has joined.
19:10:30 <lambdabot> tswett said 3h 25m 30s ago: I never log off (if I can help it).
19:12:56 -!- augur has joined.
19:18:40 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
19:30:31 -!- hppavilion[1] has joined.
19:33:44 <hppavilion[1]> Are there any x/// expressions other than s and y?
19:37:51 -!- augur has quit (Ping timeout: 276 seconds).
19:38:49 -!- augur has joined.
19:41:18 -!- Sprocklem has joined.
20:04:19 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
20:11:28 -!- Nithogg has joined.
20:11:33 -!- shikhin_ has changed nick to shikhin.
20:11:59 -!- jaboja has quit (Ping timeout: 250 seconds).
20:16:04 -!- jaboja has joined.
20:20:21 -!- Sprocklem has quit (Ping timeout: 244 seconds).
20:22:27 -!- jaboja has quit (Ping timeout: 248 seconds).
20:27:06 <prooftechnique> Did anyone else just have the whole ban list dumped to channel?
20:30:22 -!- lambda-11235 has quit (Quit: Bye).
20:30:56 <coppro> prooftechnique: you probably sent /mode #esoteric +b
20:32:00 <prooftechnique> My whole status buffer was full of /who lists at that time, too
20:35:11 -!- jaboja has joined.
20:36:39 -!- hppavilion[1] has joined.
20:39:29 -!- jaboja has quit (Ping timeout: 244 seconds).
20:39:58 <zzo38> Now what else I should need to add into my JavaScript Xlib?
20:40:54 <zzo38> Would it need a command to draw a stack of pictures?
20:41:00 <zzo38> Yes Xlib for X window system
20:41:11 <int-e> Meh I HATE pulseaudio.
20:41:22 <hppavilion[1]> zzo38: Is this on the desktop for JS, or is it an emulator that runs in-browser?
20:41:37 <zzo38> It is a JavaScript program to access Xlib (and also the C program)
20:41:42 <zzo38> hppavilion[1]: It is for use with Node.js
20:42:45 <zzo38> There is a function X.Drawable.prototype.drawPicture but I would mean, a command to draw multiple pictures in the same place all at once (if it doesn't have it you can still just use drawPicture multiple times, but as a single command might be more efficient?)
20:43:01 <int-e> Just wasted 3 hours of my life on figuring out a) that I need it b) how to start it (it was stumbling over a leftover socket file in /var/run... but of course I got a descriptive error message: bind(): socket already in use) and c) why I need it... to play videos with sound in Firefox.
20:43:51 <int-e> (the answer to c) is that the HTML5 stuff uses libpulse to play audio, which will only talk to a pulseaudio server)
20:44:17 <int-e> (but apparently isn't smart enough to start one when none is running)
20:44:52 <zzo38> I do not really like pulseaudio either, although it is already set up in my computer anyways so I do not need to do anything.
20:45:15 <int-e> to me it's cruft that solves a non-problem
20:45:26 <int-e> (playing sound from different sources simultaneously)
20:45:42 <zzo38> Other commands I would be planning to add are X.Drawable.prototype.pushGC, X.Drawable.prototype.popGC, and X.Drawable.prototype.drawMacro
20:56:13 <b_jonas> ARGH! In HTML webpages, why don't people use images with alt text versus images with empty alt text versus background images the semantically right way?
20:58:40 <HackEgo> irc/IRC is short for "Internet Relay Chat". It is named so because all the servers are constructed from relays.
20:58:40 <HackEgo> btw/btw is short for "bury the weasel"
20:58:41 <HackEgo> cpressey/cpressey invented the esolang, the pipe cleaner and the electrical mousse.
20:59:13 <int-e> would mousse be a sharp rodent?
21:02:40 <int-e> And ratatouille could be a stuttering rodent.
21:07:57 -!- augur has quit (Remote host closed the connection).
21:09:12 <zzo38> They say dash (in Magic: the Gathering) can only go on creatures, but it is untrue; cards could be made that are not creatures and have dash (as long as it is not an instant, sorcery, or land). The haste is mostly meaningless in such case but still has it and in some cases can be used.
21:11:56 <zzo38> (The same is true of megamorph, although the +1/+1 counter in such case would ordinarily do nothing, when combined with undying, graft, and/or modular, it can do such thing even though it is not a creature.)
21:13:57 <zzo38> Exploit also does not have to go only on creatures
21:15:37 <shachaf> zzo38: Is that also true of super haste?
21:18:28 <zzo38> I suppose so, although it is irrelevant since super haste is not a standard rule for the normal game and is only for Un-cards.
21:19:44 <shachaf> If a card isn't a creature can you still put it on the battlefield with super haste?
21:20:48 <zzo38> There is no such rule as super haste.
21:22:23 <shachaf> http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=74324 has it.
21:22:41 <shachaf> Do you refuse to play with Un-cards?
21:24:49 <zzo38> Not necessarily, although people would need to agree a different kind of game, sometimes it is necessary to argue about the rules, etc.
21:25:26 <shachaf> Necessary to argue about the rules?
21:25:38 <shachaf> That makes it completely different from a regular Magic: The Gathering game.
21:25:43 <zzo38> Consider a card such as: {3} Artifact ;; Undying ;; Megamorph {1} ;; {T}, Sacrifice ~: Target player gains 2 life.
21:25:59 <zzo38> But I said "sometimes"!
21:28:58 -!- zadock has quit (Quit: Leaving).
21:29:09 <zzo38> For example, my own ideas about how R&D's Secret Lair is working is different than what other people say (and they are also different from each other), but there is no rule to make such an effect work, so you have to argue about it.
21:30:58 <zzo38> (My own opinion that the old Lightning Bolt with R&D's Secret Lair allows you to target any player, object, or zone; if the object is not a permanent, or is a permanent that isn't a creature or planeswalker, or is a zone other than the battlefield, nothing happens; if the target is the battlefield, each non-token creature and non-token planeswalker (including ones with shroud/hexproof, but not if it has protection from red) takes 3 points of damag
21:33:58 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
21:34:43 -!- Sprocklem has joined.
21:35:34 -!- zzo38 has quit (Remote host closed the connection).
21:36:06 -!- hppavilion[1] has joined.
21:42:39 <int-e> *reads about the ending phase* ... could there be an infinite loop of cleanup steps...
21:44:40 -!- J_Arcane has joined.
21:47:50 -!- ais523 has joined.
21:58:36 -!- AnotherTest has quit (Quit: ZNC - http://znc.in).
22:16:16 -!- `^_^v has quit (Quit: This computer has gone to sleep).
22:20:44 -!- spiette has quit (Ping timeout: 244 seconds).
22:25:48 -!- jaboja has joined.
22:26:19 -!- Sprocklem has quit (Quit: [).
22:30:27 -!- jaboja has quit (Ping timeout: 248 seconds).
22:36:55 -!- spiette has joined.
22:45:42 -!- Opodeldoc has quit (Quit: Leaving).
22:53:03 -!- oerjan has joined.
22:59:36 -!- spiette has quit (Quit: :qa!).
23:00:19 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
23:02:42 -!- lambda-11235 has joined.
23:08:32 <oerjan> <int-e> would mousse be a sharp rodent? <-- i'm not quite sure where you get "sharp" twh
23:09:50 -!- boily has joined.
23:10:21 <int-e> I guess you got it, but anyway: a mousssse would be super extra sharp.
23:10:43 <boily> int-ello. sharp mousse?
23:12:40 <oerjan> `learn A mousse is a sharp rodent. "A mousse once bit my sister."
23:12:49 <boily> I logsschecked. I still don't grok it.
23:12:49 <HackEgo> Learned 'mousse': A mousse is a sharp rodent. "A mousse once bit my sister."
23:12:56 <oerjan> i hope the quote is accurate twh
23:13:05 <boily> hellørjan. you seem to be having understood it.
23:13:24 <int-e> it's a pun on ß, often written "ss".
23:14:05 <oerjan> it's really just an s with a scarf
23:14:23 <int-e> I'll readily admit that it wasn't very inspired
23:14:34 * boily lightly thwacks int-e
23:14:59 <int-e> `learn ß is not a beta.
23:15:02 <HackEgo> Learned 'ß': ß is not a beta.
23:16:16 <oerjan> `learn_append ß It's a "scharfes S", aka s with a scarf.
23:16:21 <HackEgo> Learned 'ß': ß is not a beta. It's a "scharfes S", aka s with a scarf.
23:16:49 <zgrep> Err... with a scharf.
23:17:14 <oerjan> int-e: also, i didn't actually get it, i just got a different idea.
23:17:16 <int-e> Would omegpsi be a co-alphabet?
23:17:58 <int-e> shachaf: thanks, always a pleasure to drag people down to my level
23:18:10 <oerjan> zgrep: no, we have to consider the sk -> sch sound change in german hth
23:19:17 <boily> int-e: what's an omegpsi?
23:19:26 <zgrep> I do not Deutsch sprechen.
23:20:15 <int-e> boily: just musing about the etymology of "alphabet"
23:20:32 <int-e> boily: I mean I don't even know what a co-alphabet would be.
23:21:12 <oerjan> shachaf: it may be a little older than the borrowing of that medical term hth
23:21:34 <boily> int-e: oh. makes sense. tdh
23:22:11 <boily> moi neither, je speake not le Deutsch.
23:22:17 <boily> shachaf: hellochaf.
23:22:30 <shachaf> eye of newt and toe of frog / wing of bat and pooch of dog
23:22:36 <shachaf> eye of newt and toe of frog / wool of bat and pooch of dog
23:23:01 <oerjan> `learn A ratatouille is a stuttering rodent.
23:23:05 <HackEgo> Learned 'ratatouille': A ratatouille is a stuttering rodent.
23:23:34 <oerjan> int-e: you can add your own wisdom you know hth
23:24:04 <shachaf> In the game Lost Vikings 2, you collect a wing of bat to give to the witch to bring you home.
23:24:32 <HackEgo> TIL that TIL means Today I Learned
23:24:35 <boily> wait. you give a wing to bring back a bat???
23:25:01 <boily> til is also the most confusingest Norwegian word.
23:25:24 <oerjan> it's cognate to german "Ziel", which means goal, iirc
23:25:43 <oerjan> but somehow it got press ganged into a preposition.
23:26:17 <shachaf> `translatefromto en no wisdom/til | sponge wisdom/til
23:26:23 <shachaf> that doesn't even make sense
23:26:31 <oerjan> (for a while it thus governed the genitive case, while our prepositions still did that sort of thing.)
23:26:55 <oerjan> and a few stock phrases still do that. "til sjøs" = at sea
23:27:24 <oerjan> it can mean both, i think.
23:29:13 <oerjan> i may be confusing it with "til lands og til vanns" (a stock phrased used about a magical boat in a fairy tale that could sail on the ground or on the water, or even fly)
23:29:44 <HackEgo> shachaf sprø som selleri and cosplays Nepeta Leijon on weekends. He hates bell peppers with a passion.
23:30:08 <oerjan> oh and "til fots", by foot
23:30:28 <shachaf> oerjan: have you considered that english is simpler than norwegian
23:30:29 <boily> shachaf: your wisdom lacks pooches hth
23:30:46 <shachaf> boily; then it reflects me
23:33:00 <oerjan> <boily> «tille cheusse». <-- that's pretty accurate pronunciationwise, i think
23:33:44 -!- Lord_of_Life has quit (Excess Flood).
23:33:52 <oerjan> shachaf: i think that's debatable.
23:34:32 <oerjan> the spelling isn't quite as insane as english, anyway
23:34:49 <oerjan> although still not exactly a bijection
23:35:24 <oerjan> the genders don't help, i guess. otoh we have less verb inflection.
23:35:37 -!- Lord_of_Life has joined.
23:36:10 <oerjan> (no pesky progressive, and no person/number suffixes)
23:36:29 <nzt-fish> oh my god, your language suck so hard!
23:36:52 <HackEgo> nzt-fish: Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
23:37:15 <nzt-fish> oerjan: I'm homosexual. Is that okay?
23:37:28 <oerjan> nzt-fish: you seem confused. and yes, that's okay.
23:37:45 <nzt-fish> I suck a lot of dicks. If you ban me, you're a homophobe
23:38:03 <int-e> but trolling is not okay.
23:38:27 <shachaf> oerjan: What about when you do it?
23:38:41 <oerjan> shachaf: i mean boring trolling of course, duh
23:40:13 -!- hppavilion[1] has joined.
23:40:58 <lambdabot> LOWI 022320Z AUTO VRB02KT 9999 FEW007 BKN010 02/01 Q1003
23:41:11 <shachaf> @@ @@ (@where weather) LOWI
23:41:12 <lambdabot> LOWI 022320Z AUTO VRB02KT 9999 FEW007 BKN010 02/01 Q1003
23:41:27 <oerjan> `learn_append shachaf The unit of bad punnery is named after him.
23:41:31 <HackEgo> Learned 'shachaf': shachaf sprø som selleri and cosplays Nepeta Leijon on weekends. He hates bell peppers with a passion. The unit of bad punnery is named after him.
23:41:46 <shachaf> oerjan: Is there a wisdom entry for the unit of bad punnery?
23:42:02 <shachaf> oerjan: Hey, you never made the temperature thing for lambdabot work.
23:42:17 -!- Phantom_Hoover has joined.
23:42:22 <oerjan> shachaf: well given that the unit is named "shachaf"...
23:42:51 <shachaf> Oh, I thought it was "shachafs".
23:43:28 <shachaf> `` cd wisdom; for f in *; do [ -e "$f"s ] && echo "$f"; done
23:43:29 <HackEgo> log \ math \ monad \ monoid \ the u
23:43:34 <HackEgo> I think you might mean !logs
23:43:37 <HackEgo> I think you might mean !logs
23:43:44 <HackEgo> Maths stands for Mathematical Anti-Telharsic Harfatum Septomin.
23:43:50 <HackEgo> Monads are just monoids in the category of endofunctors.
23:43:54 <HackEgo> Monads are just free monad monad monad algebras.
23:44:00 <HackEgo> The U are a very mad people.
23:44:03 <HackEgo> The US is the country opposed to the THEM.
23:44:22 <int-e> that's way too accurate
23:44:31 <boily> oerjan: it's shachafs hth
23:44:37 <oerjan> shachaf: well it would 1 shachaf, anyway.
23:44:55 <shachaf> oerjan: no, it's like flops
23:45:05 <oerjan> boily: that doesn't sound like a proper SI unit
23:45:12 <oerjan> you don't pluralize those
23:45:16 <boily> shachaf isn't very standard hth
23:45:44 <oerjan> or wait, maybe english does
23:45:56 <oerjan> is it 2.3 newton or newtons
23:45:58 <int-e> `le/rn schaf/"Schaf" is german for "sheep". There is absolutely no relation to shachaf.
23:46:13 <shachaf> int-e: why didn't you use `learn tdnh hth
23:46:22 <int-e> shachaf: because of the quotes
23:47:02 <int-e> `learn " is a double quote, added to wisdom as a test.
23:47:08 <HackEgo> Learned '"': " is a double quote, added to wisdom as a test.
23:47:13 <shachaf> Oh, I thought `learn handled those.
23:47:20 <HackEgo> rm: cannot remove `/home/hackbot/hackbot.hg/multibot_cmds/env/.hg/store/data/canary.orig': Is a directory \ Done.
23:47:27 <shachaf> oerjan: See, that's why no one trusts `learn.
23:47:50 <hppavilion[1]> In the category of numbers, what are the morphisms? Does such a category even make sense (I have a feeling it might not)?
23:48:27 <shachaf> There are lots of categories where the objects are numbers, but you don't specify a category by specifying the objects.
23:48:31 <oerjan> int-e: you cannot use `revert to remove files hth
23:48:37 <shachaf> There are also categories where the arrows are numbers.
23:48:45 <boily> numbers are scalars, AKA 1×1 matrices, so you're in the Mat category.
23:48:57 <shachaf> But you need to talk about which one you're talking about.
23:49:02 <HackEgo> " is a double quote, added to wisdom as a test.
23:49:16 <hppavilion[1]> shachaf: What are some examples of common morphisms in categories with numbers as the elements?
23:49:25 <shachaf> hppavilion[1]: That's up to you.
23:49:31 <boily> nzt-fish: it's up to you to guess who's a chanop.
23:49:36 <hppavilion[1]> And while we're at it, what about where the arrows are numbers
23:49:38 <oerjan> int-e: it's particularly insidious in that it seems to work until the next repository change (iiuc)
23:49:38 <shachaf> hppavilion[1]: I'll give you three examples and then you go figure them out and tell me things about them.
23:49:53 <shachaf> All of these categories have natural numbers as objects.
23:49:55 <hppavilion[1]> nzt-fish: We have ops, but they have to make ChanServ op themselves to be ops
23:50:03 <oerjan> i'm a chanop and so is my wife
23:50:09 <oerjan> or wait, was that spartacus
23:50:13 <shachaf> A: There's an arrow between X and Y iff X <= Y
23:50:28 * nzt-fish pulls out his huge donger and dicks every single one of you, you and you and you.
23:50:31 <shachaf> B: An arrow between N and M is an NxM matrix. Composition is matrix multiplcation.
23:50:45 <int-e> nzt-fish: surely you can be more creative than that
23:50:50 <boily> oerjan: can I be op momentarily and mapole the fish into oblivion? pretty please?
23:50:57 <oerjan> <shachaf> oerjan: See, that's why no one trusts `learn. <-- well i added documentation.
23:50:58 <shachaf> C: An arrow : N -> M is an M-tuple of numbers smaller than N. Composition is pointwise indexing.
23:51:01 <nzt-fish> int-e: yes, but it's enough to get banned. now where are the ops
23:51:07 <HackEgo> /hackenv/bin/learn: line 3: wisdom/: Is a directory \ Learned '':
23:51:16 <boily> shachaf: heh, nice one :D
23:51:50 <boily> did you just `learn the empty file with an empty name?
23:51:53 <shachaf> hppavilion[1]: Now go figure out what those categories are and tell oerjan when you're done.
23:51:56 <boily> or am I grossly mistaken...
23:51:59 <shachaf> I was trying to see oerjan's documentation.
23:52:38 <int-e> I guess it checks that.
23:53:09 * boily rolls a d20 for a charm/diplomacy check against oerjan
23:54:36 <int-e> so what would a critical charm/diplomacy failure look like...
23:54:43 <boily> int-e fumbles, grips hppavilion[1] by the arm and they both tumble down a sudden cliff that materialized out of nowhere
23:55:00 <int-e> a, straight to hell? convenient...
23:55:17 <shachaf> hppavilion[1]: Let's say reals.
23:55:37 <int-e> boily: personally I was thinking of bursting mirrors
23:55:42 -!- ChanServ has set channel mode: +o boily.
23:55:57 <oerjan> got to respect the dice
23:56:37 <int-e> damn, that contextual match is still there?
23:56:42 -!- boily has set channel mode: +b *!~nzt@unaffiliated/nzt.
23:56:44 -!- boily has kicked nzt-fish *THWACK* too doo doo doo doo doooo ♪ IT'S A HOMERUN!.
23:56:50 -!- boily has set channel mode: -o boily.
23:57:51 <shachaf> hppavilion[1]: The real point of this exercise is to realize that the objects of a category are pretty irrelevant.
23:58:32 <shachaf> That third category is a very obscure one you've probably never heard of.
23:58:38 <int-e> so you can have completely pointless categories and the theory will still work just as well as before
23:58:52 <shachaf> It has the property that products are products and sums are sums.
23:59:08 <shachaf> You can probably figure out some more properties.
23:59:13 <HackEgo> `learn creates a wisdom entry and tries to guess which word is the key. Syntax (case insensitive): `learn [a|an|the] <keyword>[s][punctuation] [...]
00:00:08 <hppavilion[1]> shachaf: I can't find what pointwise indexing means
00:00:27 <int-e> I'm confused by the [punctuation]
00:01:06 <int-e> and [] is somewhat overloaded.
00:01:32 <int-e> `learn Nits are there to be picked.
00:01:35 <HackEgo> Learned 'nit': Nits are there to be picked.
00:02:35 -!- p34k has quit.
00:03:37 <boily> nits are louse eggs hth
00:03:39 <oerjan> int-e: um it means it's optional?
00:04:34 <oerjan> well, technically that's also optional hth
00:05:13 <HackEgo> Learned 'optional.': optional.
00:05:31 <int-e> `` cd wisdom; grep '\.\.\.' *
00:05:42 <HackEgo> arothmorphise:arothmorphise ... antormo... antrohm... ant... oh bugger. This should go in the `misspellings of antrhrop... atnhro...' entry. \ code:[11,11,11,15,15,23,12],[5,5,5,3,53,45,16,26,00,20,15,16,22,25,45,91,32,11,15,27,06,01,11,01,47,22,30,13,43,21,11,13,29,61,65,17,19,12,28,17,11,01,23,20,16,20,81,18,32,25,58,22.,1985,10.301350435,1555466
00:05:45 <HackEgo> #!/bin/bash \ topic=$(echo "$1" | lowercase | sed 's/^\(an\?\|the\) //;s/s\?[:;,.!?]\? .*//') \ echo "$1" >"wisdom/$topic" \ echo "Learned '$topic': $1"
00:06:23 <oerjan> oh right, the space is not optional if it's to remove any of the rest
00:06:24 <int-e> `` cd wisdom; grep -l '\.\.\.' *
00:06:25 <HackEgo> arothmorphise \ code \ hthmonoid \ grep: le: Is a directory \ learn \ `learn \ northumberland \ grep: ¯\(°_o): Is a directory \ grep: ¯\(°_o): Is a directory \ \oren\ \ procrastination \ qdb \ quoteformat \ remorse
00:06:44 <HackEgo> Northumberland may be today a sparsely populated country... but SOON! THE NORTHUMBRAINS SHALL RISE!
00:07:22 <int-e> `culprits wisdom/northumberland
00:07:26 <HackEgo> oerjan elliott Bike FreeFull Taneb
00:08:29 <shachaf> hppavilion[1]: It means each element in the tuple gets indexed on its own.
00:09:07 <hppavilion[1]> shachaf: https://en.wikipedia.org/wiki/Tuple does not speak of "indexing"
00:09:11 <shachaf> hppavilion[1]: Try figuring out what indexing would mean and I'll tell you whether it's right.
00:09:24 <shachaf> Well, this is indexing in the usual sense.
00:10:19 <hppavilion[1]> shachaf: So... hm... OH! Is it at all like ~ in INTERCAL?
00:10:37 <oerjan> <int-e> *reads about the ending phase* ... could there be an infinite loop of cleanup steps... <-- you should reask that with ais523 around hth
00:11:02 <hppavilion[1]> shachaf: x~y is all the bits of x for which the corresponding bit in y is 1, right-justified
00:11:13 <int-e> shachaf: it's ALL CAPS, what else could it be... I mean now that COBOL is dead?
00:11:21 <ais523> int-e: there can be an infinite loop of cleanup steps, yes
00:11:35 <ais523> it's a little hard to pull off because cards are typically designed to stop things triggering then
00:11:52 <shachaf> help when did this turn into a mtg conversation
00:12:06 <int-e> shachaf: oerjan looking through logs
00:12:10 <hppavilion[1]> shachaf: What I mean is the compostion of e.g. (17, 92, 12) and (1, 2) equal to (17, 92)?
00:12:48 <shachaf> hppavilion[1]: What are the domains and codomains of those arrows?
00:13:45 <oerjan> hppavilion[1]: what shachaf means is that an arrow is not determined by its tuple alone
00:13:48 <hppavilion[1]> shachaf: Or do you mean which numbers in particular for those arrows?
00:14:28 <shachaf> An arrow : N -> M is an N-tuple of numbers < M
00:14:30 <int-e> well, graphs are categories
00:14:32 -!- sphinxo has joined.
00:14:51 <hppavilion[1]> shachaf: Ah, I think I transcribed it to my notes wrong
00:14:53 <shachaf> But M could be 100 or 1000
00:14:56 <int-e> reflexive, transitive relations are
00:15:07 <HackEgo> sphinxo: Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
00:15:12 <int-e> (that's the example that I wanted)
00:15:36 <hppavilion[1]> shachaf: Oh, so the arrows map numbers to all numbers greater than them, right
00:15:58 <sphinxo> So what's the bees knees in esoteric langs?
00:16:23 <ais523> sphinxo: in terms of newly popular? best-known?
00:16:40 <int-e> sphinxo: well your puns seem to be up to par... welcome!
00:17:06 <ais523> hmm, not sure if any esolangs have really caught on since Three Star Programmer
00:17:11 <shachaf> int-e: whoa whoa whoa, when did this turn into a linear logic conversation
00:17:27 <int-e> shachaf: you lost me
00:17:47 <int-e> oerjan: the bees one
00:18:17 <hppavilion[1]> sphinxo: One that isn't popular- but be used by at least one person in the world someday, if I'm being generous- is a proof assistant I myself made called Thoof
00:18:24 <oerjan> i didn't notice it was a pun
00:18:37 <hppavilion[1]> sphinxo: Based on Thue, which is a great language you should check out if you haven't already
00:18:48 <int-e> oerjan: flew right over your head, eh...
00:19:17 <sphinxo> hppavilion[1]: is it on github?
00:19:55 <hppavilion[1]> sphinxo: But there are no published docs yet; however, I can publish the as-of-yet incomplete tutorial if you like
00:20:04 <sphinxo> hppavilion[1]: Oh wait I think i've found it, in python right?
00:20:20 <shachaf> Oh, I thought you were talking about hppavilion[1]'s brain.
00:20:27 <shachaf> The joke seemed a little drawn out.
00:20:35 <oerjan> int-e: well, bee's knees did fit there without having to reinterpret it.
00:21:20 <hppavilion[1]> shachaf: Gah! Your and sphinxo's nicks arethe same length and both start with s!
00:21:36 <shachaf> you're already always confused hth
00:22:11 <shachaf> boily: have you figured out the mysterious category twh
00:22:34 <oerjan> hppavilion[1]: a single starting letter seems a bit little to be confusing.
00:22:41 <boily> which mysterious category?
00:22:50 <shachaf> Oh, apparently this category has a name.
00:23:08 <oerjan> shachaf: isn't it just a subcategory of Set
00:23:13 <sphinxo> In the spirit of self promotion, i'd like to present one of my first forays into the world of #esoteric
00:25:46 -!- sphinxo has left ("WeeChat 1.4").
00:26:13 -!- sphinxo has joined.
00:28:02 <ais523> sphinxo: weird mix of languages :-)
00:28:06 <ais523> (in here, that's probably a good thing)
00:28:23 <ais523> makes sense though, ocaml's good at compilers, jvm is probably the most portable asm
00:28:29 <shachaf> ais523: Do you understand par in linear logic? TWH
00:28:40 -!- tromp has joined.
00:28:50 <ais523> shachaf: what do you mean by par? I fear the answer is no
00:28:56 <ais523> I understand the subsets of linear logic I use in my work
00:28:57 <shachaf> The upside-down ampersand.
00:29:15 <sphinxo> ais523: it was my first time doing ocaml actually
00:29:22 <shachaf> Or ?A the exponential thing?
00:29:26 <sphinxo> but I didn't really like it and went back to haskell
00:29:45 <ais523> shachaf: _|_ is just "arbitrary false statement" in most logics
00:29:56 <shachaf> sphinxo: Oh, that's where I remember you from.
00:30:02 <ais523> I sort-of have a vague idea of how ? works but not enough to put it into words
00:30:22 <shachaf> ais523: Well, there's _|_ and there's 0
00:30:52 <ais523> linear logic sort-of has SCI syndrome
00:30:55 <sphinxo> shachaf: yeah i'm the one generally asking the silly questions
00:30:56 <ais523> but possibly even worse
00:31:32 <ais523> (SCI is an affine logic, which has the problem that ('a * 'b) -> 'c and 'a -> ('b -> 'c) aren't isomorphic and most language constructs need to work both ways round)
00:31:36 <ais523> syntactic control of interference
00:31:45 <shachaf> This game semantics interpretation made the most sense to me.
00:31:57 <shachaf> ais523: Oh, it has both an internal hom and a product but they're not adjoint?
00:32:13 <shachaf> The product has no right adjoint and the internal hom has no left adjoint?
00:32:33 <ais523> it causes utter chaos at the category theory level
00:32:41 <ais523> in terms of programming it, it's only mildly annoying
00:32:47 <sphinxo> y'all played tis-100? I imagine that'd be right up you guys/girls boats
00:33:05 <shachaf> ais523: Sounds sort of reasonable. Maybe.
00:33:06 <ais523> annoying enough, though, that SCI errors are something that I have to keep correcting in other people's code
00:33:34 <shachaf> ais523: Anyway in this game semantics interpretation, when you have A#B, you run two games in parallel, one for A and one for B.
00:33:40 <ais523> quite a bit of work on my thesis was trying to create a more categorically sensible SCI
00:33:40 <shachaf> And you only have to win one of them.
00:33:59 <shachaf> So for instance A # ~A is always true, because if you get a refutation on one side you can use it on the other side.
00:34:07 <ais523> it turns out that it has hidden intersection types
00:34:18 <shachaf> ais523: Hmm, I should read your thesis.
00:34:23 <ais523> shachaf: hmm, that makes me think of a programming language construct
00:34:35 <ais523> in which you give two terms, it returns one of its argument
00:34:51 <ais523> but it's guaranteed to return something other than bottom unless both arguments are bottom
00:35:10 * ais523 wonders if the Haskell people would consider that pure
00:36:35 <shachaf> ais523: Haskell people probably want a guarantee that they're equal unless they're bottom.
00:36:42 <shachaf> https://wiki.haskell.org/Unamb
00:37:16 <ais523> now I'm wondering if it's useful
00:37:19 <ais523> I guess you could do sorting with it
00:37:39 <ais523> one argument an O(n log n) worst case, the other an O(n) best case that sometimes blows up
00:37:47 <shachaf> http://conal.net/blog/tag/unamb
00:39:39 -!- tromp has quit (Remote host closed the connection).
00:43:23 <shachaf> ais523: Oh, A # B is also ~(~A x ~B)
00:45:51 -!- heroux has quit (Ping timeout: 250 seconds).
00:55:27 -!- sphinxo has quit (Quit: WeeChat 1.4).
01:01:45 -!- heroux has joined.
01:02:54 -!- llue has quit (Quit: That's what she said).
01:03:03 -!- lleu has joined.
01:07:37 <boily> mwah ah ah. Tiamat is dead!
01:08:25 <boily> dragonskin cloak is miiiiine!
01:09:05 -!- tromp has joined.
01:11:40 -!- carado has quit (Quit: Leaving).
01:15:28 -!- Phantom_Hoover has quit (Read error: Connection reset by peer).
01:15:42 -!- mad has joined.
01:16:16 <mad> will someone explain this to me: why some programmers use C but have an aversion to C++
01:17:02 <mad> (especially on non-embedded platforms)
01:19:32 <pikhq> Because the things that C++ is good at, C is about as good at, and the things that C++ does better than C, other languages do significantly better. So, C++ is a giant pile of complexity with minimal benefits.
01:21:12 <mad> er, no, there is one class of stuff where C doesn't have the tools (like, you can do it but it's cumbersome), and java/C#/etc can't do it because of the mandatory garbage collector
01:21:40 <mad> once you have lots of dynamic sized stuff C++ has a large advantage over C
01:22:24 <pikhq> You know that there's languages out there besides C-family languages, Java-family languages, and P-family languages, right?
01:22:46 -!- lynn has quit (Ping timeout: 252 seconds).
01:23:01 <mad> this is why C++ is popular for making games (too much dynamic sized stuff for C, can't use java/C# because garbage collector creates lags)
01:23:18 <pikhq> ais523: Gregor's joking name for Perl, Python, Ruby, etc.
01:23:43 <mad> pikhq: what other language category is there? functional languages?
01:24:37 <mad> the other languages I can think of generally aren't particularly fast
01:25:26 <pikhq> https://en.wikipedia.org/wiki/Template:Programming_paradigms *cough*
01:25:55 <pikhq> There's more programming language *categories* than you think there are languages, it sounds like. :)
01:26:42 <pikhq> izabera: Gregor Richards, one of the channel members who's not been that active of late.
01:26:54 <pikhq> He's still here though
01:26:58 <pikhq> Gregor: Isn't that right?
01:27:05 <mad> pikhq : that list is a split by paradigm, not by speed grade
01:27:34 <pikhq> mad: C++ ain't exactly "fast" in idiomatic use...
01:27:57 <pikhq> I mean, sure, you can write fast C++, but once you're using the STL you've abandoned all hope.
01:28:06 <ais523> izabera: Gregor's most famous for writing EgoBot and HackEgo
01:28:17 <mad> pikhq : not if you're using STL right
01:28:20 <fizzie> I thought he was most famous for the hats.
01:28:24 <HackEgo> Gregor took forty cakes. He took 40 cakes. That's as many as four tens. And that's terrible.
01:28:39 <oerjan> it wasn't always laggy
01:28:43 <mad> ie basically as a replacement for arrays [] except it manages the size
01:28:58 <pikhq> Also, I wouldn't take game developers as a good example of "how to write programs"...
01:29:09 <ais523> oerjan: if you want a cheap bot, see glogbackup (which is also Gregor's)
01:29:59 <pikhq> Unmaintainable piles of shit that are written by the sort of people who are willing to accept 80 hour workweeks are par for the course.
01:30:37 <izabera> that's a rant i've never heard
01:31:02 <izabera> what's the problem with working too many hours a week?
01:31:04 -!- Sgeo has quit (Ping timeout: 260 seconds).
01:31:42 <pikhq> Um, humans are kinda bad at being productive that long. Especially at mentally intense tasks.
01:32:17 <mad> if garbage collectors are ruled out you're left with, er, basically: C, C++, assembler, delphi, rust, and objective C (and I guess cobol and ada)
01:32:24 <mad> as far as I can think of
01:32:38 <pikhq> ... Have you never even heard of Forth?
01:32:44 <mad> ok and forth
01:32:56 <pikhq> Or Tcl, for that matter?
01:32:59 <mad> ok and fortran
01:33:06 * izabera adds bash to the list of non-garbage-collected languages
01:33:29 <mad> how is python not garbage collected
01:33:35 <pikhq> Python is reference counted.
01:33:50 <mad> also it's dynamic typed which is a much larger speed disadvantage
01:33:53 <ais523> reference counters fall into a similar category to garbage collectors to me
01:34:00 <ais523> they have noticeable overhead, often more
01:34:12 <ais523> the difference being that it's predictable overhead that always happens in the same places
01:34:12 <pikhq> ais523: They're automatic memory management, but GC is a different technique.
01:34:27 <ais523> they are not the same, but they have similar effects on a program
01:34:28 <mad> ""The standard C implementation of Python uses reference counting to detect inaccessible objects, and a separate mechanism to collect reference cycles, periodically executing a cycle detection algorithm which looks for inaccessible cycles and deletes the objects involved.""
01:34:33 <pikhq> Yes, not the same but similar.
01:35:37 <mad> reference counting doesn't cause 100ms pauses in your app like the java GC does
01:36:39 <pikhq> Does Java not have a way of using a more interactive-use-appropriate GC?
01:36:56 <ais523> you can make hints to Java about when a good time to GC would be
01:37:10 <mad> ais523 : in a video game, there's never a good time
01:37:14 <ais523> but a) it doesn't have to respect them, b) you can't delay GC, only make it happen earlier (and hopefully not again for a while)
01:37:38 <ais523> if you have the memory (and sometimes you do, but not always), you can just leak until the next loading screen and catch all the memory up there
01:37:38 <mad> if your game has loading screens, yes
01:38:14 <ais523> although in many, they're disguised, or short enough that you don't really register them
01:38:22 <tswett> It happens you caught me at a bad time.
01:38:26 <tswett> I have to go to bed now.
01:38:31 <ais523> even in the disguised/short ones, a 100ms pause isn't noticeable
01:38:34 <pikhq> Also, if you have a *good enough* GC, you should be able to only pause for short periods of time between frames.
01:39:45 <mad> it would still be better to have only ref counting and no GC in that kind of programs though
01:40:19 <ais523> mad: so if the root of a structure gets freed
01:40:28 <ais523> you then have a pause while the rest of the structure gets freed recursively
01:40:32 <ais523> refcounting doesn't remove pauses
01:40:39 <ais523> simply makes it easier to predict when they'll happen
01:40:56 <mad> but (1) other threads keep going
01:41:14 <mad> as opposed to GC which has a "stop the world" phase where it pauses every thread
01:41:35 <ais523> not necessarily, concurrent GCs exist
01:41:39 <mad> so chances are the pause will happen on your data loading thread (not your gfx thread)
01:41:39 <pikhq> That's only true of a subset of GCs.
01:42:04 <mad> even concurrent GCs do have a "stop the world" phase, it's just much shorter
01:42:13 <mad> (if what I've read is correct)
01:42:23 <pikhq> By the same notion, so does malloc because malloc has a mutex.
01:42:59 <ais523> pikhq: I've managed to deadlock on that mutex before now :-(
01:43:25 <ais523> let's just say, SDL's situation with timing and concurrency is so bad I've decided to take a look at SFML to see if it's any better
01:43:46 <pikhq> SDL is... not a well-designed library.
01:44:48 <mad> yeah SDL is way less good than it should've been
01:46:26 <boily> pygame makes SDL sane.
01:47:18 <ais523> boily: does it prevent it polling every 1ms?
01:48:28 <boily> IIRC, I don't think so.
01:48:52 <mad> the other thing is that refcounting doesn't have heap compaction
01:48:56 <mad> which is a good thing
01:49:22 <pikhq> It's kinda a wash.
01:49:36 <pikhq> (and orthogonal to refcounting, really)
01:50:12 <pikhq> Heap compaction costs when it happens, but means the allocator can spend less time in allocation.
01:50:47 <mad> heap compaction on 300megs of data isn't pretty
01:51:04 <pikhq> I've forgotten how to count that low.
01:52:20 <mad> like, it's all fine if it's server software and it doesn't matter if the whole app stops for half a second
01:52:37 <mad> then, yes, by all means use java and C# and python and whatnot
01:53:43 <pikhq> If a service pauses for half a second I get paged.
01:58:14 <shachaf> pikhq: If an individual server has a GC pause of 500ms?
01:58:40 <pikhq> shachaf: I exaggerate.
01:58:55 <pikhq> shachaf: But we *do* have SLAs for response time to requests...
02:00:01 <shachaf> I shouldn't talk about details in here anyway.
02:00:27 <shachaf> Hmm, I think I know how to set off pikhq's pager.
02:01:04 <pikhq> Joke's on you, I'm not on call right now
02:01:36 <shachaf> But is your pager thing actually turned off?
02:06:00 -!- andrew_ has joined.
02:06:35 -!- Sgeo has joined.
02:14:49 -!- hppavilion[1] has quit (Ping timeout: 244 seconds).
02:15:12 <\oren\> why can't it just also allow else if and elsif?
02:15:45 <lifthrasiir> probably elif is much used so it is easier to write in that way?
02:16:24 <\oren\> true but it should allow elif, else if and elsif as alternatives
02:17:10 * izabera googled it and it's an actual thing
02:18:54 -!- mysanthrop has joined.
02:21:48 <\oren\> izabera: why do you think I hate him?
02:22:12 <HackEgo> mysanthrop: Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
02:23:07 <prooftechnique> I wonder if I can get mutt working on a jailbroken iPhone
02:23:48 -!- j-bot has quit (Ping timeout: 248 seconds).
02:23:48 -!- myname has quit (Ping timeout: 248 seconds).
02:23:48 -!- Alcest has quit (Ping timeout: 248 seconds).
02:23:49 -!- MoALTz has quit (Ping timeout: 248 seconds).
02:23:49 -!- nisstyre_ has quit (Ping timeout: 248 seconds).
02:23:59 <izabera> unless your mutt has a much better interface than mine
02:24:27 <\oren\> I just use a ssh app and use alpine
02:24:32 <mad> how do C programmers live without std::vector and std::string
02:24:32 <izabera> you bought an iphone, you clearly care about eye candy
02:26:40 <\oren\> mad: i have a bunch of poorly written functions I copy from one project to the next over and over
02:27:26 <pikhq> ... Or poorly, if you go by the average results. :P
02:27:32 <mad> reallocate arrays every time they change size?
02:27:50 <fizzie> Why would you do that if the std::vector implementation doesn't?
02:28:10 <fizzie> It's not like it's rocket science to have a struct that has "size" and "capacity" separately.
02:28:25 <mad> fizzie : true but then you might as well use std::vector
02:28:40 <mad> which does that and it can't leak
02:29:25 <\oren\> my functions resize them when they get to each power of two
02:29:57 <mad> \oren\ : that's exactly what std::vector does
02:30:09 <fizzie> I don't think array resizing is a major source of memory leaks.
02:30:25 <shachaf> I read this thing that was arguing that powers of two is one of the worst choices you could make.
02:30:26 <int-e> "new" is your friend if you want to leak memory in C++. ("can't" really is too strong)
02:30:47 <mad> well, the point is that std::vector<stuff> replaces stuff *
02:30:55 <mad> stuff * can leak, of course
02:31:06 <mad> std::vector<stuff> can't
02:31:07 <int-e> C++ does have a couple of resource management idioms that C doesn't support, but it's far from golden anyway
02:31:29 <\oren\> I like std::vector. I *HATE* std::ios[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[Ctream
02:31:51 <shachaf> Maybe it was https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md
02:31:53 <lifthrasiir> iostream is a big raised middle finger to STL
02:32:22 <lifthrasiir> I cannot really understand how can it be possible to have STL and iostream in the *same* standard
02:32:22 <mad> int-e : C doesn't have std::vector, that's the real one that's missing and it's a major, major gaping hole
02:32:53 <pikhq> mad: Anyways, frankly if you think that std::vector is your solution to memory management problems you are too unaware of the problems there are to solve to be having this discussion.
02:32:56 <mad> lifthrasiir : 80% of the time I simply ignore iostream but use STL anyways
02:32:59 <prooftechnique> "always non-negative, almost always measurable, frequently significant, sometimes dramatic, and occasionally spectacular"
02:33:17 <mad> pikhq : if you need a special case then STL won't cut it true
02:33:54 <mad> but in my experience, "variable sized array" is 10x more common than any other memory structure and its omission from C hurts hard
02:33:59 <lifthrasiir> mad: yeah. STL is (within its design constraint) well-designed library, while iostream is an epic fail
02:34:29 <pikhq> It's also by far the easiest data structure to implement, so...
02:34:36 <\oren\> well, realloc() is basically the equivalent for C
02:34:49 <\oren\> there's no operator renew
02:35:10 <mad> pikhq : yeah but you reimplement it so often that it should be a language feature really
02:35:12 <lifthrasiir> anyone who tried to write a new locale with iostream (to be exact, std::codecvt etc.) will understand that
02:35:27 <pikhq> Sure, it'd be a nice addition to libc.
02:35:51 <mad> there are, like, 4 features I care about in C++
02:36:29 <mad> std::vector, std::string, std::map, and putting functions in structs/classes for convenience (ie less typing)
02:36:47 <pikhq> That's the same for everyone. Unfortunately, it's a different 4 for each person, and C++ has enough features that each individual human being gets their own set of 4 features.
02:36:53 <mad> std::vector is not just a "nice addition", it's a major feature
02:38:00 <\oren\> I just have a function for appending to an array
02:38:06 <pikhq> (I suspect that C++ releases new versions to keep up with global population growth)
02:38:08 <HackEgo> This wisdom entry was censored for being too accurate.
02:38:27 <mad> pikhq : that is true
02:39:08 <\oren\> apparr(char**array,int*size,char*part,int*partz);
02:39:29 <int-e> https://developer.gnome.org/glib/stable/glib-Arrays.html
02:39:31 <mad> realloc() isn't bad
02:39:36 <boily> int-e: the mad that was censored isn't the mad that is in the chännel hth.
02:40:03 <pikhq> Ugh, glib. glib makes C++ look *angelic* in commparison.
02:40:19 <\oren\> my function does realloc iff size would increase through a power of two
02:41:04 <mad> \oren\ : yeah. I use std::vector for exactly that except with less potential mistakes
02:41:06 <\oren\> I don't remember why partz is passed by pointer
02:41:43 <boily> he\\oren\. more pointers, more stars, more sparkliness.
02:41:52 <mad> pointers are evil
02:42:14 <int-e> pikhq: sure but if the objection is that one has to reimplement resizable arrays all the time, that's one of the counterarguments that come to my mind
02:42:26 <mad> except pointers that are essentially referrences, those are okay
02:42:27 <pikhq> int-e: Fair enough. :)
02:42:46 <\oren\> mad: isn't that all pointers?
02:42:53 <boily> \oren\: I see that you are still fonting ^^
02:43:06 <boily> (nice fraktur btw.)
02:43:09 <\oren\> pointers and references are different words for the same thing
02:43:27 <mad> \oren\ : well, basically if its pointing to data owned by some other structure, it's okay
02:44:05 <mad> \oren\ : if it's pointing to a memory allocation and you get a leak if the pointer gets overwritten, then it's bad
02:44:36 <\oren\> how's that different from references?
02:45:38 <mad> well, c++ references are typically used in function declarations and they refer to some object
02:46:05 <mad> you can't use c++ references to do allocation/deallocation so by definition they generally can't be evil
02:46:29 <boily> it's C++ we're talking about. everything can be alignment-shifted.
02:46:40 <mad> boily : and then it'll be slow
02:46:51 <mad> but that's a rare case
02:46:51 <\oren\> well then what good are they? you need some way to refer to non-stack memory...
02:47:09 <prooftechnique> If every programmer were as disciplined as that, we'd already be out of work
02:47:13 <int-e> I bet delete &ref; is valid
02:47:16 -!- nisstyre_ has joined.
02:47:55 <mad> \oren\ : easy, when you have a function that returns 2 things, one can be returned as a return value but the other has to be a pointer or reference argument and then the called function will write in it
02:48:05 <mad> that's what references are for
02:48:17 <mad> they're essentially interchangeable with pointers
02:48:45 <\oren\> that's what I said, they're just a pointer.
02:48:54 <mad> internally, c++ references are pointers yes
02:49:02 <boily> time to have unevil, functional sleep. 'night all!
02:49:03 <mad> basically they're just syntactic sugar
02:49:09 -!- boily has quit (Quit: SELFREFERENTIAL CHICKEN).
02:49:27 <mad> int-e : C++ doesn't guard against messing things up badly :D
02:49:40 <\oren\> specifically, a int& is the same as a int*const, but with syntax sugar
02:50:10 <\oren\> allowing you to code as if it's a int
02:50:49 <int-e> \oren\: and it's much harder to pass in NULL.
02:50:52 <mad> basically if there's a way to code something with malloc/free/new/delete, and a way that doesn't involve these, I always go for way #2
02:51:59 <prooftechnique> If you're not writing a custom malloc implementation every time, are you really doing your job?
02:52:22 <mad> the standard malloc goes through the bucket allocator
02:52:31 <pikhq> prooftechnique: I have a word for those people, but it's inappropriate for polite conversation.
02:52:36 <mad> for typical uses it does a pretty good job
02:52:44 <int-e> prooftechnique: If you're writing a custom malloc implementation every time, are you really doing your job?
02:52:52 <\oren\> well at my work we use our own resizable array class
02:53:07 <\oren\> instead of std::vector
02:53:29 <\oren\> because apparently std::vector doesn't play well with threads or somehting
02:53:31 <pikhq> The same is true of my work, but at this point I'm a little surprised we don't just have our own implementation of the STL...
02:54:12 <mad> \oren\ : depends on when it changes size :D
02:54:23 <HackEgo> NIH was /not/ invented by Taneb.
02:54:43 <int-e> `culprits wisdom/NIH
02:54:50 <mad> if you have a size change at the same time another thread looks or writes in the std::vector then you have a problem yes
02:54:53 <pikhq> int-e: That's practically the Google way.
02:55:00 <int-e> `culprits wisdom/nih
02:55:07 <prooftechnique> I'm a little sad that the CPPGM is already running. It seems like it'd be a fun thing to fail at
02:55:25 -!- ais523 has quit.
02:55:28 <\oren\> int-e: well half our codebase is in an in-house language instead of c++, and the compile porcess uses another in-house language instead of makefiles, so you know....
02:55:30 <shachaf> pikhq: The Google way isn't exactly NIH. They have their own variant of it.
02:57:06 <mad> \oren\ : basically whenever some std::vector can change size, it needs to be 100% mutexed accessible by only 1 thread, or else you're in trouble
02:57:18 <mad> the rest of the time it's the same as a C array
02:58:39 <mad> supposedly copy-on-write containers work well with threading
02:59:06 <\oren\> i think that's what we have NIHed
03:00:06 <mad> the other case I've heard is code that had to work on stuff like the nintendo DS
03:00:09 <\oren\> I haven't looked into the details since the interface is almost exaclt the same as std::vector
03:00:23 <mad> which if I'm not mistaken had a broken STL or something like that
03:00:48 <\oren\> this has to work on coffeemachines and things
03:00:55 <mad> my brother's company has a NIH std::vector equivalent because of that
03:02:39 <mad> for strings, ironically std::string basically complements char *>
03:03:09 <mad> char * strings are cool except that you basically can't store them, std::string fixes just exactly that
03:05:19 <\oren\> can't store them where?
03:05:37 <mad> well, char * has no storage
03:05:59 <\oren\> what the heck does that mean?
03:06:17 <mad> suppose you have to save some text data inside a struct
03:06:33 <mad> your options are like
03:07:28 <mad> char text[99]; // + 1 million runtime checks and prayer and hope that it never goes over
03:08:41 <mad> char *text; // and then make sure it's set to null in every single constructor and make sure it's deleted in the destructor and then checks that it's not null every time you read it and malloc/realloc if it ever changes size
03:09:12 <mad> std::string text;
03:10:32 <mad> it's just that option #3 has way less common failure modes than option #1 and option #2
03:10:48 <\oren\> std::string could be replaced with a bunch of funtions that take char* and handle everything you just said.
03:11:02 <mad> \oren\ : yes that's option #2
03:11:08 <mad> char * in the class
03:11:23 <\oren\> but the point is I already have such functions
03:11:51 <oerjan> `addquote <shachaf> pikhq: The Google way isn't exactly NIH. They have their own variant of it.
03:11:58 <HackEgo> 1270) <shachaf> pikhq: The Google way isn't exactly NIH. They have their own variant of it.
03:12:31 <mad> \oren\ : and you never forget to put them in constructors, destructors, and to put checks against null?
03:13:12 <\oren\> I don't have constructors or destructors, and all my string handling functions check for null
03:13:41 <\oren\> (becuase I'm writing in C, which doesn't have constructors or destructors)
03:13:59 <mad> \oren\ : well, when mallocating and freeing structs of that type then
03:14:11 <mad> of the type that contains the char *
03:14:37 <\oren\> well, since my usual first step is somthing like:
03:15:10 <\oren\> struct foo *f = newfoo();
03:16:08 <\oren\> struct foo *f = malloc(sizeof(struct foo)); *f = nullfoo; return f
03:16:30 -!- oerjan has quit (Quit: Late(r)).
03:16:43 <\oren\> that doesn't happen, becuase I have a prototype for all foo objects (nullfoo)
03:17:08 <mad> and you have a deletefoo() matching with every newfoo() ?
03:18:00 <mad> yeah i guess that works
03:19:18 <\oren\> I even have some functions that can delete an array, taking a pointer to a delete function to be called on each element
03:19:47 <mad> makes sense
03:20:13 <\oren\> it's an obvious extension of the precedent set by qsort and bsearch
03:20:35 <\oren\> they just didn't bother with it in the C stdlib
03:20:57 <mad> It's kindof the reverse of my coding style (which could be summarized as "avoid malloc/free unless there's really no other option") but I guess it's sorta functional
03:21:29 <\oren\> it's what you do if you're writing C and not C++
03:21:47 <mad> which makes sense if you're doing embedded coding yes
03:25:41 -!- nortti_ has joined.
03:25:42 -!- int-e_ has joined.
03:26:20 -!- puck1pedia has joined.
03:26:27 -!- lambda-calc has joined.
03:26:27 -!- lambda-11235 has quit (Ping timeout: 260 seconds).
03:26:28 -!- aloril_ has quit (Ping timeout: 260 seconds).
03:26:29 -!- puckipedia has quit (Ping timeout: 260 seconds).
03:26:29 -!- Gregor has quit (Ping timeout: 260 seconds).
03:26:30 -!- nortti has quit (Ping timeout: 260 seconds).
03:26:30 -!- atehwa_ has quit (Ping timeout: 260 seconds).
03:26:30 -!- catern has quit (Ping timeout: 260 seconds).
03:26:30 -!- quintopia has quit (Ping timeout: 260 seconds).
03:26:30 -!- int-e has quit (Ping timeout: 260 seconds).
03:26:52 -!- Gregor has joined.
03:27:35 -!- bender|_ has joined.
03:27:40 -!- puck1pedia has changed nick to puckipedia.
03:28:06 -!- aloril_ has joined.
03:31:06 -!- atehwa has joined.
03:31:28 -!- ais523 has joined.
03:31:29 -!- ais523 has quit (Remote host closed the connection).
03:31:30 -!- j-bot has joined.
03:37:44 -!- quintopia has joined.
03:43:29 -!- hppavilion[1] has joined.
03:43:36 -!- catern has joined.
04:02:17 -!- hppavilion[1] has quit (Ping timeout: 244 seconds).
04:12:33 -!- hppavilion[1] has joined.
04:15:07 -!- ais523 has joined.
04:15:49 <ais523> OK, so SFML uses a very thread-centric model
04:16:03 <ais523> e.g. there's no way to inject user-defined events, no way to do timers, etc.
04:16:51 <ais523> however, it /also/ doesn't define any safe way to communicate between threads, other than mutexes, and I don't think you can form the equivalent of a select() out of mutexes
04:17:08 * ais523 is in #esoteric, and thus takes questions like "can you create a message queue out of nothing but mutexes" seriously
04:18:26 <ais523> so the question is, what are the sensible cross-platform ways to merge events coming in from multiple threads, when your threading primitives suck?
04:20:24 <ais523> note: something you /could/ do entirely within SFML is to create a TCP listening socket and use that, but a) this uses up a global system resource (open ports), b) there's no way to restrict connections to localhost so it's more than a little insecure
04:20:35 <ais523> (no way within SFML's API, that is; you can obviously do it in TCP)
04:21:34 <coppro> ais523: define "out of nothing but mutexes"
04:22:04 <coppro> are we talking about communication via try_lock()?
04:22:09 <ais523> the only thread-safe blocking primitive that you have available is the mutex lock, which will block if another thread has the mutex locked
04:22:32 <ais523> the problem isn't transferring the data, because you can do that via shared memory
04:22:37 <ais523> (which is the default for threading)
04:22:52 <ais523> the problem is blocking until there's a message ready to receive
04:23:11 <ais523> and AFAICT, the problem is that you can only try to lock one mutex at a time, a specific thread holds it
04:23:28 <ais523> and so you're blocked until that specific thread gives you permission
04:23:32 <ais523> (also you can't do anything meanwhile)
04:25:04 <ais523> it's basically the opposite situation to the situation for which mutexes were designed; we don't have one process holding the lock and many waiting on it, we have many processes holding the lock and one waiting on one of them to release it
04:26:07 <mad> isn't SFML a multimedia library?
04:26:46 <ais523> however this means it contains an event loop
04:27:09 <ais523> and its event loop uses a "use different threads for different sorts of events" model (implicitly in that it doesn't support timers, has sockets as a separate thing from windows, etc.)
04:27:18 <ais523> it also supplies threads, and mutexes
04:27:32 <ais523> but this isn't enough to be able to communicate between threads without polling AFAICT
04:28:16 <coppro> ais523: yes, I don't think it's possible either
04:28:31 <mad> I'm not familiar with how it's done in the networking world
04:28:43 <coppro> under the hood, anyway
04:29:10 <ais523> so what I want is either a solution a) inside SFML using other primitives it has (IMO impossible), or b) using cross-platform primitives that are widely implemented
04:29:36 <ais523> I could use pthreads, I guess; however I don't know how that works on Windows/Strawberry
04:29:59 <ais523> and/or how well it plays with SFML (which after all, has its own threading abstraction)
04:30:07 <mad> wait, what's the thing you can't do with mutexes?
04:30:27 <ais523> mad: block until something happens on any of multiple threads
04:31:10 <ais523> coppro: semaphores would work fine, but SFML doesn't supply them as a primitive
04:31:18 <coppro> ais523: most platforms do though
04:31:19 <mad> ais523 : oh I see
04:31:31 <mad> ais523 : ...what's the application for that?
04:31:32 <coppro> hard to find something more primitive
04:32:04 <ais523> mad: the situation is that I am writing a library (libuncursed; coppro's worked on it in the past too) that presents an event-loop interface to programs using it
04:32:16 <ais523> and abstracts over a number of different backends (currently, POSIX, Windows, and SDL)
04:32:33 <mad> hmm, how about
04:33:10 <mad> event handling thread blocks on one mutex
04:33:11 <ais523> there are others that could be sensible, too (e.g. X, GDI)
04:33:34 <mad> any of the multiple other threads can unlock that mutex
04:33:42 <ais523> you can't unlock a mutex unless you hold it, surely
04:33:48 * ais523 checks to see if SFML have messed this up
04:34:20 <ais523> hmm, it doesn't say that you can't unlock a mutex while another thread holds it
04:34:43 <ais523> perhaps it's worth experimenting with
04:35:00 <ais523> seems vulnerable to race conditions but that maybe isn't insoluble
04:35:17 <ais523> (e.g. using a separate mutex to protect the signalling one)
04:35:21 <mad> that mutex would only be used to pause the event handling loop
04:36:18 <mad> each particular ressource would have its own mutex so that the owner thread of that ressource would unlock its ressource, then unlock the event handling thread's mutex
04:36:26 <ais523> these mutexes are recursive
04:36:57 <ais523> the obvious algorithm, assuming you can unlock someone else's mutex, ends with the event handling thread intentionally deadlocking on itself
04:37:02 <ais523> but you can't do that with a recursive mutex
04:37:15 <ais523> so we'll have to create a separate thread purely to deadlock it
04:38:14 <ais523> so three locks (A, B, C), two "special" threads (event and deadlock), N generic threads
04:38:52 <ais523> netutral state is A locked by deadlock, event waiting on it; B locked by event, deadlock waiting on it; C unlocked
04:39:18 <ais523> when a generic thread wants to send a message, it locks C, pushes the message on a queue, unlocks A if the queue was empty (this is protected by C), unlocks C
04:40:35 -!- XorSwap has joined.
04:41:26 <ais523> when event gets past the deadlock, it locks C, and handles messages from the queue until it's empty; then, hmm
04:41:31 <ais523> SFML doesn't even have a trylock
04:41:42 <mad> what sort of use is having a general event handling thread like that for?
04:41:47 <ais523> so how do we get back into the deadlocked state?
04:42:33 <ais523> mad: say you want to wait for a key to be pressed, or for 1 second to pass
04:42:44 <ais523> and the timer thread and keypress handling thread have to be different for some reason
04:43:53 <mad> that's a bit of a weird test case
04:43:58 <ais523> your two options are: run the entire logic of the program on whichever thread happened to be the one that received the event (key/timer); or send all the messages to the same thread
04:44:41 <ais523> it's not a weird test case at all, it's a common enough operation that, say, both ncurses and uncursed provide a function that does exactly that (although ofc the timeout's configurable)
04:44:58 <ais523> or for another example, say you want to wait for either a keypress, or receiving a network packet
04:45:44 <mad> multimedia apps often just keep processing video frames and handke keypresses on next frame
04:46:08 <ais523> that's a common way to write IRC clients (although in this case the responses to a keypress and to a network packet are different enough that you can run them on different threads without too much effort, that isn't something you should have to do)
04:47:15 <ais523> mad: that's terrible for battery life, though
04:47:22 <ais523> you want to be able to block until something happens, rather than having to poll
04:47:31 <ais523> (in fact it's the reason I wanted to move away from SDL in the first place)
04:48:13 <mad> I guess it depends on if you have the case where your app does nothing when there's no input
04:48:54 <mad> which I guess is sensible for an irc client but not a game
04:49:18 <ais523> mad: turn-based games often do nothing when there's no input
04:49:31 <mad> unless they have audio
04:50:05 <ais523> audio is one of those things that can safely be run in an independent thread, yes
04:50:16 <ais523> or interrupt-to-interrupt, on less powerful systems
04:50:25 <mad> yeah but that means you have at least one always active thread
04:50:26 <ais523> this is why it's often the only thing that works when the rest of the game crashes
04:50:43 <ais523> mad: no? audio thread blocks until the sample buffer drains, typically
04:50:45 <mad> which means that you might as well do polling on your event handler thread
04:50:52 <ais523> there's only so much the audio thread can do before blocking
04:51:02 <mad> ais523 : yes, which happens at least 50 times per second
04:51:05 <ais523> you're not running in a busy loop calculating samples
04:51:12 <\oren\> do you have any primitive atomics on shared memory?
04:51:37 <ais523> also 50fps is still slower than a typical video framerate
04:51:47 <ais523> \oren\: std::atomic would work in this case, I think
04:51:51 <\oren\> (although last time I touched that stuff I got terrible radiation burns)
04:53:07 <mad> depends on what you mean by "atomic"
04:53:56 <ais523> mad: a variable that supports operations that cannot be interfered with by other threads
04:54:01 <mad> for typical cases it's really the operations you do on your primitive that are atomic, I guess... and yeah I guess std::atomic does this for you
04:54:05 <ais523> there are a range of atomic operations, some more useful than others
04:54:18 <ais523> test-and-set is a common example of a primitive that's powerful enough to build anything else
04:54:36 <ais523> (set-to-specific-value, that is, not set-to-1)
04:55:03 <mad> yeah, the equivalent of lock cmpxchg? :D
04:55:04 <\oren\> yeah I think we used a swap operation in my OS class
04:55:29 <\oren\> or maybe a compare and swap?
04:55:52 <pikhq> Surely CAS. Just swap isn't sufficiently general I don't think.
04:56:13 <ais523> pikhq: IIRC pure swap is sufficiently general, but much more complex to use
04:56:26 <mad> I think it needs the compare to handle the case where some other thread has changed the value
04:56:33 <mad> between the read and the write
04:56:37 <ais523> pikhq: you can construct a boolean test-and-set out of a swap by swapping in a 0 or 1
04:56:47 <ais523> swapped-out value is the test, swapped-in value is the set
04:56:54 <pikhq> And you don't find hardware without CAS really, so it's not worth the effort.
04:56:55 <\oren\> yeah we used just swap
04:57:24 <\oren\> the OS ran on some sort of virtual machine
04:57:35 <ais523> you basically use the test-and-set as a mutex to guard a non-atomic operation on shared memory
04:57:43 <ais523> I think you might have to spin until the value is not set any more, though
04:58:04 <mad> how does swap guarantee that some other thread hasn't changed the value after your read but before your write?
04:58:05 <\oren\> yup, that's what we did, I remeber it now
04:58:29 <ais523> mad: atomic swap guarantees that because atomic
04:58:47 <\oren\> i think maybe it just freezes the other processors? who knows
04:58:49 <ais523> hmm, so SFML on Linux, at least, uses pthreads
04:59:09 <ais523> \oren\: it actually uses quite a complex locking mechanism internally
04:59:22 <ais523> the processors will block on the lock on the memory address if they try to access the same address
04:59:29 <ais523> there might also be some memory barriers involved
04:59:47 <\oren\> well, in my course we were on a vitual machine, so who knows
04:59:52 <mad> ais523 : but you can't prevent the swap if the value has changed
05:00:10 <mad> suppose you're trying to do an atomic increment
05:00:14 <mad> value is 0
05:00:22 <ais523> mad: you don't do the swap on the value you're incrementing
05:00:26 <ais523> you do it on a second, guard value
05:00:37 <ais523> which is 1 while in the middle of an increment, and 0 the rest of the time
05:00:43 <ais523> to increment, first you swap the guard value with 1
05:00:48 <\oren\> maybe cmpxchg is better for real processors because you don't need so much locking
05:01:07 <pikhq> cmpxchg lets you have atomics without having a second guard value like that.
05:01:13 <ais523> if you swapped a 0 out of it, then you do the increment, and swap a 0 back in (and will get a 1 after your swap unless shenanigans)
05:01:16 <mad> \oren\ : cmpxchg lets you do atomic increment without a guard value yeah
05:01:30 <ais523> if you swapped a 1 out of it, then you try again; you swapped a 1 with a 1 so you didn't interfere with the process that's currently doing the increment
05:01:49 <\oren\> so they made us do it with swap only because it's harder
05:01:52 <ais523> with compare-and-swap, what you do is you first (nonatomically) read the value, say it's x
05:02:01 <ais523> then you swap in x+1 if the current value is x
05:02:12 <ais523> if you swapped an x out, everything is fine, you're done
05:02:13 <mad> ais523 : but what if you have a 1 and then a third thread comes in? then the third thread will see a false 0
05:02:34 <ais523> if you didn't, then try again, you didn't change anything as you did a read and a failed-CAS
05:03:22 <mad> wait I guess I see
05:03:27 <ais523> here's my program: /*x*/ while (swap(guard, 1)); /*y*/ val++; /*z*/ swap(guard, 0)
05:03:50 <mad> yeah that works if the cpu doesn't reorder memory writes
05:04:10 <ais523> and an atomic swap is normally assumed to contain appropriate memory barriers
05:04:18 <ais523> to protect anything that's ordered relative to it
05:04:29 <mad> which means it should work on x86 but not necessarily other platforms
05:04:34 <ais523> (either in the processor architecture itself, or because it's a wrapper for the instruction + the barrier)
05:04:56 <pikhq> mad: The underlying instruction, sure, but any real-world use would have the appropriate memory barrier.
05:04:56 <mad> ais523 : as opposed to cmpxchg which.... doesn't really need barriers I think?
05:05:12 <pikhq> Because it's not at all helpful if it's not a synchronization primitive. :)
05:05:43 <ais523> mad: well it depends on what the memory sequencing properties of the compare-and-swap are
05:05:53 <ais523> it needs to contain at least a barrier on the things it's swapping
05:06:09 <ais523> but really you need them in order to avoid time paradoxes
05:06:16 <mad> well, the point of compare-and-swap is to have memory order guarantees against some other thread also doing compare-and-swap on the same value
05:06:34 <mad> so presumably it has at least some kind of barrier against itself
05:07:05 <pikhq> That's the "lock" prefix on x86.
05:07:21 <pikhq> Without it, cmpxchg isn't atomic WRT other threads. :)
05:07:25 -!- lleu has quit (Quit: That's what she said).
05:07:28 <ais523> something that happens in Verity at the moment (assignment in Verity is atomic but has no barrier): new x := 0 in new y := 0 in {{x := 1; y := 2} || {y := 1; x := 2}}; print(!x); print(!y)
05:07:41 <ais523> can print 1 1 even if you had a barrier betwen the parallel assignment and the prints
05:08:25 <ais523> this is because there's no barrier between the assignments to x and to y, and in particular, the four assignments can happen /literally/ simultaneously, in which case it's unspecified which ones win
05:08:46 <mad> that seems normal?
05:09:03 <pikhq> Yes, but it's weird to people used to x86's memory model.
05:09:15 <ais523> mad: well there isn't any way to interleave {x := 1; y := 2} and {y := 1; x := 2} that leaves both variables set to 1
05:09:33 <mad> x := 1 happens
05:10:04 <pikhq> Reordering is fun.
05:10:11 <ais523> pikhq: it's not even reordering
05:10:15 <mad> the print() stuff happens on the 2nd thread?
05:10:15 <ais523> it's just simultaneity
05:10:23 <ais523> mad: || is a thread split + join
05:10:24 <mad> after the x:=2
05:10:41 <mad> where's the join?
05:10:49 <ais523> i.e. I temporarily fork into two threads, one does {x := 1; y := 2} and the other does {y := 1; x := 2}
05:10:57 <ais523> || is a fork + join operator
05:11:15 <mad> I guess you're right, that can't happen in the x86 memory model
05:11:23 <mad> unless the compiler reorders the writes
05:11:35 <mad> (which afaik it totally can)
05:11:38 <ais523> in Verity, the compiler doesn't reorder the writes, it's just that all four happen at the exact same time
05:11:58 <ais523> mad: right, in gcc you'd need a compiler barrier
05:12:02 <pikhq> The x86 memory model is one of the stronger ones out there.
05:12:07 <ais523> like "asm volatile ();"
05:12:17 <ais523> to prevent gcc reversing the order of the assignments to x and to y
05:12:23 <mad> pikhq : they probably had no choice :D
05:12:31 <mad> considering all the apps out there
05:12:40 <ais523> well most programs out there at the time were single-threaded
05:12:41 <pikhq> ais523: I'm not sure if that's actually a full compiler barrier.
05:12:51 <ais523> asm volatile (:::"memory")
05:12:53 <pikhq> I tend to use asm volatile("" ::: "memory");
05:13:45 <mad> there's probably less compiler memory op reordering on x86 though
05:13:53 <mad> due to the structure of the instruction set
05:13:56 <pikhq> mad: It's actually a fairly arbitrary choice, given that it would *only* effect programs and OSes that were aware of multiprocessing, and when introduced this was very close to 0.
05:15:04 <mad> I remember that when real multiprocessor systems started to happen there were a few apps that started failing
05:15:12 <mad> not that many tho
05:15:56 <ais523> hmm, Verity's || operator was called , in Algol
05:16:02 <pikhq> Yes, they'd be ones that used threads incorrectly.
05:16:11 <ais523> Verity is an Algol derivative, after all, so it's not surprising it has one
05:16:28 <mad> is {x := 1; y := 2} implicitly unordered?
05:16:28 <ais523> however, it's surprising that it isn't seen more often in modern languages
05:16:32 <pikhq> Hence why it would be not that many -- threading is a bit niche without multiprocessor systems.
05:16:48 <ais523> assignment to x happens before, or simultaneously with, assignment to y
05:17:08 <mad> 'or simultaneously with'
05:17:27 <ais523> a write to a variable cannot happen simultaneously with a write or read that comes earlier
05:17:41 <ais523> and if a write and read happens simultaneously you get the new value
05:17:45 <ais523> there, those are Verity's timing rules
05:17:54 <pikhq> ais523: Huh, that's actually kinda-sorta related to C's , introducing a sequence point, then, isn't it?
05:17:58 <ais523> (by simultaneously, I mean on the same clock edge)
05:18:08 <pikhq> Erm, no, no it isn't.
05:18:28 <ais523> pikhq: for if you want even more detail on how it works:
05:18:40 <ais523> it's call-by-name so naming a variable can be seen a bit like a function call
05:18:48 <ais523> and the same call can't return twice on the same cycle
05:19:07 <ais523> however, for "simple" reads of variables the call can be optimized out
05:19:35 <ais523> (it just looks at the bits in memory directly)
05:20:10 <mad> if all read/writes in a group are to different variables, they can happen all at the same time?
05:20:29 <mad> then I guess they can be reordered no? :D
05:20:38 <ais523> "the same call can't return twice on the same cycle" is the /only/ rule slowing the program down (apart from some corner cases wrt recursion)
05:20:44 <ais523> mad: no, in x := 1; y := 2
05:20:49 <ais523> the write to y can't happen before the write to x
05:20:57 <ais523> it happens simultaneously (same clock cycle) or later
05:21:30 <ais523> (in this particular case it would be simultaneous because 2 is a constant, and thus there's nothing that could delay the write to y)
05:22:49 -!- bender|_ has changed nick to bender|.
05:22:57 -!- bender| has quit (Changing host).
05:22:57 -!- bender| has joined.
05:23:03 <mad> what if you had x := some_calculation; y := 2
05:23:06 <ais523> fwiw I consider this behaviour to potentially be a bug, but we've decided that for the time being at least it isn't (also it makes the program run faster, which is a good thing in the abstract)
05:23:21 <ais523> mad: x and y would be assigned at the same time, when the calculation completed
05:23:39 <ais523> meanwhile x := 2; y := some_calculation would assign x first, start the calculation that cycle, and assign y when the calculation completed
05:23:44 <ais523> which might or might not be that cycle
05:23:52 <mad> what about
05:24:06 <mad> x := some_calculation; y := some_calculation
05:24:48 <mad> how much of y's calculation can overlap with x's calculation?
05:24:55 <ais523> runs the calculation, when it finishes delays one cycle; then assigns the result to x and starts running the calculation again, when it finishes assigns the result to y
05:25:32 <ais523> note the "delays one cycle", this is automatically inserted to fulfil the rule that prevents the same block of code being used for two different purposes at the same time
05:25:49 <mad> what about
05:25:56 <mad> x := some_calculation; y := some_other_calculation
05:26:12 <ais523> those could happen on the same cycle (unless the two calculations involve shared resources)
05:26:25 <ais523> obviously, they only would if some_other_calcuation took zero cycles
05:26:40 <ais523> as some_other_calculation doesn't start until some_calculation has finished
05:26:42 <ais523> and to complete the set
05:26:50 <ais523> x := some_calculation || y := some_other_calculation
05:27:04 <ais523> would run both calculations in parallel regardless of what arguments they took or how long they took
05:27:57 <mad> is this designed for some specific piece of hardware? :D
05:29:19 <ais523> pretty much the opposite: it designs specific pieces of hardware
05:29:29 <ais523> to run the program you entered
05:29:37 <ais523> e.g. via programming an FPGA
05:29:46 <mad> does it compile to verilog or something like that?
05:30:03 -!- lynn has joined.
05:30:27 <ais523> and ofc the big advantage of designing hardware is that you can do things in parallel for free
05:30:36 <ais523> so long as you don't need access to shared resources
05:31:18 <ais523> one of my coworkers is looking into rewriting "x := a; y := b" as "x := a || y := b" if it can prove that the two programs always do the same thing
05:31:32 <ais523> which would give a big efficiency gain without requiring people to place all the || in manually
05:31:51 <mad> that sounds like an aliasing resolution problem
05:32:10 -!- dingbat has quit (Quit: Connection closed for inactivity).
05:33:37 <mad> the standard approach to that is renaming but then it can parallelize the variables but not the name changes
05:33:38 <ais523> well, much of our theoretical research has been in that direction
05:33:53 <ais523> in particular, we statically know whether any two things can share or not
05:34:08 <ais523> we don't have aliasing problems because Verity disallows storing anything other than integers in pointers
05:34:15 <ais523> *integers in variables
05:34:21 <ais523> (in particular, you can't store a pointer in a variable)
05:36:38 <mad> how does it know what to put in dram, block ram and in logic fabric registers?
05:39:20 <ais523> arrays go in block ram, non-array variables in logic fabric (unless a large number of copies are required due to, e.g., them being local to a recursive function)
05:39:31 -!- lambda-calc has changed nick to lambda-11235.
05:39:32 <ais523> dram isn't used by the language itself but you could write a library to access it
05:39:51 <ais523> (assuming you're talking about external ram)
05:39:59 <ais523> ("d" could expand in more than one way here)
05:45:10 -!- bender| has quit (Remote host closed the connection).
05:45:37 <mad> is "array[x] := n || array[y] := m" a compilation error?
05:46:39 <ais523> yes but only because arrays use () for indexing rather than []
05:47:02 <ais523> although, interestingly, "array(x) := n || array(y) := m || array(z) := l" will give you a warning
05:47:24 <ais523> the reason is that you can't do more than two writes to block RAM simultaneously in hardware
05:47:39 <mad> yeah obviously
05:47:45 <ais523> and thus it has to add extra components to serialize the writes so that no more than two happen at a time
05:48:40 <mad> what mode does it use the bram's port in? read_before_write?
05:49:03 <ais523> "warning: made 3 copies of an array's read/write ports" "info: at most two read/write ports can be supported efficiently"
05:49:10 <ais523> and read-before-write, yes
05:49:27 <ais523> not that it matters, all that changes is the behaviour in race conditions
05:50:37 <ais523> that said, I'm currently working on implementing pipelining
05:51:00 <ais523> in which case "array(x) := n || array(y) := m || array(z) := l" would do the writes on three consecutive cycles and thus you wouldn't get the warning
05:51:23 <mad> but then your throughput would go down :D
05:53:21 <ais523> yes; this is something we might want to look at later
05:56:27 <mad> I've been really into trying to find an alternative to RISC/CISC/VLIW for practical CPUs
05:58:29 <mad> it's hard to balance between too static-scheduled (VLIW being simple but stalling easily etc) and too dynamic-scheduled (RISC/CISC start breaking down majorly over about 4 instructions per cycle)
05:59:13 <ais523> as this is #esoteric, I'm wondering if there are any other alternatives
05:59:36 <ais523> even if it's a pretty hppavilion[1] reaction to the problem
05:59:46 <mad> I have some interesting designs but nothing approaching the simplicity of RISC
06:00:21 <ais523> what about a CPS processor?
06:00:34 <ais523> i.e. "run this command, once it finishes running, do this other thing next"
06:00:45 <ais523> although that's pretty similar to hyperthreading, really
06:01:04 <mad> it falls down on what exactly a "command" is :D
06:01:10 <ais523> and there's a reason processors don't run entirely on hyperthreading
06:01:52 <mad> I thought hyperthreading was basically just a way to keep the cpu active when loads have fallen out of data cache and it's that or stalling
06:02:29 -!- XorSwap has quit (Quit: Leaving).
06:02:38 <mad> or, in the case of sparc, a way of wiggling their way out of doing an out-of-order while keeping okay performance :D
06:03:32 <mad> ais523 : what runs in parallel in a CPS processor?
06:04:12 <ais523> mad: I guess you can start multiple commands (well, opcodes) running at the same time
06:04:18 <ais523> basically via the use of a fork opcode
06:04:42 <ais523> the question is, do we also need a join, or do we just exit and run the code for its side effects?
06:04:58 <mad> how do you tell if the opcodes are truly independent or have dependencies?
06:06:01 -!- lynn has quit (Read error: Connection reset by peer).
06:06:35 <mad> the approach I've been looking at is extremely small "threads"
06:06:42 <mad> like, 3 instruction long for instance
06:07:24 <ais523> you don't have to, you just run them whenever they become runnable
06:07:56 <ais523> I guess that if you add join, this is basically just a case of an explicit dependency graph
06:08:08 <mad> if your commands do loads/stores on the same memory you need to know what happens
06:08:13 <ais523> which is a bit different from VLIW
06:08:20 <ais523> but similar in concept
06:08:54 <mad> VLIW dependency is handled by keeping everything in some exact known sync
06:09:53 <mad> compiler scheduler knows the sync and fills the instruction slots
06:10:25 <mad> generally it works well for DSP code (lots of multiplies and adds etc) but not well at all for load-store-jump code
06:10:33 <mad> which is why VLIW is typically used in DSPs
06:11:10 <ais523> well I'm basically thinking of the Verity model but on a CPU
06:11:33 <mad> some CPUs simply run all loads and stores in-order
06:11:36 <ais523> if two things don't have dependencies on each other, you run them in parallel
06:11:44 <mad> everything else can be reordered willy-nilly though
06:12:20 <ais523> this means that the CPU needs to be able to handle large numbers of threads at once (probably a few hundred in registers, and swapping if the registers get full), and needs very cheap fork/join
06:12:23 <mad> ais523 : true, but if your two things are memory addresses calculated late in the pipeline, it's very hard to tell that they have dependencies
06:12:35 <ais523> OTOH, so long as you have enough threads available, you don't care much about memory latency, only bandwidth
06:12:46 <ais523> just run something else while you're waiting
06:12:59 <ais523> this is similar to GPUs but GPUs are SIMD at the lowest levels, this is MIMD
06:13:20 <ais523> mad: well the dependencies would be calculated by the compiler
06:13:36 <mad> compiler can only calculate so many dependencies
06:13:39 <ais523> ideally via the use of a language in which aliasing problems can't happen
06:14:02 <hppavilion[1]> ais523: ALIW and OLIW are some alternatives to RISC, CISC, and VLIW
06:14:03 <mad> in fact the ideal situation for the compiler is that loads and stores never move
06:14:14 <mad> every other instruction is easy to move
06:14:30 <ais523> in most practical languages, though, loads and stores happen a lot
06:14:42 <ais523> hmm, can we invent some sort of functional memory for functional languages?
06:14:44 <mad> it's just calculations and it's all in SSA form so it knows exactly what depends on what and how to reorder stuff
06:14:53 <ais523> i.e. memory never changes once allocated, it can go out of scope though
06:14:59 <hppavilion[1]> ais523: I thought of that once- the ASM of Haskells
06:15:08 <mad> what I was thinking of was C++ with absolutely no pointers
06:15:23 <mad> and every object or array is copy-on-write
06:15:31 <ais523> there have been some experiments of getting it to run on CPU
06:16:02 <mad> no dynamic typing or garbage collection or other slow features
06:16:15 <hppavilion[1]> ais523: What other properties should the FMM have?
06:16:27 <mad> only copy-on-write because it's the one thing that can prevent aliasing
06:17:06 <ais523> mad: not the only thing, you can use clone-on-copy instead
06:17:09 <ais523> it's just slower usually
06:17:36 <ais523> (it's faster for very small amounts of data, around the scale of "if you have fewer bits in your data than you do in an address")
06:17:41 <mad> but then don't you need references if you use clone-on-copy
06:18:30 <mad> references so that you can point to objects that you're going to read from without doing tons of copies
06:18:40 <ais523> I didn't say it was efficient
06:19:11 <mad> that's why I'm suggesting copy-on-write
06:19:26 <ais523> hppavilion[1]: the main problem with a functional memory model is handling deallocation
06:19:39 <ais523> you can a) use reference counts, b) use a garbage collector, c) clone on copy
06:19:54 <ais523> method c) is used by most esolang impls AFAIK
06:20:15 <mad> what do haskell etc use?
06:21:44 <ais523> mad: normally garbage collectors, for most workloads it's the most efficient known solution
06:21:57 <ais523> although it requires a lot of complexity to get it more efficient than reference counting
06:22:41 <mad> can functional programming generate cycles?
06:22:43 <ais523> I personally like reference counting, especially because it allows you to implement an optimization whereby if something is unaliased at runtime (i.e. the reference count is 1), you can just change it directly rather than having to copy it first
06:23:07 <mad> that's what copy-on-write is no?
06:23:27 <ais523> there are language features which can cause cycles to be generated; however, some functional languages don't include those features
06:24:02 <ais523> copy-on-write doesn't necessarily check for refcount 1, some implementations check for never-cloned instead
06:24:25 <ais523> which means that you don't have to update the refcount when something leaves scope
06:24:41 <mad> but what if it was cloned but then the clone went out of scope?
06:24:47 <mad> then you have a useless copy
06:25:07 <ais523> but without a refcount you don't know it's useless until the next gc cycle
06:25:46 <mad> the idea of having COW everything is that also when you need a copy, typically you only need a copy of the topmost layer
06:25:58 <ais523> it's possible that the extra copies are faster than the refcount updating
06:26:02 <mad> ie an object containing a bunch of sub-objects
06:26:14 <ais523> most likely because you're just copying a wrapper that contains a couple of pointers
06:26:24 <mad> if you have to copy the object, you don't need any copy of the sub-objects
06:26:31 <mad> except the ones that are really different
06:26:32 <ais523> and yes, I think we're making the same point here
06:27:33 <mad> how expensive is refcounting anyways?
06:27:37 <mad> it's just +/-
06:27:53 <ais523> it's pretty expensive because it screws up your cache
06:28:12 <ais523> whenever something gets copied or freed, you have to a) dereference it, b) write a word of memory next to it
06:28:37 <ais523> which means that less fits in your cache, and copy and free operations end up bumping something into cache that isn't immediately needed
06:28:47 -!- mysanthrop has changed nick to myname.
06:28:48 <mad> isn't it reading in 1 cache line that's probably going to be read by whatever next object operation on that object?
06:29:02 <ais523> for a free, you probably aren't planning to use the object again for a while ;-)
06:30:00 <mad> well, for a free you start by -- refcount, checking it, it's 0, then you have to go through the whole destructor so that's more accesses to object variables no?
06:31:42 <ais523> oh, you're assuming there's a nontrivial destructor
06:31:54 <ais523> I'm not, destructor is often trivial
06:32:23 <mad> well, it must decrease child object refcounts no?
06:32:31 <ais523> yes, /but/ we're comparing refcounting to GC
06:32:34 <mad> and eventually call free()
06:32:41 <ais523> GC doesn't need to decrease the child object refcoutns
06:33:47 <ais523> so it doesn't have a need to pull the object into cache
06:34:10 <ais523> fwiw, I think there's little doubt that refcounting is better if you have a lot of nontrivial destructors
06:34:15 <ais523> but that doesn't come up very often
06:35:37 -!- lambda-11235 has quit (Quit: Bye).
06:37:00 <mad> it sounds like it depends on the "shape" of the objects you're freeing
06:37:14 <mad> depending on average size and average number of levels
06:38:33 <mad> other issue is
06:38:50 <mad> suppose you have some large global object with some error logger in it
06:39:27 <mad> some function of some small object within that global object does whatever
06:39:33 <mad> and then logs an error
06:40:09 <mad> how do avoid forcing the user to make the function take the large global object as an explicit argument? :D
06:41:01 <ais523> this is one of the largest problems in OO, possibly programming generally
06:41:12 <ais523> there are a lot of proposed solutions but I'm not sure if any of them are actually good ones
06:41:46 <mad> I know only the C++ solution, which is that you store a pointer to the large global object in the small object
06:41:53 <mad> but then that breaks any purity
06:42:18 <ais523> look up dependency injection, it's crazy
06:42:38 <mad> and it introduces a reference cycle
06:42:59 <ais523> err, dependency injection frameworks
06:43:11 <ais523> dependency injection itself is just the concept of passing the large global as an argument
06:43:19 <ais523> but the interest comes from doing it /implicitly/
06:43:36 <ais523> normally via some sort of code transformation, either at compile-time or run-time
06:43:39 <ais523> (which is why it's crazy)
06:44:20 -!- nortti_ has changed nick to nortti.
06:47:04 <mad> without solving aliasing then basically you're designing a cpu for executing C++
06:47:54 <mad> and I don't think it's possible to design a cpu for higher level languages
06:48:31 <mad> because C++ tends to have all the real low latency operations basically
06:48:58 <mad> and in particular the ones that have few sideeffects
06:49:04 <mad> side effects are deadly
06:50:26 <ais523> well I don't think a language can be considered higher-level nowadays if it doesn't provide at least some way to manage side effects
06:51:03 <mad> dunno, aside from functional languages
06:51:23 <mad> my impression is that most high level languages have great tools for CAUSING side effects
06:52:02 <mad> witness all the perl-python-lua-js type of languages that never even got multithreading
06:55:11 <mad> I can't think of any approach other than multithreading and functional-style-purity for managing side effects
06:55:32 <mad> especially long-term side effects
06:56:25 <mad> for short term side effects generally you have the whole LLVM style thing where it uses SSA on non-memory values and then LLVM-style alias resolution loads/stores
06:56:33 <mad> and...that's it!
06:57:27 <mad> unless you count SIMD as a form of side-effect management
06:57:32 <mad> (which I guess it is!)
06:58:04 -!- dingbat has joined.
07:01:10 <mad> that's why the MIPS is still the "top" design in a way
07:01:30 -!- Sprocklem has joined.
07:04:32 <ais523> mad: well Verity compiles via an intermediate language SCI, which has the property that aliasing will fail to compile
07:04:51 <ais523> although it sacrifices quite a lot to accomplish that
07:05:54 <mad> well, it compiles to vhdl so it's essentially a low level language no?
07:05:55 -!- carado has joined.
07:06:50 <ais523> mad: Verity is low level, yes
07:07:04 <ais523> however the principles behind SCI were originally expressed in a language which was (at the time, at least) pretty high level
07:10:40 <mad> if you're going towards agressive threading then the target kind of cpu is pretty clear
07:10:50 <mad> stick in a bunch of in-order RISCs
07:10:58 <mad> as many as you can fit
07:11:32 <mad> each new core = new DCACHE = 1 more potential load per cycle
07:11:50 <mad> or 2 loads if you have a 2 port DCACHE
07:12:38 <ais523> I think you also need to have more threads "ready to go" than you do CPUs
07:12:53 <ais523> so that you can suspend some while waiting for memory access, branch prediction failure, etc.
07:12:59 <mad> you'll probably want some degree of hyperthreading to fill in stalls
07:13:09 <ais523> actually if you have enough hyperthreads you needn't even bother to predict branches
07:13:19 <ais523> just run something meanwhile while working out whether to take them or not
07:14:28 <mad> I think the branch predictor is worth the trouble
07:14:41 <mad> it's not that complex at low IPC
07:15:05 <mad> also at low IPC your pipeline is likely to be short
07:16:00 <mad> this is basically the ultraSPARC
07:16:28 <mad> oriented towards load-store-jump code that has lots of threads
07:16:31 <mad> ie servers
07:17:26 <ais523> you could totally write a compiler to use lots of threads if they were that lightweight
07:17:34 <ais523> and they'd be very load-store-jump-mimd heavy
07:18:15 <mad> you'd need some sort of threading that doesn't have to go through the OS's scheduler
07:19:08 <mad> and get people to use tons of small threads in their code
07:19:35 <ais523> the latter is something that'll be increasingly necessary to increase performance as time goes on
07:19:59 <ais523> and hardware thread scheduling is a natural extension of that
07:20:20 <mad> the problem is that generally if the OS's scheduler is involved, that probably already wipes out your potential benefits in lots of cases
07:20:42 <b_jonas> ais523: have you looked at Rust? I don't remember if it came up yet and whether I've told my first impression opinions.
07:20:47 <mad> also there's a limit to how much threading you can get going
07:21:08 <ais523> b_jonas: yes, this channel used to have a lot of rust discussion
07:21:11 <mad> every cpu you add to a system makes the synchronization system between core memories harder
07:21:24 <ais523> that said, I don't think I know your opinion on Rust, either because you haven't told me or because I've forgotten
07:22:08 <mad> that's starting to sound like the PS3's CELL :D
07:23:11 <ais523> it was ahead of its time
07:23:51 <ais523> NUMA is going to get more and more popular as time goes on, basically because there just isn't really any other option if we want computers to keep getting faster in terms of ability-to-execute-programs
07:24:11 <mad> there's always aggressive SIMD
07:24:48 <mad> which gives you nothing for load-store-jump programs
07:25:07 <mad> but I don't think anything's going to help load-store-jump programs by this point
07:25:55 <b_jonas> mad: simd and numa have different roles. they both help, and I'm very interested in simd, but at some point even if you write optimal simd programs to reduce memory and cache load, you'll run out of memory bandwidth, and numa is the only technically realistic way to increase it
07:26:02 <ais523> the problem with SIMD is that although it's good for some workloads, those are typically the workloads you'd run on a GPU
07:26:15 <b_jonas> ais523: that's not quite true
07:26:18 <ais523> so it's more of a stopgap until people get better at writing multithreaded programs
07:26:31 <mad> CELL worked because video games have some mathy calculations to offload
07:26:57 <b_jonas> ais523: it's that people are buying into the GPU hype and very few people are trying to learn to actually use SIMD and cpu programming in a good way
07:27:16 <b_jonas> (this is partly why I'm very interested about it)
07:27:23 <mad> you can put hundreds of cores on a CPU if they can't access any memory :D
07:27:33 <b_jonas> ais523: yes, there's some overlap, but still, I don't think GPUs will solve everything
07:27:59 <mad> gpus solve one problem, rendering video games
07:28:30 <mad> other problems might see a speed gain only as much as they look like video game rendering :D
07:28:34 <ais523> GPUs actually have similar levels of SIMDiness to CPUs; their strength is that they can run the same code on thousands of threads, but not necessarily with the same control flow patterns
07:29:12 <mad> as far as I can tell the GPU's advantage is that basically memory writes only happen to the frame buffer
07:29:18 <ais523> they're bad at pointer-heavy stuff, and in general, at things with unpredictable memory access patterns
07:29:24 <mad> so GPUs have essentially no aliasing to solve
07:29:55 <ais523> mad: they have block-local storage, which is basically a case of manually-controlled caching
07:30:01 <ais523> where you load and flush the cache lines manually
07:30:15 <mad> once aliasing comes into the picture (or heavy feedback loops) CPUs take the upper hand afaik
07:30:46 <b_jonas> I might be dismissing gpu stuff too much due to how overhyped it is
07:31:08 <ais523> mad: it's mostly just that GPUs are bad at pointers
07:31:27 <mad> it comes down to how few GPU-able problems there are I think
07:31:27 <ais523> aliasing isn't any harder than dereferencing nonaliased memory, they're both hard
07:32:19 <mad> aliasing forces your memory operations to be in-order basically
07:32:36 <mad> and adds lots of heavy checks the more you reorder your operations
07:33:08 <mad> eventually you end up with giant content-addressable-alias-resolution buffers and whatnot
07:33:31 <mad> and everything becomes speculative
07:33:51 -!- mroman has joined.
07:34:17 <ais523> well how useful is unpredictable aliasing from a program's point of view?
07:34:25 <lifthrasiir> b_jonas: SIMD is a good fit for "occasional", "one-off" computations. GPGPU is a good fit for "pervasive" large computations. people seems to easily confuse the differences.
07:34:57 <ais523> lifthrasiir: hmm: what would you say is the best way to zero a large amount of RAM?
07:34:59 <mad> ais523 : it's mandatory to guarantee correctness
07:35:06 <lifthrasiir> (and when one needs occasional large computations, one is advised to avoid them)
07:35:08 <ais523> mad: not from the compiler's point of view
07:35:22 <ais523> how often do you write a program that benefits from aliasing, and can't predict where it happens in advance?
07:35:42 <ais523> lifthrasiir: that didn't seem that stupid to me
07:35:58 <ais523> I was actually thinking that systems might benefit from a dedicated hardware memory zeroer
07:36:10 <ais523> Windows apparently zeroes unused memory in its idle thread
07:36:18 <lifthrasiir> ais523: but I think it is not a good way to approach the problem. why do you need a large amount of zeroed memory after all?
07:36:29 <ais523> as something to do (thus it has a supply of zeroed memory to hand out to programs that need it)
07:36:59 <lifthrasiir> then I guess SIMD or other OS-sanctioned approach is the necessary
07:37:05 <ais523> lifthrasiir: basically a) because many programs ask for zeroed memory; b) you can't give programs memory that came from another program without overwriting it all for security reasons, so you may as well overwrite with zeros
07:37:11 <mad> well, if you write to a variable, eventually you're going to want to read from it
07:37:20 <mad> fundamentally that's aliasing
07:37:26 <ais523> GPGPU could zero GPU memory quickly just fine; the problem is that it uses different memory from the CPU
07:37:30 <ais523> and the copy between them would be slow
07:38:18 <lifthrasiir> DMA is a joke, but the hardware-wired way to zero memory may be somehow possible even in the current computers
07:38:23 <ais523> mad: yes but often both pointers are literals (because you use the same variable name both times), so the aliasing is predictable
07:38:31 <mad> for instance, a delay buffer for an echo effect
07:38:44 <mad> how fast it aliases depends on the delay time you've set
07:39:11 <ais523> yes, that's a good example of a "memmove alias"
07:39:19 <mad> ais523 : aliasing isn't predictable if you use very large array indexes :D
07:39:43 <ais523> I'm kind-of wondering, if restrict was the default in C, how often would you have to write *unrestrict to get a typical program to work
07:39:49 <ais523> mad: larger than the array, you mean? :D
07:40:34 <mad> yeah but the cpu doesn't know the array size
07:40:43 <mad> most of the time even the compiler doesn't know
07:41:01 -!- tromp has quit (Remote host closed the connection).
07:41:12 <ais523> mad: well that at least is clearly something that can be fixed by higher-level languages
07:41:20 <mad> there's also the case of, well, you're accessing a class that has pointers in it
07:41:38 <mad> and it's hard to tell when your code will read out one of those pointers and write to that data
07:42:14 <ais523> you do know what restrict means, right?
07:42:21 -!- AnotherTest has joined.
07:42:34 <ais523> "data accessible via this pointer parameter will not be accessed without mentioning the parameter in question"
07:42:35 <mad> ais523 : higher-level languages can abuse references to cause surprise aliasing
07:43:05 <mad> I wasn't aware of the exact semantics of restrict
07:43:07 <ais523> example? mostly because it'll help me understand what you're considering to be higher-level
07:44:15 <mad> consider a java function working on some array
07:44:23 <b_jonas> “<ais523> [GPUS] they're bad at pointer-heavy stuff, and in general, at things with unpredictable memory access patterns” – are they also bad at unpredictable local sequential access of memory, such as decoding a jpeg-like huffmanized image that's encoded as 256 separate streams, you have an offset table for where the huffman input of each stream and the output of each stream starts,
07:44:38 <b_jonas> and within one stream, you can read the huffman input and the output pixels roughly sequentially?
07:44:41 <mad> then it reads some member variable in one of the objects it has as an argument
07:45:03 <mad> the member variable is a reference to the same array the java function is working on
07:45:09 <mad> and it uses it to poke a value
07:45:38 <b_jonas> “<ais523> I'm kind-of wondering, if restrict was the default in C, how often would you have to write *unrestrict to get a typical program to work” – isn't that sort of what Rust is about?
07:45:42 <ais523> b_jonas: so long as what you're indexing is either a) stored in memory that's fast to read but very slow to write, or b) fits into block memory (basically a manually-controlled cache), you can dereference pointers
07:46:02 <b_jonas> and I don't think that's how restrict in C works
07:46:02 <ais523> b_jonas: it's similar, yes
07:46:25 -!- AnotherTest has quit (Ping timeout: 240 seconds).
07:46:38 <ais523> mad: that's nothing to do with Java being high-level, IMO
07:46:55 <mad> this example applies to most non-pure languages
07:47:03 <ais523> storing a reference to something inside the thing itself is a pretty low-level operation
07:47:05 <mad> like perl and python and whatnot
07:47:23 <mad> well, your function gets some array argument
07:47:24 <ais523> actually, if you do that in Perl, you're supposed to explicitly flag the reference so as to not confuse the garbage collector
07:47:30 <mad> and some object
07:47:43 <mad> and the object has a reference to the array but you don't know
07:48:25 <b_jonas> ais523: well, if there are 256 streams, and you're decoding only one channel at a time and assembling the three channels later in a second pass, then each stream should be at most 8192 bytes long, its output also 8192 bytes long, plus there's a common huffman table and a bit of control information.
07:48:36 <mad> there's no self reference in my example
07:49:06 <ais523> mad: well, say, in SCI (which is designed to avoid aliasing), if you give a function two arguments, any object can only be mentioned in one of the arguments
07:49:08 <b_jonas> Oh, and some local state for each 8x8 block that might take say 512 bytes.
07:49:15 <mad> b_jonas : isn't hufman decoding inherently sequential?
07:49:26 <b_jonas> (I'm assuming a 2048x1024 pixel image, 8 bit depth channels.)
07:49:51 <b_jonas> mad: yes, but if you use a shared huffman table and you mark where each stream starts in the input and output, then you can decode each stream separately
07:50:20 <b_jonas> mad: that is actually practicaly for image decoding, and also for image encoding or video de/encoding, but those get MUCH hairier and more complicated
07:50:22 <mad> ais523 : if it avoids aliasing then it's in a different category
07:50:40 <ais523> mad: I'm saying that putting limits on aliasing is higher-level than not putting limits on aliasing
07:50:46 <b_jonas> mad: note that this is pure huffman encoding, like jpeg, not deflate-like copy operations from a 16k buffer of previous output.
07:50:48 <ais523> because it means that you have more information about the data you're moving around
07:51:07 <b_jonas> mad: the copy operations are why PNG/zip decompression is really impossible to parallelize or implement fast these days
07:51:39 <b_jonas> gzip/zip/PNG made lots of sense when they were invented, but less sense for today's hardware
07:52:03 <ais523> b_jonas: deflate uses references to locations earlier in the output, right? how much would it change if it used references to locations as they were in the input file?
07:52:03 <b_jonas> but JPEG is just as old and ages much better, which is why most modern video formats are similar to it, even if different in lots of specifics
07:52:17 <ais523> in terms of compression ratio
07:52:17 <mad> b_jonas : I guess it works if you have multiple huffman segments that you know the start of
07:52:44 <b_jonas> ais523: I'm not sure, I don't really know about modern compression algorithms, and it probably depends on what kind of data you have.
07:52:50 <ais523> that seems to be GPU-acceleratable, although I haven't worked out the details yet
07:52:50 <lifthrasiir> mad: actually I managed to persue my friend to write the similar thing with the existing deflate stream
07:53:32 <mad> doesn't every huffman symbol basically depend on the previous one?
07:53:42 <b_jonas> ais523: encoding a video also references previous frames, but in a way than I think is much nicer than gzip, because you only reference one or two previous frames, so you can decode per frame. it might still get ugly.
07:53:45 <mad> or specifically the length of the previous one
07:54:06 <lifthrasiir> mad: the point is that DEFLATE uses the end code that is distinctive enough that it can be scanned much quicker
07:54:16 <lifthrasiir> then the friend stucked on the LZ77 window :p
07:55:05 -!- andrew_ has quit (Remote host closed the connection).
07:55:07 <mroman> has anyone ever done some graph related database stuff?
07:55:09 <lifthrasiir> (it was a term project AFAIK, and the friend did get A even though the prototype was only marginally faster)
07:55:19 <b_jonas> Maybe I should write a toy image format and encoder and decoder, just to learn about how this stuff works, even if I don't get anything practically usable.
07:55:24 <lifthrasiir> (since everyone else was doing JPEG decoder stuff)
07:55:33 <ais523> mroman: I looked into it a bit for aimake 4
07:55:39 <ais523> but didn't reach the point where it came to actually write the code
07:55:42 <b_jonas> (There are already lots of practical image coders out there.)
07:55:43 <ais523> so so far, all I have is plans
07:56:20 <mroman> let's assume I have paths in my database A -> B -> D and A -> C -> D
07:56:26 <mad> ais523 : I think "non aliasing" for higher language tends to be a synonym for "pure/no side effects" and often "functional" or maybe even "lazy-evaluated functional"
07:56:52 <ais523> mad: err, the Haskell-alikes have tons and tons of aliasing
07:56:52 <mroman> and I want to know for example if there's a traffic jam on A -> D
07:56:58 <ais523> they're just constructed so that it never matters
07:57:08 <mad> it doesn't HAVE to be this way but afaik all the "no side effects" languages are functionnal
07:57:10 <lifthrasiir> mad: to be more exact: DEFLATE stream stores the (encoded) tree in the front, and the tree is structured so that every prefix code is ordered by the length of code and then by the lexicographical order. since the end code is least frequent it should appear at the very end, i.e. all 1s.
07:57:26 <mad> ais523 : afaik haskell has no real aliasing?
07:57:43 <ais523> > let x = 4 in let y = x
07:57:44 <lambdabot> <hint>:1:14: parse error in let binding: missing required 'in'
07:57:51 <ais523> > let x = 4 in let y = x in y
07:58:05 <ais523> actually GHC probably optimized the aliasing there out
07:58:13 <lifthrasiir> mad: the typical stream has 10--14 one bits for the end code, so the decompressor may try to speculatively decode the stream from that point
07:58:24 <ais523> but x and y would be aliases in a naive Haskell implementation
07:58:31 <ais523> there's just no way to tell from within Haskell itself
07:58:34 <lifthrasiir> (and the project was for CELL processor, quite amenable for this kind of things)
07:58:56 <ais523> because if two things alias, the normal way you tell is either to use a language primitive that tells you that, or to modify one and see if the other changes
07:59:17 <mad> ais523 : yes but they're basically not real aliases because you can't write in one and get surprise changes in the other
07:59:20 <mroman> the traffic jam could be between A -> B, B -> D, A -> C, C -> D or A -> D itself
08:00:00 <mad> multiple readonly pointers to the same block of memory isn't a problem
08:00:00 <ais523> mroman: huh, that's an interesting operation
08:00:12 <ais523> mad: keep going and you'll invent Rust ;-)
08:00:24 <mroman> other questions are: Are there paths from A to D that are not equally fast.
08:00:26 <mad> the problem is when one of this pointers writes something
08:00:42 <mad> and it's impossible to say which other pointers will see the write
08:01:10 <mad> at local level it's usually possible to figure it out (LLVM's alias solving does this)
08:01:18 <mad> at global level it becomes impossible
08:01:23 <ais523> mroman: the SQLite docs have an example of doing transitive closure via a recursive query
08:01:47 <ais523> I'm not sure if the performance is better or worse than running Dijkstra's algorithm from outside with a series of queries
08:01:56 <mad> that's one of x86's "voodoo" advantages
08:02:05 <b_jonas> ais523: I have to afk for some hour now, but I can tell my preliminary opinion on rust later.
08:02:08 <mad> it doesn't require memory reordering to perform well
08:02:14 <ais523> (the constant factor should be better, but the asymptotic performance might be worse if it's using a bad algorithm)
08:02:52 <mad> if it was possible to do more efficient memory reordering then x86 would be gone by now
08:03:41 <mad> some RISC or VLIW would have been twice as fast as x86 and everybody would be switching
08:05:41 <mad> as it is, the best cpu design practice, as far as I can tell, is to assume that loads/stores aren't going to move, and rearrange basically everything else around them
08:07:56 <mad> result: out-of-order execution
08:10:04 <mad> itanium tried to do compile time rearranging with some complex run-time checking+fallback mechanism
08:10:06 <mad> and it failed
08:15:57 -!- Elronnd has quit (Quit: Let's jump!).
08:21:21 -!- Elronnd has joined.
08:41:33 -!- tromp has joined.
08:46:18 -!- tromp has quit (Ping timeout: 276 seconds).
08:54:12 -!- hppavilion[1] has quit (Ping timeout: 244 seconds).
09:00:14 -!- bender| has joined.
09:04:30 -!- olsner has quit (Ping timeout: 276 seconds).
09:09:20 -!- ais523 has quit.
09:21:06 -!- AnotherTest has joined.
09:25:57 -!- AnotherTest has quit (Ping timeout: 268 seconds).
09:29:33 -!- J_Arcane has quit (Ping timeout: 240 seconds).
09:30:48 -!- olsner has joined.
09:36:34 -!- olsner has quit (Ping timeout: 240 seconds).
09:38:37 <HackEgo> [wiki] [[Talk:Brainfuck]] https://esolangs.org/w/index.php?diff=46491&oldid=46410 * Rdebath * (+4885) Shortest known "hello world" program. -- Define "shortest"!
09:45:55 -!- andrew_ has joined.
09:59:25 -!- andrew_ has quit (Remote host closed the connection).
10:13:17 -!- nisstyre_ has changed nick to nisstyre.
10:13:27 -!- nisstyre has quit (Changing host).
10:13:27 -!- nisstyre has joined.
10:16:26 -!- AnotherTest has joined.
10:19:11 -!- int-e_ has changed nick to int-e.
10:25:59 -!- AnotherTest has quit (Ping timeout: 260 seconds).
10:35:23 -!- olsner has joined.
10:42:11 -!- tromp has joined.
10:45:42 -!- jaboja has joined.
10:46:18 -!- tromp has quit (Ping timeout: 244 seconds).
11:37:27 -!- boily has joined.
11:42:25 -!- jaboja has quit (Ping timeout: 240 seconds).
12:16:30 <boily> FUNGOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOT!
12:17:04 <HackEgo> fungot is our beloved channel mascot and voice of reason.
12:18:56 <boily> FireFly: MASCOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOT!
12:19:10 <boily> oops, wrong autocompletion.
12:19:34 <boily> fizzie: MASCOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOT! FUNGOOOOOOOOOOOOOOOOOOOOOOOOT! !?!???!?!?!!???!!!!!!
12:23:22 -!- boily has quit (Quit: NONPLUSSING CHICKEN).
12:51:19 -!- jaboja has joined.
12:53:43 -!- fungot has joined.
13:02:49 <Taneb> fungot, how are you doing
13:02:49 <fungot> Taneb: i'm sure it appeared on l:tu or winxp? ;p
13:09:29 -!- oerjan has joined.
13:36:29 -!- spiette has joined.
13:48:08 -!- AnotherTest has joined.
13:56:01 -!- jaboja has quit (Ping timeout: 240 seconds).
14:28:25 -!- Alcest has joined.
14:30:40 -!- zadock has joined.
14:42:14 <oerjan> @tell mad <mad> can functional programming generate cycles? <-- in haskell it can, e.g. lst = 1 : lst defines a cyclic list, which is nevertheless immutable. (Technically you can in ocaml too, but only for simple constant initializers.)
14:52:33 -!- `^_^v has joined.
14:56:24 -!- lambda-11235 has joined.
15:24:49 -!- UrbanM has joined.
15:28:03 <UrbanM> hi please check out my website . http://sh.st/RptZh... ty :) i promise its not a virus
15:28:45 -!- tromp has joined.
15:30:45 <UrbanM> hi please check out my website . http://sh.st/RptZh... ty :) i promise its not a virus
15:32:13 -!- ChanServ has set channel mode: +o oerjan.
15:32:34 -!- oerjan has set channel mode: +b *!*Master@*.38.31.175.cable.t-1.si.
15:32:34 -!- oerjan has kicked UrbanM You are not _our_ Urban M.
15:33:03 -!- tromp has quit (Ping timeout: 244 seconds).
15:39:29 <int-e> oerjan: of course the immutability of Haskell is a lie.
15:39:54 <int-e> (I'm alluding to thunk updates.)
15:41:21 <int-e> brainfuck guy... yes
15:41:27 <int-e> https://esolangs.org/wiki/Urban_M%C3%BCller
15:41:59 <int-e> (ah, there was a question mark before the ellipsis. I typed that, then googled to confirm.)
15:42:55 <int-e> however... the user above looked more like and imposter
15:44:04 <int-e> sh.st... "shorten urls and learn money"... sounds legitimate
15:49:51 <int-e> so what do we get... googla analytics, tons of ads, some trackers, and did they actually put a captcha before the embedded link?
15:50:06 <int-e> (I'm looking at page source code)
15:51:06 <int-e> and there's a ton of javascript I haven't looked at.
15:52:57 -!- XorSwap has joined.
15:55:41 -!- lambda-11235 has quit (Quit: Bye).
15:57:42 <oerjan> int-e: thus i also mentioned ocaml hth
15:57:47 -!- oerjan has set channel mode: -o oerjan.
16:00:26 <oerjan> btw does ghc allocate a thunk for a simple lst = 1 : lst; lst :: [Int]
16:06:41 -!- bender| has quit (Ping timeout: 250 seconds).
16:06:51 <izabera> jobs outside of italy are so hard to grasp
16:08:16 -!- augur has joined.
16:09:31 -!- mroman has quit (Quit: Lost terminal).
16:12:06 -!- oerjan has quit (Quit: Later).
16:24:24 -!- augur has quit (Remote host closed the connection).
16:24:58 -!- augur has joined.
16:29:38 -!- augur has quit (Ping timeout: 250 seconds).
16:40:29 <int-e> @tell oerjan btw does ghc allocate a thunk for a simple lst = 1 : lst <-- wow, apparently not (checked assembly output from ghc-7.10.2 with -O2, native code gen)
16:43:06 <int-e> @tell oerjan even ghc-7.6.3 didn't allocate a thunk, that's as far back as I can easily go
16:50:47 -!- zzo38 has joined.
16:55:38 -!- Treio has joined.
17:04:31 -!- jaboja has joined.
17:15:35 -!- Treio has quit (Quit: Leaving).
17:17:03 -!- XorSwap has quit (Ping timeout: 240 seconds).
17:44:11 -!- XorSwap has joined.
17:54:06 -!- augur has joined.
18:06:44 -!- augur has quit (Remote host closed the connection).
18:09:19 -!- lambda-11235 has joined.
18:14:01 -!- MoALTz has joined.
18:33:44 <izabera> https://github.com/bloomberg/bucklescript
18:38:19 -!- lleu has joined.
18:39:38 -!- augur has joined.
18:46:04 -!- heroux has quit (Ping timeout: 264 seconds).
18:46:47 -!- XorSwap has quit (Ping timeout: 244 seconds).
18:49:59 -!- augur has quit (Read error: Connection reset by peer).
19:08:07 -!- zadock has quit (Quit: Leaving).
19:11:01 -!- lynn has joined.
19:14:12 -!- heroux has joined.
19:21:10 -!- XorSwap has joined.
19:31:22 -!- hppavilion[1] has joined.
19:40:45 <shachaf> Did you work out those categories?
19:43:54 <hppavilion[1]> shachaf: I'm currently trying to figure out the type of the arrows in example (A)
19:44:12 <hppavilion[1]> ("Type" may not be the correct word, but it gets the point across if I send this message)
19:44:24 <shachaf> The type of an arrow from A to B is A -> B
19:44:46 <hppavilion[1]> shachaf: Yeah, I mean I'm trying to figure out what they represent
19:45:12 <hppavilion[1]> shachaf: I think the only thing I've figured out is that in (A), composition represents the transitive property of ≤
19:45:40 <shachaf> What does identity represent?
19:45:59 <hppavilion[1]> shachaf: The fact that a value is less than or equal to itself
19:50:15 -!- lambda-11235 has quit (Ping timeout: 264 seconds).
19:51:17 <hppavilion[1]> shachaf: Wait, do arrows just represent arbitrary relations?
19:51:22 <shachaf> An arrow doesn't have to represent anything.
19:52:05 -!- lambda-11235 has joined.
19:52:06 <shachaf> Sometimes an arrow is just a cigar.
19:52:32 <int-e> hppavilion[1]: you can interpret any relation on a set as a directed graph with that set as nodes (allowing loops, not allowing multiple edges)
19:52:56 <shachaf> Arrows don't have to represent functions, no.
19:52:58 <hppavilion[1]> I don't smoke, so if it is a type of cigar I wouldn't get the joke
19:53:02 <shachaf> Or transformations, whatever that is.
19:53:19 <int-e> but you really need reflexivity and transitivity to make a category that way
19:53:21 <hppavilion[1]> shachaf: Do arrows have to mean something, or can they just be arrows?
19:53:35 <int-e> they can be just arrows
19:54:29 <int-e> I don't know what example (A) refers to.
19:54:57 <int-e> well, arguably the underlying relation gives the arrow *some* meaning
19:55:12 <int-e> it's really a philosophical question at this point.
19:55:36 <hppavilion[1]> int-e: But do they not represent anything in the way Set has arrows representing functions?
19:56:38 <hppavilion[1]> int-e: Or could it be argued that they represent Void? xd
20:01:01 -!- Phantom_Hoover has joined.
20:17:43 -!- lambda-11235 has quit (Quit: Bye).
20:19:04 -!- XorSwap has quit (Ping timeout: 252 seconds).
20:42:54 -!- p34k has joined.
20:46:09 <zzo38> To allow other program to change resources of a window in the X window system, you could have the other program appends a null-terminated string to a property on that window, and then that client watches that property and reads and deletes it and adds that string into the resource manager. You can also send commands that aren't resources too in the same way, by adding a prefix to specify
20:47:31 <zzo38> Add RESOURCE_MANAGER into the WM_PROTOCOLS list to specify that this function is available, I suppose.
20:48:03 -!- spiette has quit (Ping timeout: 240 seconds).
20:48:17 <zzo38> Does it make sense to you?
20:52:17 <zzo38> The format of the property must be 8, the type must be STRING, and the mode must be PropModeAppend.
21:03:01 -!- spiette has joined.
21:05:16 -!- `^_^v has quit (Quit: This computer has gone to sleep).
21:17:12 -!- augur has joined.
21:24:33 -!- augur has quit (Ping timeout: 240 seconds).
21:30:16 -!- ais523 has joined.
21:33:19 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
21:33:54 -!- hppavilion[1] has joined.
21:34:16 -!- spiette has quit (Quit: :qa!).
21:35:00 -!- spiette has joined.
21:39:22 -!- hppavilion[1] has quit (Ping timeout: 252 seconds).
21:47:31 -!- J_Arcane has joined.
22:04:25 -!- AnotherTest has quit (Quit: ZNC - http://znc.in).
22:43:27 -!- spiette has quit (Quit: :qa!).
22:47:13 -!- jaboja has quit (Remote host closed the connection).
22:50:31 <b_jonas> I'm trying to line up the Szabó Lőrinc translation and the original of Tennyson: Ulysses exactly. But it turns out the translation is one line shoter.
22:50:50 <b_jonas> It's missing the line that would correspond to “Death closes all: but something ere the end,”
23:08:27 -!- ais523 has quit.
23:27:37 -!- oerjan has joined.
23:27:46 -!- shikhin has changed nick to shikhun.
23:28:17 -!- shikhun has changed nick to shikhin.
23:28:21 <lambdabot> int-e said 6h 47m 51s ago: btw does ghc allocate a thunk for a simple lst = 1 : lst <-- wow, apparently not (checked assembly output from ghc-7.10.2 with -O2, native code gen)
23:28:21 <lambdabot> int-e said 6h 45m 14s ago: even ghc-7.6.3 didn't allocate a thunk, that's as far back as I can easily go
23:34:03 -!- FreeFull has quit (Quit: Rebooting).
23:36:13 -!- FreeFull has joined.
23:41:15 -!- b_jonas has quit (Ping timeout: 250 seconds).
23:42:17 -!- b_jonas has joined.
23:43:30 -!- p34k has quit.
23:43:37 -!- hppavilion[1] has joined.
23:47:52 -!- boily has joined.
23:48:12 <boily> fungot: fungellot.
23:48:13 <fungot> boily: it is edited to remove the 0 parameter? i was thinking
23:48:20 <boily> fungot: no you weren't.
23:48:21 <fungot> boily: ( code is 2.1mb so that may not have
23:48:26 <fungot> boily: wait a minute!! i am having trouble with this stub generator. it has.
23:48:47 <boily> fungot: stub generators suck, stubs suck, and asynchronous services especially suck.
23:48:47 <fungot> boily: sperber was here mar 17 at 11:11 pm utc, saying: or check out file-select and tcp-listener-fileno
23:48:53 <oerjan> "it has." seems a bit too stubby indeed.
23:50:22 <shachaf> @@ @tell oerjan @@ @@ (@where weather) ENVA KOAK
23:50:58 <lambdabot> Plugin `compose' failed with: <<timeout>>
23:51:28 <shachaf> boily: Good afternoon, person.
23:52:04 <oerjan> boily: i dunno but he was there mar 17 hth
23:52:25 <shachaf> mar 17 hasn't happened yet
23:52:43 <oerjan> then why is fungot using past tense, duh
23:52:44 <fungot> oerjan: with the procedure for-each? ie i have a question about static links. i really should read up on macros? like atom?
23:53:13 <boily> time to a fungot is an irrelevant concept hth
23:53:14 <fungot> boily: i don't apply this level of dynamic typing... it mentioned that static typing is in the browser while allowing quick access to the enclosing command.
23:53:26 <oerjan> fungot: are you a dreen
23:53:26 <fungot> oerjan: because bash gets exactly 3 parameters with that invocation, and 0 added to any number of arguments, you have
23:54:41 <fungot> shachaf: some may.....but not all. but many more possibilities than chess. many. most things just work. at least now atm
23:58:26 * boily wraps fungot in a chicken costume
23:58:27 <fungot> boily: and i think he said some weird things involving crazy symbols and actions. i'm purely interested in the same ballpark, and roughly between chicken and stalin might be one way of doing that
23:59:20 -!- grabiel has joined.
00:00:33 <HackEgo> grabiel: Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
00:00:34 <boily> . o O ( there should be a way to make my IRC client autocomplete `relcomes or something... )
00:01:43 -!- grabiel has left.
00:03:03 <Yurume> http://www.emojicode.org/
00:03:17 <Yurume> oh, well. yet another emoji craze
00:03:35 <boily> Yurumello. have I ever seen you before?
00:03:50 <Yurume> I am an alter ego of lifthrasiir
00:04:13 -!- augur has joined.
00:05:55 <shachaf> boily: tdh didn't help htdh
00:06:09 <HackEgo> HtDH is a classic text on How to Design Hotdogs or possibly Hogprams. It is all about functional condiments, and was co-authored by Herence Tao and Don Ho.
00:06:19 <oerjan> boily: that was a canaima, you should have used `bienvenido hth
00:06:43 <HackEgo> oerjan oerjan elliott Bike FreeFull cpressey cpressey cpressey
00:06:46 <shachaf> oerjan: what should a variant of culprits that looks in wisdom/ be called
00:09:41 -!- augur has quit (Remote host closed the connection).
00:10:53 <lambdabot> *** "pundit" wn "WordNet (r) 3.0 (2006)"
00:10:54 <lambdabot> n 1: someone who has been admitted to membership in a scholarly
00:10:54 <lambdabot> field [syn: {initiate}, {learned person}, {pundit},
00:11:06 * boily mapoles oerjan (0.5 shachafs)
00:11:41 <HackEgo> "Only sane man" boily is monetizing a broterhood scheme with the Guardian of Lachine, apparently involving cookie dealing. He's also a NaniDispenser, a Trigotillectomic Man Eating Chicken and a METARologist. He is seriously lacking in the f-word department.
00:11:43 <hppavilion[1]> zzo38: I found a game called TIS-100 on steam and recently bought it
00:11:49 <oerjan> boily: the "pun" at the beginning wasn't the deciding factor hth
00:12:03 <shachaf> oerjan: and yet you punned it anyway
00:12:13 <boily> it was half a funpuns, so 0.5 shachafs.
00:12:14 <lambdabot> CYYZ 040000Z 08006KT 15SM FEW050 BKN160 M05/M10 A3015 RMK SC2AC5 SLP222
00:12:15 <hppavilion[1]> zzo38: It's an ASM programming game for a massively-parallel architecture called the TIS-100 (Tessellated Intelligence System)
00:12:29 <boily> he\\oren\. did you get blizzarded?
00:12:33 <shachaf> @@ @@ (@where weather) cyyz
00:12:36 <lambdabot> CYYZ 040000Z 08006KT 15SM FEW050 BKN160 M05/M10 A3015 RMK SC2AC5 SLP222
00:13:03 <\oren\> um wtf is @@ @@ supposed to do
00:13:39 <\oren\> stupid haskull line noise
00:14:01 <oerjan> the rube goldberg weather forecast
00:15:08 <lambdabot> @@ executes plugin invocations in its arguments, parentheses can be used.
00:15:08 <lambdabot> The commands are right associative.
00:15:08 <lambdabot> is the same as: @@ (@pl (@undo code))
00:16:07 <oerjan> hm is @@ a kind of join
00:16:21 <shachaf> \oren\: it's not haskell syntax hth
00:16:45 <shachaf> haskell more like has kool
00:16:51 <shachaf> gains kool until end of turn
00:18:34 <oerjan> shachaf: extra points for using the original hindi पण्डित hth
00:28:14 -!- lambda-11235 has joined.
00:33:27 <fizzie> We had a TIS-100cussion on the channel at least once.
00:34:23 <fizzie> (The game, not the discussion.)
00:36:25 <fizzie> It might not quite count as massively parallel, wasn't it at most something like 3x4 nodes?
00:38:11 -!- tromp has joined.
00:39:22 -!- Alejandro15 has joined.
00:39:27 <hppavilion[1]> fizzie: In theory, it actually has thousands upon thousands of nodes
00:39:40 <HackEgo> Alejandro15: Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
00:40:08 <fizzie> Oh, I didn't parse the backstory like that at all, but I guess that's likely true, since it's always different nodes that are broken.
00:40:24 <hppavilion[1]> fizzie: Yep, I was going to say that, but the message changed xD
00:40:42 <hppavilion[1]> fizzie: What's the high-level equivalent of massively parallel?
00:40:55 <boily> Alejandro15: ¿habla usted español?
00:42:33 <hppavilion[1]> fizzie: I imagine in high-level massively parallel computing, you can create new ports at runtime
00:43:00 -!- Alejandro15 has quit (Quit: Leaving.).
00:43:01 <boily> massively parallel computing is a bitch. but at least there's MPI. I love MPI.
00:43:21 <boily> oerjan: see, I asked something in Spanish and he didn't even answer!
00:43:41 <boily> https://en.wikipedia.org/wiki/Message_Passing_Interface
00:44:14 <boily> MPI: simple, easy to grok, useful, documented to hell and back, and pragmatic.
00:44:43 <boily> no, I did some research stuff with heavily parallelized SVMs a few years ago.
00:44:49 * hppavilion[1] awaits a joke about how MPI was in bed- something about practically being in two places at once or something
00:45:03 <boily> I don't joke, I am sane.
00:45:10 <boily> (well, I don't joke that much.)
00:45:10 <oerjan> boily: i think cantv.net also implies canaima hth
00:45:23 <boily> oerjan: why I Spanished.
00:46:55 <oerjan> "Compañia Anónima Nacional Teléfonos de Venezuela"
00:47:10 <hppavilion[1]> fizzie: It's also interesting that the pattern of broken nodes is consistently the ones that you might want to use
00:48:35 <boily> next Venezuelan to join the chännel, everybody should switch to Spanish. maybe we'll catch one!
00:49:45 <oerjan> ok, canaima and cantv are not quite the same thing, but connected.
00:51:18 -!- lynn has quit (Ping timeout: 246 seconds).
00:51:32 -!- tromp has quit (Remote host closed the connection).
00:52:24 <oerjan> <boily> I don't joke, I am sane. <-- * now imagining a batman villain saying that...
00:53:57 <oerjan> it probably doesn't end well for em.
00:56:30 <hppavilion[1]> fizzie: What would be a good architecture for an ASM game?
00:56:39 <Taneb> Phantom_Hoover, I found out today that one of the people I play D&D with is on the York submarine jousting team
00:59:08 <oerjan> Taneb: are you trying to keep this up until actual submarines are jousted twh
00:59:44 <Taneb> oerjan, I started it because I forgot what the sport was called
01:00:00 <Taneb> Keeping it up because somehow "submarine jousting" sounds less silly than the truth
01:02:28 -!- Elronnd has changed nick to ProzacElf.
01:06:18 <shachaf> fizzie: YOu didn't like the discussion?
01:08:38 -!- ProzacElf has changed nick to Elronnd.
01:08:57 <Taneb> Phantom_Hoover, I didn't feel it polite
01:09:03 <Taneb> He did comment that your team were very good
01:10:29 <hppavilion[1]> oerjan: No, Taneb means jousting underwater- it's sub-marine jousting
01:10:39 <fizzie> hppavilion[1]: If you mean real architectures (games for some reason tend to prefer made-up ones), for some reason my first thought would be the Z80.
01:11:10 <hppavilion[1]> fizzie: Not a specific architecture; a general architecture paradigm
01:11:47 <fizzie> Oh. I'd just do something that actually exists. I'm not sure how that would turn out to be a "game", though.
01:12:44 <hppavilion[1]> fizzie: I think the point of those games is that the creators enjoy making the architecture
01:14:01 <fizzie> The DCPU-16 had really silly operand encodings.
01:15:26 <Phantom_Hoover> Taneb, this is of course true, was he on their A or B team though
01:15:34 <oerjan> hppavilion[1]: shut up and don't crush my dreams
01:16:15 <hppavilion[1]> fizzie: Oooh, perhaps the arch for this game could use those negative-level MOVs?
01:16:29 -!- 7YUAAGGC0 has joined.
01:16:58 <Taneb> Phantom_Hoover, I don't know, although he certainly didn't deny it when I asked if he'd played Warwick recently
01:19:28 <Phantom_Hoover> york A were good last time we played them, they just ended up in a tough group this year
01:20:28 <fizzie> There's always the time-honoured thing of taking some feature that actually exists (say, pipelines with delay slots) and just going overboard with it.
01:22:23 <Taneb> Anyway, I'm going to bed now
01:25:30 <HackEgo> alg. ii/Algae II, the successor class to Algae I. Discusses hydroponics and such.
01:26:29 <boily> `` sed -i 'sa\aeaæa' wisdom/alg*
01:27:29 <HackEgo> wisdom/algebraic number theory \ wisdom/alg. ii \ wisdom/algol \ wisdom/algorithm
01:27:45 <HackEgo> wisdom/alg. ii:Algæ II, the successor class to Algae I. Discusses hydroponics and such.
01:28:29 <HackEgo> rm: cannot remove `/home/hackbot/hackbot.hg/multibot_cmds/env/.hg/store/data/canary.orig': Is a directory \ Done.
01:34:35 <hppavilion[1]> fizzie: One of the interesting things we can do with ASM games is have features that are nigh-impossible on real computers
01:43:21 <mad> register sets?
01:48:15 -!- Phantom_Hoover has quit (Read error: Connection reset by peer).
01:53:15 -!- lleu has quit (Quit: That's what she said).
02:07:05 <mad> does it have entanglement between multiple registers?
02:09:15 <mad> dang this cpu design idea I'm trying to develop is so hard to get anywhere
02:10:43 <mad> (the thing where you have an accumulator and chains of related operations are issued together on an execution unit and run sequentially on the accumulator)
02:13:44 <mad> I'm trying to find a compromise between too much dynamic scheduling (the problem on out-of-order RISCs) and too much static scheduling (the problem on VLIWs)
02:16:15 <mad> and the complexity spirals out of control
02:19:40 -!- boily has quit (Quit: BRANCHING CHICKEN).
02:22:59 <mad> yet it's close enough to a solution that I get all obsessed
02:25:24 <mad> 1 instruction is something like
02:27:26 <mad> 4 renames - one for each regfile partition (partition 0 is r0,r4,r8,r12,r16,r20,r24,r28, partition 1 is r1,5,9,13,17,21,25,29, partition 2 is r2,6,10,14,18,22,26,30, partition 3 is r3,7,11,15,19,23,27,31). each of the 4 renames can also be replaced by a nop.
02:29:03 <mad> 8 writebacks. each writeback must use one of the 4 renames. also, you have a flag to indicate the last writeback for each of the 4 regfile partitions (the one that gets written to the regfile for real)
02:33:31 <mad> 8 microthreads. each microthread contains a block of instructions that gets assigned to one execution unit and executed sequentially. each instruction is in the form of [alu op][reg x][reg y/immediate], with the result written to the accumulator and optionally written to a regfile register(corresponding to one of the 8 writebacks). each register operand can be either one of the 32 permanent register, the accumulator, or one of the 8 writebac
02:34:44 -!- oerjan has quit (Quit: Nite).
02:35:47 <mad> 4 or 8 memory operations(not sure of the limit to set yet) (either loads or stores or nops). the order of memory operations is preserved even though the microthread execution is fully reordered.
02:36:28 <mad> offset to the next instruction (probably with some forced alignment - maybe 16bytes)
02:37:34 <mad> the idea of the whole thing is that it can be issued in 1 cycle
02:37:38 <mad> at least in theory
02:39:41 <mad> the register renamer grabs 8 free physical registers, changes up to 4 physical register assignments to architectural registers
02:40:31 <hppavilion[1]> mad: I'm trying to come up with interesting designs for CPUs, implementable or not, if you're curious.
02:40:40 <hppavilion[1]> No, no entanglement; I guess it's not fully quantum
02:41:15 <mad> it does all the renames of every register operand in parallel (which can be done in 1 cycle since the effect of renaming registers within an issued instruction is done beforehand)
02:41:44 <hppavilion[1]> fizzie: The difficulty with TIS-100 is that you have a limit of 15 instructions/node
02:41:45 <mad> I'm obsessed with making it implementable too
02:42:44 <hppavilion[1]> It's logical to have limitations (except that labels count as lines, which is bullshit), but 15 lines is a little too small (also, 15 isn't a power of 2)
02:49:53 <mad> for instance this sample resampling loop comes down to 2 instructions:
02:50:04 <mad> shr ph 16, lds [sb + ac*2] -> d0
02:50:04 <mad> add ph $10000, shr 16, lds [sb + ac*2] -> d1
02:50:04 <mad> and ph $ffff -> d2
02:50:04 <mad> lds [bu] -> d3
02:50:05 <mad> sub d1 d0, mul d2, sar 16, add d0 -> d0, mul vl, sar 16, add d3, st [bu]
02:50:05 <mad> lds [bu+4] -> d3
02:50:06 <mad> mul d0 vr, sar 16, add d3, st [bu+4]
02:50:13 <mad> add vl rl -> vl
02:50:13 <mad> add vr rr -> vr
02:50:13 <mad> add ph fr -> ph
02:50:13 <mad> add bu 4 -> bu, cmp be, jz loop
02:52:54 <mad> the first instruction has 7 microthreads, 6 writebacks (-> d0, -> d1, -> d2, -> d3, -> d0, -> d3), 4 renames (d0 d1 d2 d3), 6 load/store operations (lds [sb + ac*2], lds [sb + ac*2], ld [bu], st [bu], ld [bu+4], st [bu+4])
02:53:46 <mad> second instruction has 4 microthreads, 4 writebacks (-> vl, -> vr, -> ph, -> bu), 4 renames (vl vr ph bu)
02:54:04 <mad> assuming that vl, vr, ph and bu are in different regfile partitions
02:57:41 <mad> assuming that the subinstructions take 2-4 bytes each, the first instruction takes somewhere between 40-80 bytes, second one about 12-24 bytes
02:58:19 <mad> presumably to keep it busy you'd need an instruction cache at least 32 bytes wide
02:59:18 <mad> if stars align in theory it can run the whole loop in 2 cycles per iteration
03:01:14 <mad> a possible design is that the subinstructions go in normal instruction cache, and the renaming info that tells how to run it in parallel is generated on the fly and stored in a trace cache
03:01:45 <mad> so on first iteration it runs at like 1 instruction per cycle and analyzes the instruction sequence for how to parallelize it
03:02:12 <mad> and stores that in a trace cache so that next iteration is super parallelized
03:04:35 <mad> it would probably need a really wide data cache to run that fast too
03:05:03 <mad> like the kind of monstruously complex banked data cache that does 2 loads + 1 store per cycle you find on modern CPUs
03:07:01 <mad> in theory it doesn't need 2 register file ports per execution unit either, but I'm not sure how to ration that intelligently
03:07:19 <mad> because some instructions need 2 ports, some need 1, some need 0
03:08:38 <mad> also it has the weakness that the register renamer needs to know which execution unit will get which writeback (because they actually are separate register files for each execution units, read ports are shared but write ports aren't)
03:10:07 <mad> so yeah the whole thing works in theory but in practice is overly complex and probably needs to be cut down
03:10:23 <mad> and it's probably not well balanced
03:12:30 -!- XorSwap has joined.
03:13:10 <lambdabot> http://www.haskell.org/haskellwiki/Game_Theory
03:13:41 <hppavilion[1]> I was hoping that would lead to wikipedia, but in retrospect that seems silly
03:13:51 <mad> in theory you could make a VLIW version of the above but I think it would be very hard to properly static schedule
03:14:02 <mad> and it would probably stall way too easily
03:14:06 <mad> what's OLIW?
03:14:12 <HackEgo> /home/hackbot/hackbot.hg/multibot_cmds/lib/limits: line 5: exec: wiki: not found
03:14:28 <mad> how is it better
03:14:41 <mad> aside from burning through instruction cache faster
03:14:58 <hppavilion[1]> mad: OLIW has instruction sets within instruction sets
03:15:05 <hppavilion[1]> http://pastebin.com/wz3WwSbF is an example of an OLIW architecture
03:15:06 <mad> also the cpu I described above is a pretty good candidate for OLIW :D
03:15:37 <mad> 64byte instruction words aren't for the faint of hearth
03:17:40 <hppavilion[1]> mad: Mine maxes out at 2752577 bytes per instruction word
03:18:19 <mad> how is that electrically possible
03:18:25 <hppavilion[1]> ("Instruction word" doesn't really apply at this point though; it's more of an instruction paragraph)
03:20:05 <hppavilion[1]> mad: I mean, it might be implementable on hardware, because it doesn't use all 2752577 bytes at a time
03:20:24 <mad> dunno, does it have latency causing characteristics?
03:21:14 <hppavilion[1]> mad: It has properties like instruction words having length headers
03:22:01 <hppavilion[1]> mad: Did you /want/ something with the word "Obscenely" in it to be practical?
03:23:19 <mad> I also have a hard time figuring out what all those fields mean
03:24:06 <mad> not if you can't make it short
03:24:33 <mad> it looks like it has 0..65535 conditions
03:24:55 <mad> what's the condition group thing
03:24:56 <hppavilion[1]> mad: Instructions are basically a long list of normal ALU instructions (something you might find in a real machine) enclosed in a giant WHILE loop
03:25:21 <hppavilion[1]> mad: The condition is a series of instructions from a separate instruction set within the main one
03:25:49 <hppavilion[1]> mad: The condition is divided into groups, and the while loop- when checked- terminates when /all/ conditions are true in /any/ of the groups
03:27:09 <mad> what are the condition instruction arguments and why are they *8
03:27:42 <hppavilion[1]> mad: Condition instruction arguments are the things the condition checks!
03:28:11 <hppavilion[1]> And they're *8 because I didn't understand ISAs at the time, but each argument is 8 bytes that references a memory location
03:28:42 <mad> is that an absolute address or it's coming from some calculation?
03:29:24 <hppavilion[1]> mad: I'm not a pro with ISAs. I don't even know for certain what that question means.
03:29:30 <hppavilion[1]> However, if my guess as to what it means is correct
03:29:48 <mad> are they like 64bit memory addresses?
03:29:59 <hppavilion[1]> It doesn't matter really, it depends on the exact design
03:30:21 <mad> what are the body flags
03:31:14 <mad> where does it store the results?
03:31:38 -!- augur has joined.
03:32:08 <hppavilion[1]> I made this a month or two ago (while talking to you, IIRC), and didn't kept detailed notes
03:32:14 -!- augur has quit (Remote host closed the connection).
03:32:20 <hppavilion[1]> If you like, I can make a better one with detailed documentation
03:32:31 <mad> no I guess I've had my fill
03:32:51 <mad> like it does have obscenely large instructions
03:32:54 <mad> but that's about it
03:33:28 <hppavilion[1]> mad: Also, compiling to it (or even programming in its ASM) is completely different
03:33:54 <hppavilion[1]> mad: It includes nonnesting WHILE loops as a primitive rather than JMPs, which makes it very different
03:34:14 <mad> considering that every instruction loads tons of stuff from memory it's not like compilation can be efficient anyways
03:34:54 <hppavilion[1]> mad: It's an esolang, really, or at least an outline for it
03:35:19 <mad> it's more an esolang than a cpu ues
03:37:35 <hppavilion[1]> It is implementable on hardware conceivably, just not efficiently or in small space
03:38:22 <mad> you can implement a MIPS that runs an emulator :D
03:41:28 <mad> if you can get the emulator to do a memory load per cycle it's not even slower than the real thing
03:44:00 -!- feliks has joined.
03:48:35 -!- augur has joined.
03:49:33 -!- J_Arcane has quit (Ping timeout: 240 seconds).
03:53:04 -!- augur has quit (Ping timeout: 260 seconds).
03:55:06 -!- augur has joined.
03:58:05 <hppavilion[1]> Oh... oh god https://www.youtube.com/watch?v=Mk3qkQROb_k
04:13:46 <mad> hppavilion[1] : that's... wrong
04:14:49 <hppavilion[1]> mad: It must be so hard for people who program in java to make funny comments written in code...
04:23:52 -!- heroux has quit (Ping timeout: 264 seconds).
04:24:28 -!- heroux has joined.
04:27:41 -!- clog has quit (Ping timeout: 250 seconds).
04:33:23 -!- XorSwap has quit (Read error: Connection reset by peer).
04:33:52 -!- XorSwap has joined.
04:36:46 -!- bender| has joined.
04:37:53 -!- FreeFull has quit (Ping timeout: 268 seconds).
04:38:30 -!- idris-bot has quit (Ping timeout: 268 seconds).
04:43:12 <mad> is there a good scripting language with no garbage collector (and possibly no dynamic typing) ?
04:44:41 <mad> I'm asking because at work we do VST plugins at it would be nice to have a scripting language for doing stuff like envelopes and lfos and modulations and custom arpeggiators but the standard options like LUA can't be used because of the really short latency constraints
04:45:02 <pikhq> Tcl's even meant to be embedded.
04:45:16 <deltab> manual memory management in scripting?
04:45:39 <deltab> maybe what you need to *control* over the gc
04:46:03 <mad> GC would need absolutely no "stop the world"
04:46:12 <mad> not even 1ms
04:46:45 -!- fungot has quit (Ping timeout: 250 seconds).
04:46:48 <shachaf> whoa whoa whoa, GC that doesn't need to stop the world?
04:46:50 <mad> basically there generally can't be any memory allocation/freeing on the audio thread generally
04:48:10 <mad> like if it allocates memory as part of how it calculates stuff (like writing array values in a lot of script languages) then it can't work
04:48:54 <pikhq> You're gonna have a hard time then.
04:49:36 <zzo38> A small kind of Forth may be done?
04:49:47 <shachaf> pikhq: Have you had fund learning about the intricacies of HotSpot GCs?
04:49:59 <pikhq> shachaf: Not personally.
04:50:11 <mad> zzo38 : guess it could work out in theory
04:50:39 <pikhq> ... Though I predict it'll come up.
04:50:56 <zzo38> hppavilion[1]: Well, you could ask me question if you have any, I suppose (but I am not guaranteed to know the answer)
04:51:12 <mad> in tcl feature list: "All data types can be manipulated as strings, including source code. Internally, variables have types like integer and double, but converting is purely automatic."
04:51:31 <mad> this is exactly the kind of features that I want it to NOT have
04:51:42 <mad> no freaking dynamic typing
04:51:45 <pikhq> So... You don't want a scripting language.
04:51:50 <pikhq> Might I recommend Forth?
04:51:50 <zzo38> mad: With Forth generally you preallocate so you can avoid these problems.
04:52:17 <zzo38> pikhq: Yes that is what I would think, too
04:52:41 <hppavilion[1]> mad: Dynamic typing is when you can change the type of a variable (something that was once a string can now be an int) in an unregulated fashion (it isn't just retyping)
04:52:53 <hppavilion[1]> mad: Static typing is what C has, where variables MUST NOT CHANGE TYPE EVER
04:53:06 <hppavilion[1]> mad: Strong typing is where conversions aren't done automatically
04:53:11 <pikhq> zzo38: Yup. It's basically the perfect language for this problem domain: small embeddable language with easily measurable and consistent performance characteristics.
04:53:12 <mad> in C variables simply cannot change type
04:53:58 <hppavilion[1]> mad: And weak typing- what TCL apparently has- is where values change type based on what's needed ("I know you just tried to add an int to a string, which doesn't make sense, but let's just pretend the int is a string too")
04:54:40 <pikhq> hppavilion[1]: Tcl's semantics (it's not an acronym BTW) are more that all values are strings.
04:54:55 <zzo38> In C a variable has a type which is declared and isn't changed; in JavaScript a variable doesn't have a type, a value has a type and any value can be stored in any variable.
04:55:23 <deltab> but usually written Tcl
04:55:52 <mad> isn't perl typing like javascript typing except it doesn't have integers?
04:56:00 <mad> or numbers that aren't strings
04:56:00 <pikhq> Nah, Perl does not have stringly typed semantics, at all.
04:57:15 <pikhq> ... In Tcl, an implementation which literally stored everything as actual char* strings would be perfectly reasonable (if a little inefficient).
04:58:41 <mad> irl I need about 2 variable types
04:58:46 <mad> and array of float
04:59:44 <deltab> maybe you need a shader language
05:00:00 <mad> shader languages share some characteristics yes
05:00:06 <mad> though they don't allow feedback
05:01:09 <mad> the one language of this type in the wild is jesusonic
05:01:19 <mad> but it's kindof rough
05:01:48 <zzo38> I think you can just make a simple Forth implementation and use that.
05:02:44 <mad> yeah if I can convince potential users to live with forth's weird syntax ;)
05:04:14 <zzo38> Although different from other programming languages, I think it is reasonable for what it does.
05:11:59 -!- hppavilion[1] has quit (Ping timeout: 244 seconds).
05:18:01 -!- Sgeo_ has joined.
05:20:16 -!- Sgeo has quit (Ping timeout: 252 seconds).
05:27:48 <zzo38> Can you please tell me if this document is good: https://www.npmjs.com/package/remote-xlib
05:28:16 <zzo38> You can plesae complain about what is wrong with it, so that I can fix it please.
05:33:22 -!- adu has joined.
05:36:35 <zzo38> Example program is http://sprunge.us/ZMdg
05:38:31 <zzo38> If you click inside of the window then it makes a pie chart centered at the clicked position.
05:41:11 <zzo38> (Tell me feature request too)
05:52:17 -!- XorSwap has quit (Ping timeout: 244 seconds).
06:02:36 <zzo38> Hello, what do you want please?
06:03:55 <adu> I don't want anything
06:05:02 <zzo38> But do you know answer of my question?
06:05:46 <zzo38> (I mean my other question before you join)
06:25:02 <adu> zzo38: how am I supposed to know?
06:25:22 <adu> zzo38: what was your question?
06:26:25 <zzo38> You can know by the log, but I can repeat it anyways
06:26:54 <zzo38> Can you please tell me if this document is good: https://www.npmjs.com/package/remote-xlib You can plesae complain about what is wrong with it, so that I can fix it please. Also you can make comment about feature request, and other comment/complaint/question too
06:27:31 -!- clog has joined.
06:29:48 <adu> zzo38: where is the log?
06:30:54 <zzo38> The IRC log is mentioned in the topic message it is http://codu.org/logs/_esoteric/ but anyways I already repeated my question so that you do not have to
06:32:04 -!- hppavilion[1] has joined.
06:32:46 <adu> zzo38: ah, topic, I always forget to look there
06:33:09 <adu> my client requires that I click a few things to get to the topic
06:34:02 <adu> zzo38: are you looking for HTML validation or English grammar?
06:34:55 <zzo38> Neither (I didn't write the HTML of the webpage anyways); I mean about if the document is clear, if it is sensible, etc
06:35:43 <adu> zzo38: ah, so English grammar
06:37:04 <zzo38> And if something is missing, too.
06:37:40 <zzo38> If it doesn't specify correctly how to use the program, or if perhaps some part of the program is wrong or is missing, that is what I mean too.
06:38:09 <adu> zzo38: "documentations assume" => "documentation assumes"
06:38:42 <adu> zzo38: "These documentations assume" => "This documentation assumes"
06:39:36 -!- FreeFull has joined.
06:40:28 <adu> zzo38: also, the relationship between ASCII and 16-bit characters are unclear,
06:40:31 <zzo38> OK I fixed that, although I wasn't really asking about grammar anyways, but rather about errors such as in case it is not possible to understand the operation of this program for example, or if some function you think is important, but is actually missing, etc
06:40:39 <adu> "Text ... is treated as 16-bit characters" implies Unicode
06:40:50 <zzo38> adu: Do you know JavaScript?
06:40:50 <adu> but you contradict that with ASCII, what exactly do you mean?
06:40:51 -!- hppavilion[1] has quit (Ping timeout: 244 seconds).
06:40:55 <adu> zzo38: I do
06:41:42 <zzo38> In JavaScript, a string contains 16-bit characters (which is normally interpreted as UTF-16, and the fromCodePoint and codePointAt do so, although it doesn't have to be)
06:42:09 <zzo38> It says "using the encoding of the font"; doesn't that make it clear though?
06:42:13 <adu> zzo38: right, so is there a bug in your conversion between JS and Xlib?
06:42:28 <zzo38> No there is not a bug, it is correct.
06:42:29 <adu> zzo38: fonts can be unicode, what's the issue?
06:42:51 <adu> zzo38: so it's a bug in font-config?
06:42:53 <zzo38> Yes, if the font is Unicode, then the characters are Unicode. Maybe I should add a sentence to mention that?
06:43:03 <zzo38> adu: No it is not a bug in font-config either.
06:43:08 <adu> zzo38: why can't you use unicode characters?
06:43:17 <adu> zzo38: why are you forcing your users to use ASCII?
06:43:40 <zzo38> You can use Unicode, if you are displaying text of a Unicode font.
06:43:49 <adu> zzo38: that's not what your documentation says
06:44:02 <zzo38> Yes, perhaps I should clarify that.
06:44:49 <zzo38> OK I fixed that. (That webpage won't update with all of my fixes now, since I work the changes on my own computer locally)
06:45:24 <zzo38> At the end of that paragraph, I added a sentence that says "If the font encoding is Unicode, then the string is also interpreted as Unicode." Does that make it clear?
06:46:45 <adu> the rest seems pretty clear, but then again, I love hierarchies
06:47:21 <adu> my only recommendation would be to group them into tasks/topics
06:48:24 <zzo38> I did it by alphabetical with uppercase first, within each block I put first properties of the constructor, and then properties of the instance, and then events. I can add a index with tasks/topics too I suppose, if I can figure out how it should be grouped as.
06:48:42 <adu> but sometimes that would cross-cut the class-oriented hierarchy, so I'm not sure if it would make sense in this case
06:49:05 <adu> and yes, I know that JS doesn't have classes
06:49:06 <zzo38> I do know that the documentation for X.Drawable.prototype.drawMacro is incomplete. (I will fix this later.)
06:50:52 -!- Sgeo__ has joined.
06:53:13 -!- Sgeo_ has quit (Ping timeout: 252 seconds).
06:58:21 -!- adu has quit (Quit: adu).
07:02:38 -!- bender| has quit (Remote host closed the connection).
07:03:55 -!- bender| has joined.
07:04:51 -!- hppavilion[1] has joined.
07:36:38 -!- mroman has joined.
07:45:24 -!- augur has quit (Remote host closed the connection).
07:56:04 -!- AnotherTest has joined.
08:03:58 -!- infinitymaster has joined.
08:04:50 -!- infinitymaster has quit (Client Quit).
08:08:22 -!- 7YUAAGGC0 has quit (Remote host closed the connection).
08:31:31 -!- lynn has joined.
08:35:33 -!- zzo38 has quit (Read error: Connection reset by peer).
08:40:24 -!- zzo38 has joined.
08:41:18 <zzo38> Sometimes it causes a kernel panic or other problems when trying to print, possibly there is a problem relating to powersave mode of the printer?
08:45:23 -!- lambda-11235 has quit (Quit: Bye).
08:46:10 <zzo38> (Or maybe the kernel need to be upgraded?)
09:09:22 -!- tromp has joined.
09:14:07 -!- tromp has quit (Ping timeout: 260 seconds).
09:20:06 -!- jaboja has joined.
09:30:49 -!- lleu has joined.
09:32:54 -!- hppavilion[1] has quit (Ping timeout: 244 seconds).
09:33:43 -!- impomatic_ has joined.
09:49:37 -!- heroux has quit (Remote host closed the connection).
09:59:45 -!- MoALTz has quit (Ping timeout: 244 seconds).
10:02:28 -!- ais523 has joined.
10:16:14 -!- heroux has joined.
10:36:22 -!- jaboja has quit (Ping timeout: 260 seconds).
11:27:36 -!- boily has joined.
11:44:33 <HackEgo> arothmorphise/arothmorphise ... antormo... antrohm... ant... oh bugger. This should go in the `misspellings of antrhrop... atnhro...' entry.
12:09:48 -!- boily has quit (Quit: ANSWER CHICKEN).
12:10:07 -!- tromp has joined.
12:14:37 -!- tromp has quit (Ping timeout: 244 seconds).
12:38:17 -!- bb010g has joined.
12:42:43 -!- p34k has joined.
13:08:40 -!- oerjan has joined.
13:09:26 -!- Melvar` has joined.
13:11:13 -!- Melvar has quit (Disconnected by services).
13:11:17 -!- Melvar` has changed nick to Melvar.
13:42:49 -!- tromp has joined.
13:43:18 <HackEgo> #!/bin/bash \ if [ "$1" ] && url "$1" 2>/dev/null # Save making a file when it already exists. \ then \ true \ else \ PASTENUM="$RANDOM" \ \ mkdir -p $HACKENV/paste \ \ url paste/paste."$PASTENUM" \ cat -- "${1--}" > $HACKENV/paste/paste."$PASTENUM" \ fi
13:43:36 <HackEgo> #!/usr/bin/env python \ import sys, os.path, re, urllib \ if len(sys.argv) <= 1: \ print "http://codu.org/projects/hackbot/fshg/" \ else: \ f = os.path.abspath(sys.argv[1]) \ f = re.sub(r"^/+hackenv/", "", f) \ if re.match(r"/|\.hg(?:/|$)",f): \ sys.exit("File is outside web-viewable filesystem repository.") \ else: \
13:45:20 <HackEgo> http://codu.org/projects/hackbot/fshg/index.cgi/file/tip/bin/url
13:47:36 -!- bender| has changed nick to sid123.
13:47:51 -!- sid123 has changed nick to bender|.
13:48:18 <HackEgo> http://codu.org/projects/hackbot/fshg/index.cgi/file/tip/test.hg
13:48:44 <oerjan> guess it only matches at beginning
13:49:23 <HackEgo> tswett tswett oerjan oerjan oerjan oerjan oerjan fizzie fizzie fizzie fizzie oerjan oerjan oerjan oerjan elliott ais523 ais523 oerjan oerjan oerjan shachaf shachaf elliott elliott nitia
13:50:11 <impomatic_> Are people still playing BF Joust? I notice the strategy page hasn't had anything new added for almost a year.
13:50:25 <oerjan> obviously, i was the one who wrote that part.
13:50:41 <oerjan> impomatic_: not very often afair
13:50:58 <oerjan> i guess people haven't had any new ideas to try
13:51:08 <oerjan> at least, none that won.
13:53:51 <ais523> impomatic_: I go back and top the leaderboard every now and again, but it's been deadish for a while
13:54:24 <ais523> impomatic_: if you haven't seen growth2 yet, I'd recommend watching it, I really like the strategy
13:54:49 -!- Mikaos has joined.
13:54:49 <ais523> 19:05, 31 May 2015 Ais523 (Talk | contribs | block) . . (97,150 bytes) (+3,004) . . (→2015: because we couldn't go a year without a new hill-topper)
13:55:06 -!- Mikaos has left.
13:55:20 -!- spiette has joined.
13:56:10 <oerjan> ais523: seems like you need to get a new one soon >:)
13:58:42 <oerjan> hm is my tooth actually getting a bit better again
14:03:39 -!- tromp has quit (Remote host closed the connection).
14:09:08 <ais523> in terms of BF Joust hill-topping, I really want to get margins to work
14:09:15 <ais523> but every time I try to change it I break it
14:09:23 <ais523> maybe I should start from scratch using the same strategy
14:15:54 * oerjan has to stop clicking on giant reverts and nitia in the repository browser
14:17:41 -!- MoALTz has joined.
14:21:49 <oerjan> @tell hppavilion[1] <hppavilion[1]> @wikipedia Game Theory <-- tip 1: @google tip 2: wikipedia wouldn't capitalize "theory".
14:22:12 <lambdabot> https://en.wikipedia.org/wiki/Game_theory
14:23:06 -!- MoALTz has quit (Ping timeout: 268 seconds).
14:23:15 <oerjan> <lambdabot> Unknown command, try @list <-- . o O ( <HackEgo> Unknown command, try `list )
14:24:25 <ais523> bleh, now I'm working on stealth3 :-)
14:29:29 -!- spiette has quit (Ping timeout: 260 seconds).
14:32:58 -!- spiette has joined.
15:04:13 -!- tromp has joined.
15:08:45 -!- tromp has quit (Ping timeout: 248 seconds).
15:25:09 -!- jaboja has joined.
15:37:15 -!- Alejandro15 has joined.
15:39:32 -!- Alejandro15 has left.
15:48:08 -!- lambda-11235 has joined.
15:49:24 -!- ais523 has quit (Ping timeout: 260 seconds).
15:50:06 -!- XorSwap has joined.
15:51:34 -!- ais523 has joined.
15:52:32 -!- jaboja has quit (Ping timeout: 260 seconds).
15:58:54 -!- XorSwap has quit (Read error: Connection reset by peer).
16:00:02 -!- XorSwap has joined.
16:05:47 -!- J_Arcane_ has joined.
16:10:08 -!- mroman has quit (Quit: Lost terminal).
16:17:50 <Taneb> I think a loop is an automorphism in the groupoid of paths
16:18:37 -!- Alejandro15 has joined.
16:19:31 -!- XorSwap has quit (Ping timeout: 244 seconds).
16:20:01 <Taneb> Category of paths- it's not always a groupoid
16:20:17 <Taneb> Well, it's almost never a groupoid. It doesn't always have inverses
16:20:22 <HackEgo> [wiki] [[Brainfuck constants]] https://esolangs.org/w/index.php?diff=46492&oldid=45087 * Quintopia * (+25) /* Power Series */ wolfram alpha says so
16:22:43 -!- Alejandro15 has left.
16:23:54 <izabera> quintopia: sounds a bit vague for wolfram alpha
16:24:08 -!- Sprocklem has quit (Ping timeout: 244 seconds).
16:25:04 <HackEgo> [wiki] [[Brainfuck constants]] https://esolangs.org/w/index.php?diff=46494&oldid=46492 * Quintopia * (+60) /* Power Series */ wolfram alpha says so
16:25:13 * Taneb is learning what a homotopy is
16:28:38 <Taneb> The lecturer is being very handwavey
16:28:47 <Taneb> "Continuous functions form a space!"
16:30:21 -!- Alejandro15 has joined.
16:30:47 -!- Alejandro15 has left.
16:32:17 <Taneb> He's also pronouncing homotopy in a different way to what I had assumed
16:32:32 <Taneb> I was putting the stress on the second and forth syllables, with all short os
16:32:46 <Taneb> He's putting the stress on the first and third syllables, and having the first two os long
16:40:42 <Taneb> oerjan: looking at the greek roots, they use omicrons rather than omegas
16:41:14 <oerjan> does that actually matter to english
16:41:51 <Taneb> No, but it's at least a point of data
16:42:03 <Taneb> Then again, I pronounce "finite" with short is
16:42:06 <oerjan> hm google translate has them long
16:43:20 <Taneb> OED gives it as /ˈhɒməʊtɒpi/ or /həˈmɒtəpi/
16:43:20 <oerjan> https://www.reddit.com/r/math/comments/lhj6r/how_do_you_pronounce_homotopy/c2svi40 hth
16:45:48 -!- fungot has joined.
16:46:07 <fizzie> fungot: Push the shell. Climb the shell.
16:46:07 <fungot> fizzie: your majesty! and queen. he and a friend left on a journey 10, then magic damage will be reduced by 10%. a star after any characteristic means it's at maximum strength! no matter what the price! it is, you idiot! hey! is that for us! the chef's in a snit, trying to get food to the front lines. heard a spell to energize the sword takes immense evil! indeed! this thing. what you have the masamune!
16:46:35 <oerjan> also https://www.youtube.com/watch?v=jJRyeUDfthk
16:47:13 <fizzie> fungot: I heard it takes immense concentration, not immense evil...
16:47:13 <fungot> fizzie: like, thanks princess. i'll take that under advisement!!
16:47:21 <fizzie> That's such an uppity bot.
16:47:39 <fungot> Available: agora alice c64 ct* darwin discworld enron europarl ff7 fisher fungot homestuck ic irc iwcs jargon lovecraft nethack oots pa qwantz sms speeches ss wp youtube
16:47:40 <fungot> Selected style: ct (Chrono Trigger game script)
16:47:53 <oerjan> and a serious one https://www.youtube.com/watch?v=6Nw1uIpZ9io
16:47:57 <fungot> izabera: i'd like to see that mystical sword for myself! geez! well, remember that you can log in anywhere on the world map! need a brief weapons and items seminar?
16:50:27 <fizzie> fungot: Yes, please. Give us a seminar on weapons and items.
16:50:28 <fungot> fizzie: is the gate key okay!! get' em! 200g per night. care, and stay...healthy! my husband...he's...he's...gone... but he left me precious gifts! the seeds...and our child, it's ancient history now...
16:50:41 <fizzie> fungot: Oh, if it costs that much, never mind then.
16:50:41 <fungot> fizzie: the masamune!! stole a tonic! amazing! you found a dreamstone! i'd forgotten how beautiful they are the evildoers? magus's lair! you brave! he's probably up north, to guardia!!! let's toast our land! now we'll have some peace! magus is a tad on the spooky side. our only hope.
16:50:51 <fizzie> It's a very excitable style.
16:51:09 -!- bender| has quit (Disconnected by services).
16:54:07 -!- oerjan has quit (Quit: Later).
17:01:53 -!- nisstyre has quit (Ping timeout: 244 seconds).
17:04:19 -!- tromp has joined.
17:08:50 -!- bb010g has quit (Quit: Connection closed for inactivity).
17:09:09 -!- tromp has quit (Ping timeout: 276 seconds).
17:12:12 -!- jaboja has joined.
17:17:32 -!- ais523 has quit.
17:28:35 -!- XorSwap has joined.
17:29:43 -!- XorSwap has quit (Read error: Connection reset by peer).
17:29:56 -!- XorSwap has joined.
17:37:23 -!- XorSwap has quit (Quit: Leaving).
17:59:47 <b_jonas> Stupid framework tries to be overly general but doesn't actually do the simple things right.
18:00:40 <Taneb> b_jonas, which framework
18:01:16 <b_jonas> has layers of abstractions
18:01:26 <b_jonas> at the bottom it sometimes does the correct thing, sometimes doesn't
18:01:58 <b_jonas> but you can never tell which because you can't follow the source code to the end
18:05:36 -!- tromp has joined.
18:09:45 -!- tromp has quit (Ping timeout: 246 seconds).
18:13:18 -!- earendel has quit (Ping timeout: 248 seconds).
18:13:45 <Taneb> b_jonas, apparently that kind of thing is really common in a lot of industries
18:13:50 <Taneb> Especially banking?
18:15:54 -!- vanila has joined.
18:16:00 <vanila> occult wizards of the digital age
18:24:53 -!- augur has joined.
18:36:11 -!- earendel has joined.
18:37:55 -!- treaki has joined.
18:40:03 -!- MoALTz has joined.
19:01:52 -!- augur has quit (Remote host closed the connection).
19:04:27 <HackEgo> Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
19:04:28 <HackEgo> Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
19:05:37 -!- Melvar has quit (Ping timeout: 260 seconds).
19:08:33 -!- nikylom has joined.
19:10:41 -!- nikylom has quit (Client Quit).
19:11:08 -!- nikylog has joined.
19:16:17 <HackEgo> vanila: Welcome to the international hub for esoteric programming language design and deployment! For more information, check out our wiki: <http://esolangs.org/>. (For the other kind of esoterica, try #esoteric on EFnet or DALnet.)
19:18:54 <HackEgo> [wiki] [[Piet++]] https://esolangs.org/w/index.php?diff=46495&oldid=42982 * 202.171.164.185 * (+25)
19:19:34 -!- Melvar has joined.
19:27:51 -!- hppavilion[1] has joined.
19:28:15 -!- ^v has quit (Ping timeout: 276 seconds).
19:32:04 <zzo38> How to make Bezier line with Xlib?
19:44:57 -!- Sprocklem has joined.
19:48:42 <quintopia> prooftechnique: not builtin, maybe, but you can make it do it
19:49:32 <quintopia> izabera: wolframalpha gave me exact values for several different choices of x. They are ugly irrational numbers.
19:50:26 <zzo38> I found a document that says that by use of X10 codes in X11 it is possible to make spline, but does not describe very well how spline is made
19:53:11 <prooftechnique> Looks like this is a clock that draws the hands with a Bezier curve: ftp://ftp.lip6.fr/pub/linux/sunsite/X11/clocks/bclock-1.0.tar.gz
19:53:16 -!- Reece` has joined.
19:53:29 -!- Reece` has quit (Remote host closed the connection).
19:54:35 -!- augur has joined.
19:59:11 -!- heroux has quit (Ping timeout: 268 seconds).
19:59:31 -!- augur has quit (Remote host closed the connection).
19:59:32 <b_jonas> zzo38: if you mean degree 2 spline, then pull in the cairo library, which can draw bezier stuff, and use its X11 backend.
19:59:54 <b_jonas> but cairo supports cubic (degree 3) too
20:01:30 <zzo38> Apparently Xlib can also do spline by including <X11/X10.h> but it does not describe very well what spline algorithms are used and how to control it.
20:01:45 -!- heroux has joined.
20:04:50 <b_jonas> zzo38: in that case, check cairo if it uses those functions of Xlib (it might not, if they're not general enough).
20:05:23 -!- jaboja has quit (Ping timeout: 248 seconds).
20:08:36 <zzo38> Why does tar have a large number of worthless options as well as a few useful ones, some of which can only be written as long option and short option won't work?
20:10:20 <b_jonas> zzo38: and yes, --no-recurse should really have a short version
20:10:25 -!- Sprocklem has quit (Ping timeout: 240 seconds).
20:11:06 <vanila> sometimes if your file looks like a link it will try to open a network connection
20:11:18 <zzo38> If all of the worthless options were to be removed, then all of the remaining long options could be changed to short options.
20:11:34 <vanila> yeah someone should just clean slate rewrite tar
20:11:39 <vanila> and it shouldn't support compression
20:11:48 <vanila> make it the "unix way"
20:12:08 <b_jonas> zzo38: what I wish for is a program with 7z's backend and capabilities, but a sane front-end with reasonable unixish command-line syntax and output.
20:12:35 <vanila> I made a program that unzips any archive format
20:12:46 <vanila> you just go: un thing.whatever
20:12:57 <b_jonas> vanila: that's exactly what 7z is trying to do, unzips any archive format if you say 7z x somearchive
20:13:01 <vanila> and it has modules that describe each unix program to decompress
20:13:22 <vanila> i made it careful not to splay files everywhere
20:13:29 <zzo38> I agree you should use a separate program for compression instead. For example "zcat < program.tar.gz | tar t" or whatever (that already works though)
20:13:31 <vanila> it always puts them inside a folder (unless the zip itself was a single item)
20:13:34 <vanila> I wrote it in lisp and use it all the time
20:14:04 <vanila> it's abit imperfect though because every program is different and moste are not built to be used programatically(!)
20:14:11 <vanila> despite being command line unix programs
20:14:11 <zzo38> I always list the archive first before extracting it so that I will know what directory structure it needs.
20:14:35 <zzo38> (Or in case I do not need all of the files from the archive)
20:14:53 -!- XorSwap has joined.
20:15:14 <zzo38> I think Hamster archive is a better format. Hamster archive is consist of zero or more lumps, where each lump consists of the null-terminated filename, the 32-bit length in PDP-endian format, and then the data.
20:15:53 -!- XorSwap has quit (Client Quit).
20:16:07 <int-e> . o O ( so how do you deal with messages that are larger than 4GB? )
20:17:12 -!- nikylog has quit (Quit: Page closed).
20:17:18 <zzo38> I suppose you could just add more than one with the same name if you really need to
20:17:45 <shachaf> Why do you like PDP-endian?
20:18:10 <zzo38> I don't, but that is how it was defined (I don't know why, but I can guess).
20:18:12 <b_jonas> zzo38: separate program for compressing is what I do right now: tar -c "${lots_of_ugly_options[@]}" | 7z a "$outputpath/$basename.t7z" -t7z -mx=3 -si"$basename.tar"
20:18:36 <b_jonas> separate program is also what tar does of course
20:18:57 <b_jonas> it automatically invokes the right separate program for decompressing gzip, bzip, xz, and a few more
20:19:21 <b_jonas> which is definitely the Right Thing for it to do
20:19:35 <vanila> another problem is unrar is not free
20:19:41 <zzo38> 7-Zip will already do both archiving and compression though, due to the 7-Zip file format in use.
20:20:05 <zzo38> b_jonas: I don't, I think you should use pipe to tell to decompress instead
20:20:47 <zzo38> The reason Hamster archive uses PDP-endian is for historical reasons and is not up to me.
20:21:07 <b_jonas> zzo38: 7-zip does archiving, but you can't use that if you want to save unix filesystem attributes (owner, group, and permission bits most importantly), which is important for a system backup
20:21:15 <b_jonas> zzo38: I used tar this way for backups
20:21:26 <b_jonas> for just distributing a tarball of some program, 7z without tar is fine of course
20:22:02 <zzo38> Yes I suppose that can be also a reason
20:23:23 <b_jonas> zzo38: 7z can create or extract tar files (and many other formats), but since its command line utility is even worse to use than tar, I never tried to create tar with it (I did create zip with it though)
20:24:18 <b_jonas> The backend of 7z and how many formats it supports (not all archive formats either) is great, as well as its specific 7z format, and its windows gui. It's only the command-line tool I don't like.
20:24:37 <b_jonas> I might try to nudge its source code a bit some time to make it a bit saner.
20:25:31 <zzo38> It is one advantage of 7z, that you can support many different format; it has successfully opened some files I downloaded that were in unusual formats and it worked fine.
20:25:56 <b_jonas> I use 7z a lot for this reason
20:26:02 <b_jonas> I also use it a lot to create 7z archives
20:27:18 -!- XorSwap has joined.
20:27:30 <b_jonas> There are lots of other tools that try to support multiple archives of course: bzip2 can decompress gzip; xz can decompress gzip, bzip2, lzma; the rar program can decompress zip and I think it can even compress it; norton commander has a built-in zip decompressor; and there are even a few tools that try to handle any archive by calling other specific programs.
20:27:37 <zzo38> Yes, 7-Zip does compress pretty well
20:28:43 <zzo38> Note that some of the files I have successfully opened with 7-Zip are not even documented in the document of 7-Zip.
20:28:57 <b_jonas> Also, I've never seen 7-zip crash, neither the gui nor the command-line, and that's a big plus.
20:29:04 <zzo38> (Maybe they are now, but at that time they weren't)
20:29:25 <zzo38> b_jonas: Yes that too, although I have not used the GUI of 7-Zip
20:29:50 <b_jonas> zzo38: the gui is quite good, and is designed better than the command line. it's not perfect, but quite good.
20:30:35 <zzo38> It probably is good, although I still prefer to work by command-line
20:30:52 <b_jonas> I use both, depending on the task.
20:31:04 <b_jonas> Obviously the command line can be automated, which I have done at least once.
20:32:16 <zzo38> It won't support Hamster archive, but I have written my own program for Hamster archive anyways (other programs exist, but they aren't very good, and also they require DOS)
20:32:39 <b_jonas> What I don't understand is why some people like the horrible trialware winrar program, when 7-zip has been available for quite a while and does basically anything winrar can do but better, except for compressing rar archives.
20:32:51 <b_jonas> (The full version of 7-zip does decompress rar archives.)
20:33:19 <zzo38> I described it above. It is: Hamster archive is consist of zero or more lumps, where each lump consists of the null-terminated filename, the 32-bit length in PDP-endian format, and then the data.
20:33:30 <vanila> in my opinion 7z should handle 7z only
20:33:42 <vanila> and there should be a separate multi-archiver program to 'combine'
20:33:42 <zzo38> That is the entire document, now you can even make your own implementation if you want to
20:34:32 <b_jonas> zzo38: what are Hamster archives used for?
20:34:45 <zzo38> vanila: I know PDP-endian isn't as good, but that is what it is and I do not quite know why.
20:35:01 <vanila> it's the silliest endian
20:35:15 <zzo38> Yes I agree it is the silliest endian
20:35:22 <prooftechnique> I've tried to look up documentation on the format, and most of what I find is codu logs of zzo talking about it :D
20:35:30 <b_jonas> wait, is pdp endian one of those mixed-endian formats, in which the int16 level endian is opposite to the int32 level endianness?
20:35:40 <zzo38> Nevertheless it can be implemented easily enough, as can the better formats such as big-endian and small-endian
20:36:10 <b_jonas> for an archive format like this it's fine
20:36:33 <zzo38> prooftechnique: Other documentation does not name the format anything, which makes it difficult to find, although I wrote the entire document right here anyways; it is one sentence.
20:36:47 <b_jonas> this sounds like some sort of tar format basically
20:38:22 <zzo38> Combine archives simply by "cat" program or by using the >> redirection operator.
20:38:41 <b_jonas> zzo38: right, I think tar formats can do that too
20:39:21 <zzo38> I know gzip supports that too
20:39:46 -!- jaboja has joined.
20:39:55 <prooftechnique> \oren\: Your font is making me depressingly aware of how often people use nonbreaking spaces for evil :|
20:40:24 <b_jonas> the t in tar stands for tape, as in, you can append new files to a tar file on a magnetic tape without reading it
20:40:46 <zzo38> prooftechnique: Also with s/nonbreaking spaces/Unicode/ too isn't it?
20:41:50 <prooftechnique> A little bit, yeah. Nonbreaking spaces are *everywhere*, though :|
20:43:03 <zzo38> Nonbreaking spaces are certainly not limited to Unicode of course though, other formats have nonbreaking spaces too
20:43:35 -!- katherine has joined.
20:43:38 -!- Phantom_Hoover has joined.
20:43:39 <zzo38> In UTCE all characters are nonbreaking (including the ASCII space)
20:44:48 <b_jonas> I think part of the reason why nonbreaking space got popular is that HTML traditionally couldn't represent multiple adjacent spaces, so when people wanted to show two adjacent spaces of an ascii string in HTML, they replaced one with a non-breaking space for display.
20:44:51 -!- katherine has left.
20:46:39 <prooftechnique> I mainly see it a lot in mailing list archives and GNU docs :D
20:47:00 <prooftechnique> Then again, I also see lots of tables used for no reason in those places, so :|
20:51:16 <b_jonas> If I understand correctly, these days there's a way around this in HTML, namely specifying the CSS property white-space: pre-wrap; which disables HTML's special whitespace handling.
20:51:48 <vanila> HTML merges multiple spaces into one
20:51:54 <vanila> just so people can indent their XML?
20:52:01 <vanila> that's sooooo horribly ugly and funny
20:52:04 <b_jonas> vanila: yes, it's horrible
20:52:10 <vanila> lisp paste website uses a funny XML indentation style
20:52:22 <vanila> view-source:http://paste.lisp.org/
20:52:32 <b_jonas> vanila: it also sometimes removes a whitespace adjacent to a tag
20:52:41 <prooftechnique> A lot of it is texi2html generated stuff, so it's at least kind of understandable
20:52:58 <vanila> I have a great idea: Use s-expressions for web markup
20:53:20 -!- vanila has left ("Leaving").
21:01:03 -!- heroux has quit (Ping timeout: 264 seconds).
21:03:30 -!- heroux has joined.
21:06:37 -!- hppavilion[1] has quit (Ping timeout: 248 seconds).
21:07:28 -!- hppavilion[1] has joined.
21:22:48 -!- lleu has quit (Quit: That's what she said).
21:24:54 <lambdabot> oerjan said 7h 3m 5s ago: <hppavilion[1]> @wikipedia Game Theory <-- tip 1: @google tip 2: wikipedia wouldn't capitalize "theory".
21:25:08 <lambdabot> https://en.wikipedia.org/wiki/Game_theory
21:25:43 <hppavilion[1]> @tell oerjan I was hoping `@wikipedia game theory` would return the first sentence of the article, because it was funny IIRC
21:25:45 <lambdabot> Title: Theory Official Site | Contemporary Clothing for Women and Men
21:25:50 <lambdabot> http://www.haskell.org/haskellwiki/Theory
21:26:27 <prooftechnique> Or, for that wiki: https://en.wikipedia.org/wiki/Theory
21:27:03 <prooftechnique> hppavilion[1]: What's the joke in the first few sentences?
21:27:55 <hppavilion[1]> prooftechnique: I was wrong, it was a joke I was going to make
21:27:58 -!- XorSwap has quit (Ping timeout: 244 seconds).
21:28:11 <hppavilion[1]> "Game theory is \"the study of mathematical models of conflict and cooperation between intelligent rational decision-makers.\""
21:28:30 <hppavilion[1]> What's the study of people just in it for revenge and bitterness?
21:28:56 <hppavilion[1]> "Game theory is mainly used in ... political science..."
21:29:10 <hppavilion[1]> Where are the intelligent rational decision-makers in politics?
21:30:13 <b_jonas> hppavilion[1]: no, but politicians like to use fancy scientific stuff to try to make their decisions seem rational when they aren't
21:30:46 <b_jonas> hppavilion[1]: game theory is a great excuse, it sounds sciency enough that they can refer to game theoretical models with fancy solutions
21:31:37 <hppavilion[1]> b_jonas: How often do people yell "IS THIS ALL A GAME TO YOU!?" at game theorists do you reckon?
21:32:10 <prooftechnique> hppavilion[1]: I think the latter study is called family law
21:33:02 <prooftechnique> Divorce law, in particular, though arguably custody law, as well
21:37:43 -!- jaboja has quit (Ping timeout: 250 seconds).
21:42:43 <izabera> can you tell if a number is prime in a non turing complete language?
21:44:42 <prooftechnique> https://tsqltricks.wordpress.com/2008/12/17/udf-isprime/
21:47:10 <prooftechnique> Hmm, I guess even vanilla SQL is turing complete with CTEs and windowing
21:47:11 <izabera> ah yes you only need to loop down
21:48:39 <izabera> something that only supports a loop with a finite number of iterations is not tc, even if that number is unbounded, right?
21:50:34 <prooftechnique> Apparently you can do it with regex, but I'm not sure if it's only PCRE (which is TC, IIRC)
21:51:17 <izabera> but i don't know if bre is turing complete
21:55:42 <Riviera> izabera: i don't quite get your question
21:56:12 <Riviera> izabera: "something" as in "anything?" Most algorithms for checking whether a number is prime aren't turing complete, yet they can do what they do.
21:56:58 <Riviera> that doesn't make it any less vague.
21:57:12 <prooftechnique> Well, Charity is definitely not Turing Complete, but you could reasonably check for primality with it
22:00:03 -!- spiette has quit (Ping timeout: 246 seconds).
22:01:34 -!- augur has joined.
22:05:15 -!- hppavilion[1] has quit (Ping timeout: 264 seconds).
22:07:11 -!- tromp has joined.
22:10:53 -!- Sprocklem has joined.
22:11:21 -!- tromp has quit (Ping timeout: 244 seconds).
22:16:24 <zzo38> Even SQLite is capable of solving Sudoku and computing a mandelbrot set with a single query.
22:16:37 <zzo38> (with an empty database)
22:19:46 <myname> just add a prime checker to hq9
22:23:03 <coppro> p: the command p looks at the next available input for the longest consecutive series of digits, and outputs "Prime!" if it is a prime number, or "Not prime!" otherwise (including if it is an empty sequence). Note that the input is not removed from the queue.
22:23:44 <myname> question can now be answered withn yes, there is such a language
22:40:44 -!- augur has quit (Remote host closed the connection).
22:53:10 -!- oerjan has joined.
22:59:03 <zzo38> SQLite has no regular expression built-in but I made the SQLite extension library to use PCRE with SQLite
23:00:56 -!- idris-bot has joined.
23:02:46 -!- hppavilion[1] has joined.
23:11:29 <oerjan> i think "set-theoretical" and "primitive" are about right for that.
23:11:53 <lambdabot> hppavilion[1] said 1h 46m 10s ago: I was hoping `@wikipedia game theory` would return the first sentence of the article, because it was funny IIRC
23:12:21 <hppavilion[1]> oerjan: It turned out I just had a joke to make about it
23:15:54 <oerjan> <katherine> holaaaaaaaaaaaaaaaaaaaaaaaaaaa <-- i'm wondering if it's some kind of semester start in venezuela
23:16:05 <oerjan> all these people showing up at the same time
23:21:14 -!- hppavilion[1] has quit (Read error: Connection reset by peer).
23:28:36 -!- AnotherTest has quit (Ping timeout: 246 seconds).
23:31:03 <oerjan> <izabera> something that only supports a loop with a finite number of iterations is not tc, even if that number is unbounded, right? <-- right, this is well-known to give you exactly the primitive recursive functions on numbers. see BlooP.
23:32:03 <HackEgo> lambdabot: @@ @@ (@where weather) CYUL ENVA ESSB KOAK
23:32:05 <lambdabot> CYUL 042300Z 04002KT 15SM FEW240 M05/M16 A3023 RMK CI1 CI TR SLP241 \ ENVA 042250Z 00000KT 9999 FEW045 BKN090 01/M03 Q1003 RMK WIND 670FT 09008KT \ ESSB 042320Z AUTO 13007KT 9999 BKN008/// OVC009/// 01/00 Q1008 \ KOAK 042256Z 16008KT 10SM SCT013 BKN025 OVC038 17/16 A2994 RMK AO2 RAE56 P0000 T01720156
23:34:08 -!- tromp has joined.
23:34:47 -!- lynn_ has joined.
23:34:50 * oerjan notes graue once deleted BlooP from our wiki, and wonders wtf he was on.
23:35:13 <Phantom_Hoover> <oerjan> <katherine> holaaaaaaaaaaaaaaaaaaaaaaaaaaa <-- i'm wondering if it's some kind of semester start in venezuela
23:35:31 <Phantom_Hoover> this stuff happens because we're inexplicably on the default channel list on some spanish distro's irc client, right?
23:35:56 <oerjan> s/spanish/venezuelan/, at least originally.
23:36:28 -!- lynn has quit (Ping timeout: 264 seconds).
23:37:05 <oerjan> or at least so i assume, i've never literally seen that channel list or what program it is in.
23:37:31 <oerjan> but i once got some kind of half-confirmation out of one of them
23:37:50 <oerjan> only half- because i'm not sure they used compatible terminology.
23:38:41 <oerjan> however, my comment above was because we've had 3 or 4 of them in just a few days.
23:41:12 <oerjan> @tell izabera <izabera> something that only supports a loop with a finite number of iterations is not tc, even if that number is unbounded, right? <-- right, this is well-known to give you exactly the primitive recursive functions on numbers. see BlooP.
23:45:59 -!- tromp has quit (Remote host closed the connection).
23:51:55 -!- p34k has quit.
23:52:31 <zzo38> The instruction for PortAudio says you must terminate it. However if the program won't terminate properly then how to ensure it will stop properly?
00:00:16 -!- hppavilion[1] has joined.
00:00:58 <hppavilion[1]> Given a number by its prime factorization, calculate the prime factorization of its successor
00:01:37 <myname> easy, drop everything you have and start from scratch
00:02:44 <myname> i don't think you can get the factorization any easier with the factors of the predecessor
00:02:54 <myname> at least not in the general case
00:03:01 <hppavilion[1]> myname: This isn't for code I'm working on, this is for a humorous data types
00:03:26 <hppavilion[1]> myname: How about for numbers that can be expressed as the product of 8 prime numbers, all of which must be in the smallest 256 prime numbers?
00:04:17 -!- Nithogg has quit (Ping timeout: 260 seconds).
00:04:32 <hppavilion[1]> myname: The idea behind the PFact type is that it's a data type that expresses numbers as the product of 8 primes
00:04:59 -!- Nithogg has joined.
00:05:22 <hppavilion[1]> myname: Assuming 64-bit registers, each number must fall in the 255 smallest primes, with 1 filling in gaps when n<8
00:11:34 -!- augur has joined.
00:18:48 -!- tromp has joined.
00:20:55 <tswett> Lemme find one of those hard-to-factor numbers.
00:21:21 <tswett> Now, the question "given the factorization of n, what is the factorization of n+1?" definitely sounds pretty interesting.
00:21:36 <tswett> And here's one thing that you do know: the two numbers cannot have any prime factors in common.
00:21:52 <Phantom_Hoover> would be surprised if you can say anything enormously stronger than that
00:22:14 <tswett> (Because if p is a prime factor of n and p is also a prime factor of n+1, then n/p and (n+1)/p are both integers, so 1/p is an integer. But that's impossible.)
00:22:40 <mad> afaik the link between the primeness of n and n+2 is still an open problem
00:23:22 <tswett> Here's a number that's hard to factor:
00:23:24 <tswett> 1522605027922533360535618378132637429718068114961380688657908494580122963258952897654000350692006139
00:23:32 <oerjan> also, at most one of the numbers can _be_ prime hth
00:23:51 <tswett> Except that it's pretty easy to factor it using the Google method.
00:23:59 <tswett> Anyway, let's see what the factorization of its predecessor is.
00:24:24 <coppro> oerjan: 2 and 3 don't have any prime factors in common
00:24:46 <oerjan> coppro: and this contradicts what i said how?
00:25:01 <coppro> I missed the line above that
00:25:15 <tswett> Okay, I found the factorization. It is:
00:25:41 <tswett> 2 * 3^2 * 210974974123 * 400944086233670527306310281636760087998315351567377660286363410284049027879820778576767
00:25:58 <tswett> That's probably pretty dang unhelpful.
00:26:28 <tswett> Fun fact: for 100% of all prime numbers p, p-1 has 2 as a factor.
00:26:50 <tswett> I wonder what the factorization of 400944086233670527306310281636760087998315351567377660286363410284049027879820778576766 is...
00:27:01 <oerjan> i vaguely recall there's some restriction on the prime factorization of pq-1 in order for pq to be a good RSA key
00:27:16 <tswett> myname: nope, 2-1 doesn't have 2 as a factor.
00:27:38 <tswett> Surprisingly, 400944086233670527306310281636760087998315351567377660286363410284049027879820778576766 is taking several seconds to factor.
00:28:03 <oerjan> myname: it's 100% by the most useful definition, aka density.
00:28:07 <tswett> Well, what percentage do you think it is?
00:28:22 <myname> i see what you did there
00:32:33 <tswett> Dang, it's taken over five minutes so far to factor that bad boy.
00:37:23 -!- impomatic_ has quit (Ping timeout: 248 seconds).
00:39:50 <mad> if I recall the idea of RSA is that, if you calculate 2^n modulo 13, the result will loop every steps
00:39:59 <mad> every 12 steps
00:40:33 <mad> since the result can't go through 0 but it has to go through all other numbers since 2 and 13 have no common factors
00:41:29 <zzo38> Do you know if it is OK to call Pa_Terminate and/or Pa_CloseStream in a signal handler?
00:41:41 <mad> if you calculate 2^n modulo 13*17, logically the modulo 13 part loops every 12 and the modulo 17 part loops every 16
00:44:11 <mad> ""For security purposes, the integers p and q should be chosen at random, and should be similar in magnitude but 'differ in length by a few digits""
00:46:18 <mad> "Since any common factors of (p-1) and (q-1) are present in the factorisation of p*q-1,[14] it is recommended that (p-1) and (q-1) have only very small common factors, if any besides the necessary 2."
00:52:20 -!- XorSwap has joined.
00:58:47 <tswett> Woo. It took half an hour and fifteen seconds, but I got that number factored. The factorization is:
00:59:25 <tswett> 2 * 3 * 409 * 1645447576107402059859920361500918359 * 99294502354941754852634597949140561238814554731
00:59:35 <tswett> Now, of course, I wonder what the factorization of 99294502354941754852634597949140561238814554730 is.
01:00:51 <oerjan> <mad> if I recall the idea of RSA is that, if you calculate 2^n modulo 13, the result will loop every steps <-- i think you may be confusing RSA with discrete logarithm, or something.
01:01:18 <tswett> It's 2 * 5 * 17 * 22369 * 243130343851969331 * 107396603915138092862971. And the factorization of 107396603915138092862970 is 2 * 3 * 5 * 13 * 17 * 281 * 991 * 2758397 * 21088237.
01:02:09 <tswett> And the factorization of 21088236 is 2^2 * 3 * 13 * 135181, and the factorization of 135180 is 2^2 * 3^2 * 5 * 751.
01:02:29 <mad> oerjan : RSA and the discrete logarithm are related I think
01:03:13 <oerjan> <mad> since the result can't go through 0 but it has to go through all other numbers since 2 and 13 have no common factors <-- that's not enough, you actually need to check if 2 has that property. however, given that 13 is prime, _some_ number ("primitive root") will loop through all of them.
01:04:18 <oerjan> > length $ nub [2^n `mod` 13 | n <- [0..11]]
01:05:12 <oerjan> > [(p,length $ nub [2^n `mod` p | n <- [0..p-1]]) | p <- [3,5,7,11,13,17,19,23,29,31]]
01:05:13 <lambdabot> [(3,2),(5,4),(7,3),(11,10),(13,12),(17,8),(19,18),(23,11),(29,28),(31,5)]
01:05:30 <oerjan> myname: it could have been something else. of course 13 _wouldn't_ be an example.
01:06:23 <oerjan> look at 7, 17, 23 and 31 up there.
01:07:02 <oerjan> in general, the order is some factor of p-1