1
0

Added library function over builtin functions. (Currently only math library covered.)

This commit is contained in:
Jon Michael Aanes 2016-12-29 18:40:30 +01:00
parent 038a88eca5
commit d75507da40
3 changed files with 245 additions and 18 deletions

176
library.lua Normal file
View File

@ -0,0 +1,176 @@
local function_library = {}
-- math (Mathematical Functions)
function_library[ math.abs ] = {
name = 'math.abs',
params = {'x'},
doc = 'Returns the absolute value of x.'
}
function_library[ math.acos ] = {
name = 'math.acos',
params = {'x'},
doc = 'Returns the arc cosine of x (in radians).'
}
function_library[ math.asin ] = {
name = 'math.asin',
params = {'x'},
doc = 'Returns the arc sine of x (in radians).'
}
function_library[ math.atan ] = {
name = 'math.atan',
params = {'x'},
doc = 'Returns the arc tangent of x (in radians).'
}
function_library[ math.atan2 ] = {
name = 'math.atan2',
params = {'y', 'x'},
doc = 'Returns the arc tangent of y/x (in radians), but uses the signs of both parameters to find the quadrant of the result. (It also handles correctly the case of x being zero.)'
}
function_library[ math.ceil ] = {
name = 'math.ceil',
params = {'x'},
doc = 'Returns the smallest integer larger than or equal to x.'
}
function_library[ math.cos ] = {
name = 'math.cos',
params = {'x'},
doc = 'Returns the cosine of x (assumed to be in radians).'
}
function_library[ math.cosh ] = {
name = 'math.cosh',
params = {'x'},
doc = 'Returns the hyperbolic cosine of x.'
}
function_library[ math.deg ] = {
name = 'math.deg',
params = {'x'},
doc = 'Returns the angle x (given in radians) in degrees.'
}
function_library[ math.exp ] = {
name = 'math.exp',
params = {'x'},
doc = 'Returns the value ex.'
}
function_library[ math.floor ] = {
name = 'math.floor',
params = {'x'},
doc = 'Returns the largest integer smaller than or equal to x.'
}
function_library[ math.fmod ] = {
name = 'math.fmod',
params = {'x', 'y'},
doc = 'Returns the remainder of the division of x by y that rounds the quotient towards zero.'
}
function_library[ math.frexp ] = {
name = 'math.frexp',
params = {'x'},
doc = 'Returns m and e such that x = m2e, e is an integer and the absolute value of m is in the range [0.5, 1) (or zero when x is zero).'
}
function_library[ math.ldexp ] = {
name = 'math.ldexp',
params = {'m', 'e'},
doc = 'Returns m2e (e should be an integer).'
}
function_library[ math.log ] = {
name = 'math.log',
params = {'x'},
doc = 'Returns the natural logarithm of x.'
}
function_library[ math.log10 ] = {
name = 'math.log10',
params = {'x'},
doc = 'Returns the base-10 logarithm of x.'
}
function_library[ math.max ] = {
name = 'math.max',
params = {'x', '...'},
doc = 'Returns the maximum value among its arguments.'
}
function_library[ math.min ] = {
name = 'math.min',
params = {'x', '...'},
doc = 'Returns the minimum value among its arguments.'
}
function_library[ math.modf ] = {
name = 'math.modf',
params = {'x'},
doc = 'Returns two numbers, the integral part of x and the fractional part of x.'
}
function_library[ math.pow ] = {
name = 'math.pow',
params = {'x', 'y'},
doc = 'Returns xy. (You can also use the expression x^y to compute this value.)'
}
function_library[ math.rad ] = {
name = 'math.rad',
params = {'x'},
doc = 'Returns the angle x (given in degrees) in radians.'
}
function_library[ math.random ] = {
name = 'math.random',
params = {'[m [', 'n]'},
doc = 'When called without arguments, returns a uniform pseudo-random real number in the range [0,1). When called with an integer number m, math.random returns a uniform pseudo-random integer in the range [1, m]. When called with two integer numbers m and n, math.random returns a uniform pseudo-random integer in the range [m, n].'
}
function_library[ math.randomseed ] = {
name = 'math.randomseed',
params = {'x'},
doc = 'Sets x as the "seed" for the pseudo-random generator: equal seeds produce equal sequences of numbers.'
}
function_library[ math.sin ] = {
name = 'math.sin',
params = {'x'},
doc = 'Returns the sine of x (assumed to be in radians).'
}
function_library[ math.sinh ] = {
name = 'math.sinh',
params = {'x'},
doc = 'Returns the hyperbolic sine of x.'
}
function_library[ math.sqrt ] = {
name = 'math.sqrt',
params = {'x'},
doc = 'Returns the square root of x. (You can also use the expression x^0.5 to compute this value.)'
}
function_library[ math.tan ] = {
name = 'math.tan',
params = {'x'},
doc = 'Returns the tangent of x (assumed to be in radians).'
}
function_library[ math.tanh ] = {
name = 'math.tanh',
params = {'x'},
doc = 'Returns the hyperbolic tangent of x. '
}
--------------------------------------------------------------------------------
return function_library

View File

@ -1,4 +1,6 @@
local LIBRARY = require "library"
local ERROR_UNKNOWN_TYPE = [[
[pretty]: Attempting to format unsupported value of type "%s".
A native formatting of the value is: %s
@ -190,6 +192,7 @@ local function get_function_info (f)
info.env = debug.getfenv(f)
info.builtin = info.source == '=[C]'
for i = 1, info.nparams do info.params[i] = debug.getlocal(f, i) end
if info.isvararg then info.params[#info.params+1] = '...' end
for i = 1, info.nups do local k, v = debug.getupvalue(f, i); info.ups[k] = v end
if info.source:sub(1,1) == '=' then info.defined_how = 'C'
@ -197,6 +200,12 @@ local function get_function_info (f)
else info.defined_how = 'string'
end
if info.builtin and LIBRARY[f] then
info.name = LIBRARY[f].name
info.params = LIBRARY[f].params
info.doc = LIBRARY[f].doc
end
return info
end
@ -480,7 +489,9 @@ end
local function format_function (value, options, depth)
local info = get_function_info(value)
if info.defined_how == 'string' then return format_string_defined_function(value, options, depth) end
if info.defined_how == 'string' then
return format_string_defined_function(value, options, depth)
end
local l = {}
@ -488,7 +499,6 @@ local function format_function (value, options, depth)
if info.builtin then l[#l+1] = 'builtin ' end
l[#l+1] = 'function ('
for _, param in ipairs(info.params) do l[#l+1], l[#l+2] = param, ', ' end
if info.isvararg then l[#l+1] = '...' end
if l[#l] == ', ' then l[#l] = nil end
l[#l+1] = ')'
@ -514,25 +524,43 @@ local function format_function (value, options, depth)
else
-- More info! --
-- source
l[#l+1] = '\n'
l[#l+1] = options.indent
l[#l+1] = '-- source_file: \''
l[#l+1] = info.short_src
l[#l+1] = '\' [Line'
if info.linedefined == info.lastlinedefined then
l[#l+1] = ': '
l[#l+1] = tostring(info.linedefined)
else
l[#l+1] = 's: '
l[#l+1] = tostring(info.linedefined)
l[#l+1] = ' - '
l[#l+1] = tostring(info.lastlinedefined)
-- Name
if info.name then
l[#l+1] = '\n'
l[#l+1] = options.indent
l[#l+1] = '-- '
l[#l+1] = info.name
end
-- Doc
if info.name then
l[#l+1] = '\n'
l[#l+1] = options.indent
l[#l+1] = '-- '
l[#l+1] = info.doc
end
-- source
if not info.builtin then
l[#l+1] = '\n'
l[#l+1] = options.indent
l[#l+1] = '-- source_file: \''
l[#l+1] = info.short_src
l[#l+1] = '\' [Line'
if info.linedefined == info.lastlinedefined then
l[#l+1] = ': '
l[#l+1] = tostring(info.linedefined)
else
l[#l+1] = 's: '
l[#l+1] = tostring(info.linedefined)
l[#l+1] = ' - '
l[#l+1] = tostring(info.lastlinedefined)
end
l[#l+1] = ']'
end
l[#l+1] = ']'
-- upvalues
if info.nups > 0 then
if info.nups > 0 and not info.builtin then
l[#l+1] = '\n'
l[#l+1] = options.indent
l[#l+1] = '-- up_values: '

View File

@ -315,10 +315,33 @@ format_test {
expect = 'builtin function (...) ... end',
}
format_test {
input = math.abs,
expect = 'builtin function (x) ... end',
}
format_test {
input = math.abs,
options = { more_function_info = true },
expect = 'builtin function (x)\n\t-- math.abs\n\t-- Returns the absolute value of x.\n\n\t...\nend',
}
format_test {
input = math.random,
expect = 'builtin function ([m [, n]) ... end',
}
format_test {
input = math.random,
options = { more_function_info = true },
expect = 'builtin function ([m [, n])\n\t-- math.random\n\t-- When called without arguments, returns a uniform pseudo-random real number in the range [0,1). When called with an integer number m, math.random returns a uniform pseudo-random integer in the range [1, m]. When called with two integer numbers m and n, math.random returns a uniform pseudo-random integer in the range [m, n].\n\n\t...\nend',
}
--------------------------------------------------------------------------------
-- Userdata printing
-- TODO. First off figure out a way to test this stuff.
-- Maybe look into using the one available debug.getupvalue(pairs, 1)
--------------------------------------------------------------------------------
-- Thread printing