Added library function over builtin functions. (Currently only math library covered.)
This commit is contained in:
parent
038a88eca5
commit
d75507da40
176
library.lua
Normal file
176
library.lua
Normal 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
|
64
pretty.lua
64
pretty.lua
|
@ -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: '
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user