Values - String conversion using the interpreter state
This commit is contained in:
parent
79033b78b9
commit
22b284ffa3
1 changed files with 49 additions and 1 deletions
|
@ -1,10 +1,17 @@
|
||||||
use std::{cell::RefCell, fmt::Display, rc::Rc};
|
use std::{cell::RefCell, fmt::Display, rc::Rc};
|
||||||
|
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
errors::{ErrorKind, SloxError, SloxResult},
|
||||||
|
tokens::{Token, TokenType},
|
||||||
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
classes::{Class, ClassRef, Instance, InstanceRef, PropertyCarrier},
|
classes::{Class, ClassRef, Instance, InstanceRef, PropertyCarrier},
|
||||||
functions::Function,
|
functions::Function,
|
||||||
native_fn::NativeFunction,
|
native_fn::NativeFunction,
|
||||||
Callable,
|
Callable, InterpreterState,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A value being handled by the interpreter.
|
/// A value being handled by the interpreter.
|
||||||
|
@ -25,6 +32,17 @@ pub enum Object {
|
||||||
Instance(InstanceRef),
|
Instance(InstanceRef),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref TO_STRING_TOKEN: Token = {
|
||||||
|
let name = "to_string".to_owned();
|
||||||
|
Token {
|
||||||
|
token_type: TokenType::Identifier(name.clone()),
|
||||||
|
lexeme: name,
|
||||||
|
line: 0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------- *
|
/* -------------------- *
|
||||||
* Value implementation *
|
* Value implementation *
|
||||||
* -------------------- */
|
* -------------------- */
|
||||||
|
@ -106,6 +124,36 @@ impl Value {
|
||||||
_ => ferr(),
|
_ => ferr(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Convert a value into a string. This can only be done fully with an interpreter state,
|
||||||
|
/// because it might require calling an instance's to_string method.
|
||||||
|
pub fn convert_to_string(
|
||||||
|
&self,
|
||||||
|
es: &mut InterpreterState,
|
||||||
|
at_token: &Token,
|
||||||
|
) -> SloxResult<String> {
|
||||||
|
self.with_instance(
|
||||||
|
|inst| {
|
||||||
|
if let Ok(result) = inst.get(es, &TO_STRING_TOKEN) {
|
||||||
|
result
|
||||||
|
.with_callable(
|
||||||
|
|callable| callable.call(es, vec![]),
|
||||||
|
|| {
|
||||||
|
Err(SloxError::with_token(
|
||||||
|
ErrorKind::Runtime,
|
||||||
|
at_token,
|
||||||
|
"to_string() isn't callable".to_owned(),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.map(|r| r.to_string())
|
||||||
|
} else {
|
||||||
|
Ok(inst.borrow().to_string())
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|| Ok(self.to_string()),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PartialEq for Value {
|
impl PartialEq for Value {
|
||||||
|
|
Loading…
Reference in a new issue