Skip to main content

rl_lang/interpreter/stdlib/math/
log.rs

1use crate::{
2    interpreter::{evaluator::Evaluator, values::Value},
3    utils::{errors::Error, span::Span},
4};
5
6pub fn std_log(eval: &mut Evaluator, a: Value, base: Value, span: Span) -> Result<Value, Error> {
7    match (a, base) {
8        (Value::Integer(i), Value::Integer(base)) => Ok(Value::Float((i as f64).log(base as f64))),
9        (Value::Float(f), Value::Float(base)) => Ok(Value::Float(f.log(base))),
10        (Value::Float(f), Value::Integer(base)) => Ok(Value::Float(f.log(base as f64))),
11        (Value::Integer(i), Value::Float(base)) => Ok(Value::Float((i as f64).log(base))),
12
13        (a, base) => Err(eval.err(
14            format!(
15                "log() expects a number, got ({}, {})",
16                a.type_name(),
17                base.type_name()
18            ),
19            span,
20        )),
21    }
22}