(o == null ? "null" : (o instanceof Lang.String ? "String" : (o instanceof Lang.Object ? "Object" : "?"))) ...
Thanks!
(o == null ? "null" : (o instanceof Lang.String ? "String" : (o instanceof Lang.Object ? "Object" : "?"))) ...
I wanted to try a code block with the .txt RaceQs posted. I'd heard it should be working. RaceQs - what error were you getting when you tried to post?
function type_name(obj) { if (obj instanceof…
I have used this code quite a bit in the past. It isn't extremely efficient, but it is very flexible.
//! Module for writing an object or object hierarchy as a pretty string. //! //! Simple module for pretty-printing MonkeyC objects. All native types //! are handled by default. User-defined types can implement the special //! __repr__ method to return a string representation. If the behavior //! for a type (native or user-defined) needs to be changed, a callback //! can be registered to override. The most recently registered callback //! will be used. //! //! @example //! function hexadecimal_number(obj) { //! return Lang.format("0x$1$", [ obj.format("%x") ]); //! } //! //! function scientific_float(obj) { //! return obj.format("%e"); //! } //! //! function demo() { //! var d = { 1 => 3.14159 }; //! //! // prints "{ 1: 3.14159f }" //! pretty.dump(d); //! //! // override the behavior for Number //! pretty.register_type(Lang.Number, method(:hexadecimal_number)); //! //! // override the behavior for Float //! pretty.register_type(Lang.Float, method(:scientific_float)); //! //! // prints "{ 0x1: 3.141590e+00 }" //! pretty.dump(d); //! } module pretty { using Toybox.Lang; using Toybox.System; //! Register a callback to pretty format an object of the given type. //! //! @param [type] The type of an object to use the given callback function for //! @param [callback] A Lang.Method that generates a string representation of a type function register_type(type, callback) { _type_map.add(new TypeMapEntry(type, callback)); } //! Remove a callback registered to pretty format an object of the given type. //! //! Remove the most recently registered callback for the given type. Has no //! effect if no registered function is found. The default handlers for the //! built-in types cannot be removed, but they can be overridden by adding //! a new callback with `register_type`. //! //! @param [type] The type to deregister function deregister_type(type) { var n = _type_map.size(); for (var i = n - 1; i >= 0; --i) { if (_type_map[i].type == type) { _type_map.remove(_type_map[i]); return; } } } //! Convert an object to a pretty string representation. //! //! Convert an object to a pretty string representation using //! 1) the most recent callback registered with `register_type` //! that has not been removed with `deregister_type` //! 2) the default formatting for built-in types //! 3) the format provided by a class member function __repr__. //! //! @param [obj] The object to convert. //! @return String A pretty string representation of the object. //! @throws UnexpectedTypeException if an object type is not known. //! function dumps(obj) { return _dumps(obj); } //! Write the pretty representation of an object to output. //! //! write the pretty representation of the given object as if //! by calling to System.println(pretty.dumps(obj)). //! //! @param [obj] The object to write. //! @throws UnexpectedTypeException if an object type is not known. //! function dump(obj) { _dump(obj); System.print("\n"); } // // everything below this line is an implementation detail // do not access these things // var _type_map = []; class TypeMapEntry { function initialize(type, callback) { self.type = type; self.callback = callback; } var type; var callback; } // // return a pretty representation of the given object // function _dumps(obj) { var n = _type_map.size(); for (var i = n - 1; i >= 0; --i) { var entry = _type_map[i]; if (obj instanceof entry.type) { return entry.callback.invoke(obj); } } // default behavior for built-in types if (obj instanceof Lang.Boolean) { return obj.toString(); } else if (obj instanceof Lang.Char) { return Lang.format("'$1$'", [ obj ]); } else if (obj instanceof Lang.Double) { return Lang.format("$1$d", [ obj.format("%g") ]); } else if (obj instanceof Lang.Float) { return Lang.format("$1$f", [ obj.format("%g") ]); } else if (obj instanceof Lang.Long) { return Lang.format("$1$L", [ obj ]); } else if (obj instanceof Lang.Number) { return obj.toString(); } else if (obj instanceof Lang.String) { return Lang.format("\"$1$\"", [ obj ]); } else if (obj instanceof Lang.Array) { var n = obj.size(); if (n == 0) { return "[]"; } var r = "[ "; r += _dumps(obj[0]); for (var i = 1; i < n; ++i) { r += ", "; r += _dumps(obj[i]); } r += " ]"; return r; } else if (obj instanceof Lang.Dictionary) { var n = obj.size(); if (n == 0) { return "{}"; } var k = obj.keys(); var v = obj.values(); var r = "{ "; r += _dumps(k[0]); r += ": "; r += _dumps(v[0]); for (var i = 1; i < n; ++i) { r += ", "; r += _dumps(k[i]); r += ": "; r += _dumps(v[i]); } r += " }"; return r; } else if (obj instanceof Lang.ByteArray) { return obj.toString(); } else if (obj == null) { return "null"; } // special behavior for user-defined types else if (obj has :__repr__) { return obj.__repr__(); } // no idea what to do here else { throw new Lang.UnexpectedTypeException(Lang.format("Unknown type for '$1$'", [ obj ]), null, null); } } // // display a pretty representation of the given object // function _dump(obj) { var n = _type_map.size(); for (var i = n - 1; i >= 0; --i) { var entry = _type_map[i]; if (obj instanceof entry.type) { System.print(entry.callback.invoke(obj)); return; } } // default behavior for built-in types if (obj instanceof Lang.Boolean) { System.print(obj.toString()); } else if (obj instanceof Lang.Char) { System.print(Lang.format("'$1$'", [ obj ])); } else if (obj instanceof Lang.Double) { System.print(Lang.format("$1$d", [ obj.format("%g") ])); } else if (obj instanceof Lang.Float) { System.print(Lang.format("$1$f", [ obj.format("%g") ])); } else if (obj instanceof Lang.Long) { System.print(Lang.format("$1$L", [ obj ])); } else if (obj instanceof Lang.Number) { System.print(obj.toString()); } else if (obj instanceof Lang.String) { System.print(Lang.format("\"$1$\"", [ obj ])); } else if (obj instanceof Lang.Array) { var n = obj.size(); if (n == 0) { System.print("[]"); return; } System.print("[ "); _dump(obj[0]); for (var i = 1; i < n; ++i) { System.print(", "); _dump(obj[i]); } System.print(" ]"); } else if (obj instanceof Lang.Dictionary) { var n = obj.size(); if (n == 0) { System.print("{}"); return; } var k = obj.keys(); var v = obj.values(); System.print("{ "); _dump(k[0]); System.print(": "); _dump(v[0]); for (var i = 1; i < n; ++i) { System.print(", "); _dump(k[i]); System.print(":"); _dump(v[i]); } System.print(" }"); } else if (obj instanceof Lang.ByteArray) { System.print(obj.toString()); } else if (obj == null) { System.print("null"); } // special behavior for user-defined types else if (obj has :__repr__) { System.print(obj.__repr__()); } // no idea what to do here else { throw new Lang.UnexpectedTypeException(Lang.format("Unknown type for '$1$'", [ obj ]), null, null); } } }