• Subject: Re: Avoiding LuaJIT FFI allocations (Was: LuaJIT - Is ffi.alloca possible?)
• From: steve donovan <steve.j.donovan@...>
• Date: Mon, 6 Feb 2012 14:28:52 +0200

```On Mon, Feb 6, 2012 at 1:47 PM, steve donovan <steve.j.donovan@gmail.com> wrote:
> I'll do some experiments and come up with a shorter notation.

This does the trick:

local M = require 'macro'
local indexes = {
'11','21','31','41',
'12','22','32','42',
'13','23','33','43',
'14','24','34','44'}
local nix = #indexes

M.define('mat4',function(get)
local names = get:names '\n'
for _,name in ipairs(names) do
M.define(name,function(get,put)
local out = {}
for i = 1,nix do
out[i] = name..indexes[i]
end
return put:names(out)
end)
end
end)

a,b = tostring(a), tostring(b)
local out = {}
for i = 1,nix do
out[i] = a..indexes[i]..'+'..b..indexes[i]
end
return table.concat(out,',')
end)

This program does the desired thing using luam (say luam -d to see the
expanded source)

require_ 'mat'

mat4 A,B

A = 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0

B = 1, 2, 3, 4,
0.1, 0.2, 0.3, 0.4,
1,-2,-3,-4,
1.1,1.2,1.3,1.4

print(A)

This inlines additions, but multiplications should probably be done as

maximum number of locals for a given function!

Also, these matrices are rather hard to index ;)

Expressions would be hard in this framework, since LuaMacro just does
lexical substitution.  Metalua would then be the preferred route,
except that it directly compiles to 5.1 bytecode.

steve d.

```

• References: