Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I chain function call in lua?

Tags:

function

lua

I am trying to make a function to chain functions call. However it is not working. It should be able to print out the value after doing the sum without any issues.

Here is my first attempt:

local _ = {}
function _.add(x, y) return x + y end
function _.lt(x, y) return x < y end

function _.chain(value)
    local mt = {
        __newindex = function(t, k, v)
            t._value = _[k](t._value, v)
        end
    }
    local chain = {
        _value = value,
        value = function(self)
            return self._value
        end
    }
    chain = setmetatable(chain, mt)
    return chain
end

local value = chain(2).add(5)
print(value)

This solution is not working because it should be able to localize the function through the __newindex metatable . Instead of localizing the function, it's throwing me a error saying the following message:

lua: main.lua:21: attempt to call a nil value (method 'add')
stack traceback:
    main.lua:21: in main chunk
    [C]: in ?

My second attempt at solving this issue was by using no metamethod what's so ever:

local _ = {}
function _.add(x, y) return x + y end
function _.lt(x, y) return x < y end

function _.chain(value)
    local t = {
        _value = value;
        value = function (self)
            return self._value
        end
    }
    -- merge methods in t
    for k, v in pairs(_) do
        if type(v) == "function" then
            t[k] = function (self, ...)
                local result = v(self._value, ...)
                if result ~= self._value then
                    self._value = result
                end
                return self
            end
        end
    end
    
    return t
end
local sum = _.chain(2):add(5):value()
print(sum)

This attempt doesn't work because it's printing out nil instead of 7.

like image 410
Vini Dalvino Avatar asked Mar 27 '26 01:03

Vini Dalvino


1 Answers

In your first attempt you are not adding new fields to the table chain so the method __newindex is never called, in your second attempt, I don't know what you did wrong because it worked to me, I did:

local sum = _.chain(2):add(5):value()
print(sum)

and printed 7

local sum = _.chain(2):add(5):add(3):value()
print(sum)

and printed 10

local sum = _.chain(2):add(5):add(3):add(7):value()
print(sum)

and printed 17

like image 178
HerlySQR Avatar answered Mar 29 '26 16:03

HerlySQR



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!