Use throw() instead of returning errorObject() results directly
Add (type-of) for getting the string representation of an object's type.
This commit is contained in:
parent
c37a12e244
commit
8b9a351be1
|
@ -242,6 +242,7 @@ struct Environment defaultEnv()
|
||||||
#endif
|
#endif
|
||||||
#ifdef STANDALONE
|
#ifdef STANDALONE
|
||||||
pf(segfault),
|
pf(segfault),
|
||||||
|
pf(typeOf),
|
||||||
pf(print),
|
pf(print),
|
||||||
pf(numToChar),
|
pf(numToChar),
|
||||||
pf(printEnvO),
|
pf(printEnvO),
|
||||||
|
|
|
@ -734,7 +734,7 @@ inline Object withLen(size_t len, enum Type type)
|
||||||
inline Object constructLambda(const Object* params, const Object* body, struct Environment* env)
|
inline Object constructLambda(const Object* params, const Object* body, struct Environment* env)
|
||||||
{
|
{
|
||||||
if (!params || !body) {
|
if (!params || !body) {
|
||||||
return errorObject(NULL_LAMBDA_LIST);
|
throw(NULL_LAMBDA_LIST, "fn params and body cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params->type != TYPE_LIST) {
|
if (params->type != TYPE_LIST) {
|
||||||
|
|
|
@ -379,7 +379,7 @@ static Object run_script(Object* params, int length,
|
||||||
free(code);
|
free(code);
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
return errorObject(SCRIPT_NOT_FOUND);
|
throw(SCRIPT_NOT_FOUND, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void code_window_unload(Window* window)
|
static void code_window_unload(Window* window)
|
||||||
|
|
|
@ -277,7 +277,7 @@ int areEqual(const Object* obj1, const Object* obj2)
|
||||||
Object equ(Object* params, int length, unused struct Environment* env)
|
Object equ(Object* params, int length, unused struct Environment* env)
|
||||||
{
|
{
|
||||||
if (length < 2) {
|
if (length < 2) {
|
||||||
return errorObject(NOT_ENOUGH_ARGUMENTS);
|
throw(NOT_ENOUGH_ARGUMENTS, "expected at least 2");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < length - 1; i++) {
|
for (int i = 0; i < length - 1; i++) {
|
||||||
|
|
|
@ -12,6 +12,12 @@ Object print(Object* params, int length, unused struct Environment* env)
|
||||||
return numberObject(0);
|
return numberObject(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object typeOf(Object* params, unused int length, unused struct Environment* env)
|
||||||
|
{
|
||||||
|
const char* typeString = getTypeName(&(params[0]));
|
||||||
|
return nullTerminated(typeString);
|
||||||
|
}
|
||||||
|
|
||||||
Object numToChar(Object* params, unused int length, unused struct Environment* env)
|
Object numToChar(Object* params, unused int length, unused struct Environment* env)
|
||||||
{
|
{
|
||||||
checkTypes(numToChar);
|
checkTypes(numToChar);
|
||||||
|
|
|
@ -7,6 +7,14 @@
|
||||||
|
|
||||||
fn(print, "prn", "Prints the string representation of the given object to stdout.");
|
fn(print, "prn", "Prints the string representation of the given object to stdout.");
|
||||||
|
|
||||||
|
tfn(typeOf, "type-of",
|
||||||
|
({ anyType, returns(isStringy) }),
|
||||||
|
"Gets a string indicating the type of the given object",
|
||||||
|
"(type-of 10)", "TYPE_NUMBER",
|
||||||
|
"(type-of \"string\")", "TYPE_STRING",
|
||||||
|
"(type-of (fn () ()))", "TYPE_LAMBDA",
|
||||||
|
);
|
||||||
|
|
||||||
tfn(numToChar, "ch",
|
tfn(numToChar, "ch",
|
||||||
({ expect(isNumber), returns(isStringy) }),
|
({ expect(isNumber), returns(isStringy) }),
|
||||||
"Gets a string containing the ascii character for the given number value.",
|
"Gets a string containing the ascii character for the given number value.",
|
||||||
|
|
|
@ -94,7 +94,7 @@ Object addTextLayer(Object* params, int length, struct Environment* env)
|
||||||
Object window = params[0];
|
Object window = params[0];
|
||||||
Object text = params[1];
|
Object text = params[1];
|
||||||
if (getPebbleType(window) != WINDOW) {
|
if (getPebbleType(window) != WINDOW) {
|
||||||
return errorObject(0);
|
throw(BAD_TYPE, "Expected a pebble window, but received %s", getTypeName(&window));
|
||||||
}
|
}
|
||||||
Layer* window_layer =
|
Layer* window_layer =
|
||||||
window_get_root_layer(accessPebbleObject(window)->window);
|
window_get_root_layer(accessPebbleObject(window)->window);
|
||||||
|
@ -179,6 +179,6 @@ Object doVibe(Object* params, int length, struct Environment* env)
|
||||||
(VibePattern) {.durations = pattern, .num_segments = l});
|
(VibePattern) {.durations = pattern, .num_segments = l});
|
||||||
return trueObject();
|
return trueObject();
|
||||||
} else {
|
} else {
|
||||||
return errorObject(NOT_A_LIST);
|
throw(NOT_A_LIST, "(vibe) requires a non-empty list!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue