Fix up evaluation baybeeee!!!!!
also write the primes program or w/e
This commit is contained in:
parent
ac62dc4e2d
commit
d9385ed1c3
|
@ -1,5 +1,31 @@
|
||||||
main: Int
|
main: Int
|
||||||
main = 1 + distance_squared 4 3
|
main = nth_prime 77
|
||||||
|
|
||||||
distance_squared: Int, Int -> Int
|
nth_prime: Int -> Int
|
||||||
distance_squared a b = a * a + b * b
|
nth_prime n =
|
||||||
|
if n == 1
|
||||||
|
then 2
|
||||||
|
else nth_prime_helper (n - 1) 3
|
||||||
|
|
||||||
|
nth_prime_helper: Int, Int -> Int
|
||||||
|
nth_prime_helper remaining_primes next_to_try =
|
||||||
|
if is_prime next_to_try
|
||||||
|
then
|
||||||
|
if remaining_primes < 2
|
||||||
|
then next_to_try
|
||||||
|
else nth_prime_helper (remaining_primes - 1) (next_to_try + 2)
|
||||||
|
else nth_prime_helper remaining_primes (next_to_try + 2)
|
||||||
|
|
||||||
|
is_prime: Int -> Int
|
||||||
|
is_prime x =
|
||||||
|
if x % 2 == 0
|
||||||
|
then 0
|
||||||
|
else is_prime_helper x 3
|
||||||
|
|
||||||
|
is_prime_helper: Int, Int -> Int
|
||||||
|
is_prime_helper x try =
|
||||||
|
if try * try > x
|
||||||
|
then 1
|
||||||
|
else if x % try == 0
|
||||||
|
then 0
|
||||||
|
else is_prime_helper x (try + 2)
|
||||||
|
|
|
@ -252,19 +252,25 @@ pub fn get_last_ident(exprs: &LinkedList<Expr>) -> Option<Identifier> {
|
||||||
|
|
||||||
pub fn evaluate(exprs: LinkedList<Expr>, bindings: &ValueBindings) -> evaluation::Result {
|
pub fn evaluate(exprs: LinkedList<Expr>, bindings: &ValueBindings) -> evaluation::Result {
|
||||||
let bindings = bindings.nested_scope();
|
let bindings = bindings.nested_scope();
|
||||||
let (all_bindings, last_ident) = exprs.into_iter()
|
if exprs.iter().all(|e| !e.isnt_noop()) {
|
||||||
.filter(Expr::isnt_noop)
|
bindings.lookup(&exprs.back().ok_or(EvaluateError::EvaluatingZeroLengthExpr)?.identifier)
|
||||||
.try_fold(
|
.ok_or_else(|| EvaluateError::UndefinedValue(exprs.back().unwrap().identifier.clone()))
|
||||||
(bindings, None),
|
.cloned()
|
||||||
|(bindings, _last_ident), expr| {
|
} else {
|
||||||
let last_value = expr.evaluate(&bindings)?;
|
let (all_bindings, last_ident) = exprs.into_iter()
|
||||||
Ok((bindings.bind(&expr.identifier, last_value.clone()), Some(expr.identifier)))
|
.filter(Expr::isnt_noop)
|
||||||
})?;
|
.try_fold(
|
||||||
last_ident.ok_or(EvaluateError::EvaluatingZeroLengthExpr)
|
(bindings, None),
|
||||||
.and_then(
|
|(bindings, _last_ident), expr| {
|
||||||
|ident|
|
let last_value = expr.evaluate(&bindings)?;
|
||||||
all_bindings.lookup(&ident)
|
Ok((bindings.bind(&expr.identifier, last_value.clone()), Some(expr.identifier)))
|
||||||
.cloned()
|
})?;
|
||||||
.ok_or(EvaluateError::UndefinedValue(ident))
|
last_ident.ok_or(EvaluateError::EvaluatingZeroLengthExpr)
|
||||||
)
|
.and_then(
|
||||||
|
|ident|
|
||||||
|
all_bindings.lookup(&ident)
|
||||||
|
.cloned()
|
||||||
|
.ok_or(EvaluateError::UndefinedValue(ident))
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue