On Thursday, 1 March 2012 at 08:01:07 UTC, Daniel Murphy wrote:
Web programming... might actually become non-horrible?
hehe. I already found it ok though; I've been using D on the server for... will be two years in a couple weeks. Javascript isn't bad if you use it sparingly, and in the last year, my web.d server side thing has just enough javascript to let me write less of it. I just call server side functions in most the JS. I went a little nuts on partial application to make it nice looking; you pass arguments to the callback when you make it. But, it is nice to have this other stuff too. If I have to do a browser game, definitely doing D now, from top to bottom. Work wants ipad apps too... I'll probably do them as downloadable browser things, now in D! Anyway, a few more hours on d to js today. I spent the time working on struct semantics. It is amazing how complicated structs are! Compared to this, classes are just plain easy. My tests file (which I need to run in real D to confirm my thought here, but I think all my asserts are sane) now passes including tests of struct. http://arsdnet.net/dtojs/tests.d I implement structs as Javascript Object()'s, but this doesn't quite match what D expects. 1) JS Object are references, whereas D struct are value. 2) JS variables have indeterminate lifetimes 3) The JS language doesn't have block scoping like D. (1) was a big mess, and I'm sure I don't have it right yet (I know it is a lot less efficient than it could be). My solution was to make all assignments do shallow copies, including function call. void t(MyStruct a) {} t(a); becomes t(__d_struct_copy(a)) Worked for the basics. But, D structs are incredibly complex monsters. opAssign, postblit, copy constructors, blit initializers, expression initializers, TOKconstruct - something I'm not even sure what it actually is. Well, I think I got it. Lots of filthy dirty code, but it passed the test file. I haven't tested struct constructors yet, but they are relatively easy, just like class constructor, so I'm confident it will work. (2) and (3) go together: variable lifetime. D structs die when they go out of scope, both on function returns and exceptions. dmd implemented this as a Scope followed by a Finally. I ended up making it put try {} around the scope, and then write out the finally {}. dmd really did all the work already! And... finally works in Javascript. Amazing, we have struct destructors working like you expect. Moreover, dmd implements scope(exit) the exact same way. Boom, we have scope guards too. To my surprise, scope(failure) and scope(success) Just Worked: dmd set up a flag variable and automatically added it to the appropriate places. As far as I can tell, we have variable lifetime! (JS's garbage collector is still a question, and some of the variables are global - dmd loves the (var a, b) syntax, which is invalid so I made var a in global scope. It is not set to null when done.) Pretty cool. The majority of the language works correctly, though there's a few hacks in there to make it happen. I probably won't upload another zip until the weekend though.