1
0

Added vulgar_fraction function, and increased resilience.

This commit is contained in:
Jon Michael Aanes 2017-05-25 22:53:02 +02:00
parent 0ab7942023
commit 7ccb9e8123
3 changed files with 35 additions and 25 deletions

View File

@ -1,6 +1,10 @@
local utf8 = require "utf8" -- FIXME: I don't really like this. Either have a local copy of the files, or remove the functionallity requiring it. local utf8 = require "utf8" -- FIXME: I don't really like this. Either have a local copy of the files, or remove the functionallity requiring it.
-- Make sure we imported the correct library.
local CAN_USE_SHORTHAND = not not utf8.width
if not CAN_USE_SHORTHAND then utf8.width = function(a) return #a end end
-- Constants -- Constants
local MAXIMUM_INT = 2^53 -- The maximum double for where all integers can be represented exactly. local MAXIMUM_INT = 2^53 -- The maximum double for where all integers can be represented exactly.
@ -9,6 +13,11 @@ local MAXIMUM_ZERO = 10^-7 -- Used when attempting to determine fraction. Anyt
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Util -- Util
local function vulgar_fraction (a, b)
-- Returns a string representing the fraction a/b, with unicode characters.
return utf8.superscript(a) .. '' .. utf8.subscript(b)
end
local function is_integer (n) local function is_integer (n)
-- Predicate. Neither +inf, -inf nor nan are integer. -- Predicate. Neither +inf, -inf nor nan are integer.
return n == math.floor(n) and n ~= 1/0 and n ~= -1/0 return n == math.floor(n) and n ~= 1/0 and n ~= -1/0
@ -68,8 +77,8 @@ local SPECIAL_NUMBER = {
-- x = a/b -- x = a/b
{ est = calculate_fraction, { est = calculate_fraction,
real = function (a, b) return b ~= 1 and (a/b) end, real = function (a, b) return b ~= 1 and (a/b) end,
repr = function (a, b) return format_num(a)..'/'..format_num(b) end, repr = function (a, b) return a..'/'..b end,
short = function (a, b) return format_num(a)..'/'..format_num(b) end, short = function (a, b) return a..'/'..b end,
}, },
-- Factorial -- Factorial
{ est = function (n) return inverse_factorial(n) end, { est = function (n) return inverse_factorial(n) end,
@ -155,5 +164,5 @@ end
return function (value, options, depth, l) return function (value, options, depth, l)
-- TODO: Add support for more relaxed representations. -- TODO: Add support for more relaxed representations.
l[#l+1] = format_num(value, options.math_shorthand) l[#l+1] = format_num(value, CAN_USE_SHORTHAND and options.math_shorthand)
end end

View File

@ -5,18 +5,25 @@
local format_number, format_function, analyze_structure, get_table_info, TABLE_TYPE local format_number, format_function, analyze_structure, get_table_info, TABLE_TYPE
do do
local thispath = ... and select('1', ...):match('.+%.') or '' local thispath = ... and select('1', ...):match('.+%.') or ''
local function import (name, ignore_failure)
local was_loaded, lib_or_error = pcall(require, thispath..name)
if not was_loaded then
if ignore_failure then return nil end
error('[pretty]: Could not load vital library: '..name..'.lua:\n\t'..lib_or_error)
end
return lib_or_error
end
-- Load number and function formatting -- Load number and function formatting
format_number = select(2, pcall(require, thispath..'number')) -- Will use a very simple number formatting, if number.lua is not available.
format_function = select(2, pcall(require, thispath..'function')) -- Will use a very simple function formatting, if function.lua is not available.
format_number = import('number', true) or function (value, _, _, l) l[#l+1] = tostring(value) end
format_function = import('function', true) or function (value, _, _, l) l[#l+1] = 'function (...) --[['..tostring(value):sub(11)..']] end' end
-- Load other stuff -- Load other stuff
local was_loaded analyze_structure = import 'analyze_structure'
was_loaded, analyze_structure = pcall(require, thispath..'analyze_structure')
analyze_structure, get_table_info = analyze_structure[1], analyze_structure[2] analyze_structure, get_table_info = analyze_structure[1], analyze_structure[2]
assert(was_loaded, '[pretty]: Could not load vital library: analyze_structure') TABLE_TYPE = import 'table_type'
was_loaded, TABLE_TYPE = pcall(require, thispath..'table_type')
assert(was_loaded, '[pretty]: Could not load vital library: table_type')
end end
-- --
@ -431,13 +438,6 @@ local function format_string (str, options, depth, l)
l[#l+1] = right l[#l+1] = right
end end
if not format_number then
-- Very simple number formatting, if number.lua is not available.
format_number = function (value, _, _, l)
l[#l+1] = tostring(value)
end
end
local function format_coroutine (value, options, depth, l) local function format_coroutine (value, options, depth, l)
l[#l+1] = coroutine.status(value) l[#l+1] = coroutine.status(value)
l[#l+1] = ' coroutine: ' l[#l+1] = ' coroutine: '
@ -448,13 +448,6 @@ local function format_primitive (value, options, depth, l)
l[#l+1] = tostring(value) l[#l+1] = tostring(value)
end end
if not format_function then
-- Very simple function formatting, if function.lua is not available.
format_function = function (value, _, _, l)
l[#l+1] = 'function (...) --[['..tostring(value):sub(11)..']] end'
end
end
local TYPE_TO_FORMAT_FUNC = { local TYPE_TO_FORMAT_FUNC = {
['nil'] = format_primitive, ['nil'] = format_primitive,
['boolean'] = format_primitive, ['boolean'] = format_primitive,

View File

@ -42,6 +42,14 @@ SUITE:addTest('Dont allow bad types in options', function ()
end) end)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Survive not loading libs
-- TODO: Find a way to test this.
--------------------------------------------------------------------------------
-- Strange standard libs
SUITE:addTest('no_std_lib', function () SUITE:addTest('no_std_lib', function ()
-- This tests whether one could load the library with an empty env, without -- This tests whether one could load the library with an empty env, without