better bad cast error message
This commit is contained in:
parent
f92cefc004
commit
b68987fdd7
27
ml.cpp
27
ml.cpp
|
|
@ -35,7 +35,11 @@
|
||||||
#define INVALID_LAMBDA "invalid lambda"
|
#define INVALID_LAMBDA "invalid lambda"
|
||||||
#define INVALID_BIN_OP "invalid binary operation"
|
#define INVALID_BIN_OP "invalid binary operation"
|
||||||
#define INVALID_ORDER "cannot order expression"
|
#define INVALID_ORDER "cannot order expression"
|
||||||
#define BAD_CAST "cannot cast"
|
#define BAD_CAST_INT "cannot cast as int"
|
||||||
|
#define BAD_CAST_FLOAT "cannot cast as float"
|
||||||
|
#define BAD_CAST_STRING "cannot cast as string"
|
||||||
|
#define BAD_CAST_ATOM "cannot cast as atom"
|
||||||
|
#define BAD_CAST_LIST "cannot cast as list"
|
||||||
#define ATOM_NOT_DEFINED "atom not defined"
|
#define ATOM_NOT_DEFINED "atom not defined"
|
||||||
#define INTERNAL_ERROR "internal virtual machine error"
|
#define INTERNAL_ERROR "internal virtual machine error"
|
||||||
#define INDEX_OUT_OF_RANGE "index out of range"
|
#define INDEX_OUT_OF_RANGE "index out of range"
|
||||||
|
|
@ -181,42 +185,33 @@ bool MlValue::is_list() const {
|
||||||
return type == LIST;
|
return type == LIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the "truthy" boolean value of this value.
|
|
||||||
bool MlValue::as_bool() const {
|
bool MlValue::as_bool() const {
|
||||||
return type != NIL && *this != MlValue(0l); // TODO remove 0 as false
|
return type != NIL && *this != MlValue(0l); // TODO remove 0 as false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get this item's integer value
|
|
||||||
long MlValue::as_int() const {
|
long MlValue::as_int() const {
|
||||||
return cast_to_int().stack_data.i;
|
return cast_to_int().stack_data.i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get this item's floating point value
|
|
||||||
double MlValue::as_float() const {
|
double MlValue::as_float() const {
|
||||||
return cast_to_float().stack_data.f;
|
return cast_to_float().stack_data.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get this item's string value
|
|
||||||
std::string MlValue::as_string() const {
|
std::string MlValue::as_string() const {
|
||||||
// If this item is not a string, throw a cast error.
|
|
||||||
if (type != STRING)
|
if (type != STRING)
|
||||||
throw MlError(*this, MlEnvironment(), BAD_CAST);
|
throw MlError(*this, MlEnvironment(), BAD_CAST_STRING);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get this item's atom value
|
|
||||||
std::string MlValue::as_atom() const {
|
std::string MlValue::as_atom() const {
|
||||||
// If this item is not an atom, throw a cast error.
|
|
||||||
if (type != ATOM)
|
if (type != ATOM)
|
||||||
throw MlError(*this, MlEnvironment(), BAD_CAST);
|
throw MlError(*this, MlEnvironment(), BAD_CAST_ATOM);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get this item's list value
|
|
||||||
std::vector<MlValue> MlValue::as_list() const {
|
std::vector<MlValue> MlValue::as_list() const {
|
||||||
// If this item is not a list, throw a cast error.
|
|
||||||
if (type != LIST)
|
if (type != LIST)
|
||||||
throw MlError(*this, MlEnvironment(), BAD_CAST);
|
throw MlError(*this, MlEnvironment(), BAD_CAST_LIST);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -254,7 +249,7 @@ MlValue MlValue::cast_to_int() const {
|
||||||
case STRING:
|
case STRING:
|
||||||
return MlValue(std::stol(str));
|
return MlValue(std::stol(str));
|
||||||
default:
|
default:
|
||||||
throw MlError(*this, MlEnvironment(), BAD_CAST);
|
throw MlError(*this, MlEnvironment(), BAD_CAST_INT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -268,7 +263,7 @@ MlValue MlValue::cast_to_float() const {
|
||||||
case STRING:
|
case STRING:
|
||||||
return MlValue(std::stod(str));
|
return MlValue(std::stod(str));
|
||||||
default:
|
default:
|
||||||
throw MlError(*this, MlEnvironment(), BAD_CAST);
|
throw MlError(*this, MlEnvironment(), BAD_CAST_FLOAT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -282,7 +277,7 @@ MlValue MlValue::cast_to_string() const {
|
||||||
case STRING:
|
case STRING:
|
||||||
return *this;
|
return *this;
|
||||||
default:
|
default:
|
||||||
throw MlError(*this, MlEnvironment(), BAD_CAST);
|
throw MlError(*this, MlEnvironment(), BAD_CAST_STRING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue