Implement primitive procedure application
This commit is contained in:
58
src/primitives.rs
Normal file
58
src/primitives.rs
Normal file
@@ -0,0 +1,58 @@
|
||||
use crate::parser::Datum;
|
||||
use crate::parser::Datum::*;
|
||||
use std::mem;
|
||||
|
||||
pub fn add(mut args: Vec<Datum>) -> Datum {
|
||||
let mut r = 0;
|
||||
for i in 1..args.len() {
|
||||
let datum = mem::take(&mut args[i]);
|
||||
if let Number(n) = datum {
|
||||
r += n;
|
||||
} else {
|
||||
panic!("ADD -- not-all-args-are-numbers {:?}", args)
|
||||
}
|
||||
}
|
||||
Number(r)
|
||||
}
|
||||
|
||||
pub fn mul(mut args: Vec<Datum>) -> Datum {
|
||||
let mut r = 1;
|
||||
for i in 1..args.len() {
|
||||
let datum = mem::take(&mut args[i]);
|
||||
if let Number(n) = datum {
|
||||
r *= n;
|
||||
} else {
|
||||
panic!("MUL -- not-all-args-are-numbers {:?}", args)
|
||||
}
|
||||
}
|
||||
Number(r)
|
||||
}
|
||||
|
||||
pub fn sub(mut args: Vec<Datum>) -> Datum {
|
||||
if args.len() == 2 {
|
||||
let datum = mem::take(&mut args[1]);
|
||||
if let Number(n) = datum {
|
||||
return Number(-n);
|
||||
} else {
|
||||
panic!("SUB -- not-all-args-are-numbers {:?}", args)
|
||||
}
|
||||
}
|
||||
|
||||
let mut r;
|
||||
let datum = mem::take(&mut args[1]);
|
||||
if let Number(n) = datum {
|
||||
r = n;
|
||||
} else {
|
||||
panic!("SUB -- not-all-args-are-numbers {:?}", args)
|
||||
}
|
||||
|
||||
for i in 2..args.len() {
|
||||
let datum = mem::take(&mut args[i]);
|
||||
if let Number(n) = datum {
|
||||
r -= n;
|
||||
} else {
|
||||
panic!("SUB -- not-all-args-are-numbers {:?}", args)
|
||||
}
|
||||
}
|
||||
Number(r)
|
||||
}
|
||||
Reference in New Issue
Block a user