[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: [ANN] lua-Coat 0.5.0 : Yet Another Lua Object-Oriented Model
- From: François Perrad <francois.perrad@...>
- Date: Wed, 26 Aug 2009 21:07:18 +0200
2009/8/26 David Manura <dm.lua@math2.org>:
> On Mon, Aug 24, 2009 at 1:14 PM, François Perrad wrote:
>> lua-Coat is a Lua 5.1 port of Coat (http://www.sukria.net/perl/coat/), ...
>> Comment, bug report, patch are welcome.
>
> So if Moose is the ultimate class library for Perl, and Coat is a
> quasi-subset Moose, and lua-Coat is a port of Coat to Lua, then does
> that imply that lua-Coat is a quasi-subset of the ultimate class
> library for Lua?
>
> We can try it on the benchmark [3]
>
> -- added code
> function makeob5()
> require "Coat"
> class "ob5"
> has.data = {is='number',default=0}
> function method:test() self:data(self:data() + 1) end
> return _M()
> end
> addbenchmark("Object using lua-Coat", "ob:test()", makeob5())
>
> Results:
>
> $ lua bench.lua # using count = 10000000
> 2.969 Standard (solid)
> 3.406 Standard (metatable)
> 3.64 Object using closures (PiL 16.4)
> 2.25 Object using closures (noself)
> 16.735 Object using lua-Coat
> 1.469 Direct Access
> 0.484 Local Variable
>
A benchmark makes sense only if it's representative of your usage.
>> basic_type = type
>> local basic_type = basic_type
>> local function object_type (obj)
>> local t = basic_type(obj)
>> if t == 'table' then
>> pcall(function () t = obj._CLASS or t end)
>> end
>> return t
>> end
>> _G.type = object_type
>
> The above code implies that type {_CLASS='x'} == 'x', which is
> inconsistent with the Lua specification [1]. This might not seem
> important, but consider the case of some code that operates on a table
> whose key names are generated from user input. The above would
> introduce subtle edge cases (or security holes). The above also
> implies that type(t) will now have the overhead of a pcall when t is a
> table. I recommend against redefining type().
>
>> function before (class, name, func) .....
>> class[name] = function (...)
>> local result = func(...)
>> super(...)
>> return result
>> end
>
> To handle multiple return values, you can use the CPS style [2].
> However, I question whether before and after modifiers should alter
> return values. It appears Coat (in $modified_method_code) only does
> so for around modifiers.
>
> [1] http://www.lua.org/manual/5.1/manual.html#pdf-type
> [2] http://lua-users.org/wiki/VarargTheSecondClassCitizen
> [3] http://lua-users.org/wiki/ObjectBenchmarkTests
>
>