00:00:07 | OrionPK | Why doesnt this work; $(value.date.int) & "some other string" |
00:00:15 | renesac | but you could be sitting in a TChair or a PChair... |
00:00:17 | OrionPK | conversion from string to int is invalid |
00:03:26 | dom96 | OrionPK: What type is value.date? |
00:03:29 | OrionPK | oh god, nevermind |
00:03:35 | OrionPK | the date is a string, thought it was a TTime |
00:09:03 | Skrylar | its more a matter that you're not going to name a module tfoo but you might name it after what it contains, and if the typename is the same as a module name nim gets confused |
00:10:50 | EXetoC | Skrylar: so rectangle/Rectangle then, but you need case sensitivity |
00:11:31 | Skrylar | i would rather have trectangle than case sensitivity |
00:11:51 | Skrylar | but we're not supposed to use T/P's (lol toiletpaper), so i'll probably rename the module to rects |
00:12:02 | runvnc | so I don't put T in front of the type name right |
00:12:14 | clovis | It's the other way around. Rectangle is the base entity, not the module. |
00:12:31 | EXetoC | Skrylar: well we're getting it |
00:12:43 | Skrylar | EXetoC: it sounded like araq nixed it last time i checked the thread |
00:12:45 | EXetoC | you can do that if you want but you need to enable case sensitivity |
00:12:53 | runvnc | yeah just realized that |
00:12:55 | EXetoC | uh ok |
00:13:06 | runvnc | because I have a TSession and a session var |
00:13:09 | Skrylar | he mentioned partial case sensitivity was more migraine than it was worth in the last post, but i haven't checked in a few days |
00:13:30 | runvnc | I think for now I just need to stick with T for practicality sake |
00:13:30 | EXetoC | so we're getting full case sensitivity then? |
00:13:40 | runvnc | personally I think it is good that way it is |
00:13:46 | Skrylar | ^ |
00:13:59 | clovis | Me too, except scrap the T/P |
00:14:03 | Skrylar | He said there won't be any major syntax changes soon when filwit was poking about moving some symbols around |
00:14:18 | Skrylar | I'd imagine case sensitivity is a 'major change' which is another hint that it was scrapped |
00:15:02 | Skrylar | i'd also imagine it would just be confusing since the existing blog posts already mention the style insensitivity |
00:18:39 | clovis | A variable called "rectangle" does a bad job at describing *what* rectangle. It only states the type of the thing. |
00:19:06 | EXetoC | clovis: T is necessary with case insensitivity |
00:19:07 | clovis | A module describing the type Rectangle is itself not a rectangle |
00:19:50 | Skrylar | EXetoC: i've been getting along fine without T/P so far (well, without T.) |
00:19:56 | Skrylar | I don't see the hate against P. |
00:19:57 | EXetoC | I think the problem was that he didn't enable partial case sensitivity |
00:20:03 | EXetoC | so Rectangle == rectangle |
00:20:05 | clovis | EXetoC, what I'm trying to say is that case sensitivity isn't the problem. The identifiers naturally have different names |
00:20:40 | clovis | One is Rectangle the other is something more descriptive, like windowFrame |
00:21:33 | Skrylar | EXetoC: nope, the problem is that 'rectangle.nim' and 'rectangle the type' have the same identifier |
00:21:53 | Skrylar | and nimrod isn't smart enough to figure out what i meant |
00:22:15 | EXetoC | oh you actually named it that way. that's not good |
00:22:25 | clovis | Skrylar, the type Rectangle has the correct name. The module which itself isn't a rectangle should have another name |
00:22:30 | Skrylar | it works in java, D and C# :\ |
00:22:58 | dom96 | indeed, nimrod seems to have more trouble dealing with module names which are the same as types/identifiers than it has dealing with types which are the same as identifiers. |
00:23:19 | dom96 | I think this finally deserves an issue. |
00:23:29 | dom96 | Because there have been many cases where people got confused. |
00:23:34 | EXetoC | clovis: it's an accurate name |
00:23:44 | Skrylar | dom96: well, the compiler crashed. thats a pretty confusing issue :) |
00:24:02 | Skrylar | I saw Zah's fix and his error message isn't much better; it just says "couldn't instantiate" which doesn't tell you that the symbol name conflicted |
00:24:43 | EXetoC | clovis: you could bundle it with similar things and call it something else, but sometimes it doesn't make sense |
00:26:07 | clovis | from Rectangle import Rectangle is confusing |
00:26:19 | Skrylar | you don't need to from rectangle import rectangle |
00:26:37 | Skrylar | the only thing in skylight.rectangle is the type and methods that operate directly on the type |
00:27:56 | clovis | I guess so |
00:28:05 | * | Matthias247 quit (Read error: Connection reset by peer) |
00:28:36 | EXetoC | clovis: not when the module name is lower case |
00:29:01 | clovis | EXetoC, I take it that you want case sensitivity |
00:29:27 | EXetoC | no, but you'd say "from rectangle import TRectangle" now, assuming that the conventions are adhered to |
00:30:17 | clovis | Or, why not "from RectangleModule import Rectangle" |
00:30:18 | EXetoC | s/no/don't really mind either way/ |
00:30:58 | EXetoC | that'll get annoying fast |
00:31:16 | clovis | I'd refer to the type a lot more often than the module |
00:31:31 | Skrylar | I don't use the TFoo convention because its apparently taboo |
00:31:33 | clovis | I'd rather have the type be the natural name |
00:31:37 | Skrylar | even though I prefer it |
00:31:39 | OrionPK | dom96 is there a way to convert a TTimeInfo to a TTime |
00:32:53 | OrionPK | nm, found it. TimeInfoToTime |
00:32:55 | clovis | Why waste readability by having extra characters added to the type name when they instead could be added to the less used module name |
00:32:59 | EXetoC | Skrylar: everyone has been doing that for ages |
00:33:26 | clovis | Legibility is the most important aspect, imho |
00:33:39 | Skrylar | i don't lose readability from TRectangle |
00:33:45 | fowl | Skrylar, https://gist.github.com/fowlmouth/9584728 |
00:33:49 | * | Skrylar is one of those pascal-y people |
00:34:27 | clovis | It's still a bit of misplaced noise |
00:35:06 | Skrylar | fowl: neat. |
00:35:37 | Skrylar | fowl: now the second problem is, "is that a good pattern for nimrod?" since the closures are going to end up making the GC keep the objects alive unless you explicitly disconnect |
00:36:23 | EXetoC | clovis: "variable names should be more descriptive than that" is too general I think |
00:36:30 | EXetoC | so what about collisions? |
00:36:31 | fowl | if thats a problem we can gcunref after connecting, but yes ill need tests written |
00:37:21 | Skrylar | gcunref means when you trigger you'll be calling dead pointers, that's also bad |
00:37:41 | clovis | EXetoC, I don't have the answer except I think that it might depend on the context. In the context of dealing with rectangles a particular rectangle should be better described with a more specific name, such as windowFrame |
00:37:53 | Skrylar | Qt deals with it with some magic in that a QObject's destructor goes through a list of backlinks and performs disconnects, which is invasive but it prevents sig/slots from ever segfaulting |
00:38:02 | Skrylar | instead you get log output that someone just signalled a dead window |
00:38:40 | fowl | yea |
00:39:06 | Skrylar | might be possible to do backlinks + unref |
00:39:18 | fowl | i need to store the object as well as a closure for the function |
00:39:34 | Skrylar | after i fix the rectangle packer i have a todo to look in to event patterns |
00:39:59 | Skrylar | signals and slots are the 'neatest' one but they also require a bit of participation from classes to do really well |
00:40:11 | Skrylar | event pumps are the safest but least pretty to use |
00:40:26 | fowl | i was hoping to avoid using a supertype but i dont think it will be possible |
00:40:42 | Skrylar | shouldn't need a supertype |
00:41:14 | Skrylar | should be able to use templates to make it a simple "plug this on to any S&S object" since you don't need *that* much |
00:41:15 | fowl | i need to be able to do signal.remove(obj) |
00:41:38 | EXetoC | clovis: in some cases it's obvious anyway, and a more descriptive name might collide with some other type. I don't know how common that'd be for large projects |
00:41:42 | clovis | fowl, have you looked at libsigc++ ? http://libsigc.sourceforge.net/ |
00:42:09 | EXetoC | Anyway, I'm sure Araq will respond, so I'll see what he has to say about the status of case sensitivity |
00:42:10 | clovis | EXetoC, me neither |
00:42:10 | Skrylar | template function for "DisconnectSignals" which uses the seq of backrefs on self, sig.remove(blah) could use that |
00:42:17 | Skrylar | so there is no supertype, just methods plugged on to the receivers |
00:42:18 | EXetoC | and maybe I missed some post. let me check |
00:42:34 | fowl | clovis, no i was looking at qt, boost and http://sigslot.sourceforge.net |
00:42:38 | Skrylar | fowl: but yeah, i'll poke around with some of the research later for it |
00:42:50 | clovis | fowl, it's supposedly the fastest c++ implementation |
00:43:00 | fowl | Skrylar, "seq of backrefs on self" this is provided by the base type (qobject) |
00:43:36 | Skrylar | yes, but you could do it via templates so people weren't confined to using qobject |
00:43:49 | Skrylar | they could make an arbitrary object "qobject-like" |
00:44:00 | fowl | a template requires someone to put the right field: type in their object def |
00:44:13 | Skrylar | thats a matter of documentation :P |
00:44:32 | Skrylar | "btw if you don't want to be a child of X, do these two things" |
00:45:03 | Skrylar | its hardly a gobject level of boilerplate |
00:45:57 | EXetoC | Skrylar: where did Araq claim that he had changed his mind regarding case sensitivity? |
00:46:40 | EXetoC | also, we haven't even hit 1.0 yet, so major changes are to be expected |
00:47:03 | Skrylar | EXetoC: on the forum topic someone asked about it and he said he said partial case sensitivity was more troublesomse than expected |
00:47:14 | Skrylar | and in IRC he said there won't be any major changes to syntax for a while |
00:48:22 | EXetoC | not *the* thread apparently |
00:48:24 | clovis | EXetoC, what do you think about this: a local variable (e.g. windowFrame) would shadow a type with the same name in the local context/scope. And in doing so avoid collision? |
00:48:41 | EXetoC | well that's not the same thing as forever, but anyway just keep doing things the usual way |
00:48:49 | Skrylar | i poked firefox but it doesn't have the specific thread up |
00:48:57 | Skrylar | :\ |
00:49:10 | Skrylar | anyhow, now that i can work on that module again i can go back to getting us a neat GUI |
00:49:48 | EXetoC | that win32-only GUI? |
00:49:56 | Skrylar | no, the gl one |
00:49:57 | fowl | oo lots of file changes today |
00:50:18 | EXetoC | ok |
00:58:05 | EXetoC | clovis: that should be fairly bulletproof, but the prefix doesn't really bother me |
00:58:15 | EXetoC | and in many cases the type of something can be omitted |
01:02:07 | clovis | A related thought: the compiler should, ideally, never be able to mistake a type for a variable and vice versa. Example: let foo:rectangle. Here rectangle can't possibly be a variable, can it? |
01:05:14 | clovis | I don't know the syntax enough to say for sure, but I think that the context in which an identifier is used is all that is needed to determine if it is a module, variable or type. |
01:05:25 | * | lanior joined #nimrod |
01:06:27 | clovis | If that's the case you could in principle do the following: from rectangle import rectangle ... let rectangle:rectangle = ... without confusing the compiler. |
01:07:29 | clovis | Of course, you wouldn't! |
01:07:47 | clovis | But you could safely remove all prefixes |
01:09:16 | clovis | Humans understand natural language by context. It seems that nimrod's syntax could, in principle, allow the compiler to do the same regarding identifiers |
01:09:30 | fowl | not really |
01:09:38 | Demos | also, we want tools to be easy to write |
01:09:57 | fowl | you cant tell whether rectangle() is a constructor or a variable with the `()` function defined |
01:09:58 | clovis | Demos, reuse the parser |
01:10:14 | clovis | fowl, oh. |
01:10:15 | EXetoC | you should really Capitalize either way, case sensitive or not |
01:12:58 | * | q66 quit (Quit: Leaving) |
01:53:18 | * | clovis quit (Quit: clovis) |
02:25:07 | * | brson quit (Quit: leaving) |
03:35:09 | * | psquid joined #nimrod |
03:38:01 | * | Guest23044 quit (Ping timeout: 240 seconds) |
04:07:55 | * | lanior quit (Quit: Page closed) |
04:31:34 | Skrylar | meep |
04:33:49 | fowl | Skrylar, gc works fine with this pattern |
04:40:45 | Skrylar | fowl: using unref? |
04:41:01 | Skrylar | and also with or without the backlinks? |
04:43:11 | fowl | no backlinks, im not sure how to do it |
04:43:24 | Skrylar | yeah, that will take some thinking |
04:45:07 | * | mal`` quit (Ping timeout: 264 seconds) |
04:45:22 | fowl | i decided to allow 1 argument to a signal |
04:45:48 | fowl | that way i dont need to write 9 overloads, if you need to pass more info pass a tuple/object |
04:46:30 | Skrylar | hrm, do we not have that weird trickery that lets you pass a tuple in to function parameters? |
04:46:45 | Skrylar | I remember that was added to D, where you could have a template with '...' as a parameter, and then fill it with a tuple |
04:47:44 | fowl | yea it works fine https://gist.github.com/fowlmouth/9584728#file-signals-nim-L51 |
04:49:43 | Skrylar | neat |
04:51:20 | * | mal`` joined #nimrod |
05:15:25 | * | Skrylar growls at gnuplot |
05:15:33 | Skrylar | 1px lines are really not helpful |
05:42:16 | fowl | hrm |
05:42:50 | fowl | i was going to add initialization to seq/string on use |
05:43:02 | fowl | the compiler code is scary :/ |
05:43:32 | * | Demos quit (Read error: Connection reset by peer) |
05:51:45 | Skrylar | 'tis a scary place |
07:05:09 | * | xenagi quit (Remote host closed the connection) |
07:05:37 | * | skyfex joined #nimrod |
07:21:05 | * | skyfex quit (Quit: Computer has gone to sleep.) |
07:22:18 | * | vendethiel quit (Remote host closed the connection) |
07:52:23 | Skrylar | fowl: got the rectangle packer working |
08:28:53 | * | nolan_d quit (Ping timeout: 240 seconds) |
08:39:56 | * | lanior joined #nimrod |
08:45:07 | Skrylar | o_o what an idiot... "upgrading" to SSD because his write cycles are too slow when recording video |
08:45:33 | Skrylar | just upgrade to a drive that has an exponentially shortened write lifetime instead of using a RAID, genius |
08:51:24 | * | BitPuffin joined #nimrod |
08:58:36 | BitPuffin | dom96: why play Civ 5 when we can play FreeCiv |
09:01:35 | * | noam_ quit (Disconnected by services) |
09:02:00 | * | noam__ joined #nimrod |
09:06:07 | * | zahary_office quit (Ping timeout: 264 seconds) |
09:19:28 | Skrylar | BitPuffin: i don't remember liking freeciv :( |
09:19:35 | Skrylar | and freeorion had the starlane sadness from MOO3 |
09:27:24 | Araq | Skrylar: I'll let the community vote about the --cs:partial thing. We'll remove T/P either way. |
09:29:25 | Araq | with --cs:partial I have to go through the list of Babel packages and tell them to use foo not Foo. It's really annoying. |
09:31:52 | * | CarpNet joined #nimrod |
09:33:20 | Araq | and what's the point anyway. the people who enjoy fascism are all using Go already... |
09:33:31 | Skrylar | I've been coding without T prefixes; I think i considered using R instead of P |
09:33:39 | Skrylar | because P is technically supposed to be "pointer" |
09:34:28 | Skrylar | and.. yeah, I don't see the value in enforcing case sensitivity. I haven't had significant troubles with casing to see why its a big deal |
09:34:35 | * | Mat3 joined #nimrod |
09:34:49 | Mat3 | Good Day |
09:34:54 | Skrylar | 'morning. |
09:35:17 | lanior | Is there any way to enable null pointer dereference checks? |
09:36:57 | Araq | lanior: type Foo = ref int not nil |
09:37:09 | Araq | but the stdlib doesn't use it, making it hard to work with |
09:37:40 | Araq | we'll eventually update the stdlib but it will remain annoying for the guys of us who have complex invariants |
09:39:05 | Mat3 | I want remark that the recent Git version of Nimrod depend on libdl, so compilation need an additional »-t='-ldl'« flag, otherwise ld abort though unresolved references to dlopen, dlclose and dlsym |
09:39:42 | lanior | Araq: So there is no magic compiler switch to force nil checks? |
09:40:03 | Mat3 | (at least on Ubuntu) |
09:44:31 | Araq | Mat3: yes. why is that a problem? |
09:45:01 | Araq | lanior: no, but at least 'not nil' is checked at compile time, not runtime |
09:45:08 | Skrylar | Araq: Oh, because it doesn't add the -ldl flags properly there. |
09:45:21 | Skrylar | Back when I had linux on this computer I had to add it to get anything compiled. |
09:46:06 | Araq | hu? |
09:46:36 | Araq | I guess the ubu people decided -ldl needs to be at the end for "correctness" |
09:47:16 | Mat3 | Araq: It would be nice at least actualising the documentation, otherwise new programmers which want to participate are forced into unneeded troubles |
09:47:36 | Araq | Mat3: no we will fix it instead |
09:48:04 | Araq | but that doesn't mean I don't enjoy ranting about this |
09:48:19 | Mat3 | that's ok |
09:49:24 | BitPuffin | Araq: doesn't sound like something someone decided, more like, if you need libdl, you should link to it. You can't have the operating system guess what you want to link to, that would be stupid and error prone |
09:50:02 | Araq | BitPuffin: we do pass -ldl to gcc |
09:50:06 | Araq | since forever |
09:50:30 | Araq | we don't pass it "properly" though and gcc decided it should be stricter |
09:50:37 | Araq | something like that |
09:50:55 | BitPuffin | I'm not sure what you mean |
09:50:59 | lanior | Araq: any plans to add optional runtime check? Nimrod already has bundChecks so missing nilChecks looks a bit inconsistent |
09:51:44 | Araq | lanior: since you are the 3rd guy who wants it, I'll put it on my todo |
09:52:02 | lanior | Araq: this feature is particularly useful in web server. I dont want to reset all connections instead of serving page 500 to one user |
09:52:11 | Araq | I know |
09:52:38 | * | CarpNet quit (Remote host closed the connection) |
09:55:00 | * | io2 joined #nimrod |
09:58:59 | * | EXetoC quit (Ping timeout: 240 seconds) |
10:02:10 | * | CarpNet joined #nimrod |
10:02:48 | * | io2 quit () |
10:03:22 | lanior | Coroutines are still not available? |
10:06:55 | lanior | if not, what is the recommended way to handle parallel requests (i'm talking about web server). Thread pool? Are there any library support to build DB connection pool or balance requests between threads? |
10:08:37 | BitPuffin | ping zahary |
10:08:40 | BitPuffin | only one zahary this time |
10:15:43 | Mat3 | lanior: As I know, a decent coroutine implementation is planned |
10:17:08 | Mat3 | what kind of coroutine concept do you prefer (or which is of most usage for you) ? |
10:18:15 | lanior | there are many of them? |
10:19:14 | Mat3 | yes, parallel sheduling though process pools of cooperative tasks is one strategy for example |
10:19:44 | lanior | its just a different scheduling strategies |
10:19:45 | NimBot | dom96/jester master c88b792 Jason Livesay [+0 ±1 -0]: Add ttyl and finished |
10:19:45 | NimBot | dom96/jester master fa3a127 Jason Livesay [+0 ±1 -0]: Remove extra comments |
10:19:45 | NimBot | dom96/jester master 9f2a1eb Jason Livesay [+0 ±1 -0]: Fix comment |
10:19:45 | NimBot | dom96/jester master a60a4ff Jason Livesay [+0 ±1 -0]: finish as function |
10:19:45 | NimBot | 2 more commits. |
10:20:18 | Mat3 | that is what I asked for |
10:20:22 | lanior | web workload is primarily IO bound so i am fine with cooperative tasks |
10:21:07 | Mat3 | good to know, thanks |
10:21:19 | lanior | ... unless you are using Django) |
10:22:52 | Mat3 | sorry, I am quite unfamiliar with most aspects of web related programming |
10:23:32 | lanior | this is likely to be a python problem |
10:24:11 | lanior | django relies on metaprogramming tricks to provide nice ways to define ORM models and forms |
10:24:21 | runvnc | Well, I don't know about parallel exactly, but I am using jester and putting long running requests in a redis queue |
10:24:24 | lanior | they are pretty slow |
10:24:28 | runvnc | that way if I get really successful |
10:24:34 | runvnc | I can even service them on multiple VPSs |
10:24:47 | runvnc | then I pull the data off the redis queue when it is done processing |
10:24:50 | runvnc | and send it with jester |
10:24:54 | runvnc | its not exactly parallel |
10:25:02 | runvnc | but jester is fast |
10:25:12 | runvnc | and can handle thousands of requests per second that way |
10:25:18 | lanior | i am not talking about offloading CPU intensive workload to background processes via queue |
10:25:25 | lanior | yes jester is fast |
10:25:57 | lanior | its definitely not the fastest but its fast enough |
10:26:15 | runvnc | my understanding is that message queues are kind of a standard best practice for scaling web servers |
10:26:36 | lanior | nope its about scaling web applications |
10:26:57 | runvnc | I had a project last year |
10:27:00 | lanior | modern web servers can handle more than 500k requests per second |
10:27:04 | runvnc | which was about scaling web applications |
10:27:08 | runvnc | lol |
10:27:11 | lanior | the problem is IO |
10:27:13 | runvnc | what are you talking about lanior |
10:27:17 | runvnc | "modern web server" |
10:27:50 | lanior | anything using appropriate async system API |
10:27:58 | runvnc | so anyway last year I had a Node.js project, about scaling.. we were taking advantage of the asynchronous IO in node |
10:28:36 | runvnc | doesnt matter what kind of tricks you pull with non-blocking io, if you go through the kernel you are not going to get 500,000 requests per second |
10:28:48 | runvnc | anyway we were taking advantage of async io in node, but we still were building it with a queue |
10:28:51 | runvnc | out of process |
10:28:56 | runvnc | and that is what twitter and others do |
10:29:15 | runvnc | I have seen a few articles about a guy who had 500,000 _connections_ on one node server |
10:29:21 | runvnc | thats different from requests per second |
10:29:44 | lanior | i guess that was whats up |
10:30:18 | runvnc | if you really want to push 100000 requests per second you have to go around the kernel |
10:30:23 | lanior | my toy libuv based webserver handles about 80k requests per second on 1 core |
10:30:27 | runvnc | most people dont go to the trouble |
10:30:51 | lanior | system calls are not THAT expensive |
10:30:55 | runvnc | ok thats news to me |
10:31:03 | runvnc | can you publish a benchmark of that on a blog somewhere |
10:31:07 | runvnc | and post to hacker news |
10:31:17 | lanior | wait a minute |
10:31:18 | runvnc | because I have not seen numbers like that from 1 core without avoiding the kernel |
10:31:21 | runvnc | its not a normal thing |
10:31:49 | Mat3 | exist there a way for redefining an object (I mean no instanciation but object replacement) ? |
10:31:52 | lanior | you cant avoid kernel without using userspace network stack |
10:32:08 | lanior | which is not what normal people do |
10:32:27 | runvnc | yeah normal people dont say that 80k requests per second is a normal web server either |
10:32:38 | runvnc | very interested to see a benchmark comparing your program with "normal" web servers |
10:33:24 | lanior | http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=plaintext |
10:35:02 | lanior | and my toy app web server: github.com/lanior/plum |
10:35:18 | lanior | it was built using libuv, joyent http parser and boost coroutine libraries |
10:35:41 | lanior | just to learn c++ tricks and web server perfomance limitations |
10:36:10 | lanior | but i am fine with 10-100 RPS |
10:36:22 | Mat3 | lanior: thanks for the link |
10:36:58 | runvnc | what does the header column mean |
10:37:04 | runvnc | 256 1024 4096 etc |
10:38:38 | lanior | concurrency requests |
10:38:45 | Mat3 | however: The statistics show a larger difference between both hardware platforms |
10:39:17 | lanior | Dedicated server is a better choice |
10:40:19 | runvnc | I don't know where they are coming up with these numbers |
10:40:28 | runvnc | I can see maybe 10000 requests per second on node |
10:40:37 | lanior | javascript is slow |
10:40:38 | runvnc | dont know how they get 80000 never heard a number like that |
10:40:59 | runvnc | I have not seen numbers like this before |
10:41:46 | lanior | well V9 is faster than CPython but its targetting browsers so it cant apply heavy optimizations like Java VM |
10:42:04 | Skrylar | :3 |
10:42:17 | Skrylar | I still find amusement in that the V-engine is using Smalltalk tech |
10:42:31 | runvnc | the nodel.js benchmark is clustered |
10:42:43 | lanior | BTW luajit shows better results using the same libuv network library |
10:43:39 | runvnc | s of Round 7, three Intel Sandy Bridge Core i7-2600K workstations with 8 GB memory each (early 2011 vintage) for the i7 tests; database server equipped with Samsung 840 Pro SSD |
10:43:48 | runvnc | if they are using 3 servers in clustered mode |
10:43:54 | runvnc | then I can buy 80000 requests per second |
10:44:01 | runvnc | so I think you are confused about what is being tested |
10:44:06 | runvnc | those numbers arent for one core |
10:44:27 | lanior | they are for one machine |
10:44:40 | lanior | benchmarks are run from a separate machines |
10:45:24 | runvnc | http://www.techempower.com/benchmarks/#section=environment&hw=i7&test=plaintext&p=ymz1dq-27 |
10:45:38 | runvnc | says three sandy bridge |
10:46:15 | lanior | 1 Web Server 1 DB server 1 Test Server AFAIK |
10:46:34 | dom96 | 'morning |
10:46:55 | runvnc | the node.js test is clustered |
10:46:59 | runvnc | and so are the rest of them |
10:47:16 | Skrylar | morning dom96 |
10:47:23 | Skrylar | lanior: thats because luajit is awesome |
10:47:24 | runvnc | its not a single core test, doesnt say anyhing like that on the techempower site |
10:47:25 | lanior | its clustered on one machine |
10:47:29 | runvnc | yeah |
10:47:34 | runvnc | so that is using all of the processors |
10:47:36 | lanior | because nodejs cant use more than 1 core |
10:47:37 | runvnc | not 1 core |
10:47:42 | Mat3 | morning dom96 |
10:47:58 | runvnc | It can, it does, it uses all the cores, and that explains the 80k requests per second |
10:48:06 | lanior | oh man... |
10:48:10 | runvnc | suggesting that those numbers are for one processor is ludicrous |
10:48:27 | runvnc | lanior I have been coding in Node.js for three years |
10:48:39 | lanior | Node.js IS SLOW comparing to those web servers |
10:48:40 | runvnc | In clustered mode, node.js will use all of the processors you ask for |
10:48:52 | runvnc | did I say it was fast? |
10:49:07 | lanior | V8 much slower than c++ or Java |
10:49:07 | runvnc | I am just saying you don't get 80k requests per second from a "normal" web server on one core |
10:49:24 | lanior | what is "normal" web server? |
10:49:38 | lanior | Java web servers can five you that speed |
10:49:59 | runvnc | you seemed to be arguing that a single core, single thread "normal" server should get 80k requests per second |
10:50:02 | runvnc | which is ludicrous |
10:50:06 | runvnc | anyway its bedtime for me |
10:50:08 | lanior | but i am not talking about doing something useful. Just "Hello world" page |
10:50:08 | runvnc | goodnight people |
10:50:15 | runvnc | even with hello world |
10:50:17 | * | runvnc quit (Quit: Leaving) |
10:51:45 | Skrylar | Alright.. today... hrmm. |
10:51:49 | Skrylar | Event dispatch sounds important |
10:54:08 | Skrylar | Araq: any opinion on Qt signal/slots? |
10:54:08 | lanior | 11k RPS using jester |
10:54:12 | Skrylar | fowl and I were talking about that earlier |
10:54:14 | lanior | hmm |
10:54:35 | lanior | does it use epoll on linux? |
10:54:39 | dom96 | no |
10:54:45 | dom96 | not yet |
10:54:53 | * | Skrylar also prods dom96 as he was interested in GUIs |
10:55:02 | dom96 | it also isn't optimised at all |
10:55:08 | lanior | and its single threaded? |
10:55:16 | dom96 | Skrylar: never used Qt so I don't know. |
10:55:18 | dom96 | lanior: yeah |
10:55:48 | lanior | look like i have to compile my toy webserver to get a good baseline |
10:55:56 | Skrylar | dom96: maybe i should do a writeup of common event systems; but basically, signal/slots is putting callbacks in a queue |
10:56:08 | lanior | dom96: any way to bypass blocking on database calls? |
10:56:09 | Skrylar | so you have blah.onResized.connect(stuff) # i am now an event |
10:56:38 | dom96 | lanior: I don't think the current database APIs support that. |
10:56:41 | lanior | dom96: looks like databases drivers from stdlib doesnt not support async interface |
10:57:00 | lanior | but we can use thread pool |
10:57:21 | lanior | this is basically what python/php webserver does |
10:57:24 | dom96 | Skrylar: Isn't that what GTK uses too? |
10:57:25 | lanior | many processes or threads |
10:57:45 | Skrylar | dom96: i think gobject/gtk does that, a little clunkier |
10:58:03 | * | hgsdgbv joined #nimrod |
10:58:06 | Skrylar | Delphi "kind of" does sigslot, though it does a more java-ish version of it. |
10:58:12 | Skrylar | Java observers are terrible IMO |
10:58:52 | lanior | without that database connection will ruin perfomance |
10:59:11 | lanior | its a big problem if you have more than 5 QPS |
11:00:31 | hgsdgbv | Which gui lib shall i use? I'm not used to C. |
11:00:40 | lanior | i can still run multiple processes and do load balancing but that does not sounds good |
11:00:50 | Mat3 | how I override an object member ? |
11:06:33 | * | easy_muffin joined #nimrod |
11:06:50 | lanior | dom96: did you see easy way to implement balancing requests in jester between worker threads? |
11:07:16 | dom96 | no sorry |
11:07:29 | lanior | hard way?) |
11:07:32 | dom96 | async API should be done soon and then things will be easy |
11:07:34 | BitPuffin | dom96: is the new async stuff you did in tfm? |
11:07:44 | dom96 | BitPuffin: tfm? |
11:07:50 | BitPuffin | dom96: as in rtfm |
11:07:51 | dom96 | BitPuffin: oh btw, FreeCiv sucks. |
11:08:05 | BitPuffin | dom96: oh btw, YOU suck |
11:08:09 | dom96 | BitPuffin: It's in the stdlib if that's what you're asking. |
11:08:23 | BitPuffin | dom96: no |
11:08:25 | BitPuffin | tfm |
11:08:31 | lanior | dom96: you mean c# like async? |
11:08:46 | dom96 | yes |
11:08:57 | dom96 | BitPuffin: It's not in the manual and it won't be. |
11:10:35 | BitPuffin | dom96: oh so it's a lib thing |
11:10:39 | BitPuffin | I thought it was language stuff |
11:10:42 | BitPuffin | since it looked like it |
11:10:45 | BitPuffin | guess it's macros |
11:10:48 | lanior | looks like it converts function to promise-based variant |
11:11:22 | Araq | Mat3: use 'method' to override, but I'd use a proc var instead |
11:11:42 | Araq | I want to remove 'method' for nimrod v2 :P |
11:12:50 | Araq | hgsdgbv: we only have gtk and iup bindings afaik |
11:13:45 | lanior | dom96: using it would require wrapping async proc with async macro right? |
11:13:59 | dom96 | yes |
11:14:00 | hgsdgbv | Yeah i was looking at gtk2 doc. Btw, why are you removing methods? |
11:14:18 | hgsdgbv | Or what will be the alternative? |
11:14:26 | Araq | because I want the macro system to generate the dispatchers |
11:14:36 | Araq | more flexible and faster on x86 |
11:14:58 | lanior | but who uses x86? |
11:15:04 | hgsdgbv | Me |
11:15:28 | BitPuffin | dom96: I was just joking, you're a jolly good fella |
11:17:07 | hgsdgbv | Bear with me: i want to ¿instantiate? this: PWidget* = ptr TWidget |
11:17:09 | lanior | dom96: all the way down to the event loop callback? |
11:17:19 | hgsdgbv | Do i have to use new(PWidget) or something? |
11:18:06 | dom96 | lanior: The macro handles the low-level details. |
11:18:10 | Araq | lanior: btw the database APIs are mostly designed for convenience. for performance you likely have to use the native APIs |
11:19:44 | lanior | Araq: thread blocking API is basically unusable without big thread pool |
11:20:55 | Mat3 | Araq: thanks |
11:24:05 | Araq | lanior: so fix the wrapper to support asynio :P |
11:24:43 | Araq | it's not like we're opposed to making the harder stuff possible |
11:25:45 | lanior | Araq: having decent ORM seems to be a more important issue |
11:26:16 | lanior | Araq: and i'm trying to build one now. |
11:26:37 | Araq | actually I want to make a "decent ORM" as a commercial project ... |
11:26:38 | lanior | Araq: so far I am impressed with syntax I can get using macro system |
11:27:04 | lanior | Araq: commertial ORM wont make language popular |
11:27:12 | Araq | bah |
11:27:24 | Araq | commerical anything is bad for popularity |
11:28:10 | Mat3 | Araq: I have an object type A which hold only state variables (a structure) and and object B with a member of these type C. Now I want to instanciate B and override C. Is this possible ? |
11:28:21 | Mat3 | ^an |
11:28:39 | * | EXetoC joined #nimrod |
11:29:28 | Araq | what is "this type C"? |
11:29:33 | hgsdgbv | With member you mean methid? |
11:29:35 | hgsdgbv | *method |
11:29:48 | Araq | you say A is struct-like and B inherits from C |
11:29:56 | Araq | typo? |
11:29:56 | Mat3 | C is of type A, sorry |
11:31:38 | Araq | Mat3: just check the tutorial for 'method' |
11:32:04 | Araq | I can only repeat the examples here |
11:32:50 | Araq | hgsdgbv: in general 'ptr Foo' cames from C, so you can't 'new' it, you need to use the C function to create the object |
11:33:14 | Araq | bbl it's lunch time here |
11:33:20 | hgsdgbv | Thanks, i saw in a example i had to use "gtk_window_new" |
11:33:28 | Skrylar | I've not succeeded in getting IUP to build with GCC :( |
11:33:36 | Skrylar | Unless they changed it, since IUP uses some archaic windows headers |
11:35:18 | hgsdgbv | btw how can i get a list of args passed to nimrod? |
11:40:19 | * | EXetoC quit (Ping timeout: 264 seconds) |
11:40:37 | Skrylar | I've not actually tried. |
11:41:37 | hgsdgbv | That's a good thing to know |
11:42:07 | Mat3 | I get it, thanks |
11:42:35 | lanior | hgsdgbv: http://forum.nimrod-lang.org/t/84 |
11:43:07 | hgsdgbv | Ah! thanks! |
11:43:29 | lanior | forum really needs build-in search |
11:43:40 | lanior | or maybe just google search widget |
11:43:44 | hgsdgbv | That is from 2012, it is still neccessary to import os ? |
11:43:52 | lanior | idk |
11:43:54 | lanior | probably |
11:44:35 | lanior | why asyncio2.nim is located in lib/pure? |
11:44:56 | Skrylar | could always do the forum search as a call out to node.js with lunr |
11:45:01 | Skrylar | that would be heresy though :o |
11:48:19 | hgsdgbv | But a practical one. |
11:48:32 | lanior | we can use ElasticSearch |
11:48:37 | lanior | it has simple json api |
11:48:52 | lanior | and it is node.js free! |
11:49:37 | * | EXetoC joined #nimrod |
11:51:14 | * | clovis joined #nimrod |
11:51:20 | hgsdgbv | "could not load: libgtk-win32-2.0-0.dll" I suppose i have to download this |
11:51:47 | clovis | Sounds reasonable |
11:51:53 | Skrylar | Nimrod doesn't come with the gtk runtime |
11:52:35 | hgsdgbv | Oh joy |
11:52:48 | Skrylar | Wx probably would have been a better library for us to have than GTK, but oh well |
11:53:02 | EXetoC | yes. it doesn't come with any of the C components |
11:53:48 | hgsdgbv | Maybe ... in a future? |
11:54:04 | Mat3 | well just copy the required DLL to your system directory :-> |
11:54:12 | Skrylar | o_o |
11:54:23 | Skrylar | the gtk installers put it in your path you know |
11:54:28 | Skrylar | no need to shove random things in system |
11:55:59 | Mat3 | I know, but its more fun to accumulate them in the global system directory |
11:56:02 | hgsdgbv | What if i want to distribute a binary that uses gtk2, there is an "easy" (looks with escepticism) way to distribute the dlls? |
11:56:38 | lanior | put them in the dir with executable file |
11:57:16 | hgsdgbv | Thanks, that sounds easy. |
11:57:18 | lanior | this should work in most cases |
11:58:24 | lanior | how tightly nimrod is bound to C standard library? |
11:58:36 | hgsdgbv | Humm the installer tutorial says nothing about installers that let you choose the path, besides manual action. |
11:59:20 | * | EXetoC quit (Ping timeout: 246 seconds) |
12:00:36 | Skrylar | no, its the GTK for windows installer |
12:00:55 | Skrylar | the usual way that GTK programs do it on windows is to tell you to run the GTK installer, or they include one, but its a large runtime |
12:01:06 | Skrylar | GTK is sort of a sub-optimal toolkit on Windows tbh :( |
12:01:32 | clovis | GTK is suboptimal anywhere |
12:01:39 | hgsdgbv | lol |
12:01:43 | hgsdgbv | Do i have a choice? |
12:02:06 | lanior | GTK looks so terrible on windows |
12:02:23 | lanior | QT feels slightly better |
12:02:48 | Skrylar | Qts not really usable from nimrod with any sanity |
12:03:15 | Skrylar | whatwith the whole MOC setup |
12:03:55 | lanior | but its usable from python |
12:04:58 | hgsdgbv | How many years have nimrod been developed? |
12:04:58 | clovis | How feasible is it to use Qt Quick / Qml with nimrod? |
12:05:07 | hgsdgbv | *in development |
12:06:42 | Skrylar | clovis: well the biggest problem with using Qt has to do with making sure the MOC macros are in the right places |
12:07:09 | Skrylar | Unless you find a way around it (@lanior) |
12:07:35 | BitPuffin | well it looks like zahary did something but I'm still getting an error |
12:07:46 | BitPuffin | proc `*`*[T; R, N, C: static[int]](a: TMatrix[T, R, N], b: TMatrix[T, N, C]): TMatrix[T, R, C] {.noSideEffect.} = |
12:07:53 | BitPuffin | matrix.nim(121, 49) Error: type expected |
12:07:57 | clovis | Skrylar, I see. |
12:09:30 | clovis | hgsdgbv, at least 3 years |
12:09:54 | clovis | indicated by first github commit |
12:13:45 | clovis | Oh. "Copyright (c) 2004-2014 Andreas Rumpf" |
12:15:44 | clovis | First github import was Jun 22, 2008 |
12:16:04 | clovis | 5 years, 8 months, 25 days |
12:20:38 | * | lanior quit (Ping timeout: 245 seconds) |
12:23:29 | * | lanior joined #nimrod |
12:23:41 | clovis | Someone who is interested in GUI development and Qt could look into how PyQt5 is implemented. If Python can use Qt (bypassing the MOC and the object model of C++) then should Nimrod. |
12:24:35 | lanior | or you can use it via python binding |
12:24:54 | clovis | Perhaps |
12:25:17 | hgsdgbv | And i used to hate swing |
12:25:23 | lanior | btw who knows state of python bindings? |
12:25:46 | clovis | "The latest iteration of PyQt is v5.2. It fully supports Qt 5.2.0" |
12:25:47 | lanior | i saw discussions about fluent property access syntax for pyobjects |
12:26:10 | Skrylar | I'm working on a GUI system, albeit its not a qt interface |
12:26:17 | Skrylar | we were talking earlier about adapting signals/slots to nimrod |
12:26:38 | lanior | Skrylar: custom drawn? |
12:26:47 | clovis | Skrylar, nice. Signals/slots is a good foundation |
12:26:52 | Skrylar | yeah, GL-backed |
12:27:05 | Skrylar | I was considering a WinAPI or Cairo variant a few times |
12:27:32 | lanior | whats about users without OpenGL support? |
12:27:34 | Skrylar | there's a lot of GUI that is agnostic to how it gets drawn, so its not hard to separate out the draw code to the rest of it all and have multiple versions |
12:27:38 | clovis | WinAPI - is it Windows only? |
12:27:47 | Skrylar | yes, winapi is windows native |
12:27:56 | clovis | I meant your library |
12:28:12 | Skrylar | no, any winapi code i put in is isolated |
12:28:39 | lanior | firefox even uses opengl to directx translator on windows because WinXP supports only OpenGL 1.1 out of box |
12:29:00 | Skrylar | i've been working on foundation code so far (glyph caching, texture atlases, rectangle management) so the platform stuff hasn't been reached yet |
12:29:03 | BitPuffin | the python qt binding probably exists because holy shit does python have a userbase |
12:29:12 | BitPuffin | it's not like it isn't possible in nimrod |
12:29:15 | BitPuffin | it's just a big task |
12:29:35 | lanior | and I guess you use modern OpenGL pipeline, so thats could become a problem |
12:29:54 | Skrylar | at the moment there is zero platform code, so i don't use any gl pipeline |
12:30:01 | Skrylar | i had planned on hiding the gl pipeline under a support lib |
12:30:14 | BitPuffin | lanior: what, it does support more than 1.1, as long as you have drivers |
12:30:18 | BitPuffin | you talkin cray cray |
12:30:26 | Skrylar | he said 'out of box' |
12:30:29 | lanior | BitPuffin: but many people doesnt have it |
12:30:30 | BitPuffin | well yeah |
12:30:33 | BitPuffin | but if you don't have drivers |
12:30:40 | BitPuffin | then you don't really have d3d either amirite? |
12:30:51 | Skrylar | I planned on doing a simple graphics layer like most game engines do; mostly involving shoving VBOs together |
12:30:52 | lanior | we are talking abound 2d UI |
12:31:35 | clovis | Build upon sdl2? |
12:31:38 | lanior | Skrylar: you can just use existent 2d drawing library |
12:31:41 | lanior | like skia |
12:31:53 | Skrylar | isn't skia 1) chrome's pet rasterizer and 2) C++ |
12:32:04 | BitPuffin | Skrylar: to me it seems like d3d even requires MORE setup than opengl |
12:32:16 | Skrylar | AFAICT you can't set nimrod to only partially support C++, if any one C++ lib gets in then you *have* to use it for the whole project |
12:32:23 | BitPuffin | considering every time you run a fucking game it's like, hey, I need to set up directx ;D |
12:32:58 | BitPuffin | Skrylar: that is correct |
12:33:04 | Skrylar | I'm not hugely worried about people being unable to run an OpenGL program; mostly because the apps that I plan to use it with don't target computers that have been unpatched since 2001 |
12:33:08 | BitPuffin | however there is no reason we couldn't work our way out of that one |
12:33:16 | BitPuffin | just that it's something that hasn't been done yet |
12:33:27 | Skrylar | Though the design I plan on using allows someone else to change the graphics code, so if they want to use Not GL, they can do so |
12:33:42 | Skrylar | I mean, 90% of a GUI is *not* the drawing |
12:33:59 | Skrylar | its dealing with text layouts, control layouts, usability triggers |
12:33:59 | BitPuffin | exactly: where the hood at |
12:34:21 | BitPuffin | bah, who needs em |
12:34:30 | clovis | The part that is ugly with gtk :| |
12:34:35 | Skrylar | I would be happy to have a Cairo+Pango backend, if it wasn't for Pango having the worst dependency in the world |
12:34:50 | lanior | but you wont get "native" user experience |
12:35:16 | Skrylar | so make a winapi backend? or ask windows to draw the controls? |
12:35:20 | Skrylar | Qt just.. asks windows.. to draw it |
12:35:21 | BitPuffin | Skrylar: what's the dep? |
12:35:34 | Skrylar | There's an API for asking the theme system in windows to rasterize components for you |
12:35:38 | lanior | yes it uses theme api |
12:35:50 | lanior | but its not about drawing but about user interaction |
12:36:02 | Skrylar | then those people can use the win32 backend instead of the GL backend? |
12:36:06 | lanior | like scroll behavior on mac |
12:37:00 | Skrylar | my design is not hugely different from a 2D scene graph; theres some helpers for doing layout control, and probably helpers so people don't do button.onClicked(..) crap but instead centralize action code |
12:37:26 | clovis | You had better go 4D from the start |
12:37:41 | Skrylar | what good is a time dimension going to do? :) |
12:37:47 | clovis | ;) |
12:38:20 | Skrylar | (fwiw, i was going to name one of the programs using it 'Tesseract' because it was a multidimensional outliner, thought the name would be appropriate) |
12:38:38 | BitPuffin | isn't tesseract that fork of sauerbraten? |
12:38:41 | BitPuffin | 2 |
12:39:33 | Skrylar | i didn't know there was one |
12:39:44 | Skrylar | i stole it from a minecraft mod who stole it from a 4D mathematical object |
12:40:19 | clovis | Skrylar, perhaps the only public API could be the cetralised one? |
12:41:51 | Skrylar | clovis: maybe, though i don't want people to complain that it gives them no control |
12:42:09 | Skrylar | i still have to iron out the design docs for it all |
12:42:44 | Skrylar | but I ultimately want people loading their GUIs from data files and only interacting with the GUI through a series of actions, because it ensures buttons/menu items have consistent labels as well as makes undo/redo/recording user actions much simpler |
12:42:47 | clovis | Declare Button. Declare Action. Connect Button to Action. Connect Action to Program |
12:42:55 | Skrylar | yep |
12:43:04 | Skrylar | Qt half-supports this, but I want it to support it more |
12:44:28 | Skrylar | i need to benchmark resizing anchors against unified coordinates |
12:44:58 | Skrylar | CEGUI does this thing where each coordinate point has a relative to parent and absolute point, which makes it super easy to put a box "at the top left, always 25% of the parent width" |
12:46:03 | * | hgsdgbv quit (Ping timeout: 245 seconds) |
12:46:08 | clovis | Closures that are run automatically on resize |
12:46:56 | Skrylar | Traditional GUIs have anchors/fill rules; I'm thinking about benchmarking the complexity and time for both and seeing which one is best. The good thing with unified is that they basically replace both anchors *and* fill rules entirely within the coordinates, so there is no longer a concept of "i fill this dimension" but rather its coordinates naturally specify that they do so |
12:47:16 | Skrylar | but this requires a multiply+add for every coordinate |
12:47:48 | Skrylar | parent.x*relative+absolute |
12:47:56 | clovis | Skrylar, you also have to deal with constraints like maximum and minimum size |
12:49:13 | Skrylar | clovis: i know, one step at a time |
12:49:37 | Skrylar | I want to do this right, because it feels like most GUI libs suck pretty badly |
12:49:45 | clovis | Perhaps this is all one big constrain-satisfaction problem |
12:50:45 | clovis | All the declarations are constraints like obj A must be 25% of obj B. Obj B must be at most 30% of obj C... |
12:51:27 | clovis | There are mathematical models and algorithms that deal specifically with generalised, linear constraint satisfaction problems |
12:51:37 | Skrylar | well with cegui's unified coordinates, if i tell a widget that its 30% of the width, i do so by telling it to be (0,0) (0,0) (0.33,0) (1,0) |
12:51:47 | Skrylar | It will always be 33% the width of the parent, regardless of size |
12:52:22 | clovis | But what if it has a constraint to be at least 200px |
12:52:28 | * | EXetoC joined #nimrod |
12:52:30 | clovis | `Then what do you do? |
12:52:48 | * | akghf joined #nimrod |
12:52:55 | Skrylar | I would probably suggest that the GUI be designed more like CSS4+ flexboxes, so that if the width is violated it changes to stacked tabs |
12:53:20 | Skrylar | Users get annoyed when they can't make their windows the size they want, because it decided it won't obey |
12:53:44 | Skrylar | I say its probably better that the application cope in a meaningful way, because its the job of a computer to obey |
12:54:08 | Skrylar | such as reorienting the buttons in the window, changing from a grail-style layout to stacked tabs, using icons instead of text if its really small |
12:54:46 | clovis | That requires conditionals, if-statements? |
12:55:08 | Skrylar | yes, you'd have to check the constraints on component resize |
12:55:08 | clovis | E.g: if x<200px then use layout-B |
12:55:20 | Skrylar | however you can hide most of this with precooked layout widgets, i think |
12:56:44 | Skrylar | I suppose as a last resort, you could make it so that generic widget contains enforce minimum sizes by making scrollbars appear |
12:56:56 | Skrylar | so if you have a data entry forum that just really can't degrade further, it scrolls instead |
12:57:07 | clovis | Yeah, usually |
12:57:28 | Skrylar | what i hate is when i see programs that decide to have a minimum width and will not let me shrink them, for no apparently good reason even |
12:57:49 | clovis | Another neat thing - which I have not actually seen - would be to rescale a surface (gl rescale the pixels) |
12:57:56 | akghf | How do i get a pointer from whatever? |
12:57:59 | clovis | to shrink a surface |
12:58:22 | EXetoC | akghf: addr |
12:58:31 | akghf | Nice, thanks |
12:58:32 | EXetoC | in whichever context it makes sense |
12:59:04 | Skrylar | clovis: thats a thing that a GL interface would probably be better at than a CPU one |
12:59:19 | Skrylar | since you can fiddle around with scale cheaper |
12:59:39 | Skrylar | a big reason that i want GL is 1) for game GUIs and 2) because CPU-based diagram software tends to laaaaag |
12:59:42 | clovis | Skrylar, suppose the widget has a min with of 200px and you resize it to 100px. Perhaps the GPU could do it for you in real time |
13:00:06 | Skrylar | clovis: i'll put in a note for that |
13:00:08 | EXetoC | yeah just update the coords |
13:00:28 | EXetoC | in some situations at least |
13:00:49 | Skrylar | one thing that i take inspiration from is "what does a pro gui actually *need*?" |
13:00:52 | clovis | EXetoC, yeah you might want to get the global mouse coordinates translated |
13:01:10 | Skrylar | because a lot of GUI toolkits feel like they stop after they give you 30% of what a massive program does |
13:01:34 | Skrylar | like how many DON'T have a text editing component? |
13:01:39 | Skrylar | despite the amount of programs that need them |
13:01:47 | clovis | Right |
13:02:00 | EXetoC | not that I have used many widget toolkits, but MyGUI is pretty nice |
13:02:15 | Skrylar | I forget what problem I had with that toolkit |
13:02:22 | Skrylar | I think I had weirdly low performance in some of the demos |
13:02:30 | clovis | The thing I hate the most about text editing is when the blinking cursor becomes invisible while you move it with the cursor keys |
13:03:01 | Skrylar | but yeah. i need to figure out how to deal with backlinks tomorrow, since fowl wrote a simple signal/slot module |
13:03:22 | akghf | I wrote the following sentence: let args = [0..(paramCount - 1), string] and i receive "type mismatch, got (proc(): int, int literal(1))" |
13:03:27 | Skrylar | comparing the merits of an anchor/constraint system to just using unified coords is also a todo item; CEGUI did an interesting thing there |
13:03:51 | akghf | Is because i did not use () on paramCount ? |
13:03:59 | EXetoC | yes |
13:04:04 | clovis | My advice for you would be to view GUI lay out from a general constraint satisfaction perspective. |
13:04:30 | akghf | Humm, it always happens or just inside array definition? |
13:04:37 | EXetoC | always |
13:04:49 | EXetoC | akghf: the property syntax can only be used when the proc takes at least one arg |
13:04:59 | EXetoC | x.val |
13:05:34 | Skrylar | clovis: i've been looking at it as a simple draw tree system that just obeys; IMO time spent dealing with GUI code is wasted time |
13:05:45 | akghf | aaaah, that explains a lot. Si, if there does not exist a paramCount(arg1), you cant use that syntax? |
13:05:47 | EXetoC | where val might be defined as "proc val(x: Type)" |
13:05:49 | Skrylar | it should just do what you want it to (e.g. show the interface) instead of require 500 special knobs |
13:06:10 | akghf | *so |
13:06:18 | EXetoC | akghf: exactly. it's a reasonable limitation |
13:06:21 | Araq | hi akghf welcome |
13:06:25 | akghf | Thanks again EXetoC. |
13:06:35 | akghf | Hello there Araq. |
13:06:44 | Araq | Skrylar: interesting. I thought about an opengl ui toolkit too. |
13:06:58 | clovis | Skrylar, perhaps I got the wrong impression. You're perhaps writing a library at a lower level - closer to the hardware |
13:07:08 | Araq | then I tried to make a sweet lazarus interface and failed :P |
13:08:02 | Araq | should have listened to the guy years ago who told me to build nim on top of FPC ... |
13:08:15 | Skrylar | FPC is pretty nice |
13:08:26 | Skrylar | clovis: its an indeterminate level for the time being; as i mentioned earlier, still in design docs |
13:08:30 | clovis | What䳠FPX? |
13:08:36 | clovis | FPC? |
13:08:45 | Skrylar | I'm working on low-level stuff while assembling concepts and weighing decisions |
13:08:49 | Araq | it's still reasonably easy to build the UI with lazarus and link nimrod to it |
13:09:05 | Araq | the repo even had an example but somehow we lost it |
13:09:20 | EXetoC | Araq: did you say before that you wanted to change the convention from TType to Type, while keeping case insensitivity? |
13:09:37 | Araq | that's what I said, yes |
13:10:02 | Skrylar | measuring simplicity is going to be a nightmare |
13:10:15 | Skrylar | i'm not sure how to compare two modules to see which one that does the same job is "simpler" |
13:10:31 | Araq | Skrylar: than ask me :P |
13:10:35 | Araq | *then |
13:11:10 | akghf | How do i resolv the error: type mismatch: got (typedesc[string]) but expected 'TSlice[int]' in "let args = [0..(paramCount() - 1), string]" |
13:11:30 | Araq | clovis: FPC = Freepascal compiler, Lazarus = delphi like environment |
13:11:45 | Araq | produces a native UI on macosx, linux, windows |
13:11:48 | akghf | wow, works even on gba |
13:11:56 | clovis | Interesting |
13:12:02 | Araq | with a decent UI builder |
13:12:05 | EXetoC | Araq: won't this increase the occurrence of symbol shadowing? |
13:12:38 | Araq | EXetoC: looks like we more disambiguation rules anyway for module vs. other symbol |
13:13:00 | Skrylar | yep. I was an FPC+Lazarus derp for a while |
13:13:12 | Skrylar | I don't like Lazarus though.. the IDE is nice, but the LCL is a pain |
13:13:26 | Skrylar | Its just a clone of Borland, so all the annoying crap is still annoying and writing custom widgets is unfun |
13:13:55 | clovis | It sounds likely that the name of a module would be the same as that of its defining type, in many cases. |
13:14:13 | Araq | actually the convention is to add an 's' to the module name |
13:14:20 | Araq | tables, sets, etc. |
13:14:28 | clovis | That's quite good |
13:14:39 | clovis | Had not thought about that |
13:14:42 | Araq | rectangles vs rectangle |
13:14:48 | Araq | solves the problem |
13:15:44 | EXetoC | Araq: how will foo() for example be disambiguated? |
13:16:02 | Araq | how can foo() be a module name? |
13:16:08 | EXetoC | what about types? |
13:16:29 | EXetoC | type constructors for example, vs call operators |
13:16:58 | Araq | these simply shouldn't have the same name createFoo, newFoo, allocFoo vs Foo |
13:17:12 | Araq | like it is today |
13:17:17 | clovis | I think there are languages where the ctors do not share the name of the type |
13:17:36 | * | noam__ is now known as noam |
13:19:50 | clovis | As long as a global identifier's name is shadowed by a local declaration I'm happy. E.g. Global type WindowFrame is shadowed by: local var windowFrame:Rectangle = ... |
13:19:53 | EXetoC | akghf: the error is on another line, right? 'args' ends up being a typedesc |
13:20:11 | EXetoC | akghf: you might want : rather than = |
13:20:15 | clovis | This way you can drop the T from TRectangle and TWindowFrame |
13:20:46 | EXetoC | but that's an array with a runtime size. does that work? |
13:20:59 | EXetoC | I guess we'll find out soon |
13:21:02 | akghf | I want to iterate over the params and insert them into the array. |
13:21:10 | Araq | clovis: I think what you mean already is implemented but it's inherently complex to this properly thanks to macros |
13:21:27 | clovis | Oh |
13:21:27 | EXetoC | akghf: just replace the = with a : |
13:21:35 | akghf | i'll try. |
13:22:03 | Araq | var s = newSeq[string](paramCount()) |
13:22:19 | Araq | for i in 0 .. < paramCount(): s[i] = paramStr(i) |
13:22:31 | Araq | I don't think you can use a shortcut for that |
13:23:07 | EXetoC | maybe when we get that lambda macro |
13:23:23 | Araq | you may want to use the parseopt2 module which everybody dislikes instead |
13:23:35 | Araq | which makes you write string cases and so it sucks |
13:24:10 | Araq | much better would be a table[string, closure] instead. |
13:24:52 | Araq | this way you can have the same syntax but slightly slower code which adheres to the nonsensical "switch statements are bad" rule |
13:26:56 | * | Araq wonders if he is hard to follow |
13:27:55 | akghf | Nice. I did it with seqs, thanks. Now, i have to pass a pointer to gtk's init method |
13:28:17 | akghf | addr did not do the work |
13:28:32 | EXetoC | Araq: nonsensical indeed.. |
13:28:42 | EXetoC | table[string, string] would be more reasonable |
13:29:55 | EXetoC | https://github.com/docopt/docopt |
13:30:51 | EXetoC | or maybe values that are variants |
13:43:07 | akghf | how can i get a "pointer" from an object? using addr gives me "ptr seq", not "pointer" |
13:43:29 | * | Mat3 quit (Ping timeout: 255 seconds) |
13:43:42 | OrionPK | is thre a way to quit an iterator early? |
13:43:47 | EXetoC | akghf: it won't matter in many cases currently, but you can just cast it to a pointer |
13:43:49 | OrionPK | return / yield break |
13:44:03 | EXetoC | return? |
13:44:21 | OrionPK | "return not allowed here" |
13:44:28 | EXetoC | oh |
13:44:32 | akghf | it is because the compiler is complaining. How can i cast it? with Pointer(addr whatever) ? |
13:44:53 | EXetoC | akghf: actually, try x.addr.pointer |
13:45:10 | EXetoC | and if that fails, try cast[pointer](typedPtr) |
13:45:16 | Araq | that's a type *conversion* though |
13:45:20 | EXetoC | OrionPK: just break then I guess |
13:45:29 | akghf | Thanks EXetoC again, you are most helpful |
13:45:31 | Araq | casting looks like cast[pointer](addr x) |
13:45:39 | clovis | yield exits from the iterator, break from the loop. |
13:45:41 | OrionPK | invalid control flow: break |
13:45:47 | Araq | but surely a type conversion works here |
13:46:02 | clovis | OrionPK, break from the loop not the iterator |
13:46:29 | Araq | OrionPK: there is no alternative to a nested 'if', I think |
13:46:32 | OrionPK | yeah.. basically that's my only option I guess. a "yield break" would be nice |
13:47:38 | clovis | I don't think it's the iterators responsibility |
13:48:09 | OrionPK | iterators can have logic too |
13:48:27 | clovis | They should be able to be reused elsewhere |
13:48:28 | EXetoC | it's always the responsibility of the iterator to determine the *max amount* of values to yield |
13:48:49 | BitPuffin | Araq: will we ever get rid of the inconsistency between named params and constructors? |
13:48:51 | EXetoC | and then the actual user can break earlier if necessary |
13:48:59 | clovis | They shouldn't need to know how the calling loop is implemented. Perhaps there is more code in the loop that must be executed |
13:49:07 | akghf | How can i get an address from an integer? |
13:49:09 | OrionPK | EXetoC yes but based on logic during iteration, there might be fewer of something |
13:49:10 | akghf | Or create one |
13:49:14 | OrionPK | so breaking early is necessary |
13:49:17 | BitPuffin | akghf: addr theint? |
13:49:40 | akghf | that gives me "expression has no address" |
13:49:52 | BitPuffin | wait |
13:50:02 | BitPuffin | are you trying to get the addr of 1 + 3 for example |
13:50:04 | BitPuffin | or a variable |
13:50:16 | akghf | From a var |
13:50:17 | EXetoC | akghf: do you really need that? if so, then make sure that the integer is a var. 'let' won't allow you to take the address of it |
13:50:25 | akghf | aa, ok |
13:50:26 | akghf | i used let |
13:50:53 | BitPuffin | EXetoC: wasn't there a time where it did let you get address of a let? |
13:51:02 | EXetoC | OrionPK: I think I implied that. I'm just saying that both the iterator and the caller can break whenever |
13:51:11 | BitPuffin | or wait |
13:51:16 | Araq | akghf: the gtk module has 'nimrod_init' that you should call to setup the command line for gtk |
13:51:21 | BitPuffin | it's that you are allowed to change what's the value of a pointer |
13:51:23 | OrionPK | right.. but the iterator cant unless it's got an inner loop |
13:51:24 | Araq | no need to do it yourself |
13:51:30 | BitPuffin | so if you have let foo = PBar() |
13:51:39 | BitPuffin | you could do foo[] = ... |
13:52:06 | Araq | and you need to use toCStringArray anyway otherwise |
13:52:09 | clovis | In my opinion. The iterator should not be able to control when and how the loop is exited. It's not its responsibility. The calling loop might have to do other operations during the current iteration before exiting. |
13:52:12 | akghf | My god, at last i see a fucking window. |
13:52:50 | BitPuffin | Araq: are we ever gonna have a recursive let? which would force immutability even if you dereference or access an array or something whatever? :P |
13:53:02 | * | BitPuffin coughs at dom |
13:53:07 | EXetoC | clovis: you're breaking implicitly anyway, whenever the iterator is done |
13:54:00 | clovis | EXetoC, suppose you're using an iterator defined in a library. How could the library author possibly know all the use cases? |
13:54:32 | clovis | All the iterator can say is: hey, i'm done here. Then it's up to the loop to decide what to do |
13:54:33 | Araq | BitPuffin: we'll get something better instead. A 'discard' pragma that checks the implementation is only allowed to consist of a single 'discard' statement |
13:54:54 | EXetoC | clovis: I didn't imply that it should know anything about the caller |
13:55:13 | clovis | EXetoC, then I must have misunderstood you. |
13:55:24 | BitPuffin | Araq: is that even related? |
13:55:37 | BitPuffin | I think you are joking |
13:55:42 | BitPuffin | it's always hard to tell with you |
13:55:49 | BitPuffin | dom96: I was coughing at you |
13:55:51 | BitPuffin | pay attention damn it |
13:55:59 | Araq | I'm joking, yeah |
13:56:00 | BitPuffin | dom96: write an article about the async stuff, naoooo |
13:56:18 | BitPuffin | Araq: :) |
13:56:23 | Araq | BitPuffin: we'll get write-effect tracking which amounts to the same |
13:56:53 | BitPuffin | Araq: will this help out with the way that C interferes? |
13:57:05 | Araq | what? |
13:58:04 | BitPuffin | Araq: ie like when you mark a proc with noSideEffect, and you call a C function which you know in your heart causes no side effects to your program so you still want the proc to be considered noSideEffects by other procs that are marked with noSideEffect? |
13:58:48 | clovis | I've never know anything this profound in my heart |
13:58:55 | BitPuffin | like a {.noMrCompilerYouDoNotNeedToCheckForSideEffectsBecauseYouWillThinkThatThereAreButThereReallyAreNotAnyIPromisePleaseBabyDoNotHurtMe.} pragma |
13:59:33 | BitPuffin | guess it's not entirely related |
13:59:54 | BitPuffin | I guess what you mean is that with the write tracking let will actually enforce immutability because it tracks if something writes to it? |
14:01:23 | clovis | That's a nice pragma, though |
14:01:48 | BitPuffin | well I guess while I wait for zahary to rise from the dead and my colleague to write some code so that I can deploy it I'll rtfm |
14:01:55 | BitPuffin | tfgfm |
14:02:02 | BitPuffin | tfgm* |
14:02:11 | EXetoC | clovis: the iterator always controls when the loop is exited, and so 'break' inside the iterator wouldn't make a difference. besides, break is nothing more than a shorter/faster way of exiting from a loop |
14:02:40 | EXetoC | A loop is probably the most common way of implementing an iterator, but it could be anything really. 5 yields in a row for example |
14:03:14 | EXetoC | did I misunderstood *you*? |
14:04:23 | clovis | EXetoC, I see the iterator as a function to be called by the loop. Therefore the loop has the final say. Perhaps it has to do something else before exiting? |
14:05:56 | EXetoC | all break inside the iterator would do is possibly result in fewer values yielded. that doesn't change anything in this regard. |
14:06:13 | clovis | Right |
14:06:26 | EXetoC | and I don't know why you'd want to do something just before an iterator exits, but there's currently no way to know if you are at the end anyway |
14:07:45 | clovis | I think you're right. I didn't think it through clearly enough |
14:12:53 | dom96 | BitPuffin: Weren't you supposed to have a blog done like months ago? :P |
14:12:54 | EXetoC | I'll be experimenting with a library-based alternative to 'iterator' soon, similar to D's ranges, which means you'll be able to query the state |
14:13:21 | EXetoC | dom96: did you try the lambda macro recently? :> |
14:14:11 | EXetoC | hopefully we can have it ready for 0.9.4 |
14:14:41 | clovis | EXetoC, lazy evaluation also? |
14:14:44 | * | Varriount joined #nimrod |
14:15:02 | dom96 | EXetoC: no but zahary fixed that bug so I will try it ASAP |
14:15:35 | Araq | Varriount is back! :-) |
14:16:01 | Araq | Varriount: you're on the criticial path now. are you happy? |
14:16:46 | Skrylar | Hrm. I saw the HN discussion about Nimrod getting AFD'd on wikipedia |
14:16:49 | EXetoC | dom96: yay |
14:16:53 | Skrylar | Just looked at the Buzz page again |
14:17:07 | Skrylar | they have a list of "buzz clones" that are all unfinished except for one |
14:17:24 | BitPuffin | dom96: shh |
14:17:25 | Skrylar | they sure do a great job curating those non-notable projects don't they -_- |
14:17:26 | Varriount | Araq: Sorry, I've been taking a break, playing some games, etc. |
14:17:36 | BitPuffin | dom96: well I can't fucking finish the blog because of this mac os x bug with redirect |
14:17:39 | BitPuffin | so that's my excuse |
14:17:48 | * | darkf quit (Quit: Leaving) |
14:18:02 | BitPuffin | and how am I supposed to be able to write an article about YOUR async stuff ;D |
14:18:18 | dom96 | You're not. You're suppose to write an article about Nimrod. |
14:18:27 | dom96 | Skrylar: buzz page? |
14:18:41 | BitPuffin | well yeah when zahary fixes the bugs that are currently holding linagl back from it's new release I will |
14:18:45 | BitPuffin | and it's not far off |
14:18:47 | BitPuffin | the code is there |
14:18:50 | Araq | Varriount: please add that nimbuild feature. I depend on it |
14:18:51 | BitPuffin | just not the compiler :P |
14:19:47 | EXetoC | clovis: they are lazy by definition I think |
14:21:48 | EXetoC | clovis: you can pass it around however you like, and the range will be exhausted only after popping a certain amount of times, and that can be hidden using some foreach macro |
14:21:56 | Varriount | Araq: Testing bootstrapping you mean? |
14:22:10 | * | Demos joined #nimrod |
14:24:42 | Araq | no the "still failing tests" features |
14:25:10 | EXetoC | I can't remember what I was going to call it though. I don't think range is a good name, and it's occupied already |
14:25:34 | Skrylar | dom96: the wikipedia entry for jeskola buzz |
14:25:39 | Skrylar | its an old tracker |
14:26:07 | Skrylar | but they have out-links to a lot of abandoned code :| |
14:27:27 | Araq | EXetoC: closure iterators already provide what you seek (you can pass them around) |
14:27:31 | * | psquid quit (Ping timeout: 264 seconds) |
14:27:57 | * | psquid joined #nimrod |
14:28:01 | Araq | but a "cursor" might be a good name, perhaps? |
14:28:19 | Araq | that's what a c++ iterator is anyway |
14:28:32 | Araq | a D-styled range is a cursor_pair |
14:29:16 | * | Skrylar might write a tracker in nimrod someday :/ i hate the 'pattern command' thing where you have to type in hexcodes as though this was 1960 and you were punching raw binary code on to paper <_< |
14:32:12 | EXetoC | yeah ok |
14:33:18 | BitPuffin | hey right now int / int gives back an int right? |
14:34:05 | EXetoC | Araq: I like the idea of having a library implementation though. I think I said this before, but it will at the very least be a nice way to demonstrate the UDTC feature |
14:34:15 | EXetoC | with sensible error messages and all |
14:34:19 | * | vendethiel joined #nimrod |
14:34:24 | EXetoC | BitPuffin: it works? |
14:34:44 | BitPuffin | EXetoC: what are you talking about? |
14:34:52 | EXetoC | BitPuffin: yeah it does, but it gives you a float |
14:34:56 | EXetoC | again, see system.nim :) |
14:35:06 | BitPuffin | well yeah I didn't feel like looking it up |
14:35:16 | BitPuffin | I didn't know that int / int made float |
14:35:38 | EXetoC | proc `div` *(x, y: int): int {.magic: "DivI", noSideEffect.} |
14:35:40 | BitPuffin | so we don't have a way to divide and get back int? or maybe that's the div keyword or something like that fuck I don't remember |
14:35:57 | Demos | does int / int at least do the correct conversion to float? |
14:36:09 | Araq | Skrylar: what do you mean with "pattern command"? |
14:36:15 | BitPuffin | Demos: no Araq decided to opt for the incorrect conversion |
14:36:21 | EXetoC | I got used to it, but then I found it annoying when attempting to write a generic interface |
14:36:40 | BitPuffin | EXetoC: I was thinking we could have / and /. |
14:36:42 | Araq | no? 0 / 2 produces 0.5 |
14:36:53 | Araq | how is that the incorrect conversion? |
14:37:04 | BitPuffin | Araq: I was being sarcastic :) |
14:37:08 | Araq | I mean 1 / 2 of course |
14:37:16 | BitPuffin | yeah I was like what |
14:37:20 | BitPuffin | wow such correct |
14:37:35 | Demos | hehe well I figured maybe the bitpattern was just interpreted as a float. hey it could happen :D |
14:37:36 | BitPuffin | 0 / 2 = 0.5 - Araq 17 March, 2014 |
14:37:54 | Varriount | Araq: Are you sure that you don't' just want to add some javascript table sorting to the test results page, so that you can see all the failing tests that way? |
14:37:58 | EXetoC | Demos: brilliant |
14:38:09 | EXetoC | you know Araq. he ain't stupid :p |
14:38:31 | Araq | Varriount: yes. I don't want to look at nimbuild's website |
14:38:44 | Araq | because that is yet another tab in my browser |
14:39:12 | Araq | #nimbuild is a tab in my irc client. much better ;-) |
14:39:46 | BitPuffin | he ain't? :o :O but I wanted to use a stupid person's programming language |
14:39:53 | BitPuffin | Araq: any recommendations? |
14:39:53 | Varriount | Araq: Wait, so how exactly do you want these "still failing tests" results displayed? |
14:40:25 | BitPuffin | Varriount: on silver plate with condoms next to it |
14:40:31 | Araq | dump it into the gist and then get rid of the gist and make nimbot tell us in #nimbuild |
14:41:07 | BitPuffin | so in other words, add the data and delete it? much accomplished by the sounds of it |
14:41:41 | Araq | dom96 is going to hate me for this ... |
14:41:53 | Araq | but I really dislike the gist generation part |
14:42:05 | Araq | I click on the link just to see that nothing changed |
14:42:31 | BitPuffin | why are we generating gists? |
14:42:35 | Araq | that's bad, nimbot should dump the list of changes into #nimbuild |
14:42:37 | BitPuffin | make jizz, not gist |
14:42:52 | dom96 | No. NimBot should give a summary. |
14:42:55 | BitPuffin | no but what are we making gists for |
14:43:02 | dom96 | Not spam the damn channel/ |
14:43:12 | Araq | dom96: it's not spamming at all |
14:43:16 | BitPuffin | can't it just generate a summary based on a timeline you ask for |
14:43:23 | Varriount | Or we should just have a proper test results page, with filters, searches, etc. |
14:43:29 | Araq | it's 0-3 lines of changes, on average |
14:43:41 | BitPuffin | so if you go to build.nimrod-lang.org/summary/from/0/to/100/ it will list the changes? |
14:44:02 | BitPuffin | pretty sure git can already give you what you need there |
14:44:10 | Araq | BitPuffin: join #nimbuild and then you might be qualified to comment |
14:48:17 | Araq | Varriount: a proper test results page is fine, but not essential |
14:56:56 | Araq | bbl |
15:05:05 | akghf | http://www.pvv.ntnu.no/~steinl/vitser/evolution.html |
15:05:07 | Skrylar | do you ever have one of those moments where something seems really crippled and you're like "well that can't be nearly as good as something else, its obviously just gimpy" and then realize its actually meant to be used with something else that makes it actually considerablly powerful <_< |
15:06:25 | BitPuffin | gosh darn it the new white chapel song is pretty catchy |
15:06:29 | BitPuffin | whitechapel* |
15:09:47 | Demos | Skrylar: you have not used UNIX much then have you... |
15:10:03 | * | Demos remembers replaceing most of a matlab heavy workflow with gnuplot and awk |
15:10:39 | Skrylar | i used gnuplot earlier today |
15:11:09 | Demos | it is pretty awesome, and not actually that much harder to use than excel, esp when you need slightly complex graphs |
15:11:37 | Skrylar | i still don't know how to do proper I/O in nimrod, so i augmented the hashtable code with debugEcho and a tag name, dumped with > blah.log, used vims v/LOAD>/d to delete all lines that don't have "LOAD>" in them and spent 40 minutes getting gnuplot to obey |
15:12:27 | Skrylar | 60% load before the hash table decides it is full is still very plebian though :( |
15:15:03 | Demos | 60% sounds reasonable for some situations |
15:25:41 | * | Endy joined #nimrod |
15:28:58 | * | lanior quit (Ping timeout: 245 seconds) |
15:31:21 | Skrylar | hrm. apparently i have seemingly unreasonable requirements |
15:31:49 | Skrylar | i was looking in to varying-length tracks, and there's only one tracker that actually does it |
15:40:11 | Skrylar | Demos: maybe, though i saw people reporting 80-90% with a 4-key cuckoo |
15:40:31 | Skrylar | mine might do better when i figure out how to do the arranging portions |
15:40:44 | Demos | Skrylar: yeah, it is a tradeoff. Some hashtables let you tune the load factor |
15:40:59 | EXetoC | BitPuffin: PHP? |
15:59:49 | * | clovis quit (Quit: HydraIRC -> http://www.hydrairc.com <- \o/) |
16:04:11 | * | Demos quit (Ping timeout: 252 seconds) |
16:07:15 | * | Ransel joined #nimrod |
16:07:36 | Ransel | How do I echo a string without a newline at the end? |
16:08:54 | dom96 | stdout.write |
16:10:52 | * | Demos joined #nimrod |
16:16:30 | Ransel | Thank you, dom96! |
16:17:09 | dom96 | np |
16:20:13 | * | akghf quit (Ping timeout: 245 seconds) |
16:22:59 | * | gfdbgd joined #nimrod |
16:29:36 | * | easy_muffin quit () |
16:30:51 | dom96 | hi gfdbgd |
16:31:17 | gfdbgd | Hi there dom96 |
16:36:49 | * | Varriount quit (Ping timeout: 240 seconds) |
16:40:35 | * | Varriount joined #nimrod |
16:40:48 | gfdbgd | How can i tell nimrod to load dlls from a specific path? |
16:41:11 | BitPuffin | EXetoC: what? |
16:41:16 | Varriount | Sorry about that. I probably shouldn't have asked microsoft paint to resize a 4000x4000 pixel image by 500% |
16:47:07 | Demos | gfdbgd: I think nimrod loads dlls according to the normal shared library search path rules on your platform. You can use all the normal linker options after using --dynlibOoverride:libname, you may be able to use rpath even with nimrod's dlopen based loading |
16:47:21 | Demos | windows tends to be a bit more primitive wrt dll load paths |
16:50:11 | gfdbgd | Thanks, does nimrod support sdl 1 or 2 ? |
16:51:08 | Demos | not sure. if you want SDL2 it should not be too hard to wrap |
16:51:17 | Demos | or maybe it is already wrapped, I dun know |
16:51:26 | dom96 | it is already wrapped |
16:55:43 | * | Demos quit (Ping timeout: 264 seconds) |
16:59:52 | * | gfdbgd quit (Quit: Page closed) |
17:02:57 | * | DAddYE joined #nimrod |
17:12:28 | Varriount | dom96: Which parts of nimbuild post stuff to github? |
17:15:04 | dom96 | you mean post to gist? |
17:15:07 | dom96 | website.nim |
17:39:32 | * | BitPuffin quit (Ping timeout: 246 seconds) |
17:45:55 | * | q66 joined #nimrod |
17:54:11 | * | q66 quit (Ping timeout: 252 seconds) |
17:56:04 | * | q66 joined #nimrod |
18:11:45 | * | jbe joined #nimrod |
18:12:14 | * | BitPuffin joined #nimrod |
18:25:22 | * | Matthias247 joined #nimrod |
18:36:40 | * | brson joined #nimrod |
18:36:54 | * | brson quit (Client Quit) |
18:37:02 | * | brson joined #nimrod |
18:50:05 | * | zielmicha joined #nimrod |
18:50:46 | fowl | lol http://gizmodo.com/5980842/there-is-blatant-racist-and-sexist-language-in-github-code |
18:51:29 | fowl | nimrod repository is clear i just checked it |
18:52:28 | EXetoC | qd |
18:52:33 | EXetoC | xd |
18:54:10 | Varriount | dom96: Ping |
18:54:26 | dom96 | yea? |
18:55:10 | Varriount | dom96: Is there any feasable way for me to check my additions to the nimbuild code? |
18:55:16 | Varriount | (website.nim) |
18:57:09 | Araq | hey DAddYE is back :-) |
18:58:18 | dom96 | Varriount: Not really. You would have to setup everything manually. |
18:58:27 | dom96 | Well. |
18:58:30 | dom96 | Just redis actually. |
18:58:35 | dom96 | Since you got builders setup anyway |
18:59:18 | Araq | Varriount: just PR it and let dom96 do the work. His server, his work. :P |
18:59:48 | dom96 | I thought that the reason Varriount was doing this was because I didn't have time myself to do it? |
19:01:13 | Varriount | If nothing else, it gives me an opportunity to look at the rest of the code. |
19:01:46 | dom96 | Please don't refactor everything though. |
19:03:44 | Araq | dom96: yeah |
19:03:59 | Araq | that's still the reason |
19:04:03 | * | Mat3 joined #nimrod |
19:04:10 | Araq | but obviously he can't deploy on his own |
19:04:30 | Araq | and thanks to static typing he doesn't need to test anything anyway *cough* |
19:06:14 | fowl | Araq, i wanted to add initialization for seq/string to add/len, is adding if(seqvar == 0) initialize(); to the generated c acceptable |
19:07:03 | Araq | fowl: in principle yes |
19:07:15 | Araq | make a PR and I'll review it, obviously |
19:14:16 | Araq | BitPuffin: join the VNUG |
19:15:24 | Mat3 | Araq: I tested some integer vector routines against SSE equivalents. The SSE code suffers from the inpossibility of direct scalar accesses (need at least an expensive shuffling instruction) whereby for integer registers this is no problem (RAX <-> EAX: lower half). Because of these and despite the fact that most SSE instructions have longer latencies and/or can only be combined with integer instructions (dependent on the architecture) I thin |
19:15:24 | Mat3 | k that approach is advantageous for integer and fixpoint SIMD processing |
19:18:48 | * | Mat3 thinks Intel's SIMD extension is basical ill designed compared to alternative approaches like Altivec |
19:19:26 | Araq | Mat3: I think the point is also to free the integer units so they are available for other things |
19:19:48 | Araq | so using SIMD can still be advantageous |
19:20:05 | Araq | even if not faster in comparison |
19:20:38 | Mat3 | hmm, good point |
19:20:41 | * | io2 joined #nimrod |
19:21:44 | Mat3 | hi io2 |
19:21:59 | io2 | hi Mat3 :) |
19:30:16 | Mat3 | if I think about it: x86 CPU's are out-of-order and hold some ~128 shadow registers, we would only need only one direct register assignement so why not reuse the same one for all operations? |
19:30:40 | * | Mat3 is now known as Mat3-testing |
19:31:57 | * | Mat3-testing is now known as Mat3 |
19:32:47 | Mat3 | two, fixed register allocations are sufficient |
19:37:54 | Mat3 | I do not know if this would be problematic for C related code optimization however |
19:38:06 | Mat3 | ^optimizations |
19:38:27 | Araq | what's the problem again? personal dislike of compiler specific intrisitics? |
19:39:06 | Mat3 | hold the library compiler independent |
19:40:15 | BitPuffin | Araq: woa okay |
19:40:35 | * | silven quit (Remote host closed the connection) |
19:40:56 | BitPuffin | Araq: ah, it was a trap |
19:41:18 | Araq | Mat3: there are only 4 compilers left, 1 (intel) being a niche, it's not hard to have 4 different 'importc' pragmas, but a bit tedious |
19:41:37 | Araq | BitPuffin: nope, sorry my TS-client keeps crashing |
19:42:35 | BitPuffin | Araq: how lame :/ |
19:42:41 | BitPuffin | that's why we should use mumble instead :P |
19:44:10 | Mat3 | Araq: That is a x86 centric agumentation. The GCC SIMD library is not usable for other CPU architectures |
19:44:29 | Mat3 | (as I know) |
19:45:19 | BitPuffin | Araq: well tell me if you get it working |
19:47:29 | Araq | Mat3: ok but if you're concerned with SIMD on ARM, only 2 compilers are left and the intristics are compatible, I think (gcc and clang) |
19:49:21 | Mat3 | Araq: Supported platforms are: x86 (MMX,SSE,SSE2), Freescale (Altivec) and only *one* ARM architecture (Cortex-A, NEON) |
19:49:38 | Araq | well your "lets use integer registers instead they are just as fast" argument is x86 centric too |
19:49:52 | Araq | so you lost me |
19:50:21 | EXetoC | dom96: have you completed the macro and blogged about it yet? |
19:52:24 | Mat3 | Araq: my point was, that this is a processor independent approach which work without adaption for not so uncommon CPU architectures like SH, MIPS (loongson!) and last but not least all recent ARM architectures above MCU's with somewhat 4 kB ram |
19:52:37 | renesac | Araq, for ARM there is also the proprietary ARM compiler, that is pretty much in the same position as ICC on x86 |
19:53:45 | Matthias247 | SH is near death |
19:53:57 | Matthias247 | since renesas is also using ARM now |
19:54:32 | flyx | so I just tried to bootstrap nimrod from github master. koch boot fails with „compiler/semtypes.nim(207, 32) Error: invalid indentation“ |
19:55:11 | Araq | flyx: interesting |
19:55:14 | flyx | I opened the file and looked for the error, but I don't see any error there |
19:55:55 | Araq | which OS? |
19:56:10 | flyx | OSX 10.9 |
19:56:37 | Araq | bootstrap with --gc:markAndSweep please |
19:57:25 | flyx | same error |
19:57:43 | Araq | well which iteration fails? |
19:58:13 | flyx | wait, at which step should I add this parameter? |
19:58:26 | fowl | let intType = getSysType tyInt |
19:58:48 | fowl | flyx, try replacing that line with let intType = getSysType(tyInt) |
19:58:57 | Araq | ah fowl thank you |
19:59:14 | fowl | i wonder why it doesnt error for me though |
19:59:17 | Araq | the old compiler doesn't support the command syntax here |
19:59:18 | Mat3 | Matthias247: I dont think so (military) |
19:59:32 | Araq | I wonder why our testers do not complain about this |
19:59:46 | Matthias247 | Mat3: yeah, we also have some flying around in Automotive |
19:59:52 | flyx | now I get „compiler/semexprs.nim(924, 36) Error: ')' expected“ |
20:00:12 | Matthias247 | Mat3: but these are areas were anyway nobody would use Nimrod in the next 10 years |
20:00:12 | Araq | fowl: you're not up to date, command syntax can now be used in more contexts |
20:00:49 | fowl | flyx, else: (internalAssert(typ.kind == tyCompositeTypeClass); typ.sons[1]) |
20:01:33 | flyx | ah, I get the pattern |
20:01:58 | fowl | Araq, usually the compiler doesnt use any new features like this though |
20:02:37 | Araq | fowl: zahary enjoys the new stuff too much :P |
20:02:45 | flyx | okay, now it succeeded. however it gives „[Warning] executables are still not equal“ |
20:03:15 | fowl | Araq, that means the csources need to be updated? |
20:03:52 | Araq | no, he should fix the compiler instead to not use these bleeding edge features |
20:04:32 | fowl | does this mean i can do `discard f x` now? |
20:04:40 | Araq | try it |
20:04:46 | BitPuffin | Araq: do you have the latest version? |
20:04:50 | Araq | you should be able to do that |
20:05:04 | fowl | sweet |
20:05:43 | EXetoC | BitPuffin: I think he's on 0.9.2 still |
20:06:02 | BitPuffin | EXetoC: was referring to TS but ok |
20:06:19 | Mat3 | Matthias247: Well, if we can buy some cheap ARM boards like Raspberri Pi, have a (even cheaper) PIC32 (MIPS3) board [duinomite], some 5-10 AVR based platforms, the firebee (Freescale) and even 2 Propeller based ones, I can envision some demand for an SH board too |
20:07:16 | Araq | renesac: ok, but does the syntax of the commercial arm compiler's intrisitics differ? |
20:07:36 | Araq | btw I'll write that as intr from now on |
20:07:38 | renesac | I have no idea |
20:07:44 | Araq | abbrevs ftw |
20:07:53 | Matthias247 | Mat3: AVR and the PI are mostly popular due to wide availability, easy tools, existing code and good tutorials for beginners. All that doesn't apply to SH afaik |
20:07:59 | renesac | still, SIMD instructions exists for a reason |
20:08:13 | Matthias247 | Mat3: even ARM Cortex-M has a hard stand |
20:10:56 | * | skyfex joined #nimrod |
20:11:56 | Mat3 | yes that is true, however, my point is Nimrod as system language should be attractive for hackers and the maker society - these are people who will even misuse DSP's as CPU |
20:13:22 | Araq | Mat3: enough of this. make an emulatedSimd.nim module and it will be added |
20:13:42 | Mat3 | ok |
20:17:17 | BitPuffin | dom96: where the hell did you poke me even |
20:17:53 | BitPuffin | dom96: but you are not even in ts |
20:17:53 | Ransel | Uhm, I get an error when trying to do "src\babel1.exe install". Something with that there's no floppy disk inserted, and that I should insert one in \Device\Harddisk\DR4. |
20:20:31 | BitPuffin | Araq: get yo ass in the VNUG, dom96 is there too now |
20:20:47 | EXetoC | Ransel: :E |
20:21:17 | Araq | hi Ransel welcome |
20:21:20 | EXetoC | yeah a floppy disk is now required. sorry |
20:21:40 | EXetoC | joking of course. odd error |
20:23:36 | Ransel | Yeah. :/ |
20:24:20 | Araq | Ransel: babel1.exe? not babel.exe? |
20:25:00 | Ransel | Araq: Yeah, it's on the installation instructions for Windows. "This is required because Windows will lock the process which is being run." |
20:26:42 | BitPuffin | EXetoC: do you have CS:GO? |
20:27:38 | Araq | Ransel: try to run it in an admin shell |
20:28:43 | Ransel | Araq: Same error :/ |
20:31:23 | Araq | well I don't think you even need to *install* babel |
20:31:41 | Araq | try to install some other package with babel and see if that works |
20:38:04 | Ransel | I still get the same error. |
20:38:21 | Ransel | Same if I run it without any arguments. |
20:40:20 | Araq | deactivate your anti virus software and check again |
20:40:31 | BitPuffin | haha |
20:40:33 | BitPuffin | such a windows problem |
20:40:42 | Araq | also check that you're not trying to run a 64bit application on a 32 bit OS |
20:42:45 | * | Varriount is going to the VNUG |
20:42:53 | Ransel | I have no AV installed and I am running a 64-bit OS. |
20:48:28 | * | clovis joined #nimrod |
20:49:09 | Araq | Ransel: how did you compile babel? |
20:50:05 | Ransel | Araq: "nimrod c src\babel" as the installation instructions say. https://github.com/nimrod-code/babel#windows |
20:51:08 | Araq | try nimrod c -d:release src\babel |
20:52:40 | Varriount | (nimrod c -d:release .\src\babel.nim") && (copy .\src\babel.exe .\) |
20:53:37 | * | Endy quit (Ping timeout: 240 seconds) |
20:54:07 | Ransel | Still get the error. |
20:54:22 | Varriount | Ransel: What exactly is the error? |
20:54:34 | Ransel | But I forgot the console error (I am extremely sorry), but that is "Auto configuration failed |
20:54:34 | Ransel | 6436:error:02001015:system library:fopen:Is a directory:.\crypto\bio\bss_file.c: |
20:54:35 | Ransel | 126:fopen('g:/phpbuild/apps_install/openssl.cnf','rb') |
20:54:35 | Ransel | 6436:error:2006D002:BIO routines:BIO_new_file:system lib:.\crypto\bio\bss_file.c |
20:54:35 | Ransel | :131: |
20:54:35 | Ransel | 6436:error:0E078002:configuration file routines:DEF_LOAD:system lib:.\crypto\con |
20:54:36 | Ransel | f\conf_def.c:199:" |
20:55:06 | Varriount | Er. Is this a windows machine? |
20:55:09 | Ransel | Apparently it's looking for a file in g:\ |
20:55:14 | Ransel | Varriount: Yes |
20:55:23 | fowl | flyx, does it work now? |
20:55:28 | Trixar_za | Shouldn't it be openssl.conf? |
20:55:51 | EXetoC | BitPuffin: Like I said, I only use Linux so I can't play it yet |
20:55:57 | Varriount | Ransel: So this a gcc/c compiler error? |
20:56:20 | Ransel | I don't know? |
21:00:13 | Varriount | Ransel: According to stackoverflow, you need to set your OPENSSL_CONF environment variable to a proper config |
21:02:05 | Varriount | Ransel: try "(nimrod c -d:release -u:ssl -u:openssl .\src\babel.nim")" |
21:07:56 | Varriount | Ransel: http://stackoverflow.com/questions/4106035/what-does-this-openssl-error-mean |
21:08:48 | Ransel | It works! :D |
21:09:12 | Ransel | Thank you very much! |
21:11:08 | flyx | fowl: yes, after I altered the two lines it compiled |
21:11:25 | Varriount | Ransel: There is a downside - the parameters I gave disable SSL functionality in the modules used by babel. |
21:11:50 | Varriount | (-u undefines a symbol) |
21:11:51 | fowl | flyx, good stuff |
21:37:10 | Varriount | dom96, Araq: Sent the PR for the 'still failing tests' feature. |
21:39:10 | Araq | yaaaay |
21:39:45 | EXetoC | weeee |
21:41:19 | BitPuffin | EXetoC: ah right |
21:47:00 | Varriount | Also, I found out my git frontend has a "send pull request" feature. |
21:47:18 | * | skyfex quit (Quit: Computer has gone to sleep.) |
21:47:54 | * | skyfex joined #nimrod |
21:48:31 | EXetoC | BitPuffin: I'll buy it if you enable remote access to some windows machine. the added latency might even things up a little |
21:50:11 | * | nolan_d joined #nimrod |
21:56:14 | EXetoC | BitPuffin: dude, you gotta write more code |
21:56:48 | EXetoC | audio-centric code in particular, so that I'll bother to write that high level interface |
21:57:00 | EXetoC | and maybe some mongo code as well |
22:01:44 | dom96 | Varriount: Honestly, that will spam the channel. |
22:01:52 | dom96 | You won't be able to tell what's what. |
22:02:06 | Varriount | dom96: I cooked to Araq's order. |
22:02:35 | Araq | and I made a statistic about it |
22:03:14 | dom96 | I'll give you a statistic: |
22:03:34 | dom96 | There are currently 96 tests failing. |
22:03:51 | dom96 | You want to send 96 lines of text to #nimbuild? |
22:03:53 | dom96 | For each platform |
22:03:57 | dom96 | for each commit built? |
22:04:29 | Araq | hmm now thats a good point |
22:05:03 | Araq | I only considered the annoying "nothing changed" gists |
22:05:24 | Araq | but indeed these are not empty anymore when we always list what still fails |
22:05:35 | Araq | Varriount: I'm sorry but dom96 is right |
22:07:59 | Varriount | Araq: Well, to be fair, I anticipated this change, which is why I moved the "still failing" reports into the gist as well. |
22:08:16 | Mat3 | ciao |
22:08:19 | * | Mat3 quit (Quit: Verlassend) |
22:08:22 | Varriount | I only have to delete some lines. 3 lines, to be precise. :D |
22:08:25 | dom96 | The only new data that NimBot should announce is the number of "Now failing" tests. |
22:10:11 | dom96 | Also i'm not sure I like your code formatting change. |
22:11:10 | Varriount | dom96, Araq: PR updated. |
22:11:33 | Varriount | Now, I go eat. |
22:25:07 | * | Ransel quit (Ping timeout: 264 seconds) |
22:25:25 | * | Demos joined #nimrod |
22:28:31 | BitPuffin | EXetoC: I want to, blame zahary |
22:29:19 | BitPuffin | no but |
22:29:21 | BitPuffin | bugz |
22:29:40 | BitPuffin | EXetoC: you mean for PA? |
22:30:03 | BitPuffin | EXetoC: I will be writing my own abstraction on top of PA for this project, since it will possibly be ported to console etc |
22:32:05 | zahary | ha! why am I for blame? |
22:33:36 | zahary | BitPuffin: have you tried my weekend fixes already? |
22:44:54 | BitPuffin | zahary: yes! They dun diddely work |
22:44:57 | BitPuffin | well maybe some of them worked |
22:44:59 | BitPuffin | but something doesn't |
22:45:44 | BitPuffin | matrix.nim(121, 49) Error: type expected |
22:45:45 | EXetoC | BitPuffin: well if you want to deal with untyped pointers directly |
22:46:04 | BitPuffin | proc `*`*[T; R, N, C: static[int]](a: TMatrix[T, R, N], b: TMatrix[T, N, C]): TMatrix[T, R, C] {.noSideEffect.} = |
22:48:29 | zahary | well, post bugs please, don't just complain on IRC |
22:48:46 | BitPuffin | zahary: just really hard to know what's already known |
22:48:48 | BitPuffin | but yeah |
22:48:53 | BitPuffin | okay I'll post it as an issue |
22:52:25 | Varriount | Hi demos |
22:52:29 | BitPuffin | https://github.com/Araq/Nimrod/issues/1013 |
22:52:36 | BitPuffin | zahary: are you proud dad? ;-; |
22:53:03 | Demos | hi Varriount |
22:58:49 | * | clovis quit (Quit: clovis) |
22:59:38 | BitPuffin | no but zahary it's thanks to the work you do on generic that I can almost code ;D |
23:01:59 | zahary | is this the last issue so far? if you comment (or don't use) that proc are there other problems? |
23:02:01 | BitPuffin | EXetoC: I guess technically I can work on audio stuff while I wait for the last bugs |
23:02:07 | BitPuffin | good question sir |
23:02:35 | BitPuffin | man I wish we had block comments |
23:03:31 | Araq | discard """ |
23:03:33 | EXetoC | 'when False'? 'discard """ """'? |
23:03:37 | Araq | verbose block comment""" |
23:04:29 | BitPuffin | odd |
23:04:38 | BitPuffin | not sure which line causes this tbh |
23:04:40 | EXetoC | visual editing in vim? |
23:04:40 | BitPuffin | ector.nim(7, 42) Error: ordinal type expected |
23:04:54 | BitPuffin | zahary: that's when running matrix.nim, feels like I've seen it before |
23:05:51 | zahary | I'm currently implementing a swizzle example and I think I stumbled on this one |
23:05:51 | BitPuffin | my hunch is that It's because like a generic variable is passed to a TVector type and it goes like hey, yo, you didn't say that it's a static int, so I'm gonna say it wasn't an ordinal type for shitzels |
23:08:02 | EXetoC | BitPuffin: program-specific audio code? |
23:08:43 | EXetoC | or the lib |
23:09:25 | BitPuffin | EXetoC: for the engine |
23:10:00 | BitPuffin | zahary: very annoying that it doesn't show the line it happens on :/ |
23:10:57 | zahary | this is an internal error |
23:11:28 | zahary | gotta go, see you tomorrow |
23:11:42 | Demos | zahary, I got an internal error when I tried to use `.` overloading to write a swizzle implementation |
23:11:46 | Demos | I gotta go as well though |
23:14:09 | * | darkf joined #nimrod |
23:14:22 | BitPuffin | zahary: Yeah I know but you still wanna know which line causes the internal error lol |
23:14:29 | BitPuffin | see you :) have a good one |
23:28:11 | * | xenagi joined #nimrod |
23:30:57 | * | jbe quit (Quit: Leaving) |
23:33:23 | * | zielmicha quit (Quit: Connection closed for inactivity) |
23:35:58 | * | Demos_ joined #nimrod |
23:38:17 | Demos_ | hmm I am having issues with type Vector[N: static[int]; T; O: Options] = TMatrix[N, 1, T, O], it says "can not instanciate TMatrix" |
23:38:26 | Demos_ | Similar issue BitPuffin? |
23:44:26 | * | io2 quit () |
23:44:27 | BitPuffin | Demos_: I am not allowed to disclose open source secrets to competitors sorry |
23:44:37 | Demos_ | hehe |
23:44:43 | BitPuffin | no but I don't think so :o |
23:46:06 | * | skyfex quit (Quit: Computer has gone to sleep.) |
23:46:42 | * | skyfex joined #nimrod |
23:46:59 | Demos_ | well I will use your library if it meets my needs (Column major data storage, no extra data in fixed size matrices/vectors) |
23:48:26 | Demos_ | hm it may be, my test case error'd with the same message as #1013 |
23:49:39 | Demos_ | also who was it who was really into note-takeing apps? |
23:52:19 | * | seubert quit (Ping timeout: 264 seconds) |
23:53:10 | Demos_ | right now I have a pretty sketch set of linear algebra functions that just take a specific sized vector, and I use the good ol copy-n-paste generics. GOOD ENOUGH FOR C GOOD ENOUGH FOR ME :D |