<< 21-08-2013 >>

02:11:42*[2]charles quit (Ping timeout: 276 seconds)
02:19:21*q66 quit (Quit: Leaving)
02:46:52*Associ8or quit (Quit: Associ8or)
04:32:08*OrionPK quit (Read error: Connection reset by peer)
04:48:51*Sergio965 joined #nimrod
04:50:36*Endeg joined #nimrod
05:11:15*xilo quit (Ping timeout: 245 seconds)
05:14:52*Boscop joined #nimrod
06:03:56*Sergio965 quit (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
06:48:14*Boscop quit (Ping timeout: 246 seconds)
06:50:11*Boscop joined #nimrod
07:13:57*Araq_ joined #nimrod
08:11:53*BitPuffin_ quit (*.net *.split)
08:12:08*BitPuffin joined #nimrod
08:32:51*[1]charles quit (Ping timeout: 256 seconds)
08:34:15*Associat0r joined #nimrod
08:34:15*Associat0r quit (Changing host)
08:34:15*Associat0r joined #nimrod
09:10:44*EvilAww is now known as _EvilAww
09:10:47*_EvilAww is now known as EvilAww
09:34:58*EXetoC joined #nimrod
11:27:47*Associ8or joined #nimrod
11:27:47*Associ8or quit (Changing host)
11:27:47*Associ8or joined #nimrod
11:29:52*Associat0r quit (Ping timeout: 264 seconds)
11:38:33*q66 joined #nimrod
12:55:02*Sergio965 joined #nimrod
12:59:30EXetoCsuup
13:04:17dom96yo
13:04:28dom96how's the procrastination going?
13:04:42EXetoCgood
13:05:18Araq_I think I figured out all the details of the "write" tracking algorithm
13:05:55Araq_which is a "const" system done right, IMHO anyway
13:07:29*Associ8or quit (Quit: Associ8or)
13:08:21*Sergio965 quit (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
13:09:43EXetoCwhat's the difference compared to const in C++ for example?
13:10:40Araq_the differences are huge, instead of adding 'const' to the type system, 'write' is added to the effect system
13:10:58Araq_proc treeDepth(n: PNode): int {.writes: [].}
13:11:14Araq_but it's mostly all inferred
13:11:27Araq_no need to write 'writes: []' explicitly
13:12:51dom96why is it a list? what would you put there if you do want to write?
13:14:46Araq_dom96: a list of so called "path" expressions
13:15:02Araq_a path is something like obj.field[i].fieldB
13:16:33dom96So basically the actual 'thing' which gets written?
13:17:01dom96so if in your example I do: n = PNode(...). writes will equal [n] ?
13:17:38Araq_yes
13:17:54Araq_but for local variable it's not interesting
13:20:53dom96hrm, so instead of immutable data type we will get this then?
13:20:55dom96*types
13:22:52dom96wouldn't it be more convenient to mark data types immutable instead of marking each proc with 'writes: []' ?
13:26:30EXetoCbeing able to push and pop pragmas helps, I guess
13:27:07dom96although you do say it will be inferred.
13:27:17dom96I think I see what you mean.
13:29:16EXetoCright. you might want to force it though, but it's a good default
13:30:12EXetoCis the dot after { a way of minimizing ambiguities?
13:32:24*Araq_ quit (Read error: Connection timed out)
13:33:11*Araq_ joined #nimrod
13:36:47*Associat0r joined #nimrod
13:37:12EXetoCbut I don't think you can have set literals in the same places, so I don't know about that
13:49:32*BitPuffin quit (Read error: Operation timed out)
13:49:45Araq_EXetoC: it's an artifact; it was planned to support 3 syntaxes for nimrod
13:50:03Araq_indentation based or using {} or using 'end X'
13:50:14Araq_(which is why 'end' is a keyword btw)
13:50:22EXetoCoh
13:50:35Araq_but I've never gotten around to implement that
13:51:32Araq_and maintaining 3 parsers doesn't help me
13:52:02Araq_so ... I don't know. I don't think it'll ever be implemented
13:55:53Araq_dom96: immutability is hard to design properly
13:55:59*BitPuffin joined #nimrod
13:56:13Araq_C++ and D have lots of issues with 'const' so I don't want to take that route
13:56:41Araq_I'm not entirely sure how Rust avoids D's problems with 'const'
13:58:07*BitPuffin quit (Read error: Connection reset by peer)
14:00:43Araq_bbl
14:00:48*Araq_ quit (Quit: ChatZilla 0.9.90.1 [Firefox 23.0.1/20130814063812])
14:02:52*BitPuffin joined #nimrod
14:04:00*BitPuffin quit (Read error: Connection reset by peer)
14:04:11EXetoCwell, there's no per-field mutability, but I don't know if that helps
14:08:19*BitPuffin joined #nimrod
14:09:33EXetoCbut making individual struct fields const in D is a bad idea
14:10:50EXetoCand I don't know if this has anything to do with the const system, but having to cast away const when using the find function template for example is pretty stupid. good luck dealing with that if you're a newbie
14:13:06Associat0rmutability is the wrong default
14:40:53*Associat0r quit (Quit: Associat0r)
16:20:40EXetoCdom96: 0ad?
16:26:15dom96ehh, later.
16:27:12*Mat2 joined #nimrod
16:27:14Mat2hello
16:28:35EXetoChi
16:28:40EXetoCdom96: ok, will do something useful instead :>
16:28:47Mat2hi EXetoC
16:33:38Mat2hi all
16:34:12Mat2exist there an enum equivalent in Nimrod ?
16:34:27Mat2(not shure if I asked that question before)
16:37:35EXetoCyes, it's called enum :>
16:38:09Mat2wha, sorry, I mean something like an union in C
16:42:24EXetoConly tagged unions, but you can always achieve something similar using casts
16:43:04Mat2yes, well - that is what I try to avoid
16:53:24*Sergio965 joined #nimrod
16:54:07EXetoCyou can wrap it
16:58:54Mat2I mask the bit slots out (and hope the compiler generate decent machine-code)
17:15:16*Associat0r joined #nimrod
17:15:16*Associat0r quit (Changing host)
17:15:16*Associat0r joined #nimrod
17:21:04Mat2if I define an object x and another y which inherits x, can I invoke a public y.func (...) which is a method of x ?
17:25:45EXetoCI think so
17:26:06Sergio965Mat2: That's pretty much what it means to inherit.
17:28:45EXetoCnot always, but it might be a bit limited otherwise
17:33:42Mat2Sergio965: thanks
17:34:15Mat2ExetoC: Do you mean polymorphism ?
17:37:02EXetoCyeah, but you get one with the other in most languages I guess
17:51:02Mat2polymorphism is really a bad idea if I think about it...
17:57:10EXetoCin general, or in your case?
17:57:36Mat2in my case
17:58:01EXetoCok
17:58:45EXetoCbtw, dynamic dispatch is only used for methods
18:01:46AraqAssociat0r: mutability is NOT the wrong default for systems programming
18:02:27Araqand it would be nice if there was a single benchmark to backup the claims from the "everything should be immutable camp"
18:06:51*Sergio965 quit (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
18:09:00Mat2hi Araq
18:09:46Araqhi Mat2
18:12:50Associat0rAraq: I never said everything should be immutable
18:13:32Associat0rit's just the wrong defaulf for most things, even in systems programming
18:14:06Araqsystems programming is about arrays, immutability is about trees
18:14:23Araqarrays are fundamentally mutable IMHO anyway
18:14:40Associat0rthat's the represention
18:15:38Araqsystems programming is all about representation
18:17:17Mat2representation fits it quite well in my optinion
18:17:24Mat2^opinion
18:17:50Araqlast time I checked Rust code was full of 'mut'
18:18:11Araqand as soon as you start to optimize it by hand more and more things become 'mut'
18:19:39Associat0ryou could abstract away most mut in combinators
18:19:51*Sergio965 joined #nimrod
18:20:19*Endeg quit (Ping timeout: 264 seconds)
18:21:07AraqI could also simply use Haskell instead
18:21:33Araqsomehow the Rust guys don't consider it appropriate for systems programming either
18:22:47Mat2there exist indeed two projects exporing functional-programming languages for OS development because of similar reasons
18:23:07Araqonly two, Mat2 ? ;-)
18:23:07Mat2at moment
18:23:13Associat0rHaskell is non-strict by default and using mut is a pain there
18:23:49Araqwell that seems to be exactly what you want though, making 'mut' a pain
18:24:04Associat0rand predictable perf and representation control is also more difficult in Haskell
18:24:06Araqalso the non-strict by default has benefits for modularity
18:24:08Mat2Araq: I expect some more approaches in time ;)
18:24:25AraqMat2: history is full of these attempts
18:25:11Mat2yes, the only succesful attempt I know is LispOS however
18:25:14Associat0rAraq: mut shouldn't be too much of a pain and it should have predictable perf
18:25:46Associat0rLisp isn't really a FPL
18:26:32Mat2I don't buy this
18:26:39Araqthe compiler knows about the state monad and produces predictable perf in Haskell I think
18:26:39Associat0rI'm sure they used plenty of mutation in LispOS
18:26:56AraqAssociat0r: indeed and you might ask yourself why
18:27:14Araqand no
18:27:17Araqthe reason is not
18:27:23Araq"Lispers didn't get FP"
18:28:25Associat0rLisp's didn't really encourage immutability
18:29:14Associat0rAraq: anyway my point is to not use mutation blindly
18:29:20Mat2ehm, even a 'pure' FPL like Q is not completly free of immutability
18:29:27Associat0rbut abstract that away properly
18:30:35Associat0rwith combinators/DSLs etc
18:31:04Araqfor word in allwords(file): countable.inc(word) # pseudocode for 'wc'
18:31:37Araqnote the inherent mutability of 'counttable' in this solution
18:31:56Araqyou can dance it around it with some functional data structure
18:32:32Araqbut inherently the solution requires mutability and the workarounds are just that -- workarounds
18:33:09Araqand I don't see how a workaround improves things
18:33:30Associat0rthe point is to isolate the mutatation
18:36:39Araqno the point is to be careful about mutations when you have aliases to the data
18:36:52Araqaliases are the problem, not mutation
18:52:54Associat0rAraq: btw why not just "let count = length(allwords(file))"
18:53:49Associat0rno need to make the client circus around with mutation needlesly
18:54:04Araqthe point of a counttable is to count distinct words
18:54:14Araqok that's not 'wc', my bad
18:54:54Araqcounttable["wordA"] == 3, counttable["wordB"] == 2 etc.
18:54:59Mat2both points have reasons: For 'pure' FPL's immutability is a demandment for assuring efficient parallel processing (obviously I know no common FP language which supporting auto-parallelization)
18:55:07Associat0rlet count = length(set(allwords(word)))
18:55:22Araqthat's still not the same Associat0r
18:55:42Araqunless your 'count' is not an int
18:55:57Araqbut then your 'set' is wrong too
18:56:19Araqyou don't have a single result in my example but a lookup table
18:56:34BitPuffinto be fair, things aren't mutable by default in nimrod
18:56:43BitPuffinI mean you can choose var or let or const
18:56:46BitPuffinthere isn't a default
18:56:58*BitPuffin 's opinion
18:57:09Araqand sure ... you can hide everything behind a function call and pretend it doesn't use mutability under the hood
18:57:31Associat0rI was talking about default mutation in general
18:58:13Associat0rthe point is if you abstract it behind functions it becomes composable
18:58:38AraqBitPuffin: true but the immutability is only shallow in Nimrod, let somePointer = p(); somePointer[] = 12 # no problem
18:59:19Araqthough I never use that, I use 'var' here to improve readability
18:59:29BitPuffinis that really all that good?
18:59:43BitPuffina let wants to be _let_ alone lol
19:00:33BitPuffinwhat lisp is totally mutable
19:00:37AraqI had no choice, 'let' needs to have the same semantics as argument passing for consistency
19:02:04BitPuffinyou sure? I mean you shouldn't be able to pass a let variable to a var argument
19:02:19Araqthat's not what I mean
19:02:19BitPuffinthat just screams gotchas
19:02:24Araqthat's not what I mean
19:02:38BitPuffinyes I saw it the first time, mind the delay from you to me :)
19:03:09Araqthe 'let' variable is immutable but not what it points to
19:03:16BitPuffinmy messages were sent before I got yours
19:03:19BitPuffinah
19:03:23BitPuffinwell I guess that makes sense
19:03:28BitPuffinmemory isn't immutable
19:03:50BitPuffinbut that pointer can't start pointing at some other address right?
19:03:57Araqright
19:04:08BitPuffinalthough I am not sure what kind of safety that provides
19:04:13Mat2reads very rational to me
19:04:58Mat2BitPuffin: No typless pointer arithmetic ?
19:05:22AraqBitPuffin: it only helps readability really, the compiler can do more optimizations with 'let' but it might as easily compute whether a 'var' is used as a 'let'
19:05:33BitPuffinMat2: true, you don't crash because you tried accessing memory you don't have access to, I think?
19:05:34EXetoCI haven't had to care all that much about this, although I'm not sure how relevant it'll be with respect to the upcoming parallelization changes
19:05:35Araqinstead and optimize these
19:05:44EXetoCor whichever term is more accurate
19:06:22AraqEXetoC: well the 'write' effects tracking is in preparation for the concurrency changes
19:06:41EXetoCmakes sense
19:08:56BitPuffinAraq: guess we get slightly increased compile times for using let then hehe
19:09:22BitPuffinAraq: and also, just like noSideEffect it is a good noobgrammer blocker
19:09:51AraqBitPuffin: no you get slightly decreased compile times in theory as the compiler doesn't need to compute the 'let' variables
19:10:09BitPuffinAraq: yeah I ment decreased, sorry
19:10:10Araqin practice it's irrelevant
19:10:28BitPuffinI was probably gonna say increased compile time speed
19:11:57BitPuffinI am not sure I am confident immutability is the ultimate solution for parallelization
19:12:40Araqit's not, but it helps
19:12:47BitPuffinsure it does
19:12:51BitPuffinbut it also imposes some problems
19:12:52BitPuffinanyways
19:12:59*BitPuffin is gonna continue reading
19:13:37BitPuffinI think you get enough benefits from making pure functions than just making everything immutable, it is a nice compromise since you also get very maintainable code
19:21:09Associat0ryeah if you have proper effect tracking, but explicit visible ques about what's mutable might still be usefull
19:22:11AraqAssociat0r: the effects are annotated by the docgen
19:22:18Araqso you will be able to see them
19:22:36Associat0rI mean within the code itself
19:23:49Araq*shrug* thats just some IDE feature I guess; you can also write them down and the compiler checks them for you
19:30:11*gradha joined #nimrod
19:38:26Mat2hmm, I have these backend object x and an inherited frontend object y. If I now call a procedure which has x as object parameter but is called with y I get a type error
19:38:56Mat2so x has a different type as y
19:39:54BitPuffinMat2: change it to a method?
19:41:09Mat2hmm, have to read about method definations in the docs
19:41:46BitPuffinyeah I am not sure how it works
19:42:08BitPuffinI don't see why a proc wouldn't be able to take an object b of a where it expects an a
19:43:38AraqMat2: that does work, it's likely some other problem
19:44:19BitPuffinin fact I can't even figure out what methods are for and why procs can't do their jobs, it feels like the things should be possible to determine statically but what do I know after all
19:47:18gradhamethods are for dynamic dispatch, see if http://nimrod-code.org/manual.html#multi-methods helps explaining that
19:47:27BitPuffinwell I have read it
19:47:35BitPuffinI just don't know when dynamic dispatch is needed
19:48:17gradhait looks like C++ virtual methods, if that's of any help
19:48:39BitPuffinwell I know
19:48:49BitPuffinbut I am not sure I still get the point
19:49:03BitPuffinit should be able to be figured out statically shouldn't it?
19:49:17Mat2ok found the error, I have forget an parameter... ehm
19:49:27EXetoCif you don't want it to be overridden, you make it a proc
19:49:45Mat2(the error messages are somewhat unclear to me I must say)
19:50:53BitPuffinEXetoC: so a proc is essentially an explicit form of saying don't override me?
19:52:15EXetoCusually it's not used in such a context, but yeah I guess
19:52:29BitPuffinif b is an object of a, the I don't see why I couldn't override proc foo(p: a) and create a proc foo(p: b) and if there is no foo for b it should call foo for a
19:52:33EXetoCyou can overload it, but then you must rely on using the correct concrete type
19:54:48EXetoCyes, but then the overload is chosen at compile-time. no vtable indirections in other words
19:55:19BitPuffinbut isn't it always possible to know it at compile time+
19:55:22BitPuffinWhen would it not be?
19:56:40AraqBitPuffin: when you actually use inheritance to model polymorphic containers
19:56:44gradhaas the author of "library code" you don't know the type of subclasses
19:57:06Mat2Araq: Probably it is a good idea to tak a look at the error messages, I found them somewhat irritating
19:57:15Mat2^take
19:58:03Araqcreate a bug report then
19:58:16BitPuffinAraq: Well I still don't get why that wouldn't work with static dispatch, is it because the executable size would grow tremendously because it would have to compile each procedure for every polymorphic type?
19:58:31AraqI think they are excellent but I'm weird and know how the compiler works
19:58:34Mat2Araq: ok
19:58:59BitPuffinsometimes the error messages are a bit.. well unhelpful
19:59:14gradhaBitPuffin: if your library code calls "proc(type a)", no matter how much you subclass it the library code will still not call your override
19:59:46BitPuffingradha: because it is already compiled and done?
20:00:01gradhano, because you are calling proc(type a), with type a
20:00:37BitPuffinbut if be is of a, then why can't the proc that takes an a take a b?
20:00:51BitPuffinthey should have the same fields after all
20:00:54AraqBitPuffin: it can
20:01:03BitPuffinAraq: then why have methods?
20:01:32gradhathe b type is accepted by your proc using type a, but your implementation for b is not called
20:01:33BitPuffinif it isn't because it is already compiled and done I can't see why
20:02:04BitPuffingradha: because the library doesn't know about b's implementation?
20:02:32gradhayes, to the module where it uses a, b doesn't exists, so it can't statically call the proc version accepting b
20:02:37BitPuffinbut shouldn't it know about b's implementation if they are compiled together?
20:02:53BitPuffinlike if it is not a library
20:02:56BitPuffinor whatever
20:03:06BitPuffinyou know that they will be compiled into the same executable
20:03:15BitPuffincan you safely use a proc like a method in that case?
20:03:16gradhawell, if it's not a library you don't need methods, because you know all the procs for all types
20:03:32gradhausually end user code doesn't need methods at all
20:04:26BitPuffinokay so if I am writing library-like code, except it isn't compiled as a library but is instead compiled with the full project it should work like a method because the proc will know about b's implementation in this case?
20:04:40BitPuffinif yes, then I understand
20:05:19BitPuffinif not, well then fuck programming :P
20:05:19gradhathat's something you can answer yourself: does your module implementing the a type "import b"?
20:06:16BitPuffinwell no, but if b has inherited from a and overrides a method that a module in a calls for a types, shouldn't the compiler be able to figure it out?
20:06:37gradhaerr... no
20:06:39*Mat2 compiler frontend is finished (so port is comlete), only left some testing
20:06:45Mat2^complete
20:07:21AraqBitPuffin: no, nimrod is not java where everything is virtual per default
20:07:51BitPuffinAraq: but if it is all during the same compilation process I don't see why it couldn't somehow figure it out
20:08:00BitPuffinguess it is because I haven't written a compiler
20:08:02gradhawell, maybe you don't want that?
20:08:05Araqyou use 'proc' and get static binding or you use 'method' and get dynamic binding
20:08:40gradhaimagine I'm writing some security procs, would I want random people to override them and mess with whatever I'm doing?
20:08:45BitPuffinhmm
20:08:51BitPuffinwell then I guess the final question is
20:09:37BitPuffinif it is all in the same project, and you use method to get the dynamic binding, shouldn't you be able to optimize it so that it works like dynamic binding (ie call the overriden version) but use static dispatch instead because you already know the definition of the overriden method?
20:09:42BitPuffinperformance++
20:10:57gradhacouldn't you load dynamic libraries at runtime though?
20:11:02gradhalike dlls
20:11:02Araqthat's an optimization called devirtualization
20:11:15BitPuffinAraq: does nimrod have it?
20:11:24Araqno
20:11:28BitPuffinwill it?
20:11:42BitPuffingradha: why not blow up your computer :P
20:11:52Araqsure it's not hard to do
20:12:09BitPuffincoolio
20:12:20Araqbut that doesn't mean it's important or a good idea ;-)
20:12:22gradhaBitPuffin: plugins? anyway, if you care so much you could implement the method as a template now
20:12:29BitPuffinAraq: why would it be a bad idea?
20:12:48AraqI don't feel like encouraging people to use methods
20:12:55BitPuffingradha: well this way you would get both
20:12:57AraqI consider methods evil
20:13:10BitPuffinAraq: why? (I might already know wh)
20:13:17BitPuffinbut I want to know your opinion
20:13:34BitPuffinis it because you can get unexpected behaviour?
20:13:56Araqwell closures are often the nicer alternative to polymorphic objects
20:14:30BitPuffinAraq: then why have methods at all? make clojures neater than methods and no-one would miss them
20:15:06BitPuffinalthough I guess I don't see why clojures don't have the same problems as methods
20:15:07Araqwell we have closures and they are "neat" and yet you don't even know the bijection between them :P
20:15:16Araqit's *closure* btw
20:15:22BitPuffinoops
20:15:25Araqclojure is a programming language
20:15:34*BitPuffin knew that
20:15:36dom96I still have not once used methods, I don't even get why I would use them.
20:15:41BitPuffinbrains can fart you know
20:16:30AraqBitPuffin: I prefer enum+cases over inheritance and dynamic binding almost always
20:17:00BitPuffinAraq: but then why do we have dynamic binding?
20:17:19BitPuffinif it is a bad thing, shouldn't people be taught to use the better option
20:17:22Araqas the enum way forces you to do a state enumeration and this tends to produce more readable code and makes you think about all the states
20:17:24BitPuffin(closures)?
20:18:56BitPuffinanyways brb read
20:20:55reactormonkdom96, is "foo"[1..2] not valid in nimrod?
20:21:38dom96I think so, why not check?
20:23:04gradhaAraq: you mentioned you prefer to write ALL_CAPS for mutable stuff, so all your object fields are ALL_CAPS?
20:25:11gradhashiny... new Diablo 3 expansion: Reaper of Wallets
20:26:08Araqgradha: no I said, "if anything, global mutable variables should scream at you"
20:26:26AraqI don't use ALL_CAPS
20:28:33gradhaI'm experimenting with ALL_CAPS for all mutable variables, but it gets weird with object hierarchies
20:28:49Araqfields are not variables
20:29:14gradhacomposition of objects sort of makes them variables, maybe, who knows
20:29:37Araqa compiler doesn't know about "sort of"
20:29:54AraqI guess I think too much like a compiler now ...
20:30:30gradhaif I pass an object to a proc, not using var, can't I modify it's field if it's say a mutable string?
20:30:53Araqthat's correct you can't
20:34:41gradhanice
20:41:33gradhaI like the IF_MUTABLE_ITS_ALL_CAPS_SCREAMING_AT_YOU, so I'll be making my effort to start this new coding trend, sorry for attributing it to you
20:42:06gradharereading your post again makes me wonder what happens in my mind
20:45:31Araqgradha: I often use a 'g' prefix for globals fwiw
21:28:34gradhatrying to use the xmltree <> macro I get "lib/core/macros.nim(336, 25) Error: undeclared identifier: 'newStringTable'"
21:29:26Araqthat can be fixed now
21:29:37Araqthe language wasn't up to it until recently :P
21:30:01Araqwell ... some year ago but whatever
21:34:32gradhadid it ever work?
21:35:49Araqwell it still works but you need to import strtabs
21:36:16Araqthat you need to import it on your own can be avoided nowadays
21:36:33gradhaok, thanks
21:38:30gradharecently I used C macros to generate xml trees for a string, quite crippled
21:39:17Araqthat's sad
21:39:23Araqyou should have used Nimrod
21:40:27gradhathe worst part was the #defines could only build the static string, you still need to manually keep track of parameters for %s formatting
21:40:55gradhastill, it was an improvement over manually typing the tags
21:41:45gradhadid you get a chance to try the ouroboros module?
21:43:39*Sergio965 quit (Quit: Bye! :))
21:44:22Araqsorry no
21:44:28AraqI'm very busy these days
21:44:40Araqnot much time for any productive work
21:45:56gradhahmm... still get an error for echo(<>a(href="http://nimrod-code.org", "Nimrod rules."))
21:46:22gradhait works if I remove the "Nimrod rules" part
21:46:29Araqwhat's the error message?
21:46:37gradhadeferred_minus_gallery.nim(250, 9) Error: type mismatch: got (string, Array constructor[0..0, string], PStringTable)
21:46:37gradhabut expected one of:
21:46:38gradhaxmltree.newXmlTree(tag: string, children: openarray[PXmlNode], attributes: PXmlAttributes): PXmlNode
21:48:14gradhaI guess I'll use cgi.XMLencode and report a bug on that
21:48:57Araqwell I don't get it, iirc dom96 uses <> and it works
21:49:21dom96huh
21:49:34dom96why are you using xmltree? why not htmlgen
21:49:42dom96I use htmlgen not xmltree iirc
21:49:45Araqbut the error message is clear I think
21:50:00Araqand the example is wrong :P
21:50:15dom96with htmlgen you can just omit the <>
21:50:38gradhadom96: I'm just testing the example, I was creating random non html tags
21:50:38Araq<>a(href="http://nimrod-code.org", <>"Nimrod rules.") # might work
21:50:49dom96i see
21:51:23gradhathat changes slightly the error
21:51:24gradhadeferred_minus_gallery.nim(271, 42) Error: type mismatch: got (string)
21:51:24gradhabut expected one of:
21:51:24gradhaxmltree.newXmlTree(tag: string, children: openarray[PXmlNode], attributes: PXmlAttributes): PXmlNode
22:00:13Araqah yeah
22:01:40Araq <>a(href= "http://nimrod-code.org", newText("Nimrod rules."))
22:02:39gradhabingo
22:03:53Araqwell that looks like I never tested it :-/
22:04:19Araqor maybe there used to be another overloaded newXmlTree
22:06:14*[2]charles quit (Ping timeout: 264 seconds)
22:09:55Mat2ciao
22:10:02gradhabye bye
22:10:21*Mat2 quit (Quit: Verlassend)
22:26:08*OrionPK joined #nimrod
22:56:53*EXetoC quit (Quit: WeeChat 0.4.1)
22:59:14*EvilAww quit (Quit: ZNC - http://znc.in)
23:11:06gradhagood night
23:11:10*gradha quit (Quit: bbl, need to watch http://www.youtube.com/watch?v=OzrkmcBMPYo again)
23:56:55*noam quit (Ping timeout: 264 seconds)