Deal all,
as far as I understand the documentation on fold captures in LPEG
(
http://www.inf.puc-rio.br/~roberto/lpeg/#cap-f), the folding
function should be called if there is at least one capture in the
pattern passed to lpeg.Cf ().
However, the real minimum seems to be two.
The following code
tostring (lpeg.P{'sum'
, sum = lpeg.Cf ( lpeg.V'operand' * lpeg.Cg ( lpeg.V'operator' * lpeg.V'operand' ) ^ 0, function (arg1, op, arg2)
if op == '+' then
return arg1 + arg2
elseif op == '-' then
return arg1 - arg2
elseif op == nil then
-- Special case: there is only one number in the _expression_:
return 0
end
end )
, operand = lpeg.C ( lpeg.R'09' ^ 1 / tonumber)
, operator = lpeg.C (lpeg.S'+-')
}:match '4')
returns '4' (the whole line) rather than '0' whivh it is supposed to return if the string consists of only one number without arithmetc signs, which means that the folding function was never called.
Alexander Mashin