DMDScript now under Boost license
Adam Ruppe
destructionator at gmail.com
Tue Mar 30 17:34:22 PDT 2010
All right, now I'm actually done for the day.
Updated the zip at the link:
http://arsdnet.net/dcode/dmdscript_d2.zip
To add a pretty interface (pretty.d). It is incomplete, but works to
play with. test.d is an example of how to use it.
auto se = new ScriptEngine;
se.addFunction!(fun, "fun"); // adding D functions is just giving
the names. the second arg is required since stringof the alias kept
treating it as a property.....
se.addFunction!(fun2, "fun2");
se.compile("function test(a) { println(a); }");
se.call("test", 40); // and it is almost as easy to call script functions!
When I go back to finish it, I'm thinking I'll add more integration
with std.variant and opDispatch, so the D and javascript code
basically work the same way.
To do this, I did have to do one change to dmdscript itself: edited
dnative.d to add an overload constructor so it can take a delegate as
well as a function. That let my template just use a nested function to
keep it easy. It might not work properly if the script tries to
redefine the function though.
Still, good enough for now. I've been at this for 9 hours! Blown my
whole day off.
On 3/30/10, Adam Ruppe <destructionator at gmail.com> wrote:
> On 3/29/10, Robert Clipsham <robert at octarineparrot.com> wrote:
>> I seem to recall it is, and a fairly old D1 at that... You could always
>> update it and send a patch Walter's way, see if he accepts it :)
>
> Walter seems to have fixed it up the the new D1; it compiled there.
>
> And I just spent the day making a port to D2. There's a few WTFs in
> there though, which I hacked around.
>
> Here it is:
> http://arsdnet.net/dcode/dmdscript_d2.zip
>
> First, once each in dobject.d and script.d, I casted away a const.
> grep for FIXME.
>
> Second, and this is the big one: the assocative array implementation
> in there seems to have broken entirely with the switch to D2. Look for
> "BIG HACK" in property.d - I had to do this two times:
>
> assert(key !is null);
> p = *key in table;
>
> // BIG HACK! in seems broken!
> if(p is null)
> foreach(k,ref v; table) {
> if(k.toString() == key.toString()) {
> p = &v; // WTF
> break;
> }
> }
>
> Previously, it used a custom AA implementation, similar to the one in
> Phobos, but not quite the same. It cached the hashes for boosted
> speed.
>
> In phobos2, the AA implementation is completely different. This first
> manifested itself as linker errors on foreach statements (fix it by
> compiling as:
>
> dmd -oftest *.d
>
> instead of using the makefile). Then, I noticed obvious things were
> failing.
>
> After spending a few hours on it, I decided to just give up and use
> the above hack. I still don't understand why it is happening that way.
> (I thought const correctness would be the hard thing, but aside from
> the two casts, it was fairly easy. The stupid AA has been the real
> problem!)
>
>
>
> But, anyway, it now works on some simple scripts, and the asserts in
> there all work, so I think it is working correctly.
>
> Now, with it compiling as D2, the next step will be making the wrapper
> template I mentioned yesterday. I don't have time to do it today
> though.
>
> On the bright side, I know the code a bit better now than I ever did
> before, so maybe I can make this template better than I thought! We'll
> see.
>
More information about the Digitalmars-d-announce
mailing list