mirror of
https://github.com/eternal-flame-AD/unitdc-rs.git
synced 2025-03-09 08:19:13 -05:00
U operator
This commit is contained in:
parent
979951b940
commit
9a1247ec3d
6 changed files with 41 additions and 1 deletions
|
@ -179,7 +179,7 @@ function App() {
|
||||||
)
|
)
|
||||||
case 'message':
|
case 'message':
|
||||||
return (
|
return (
|
||||||
<div key={index}>Message: {cell.text}</div>
|
<pre key={index}>{cell.text}</pre>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -127,6 +127,7 @@ export function Keyboard(props: KeyboardProps) {
|
||||||
</div>
|
</div>
|
||||||
<div className="keyboard-col">
|
<div className="keyboard-col">
|
||||||
<UiActionButton action="clear" text="CLR" />
|
<UiActionButton action="clear" text="CLR" />
|
||||||
|
<TokenButton token="U" tokentype="operator" />
|
||||||
{
|
{
|
||||||
["m", "mol", "M", "Da"].map((token) => {
|
["m", "mol", "M", "Da"].map((token) => {
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -86,6 +86,7 @@ impl<'a> Interpreter<'a> {
|
||||||
Token::Operator('d') => self.op_d()?,
|
Token::Operator('d') => self.op_d()?,
|
||||||
Token::Operator('r') => self.op_r()?,
|
Token::Operator('r') => self.op_r()?,
|
||||||
Token::Operator('s') => self.op_s()?,
|
Token::Operator('s') => self.op_s()?,
|
||||||
|
Token::Operator('U') => self.op_upper_u()?,
|
||||||
Token::VarRecall(name) => self.op_recall(&name)?,
|
Token::VarRecall(name) => self.op_recall(&name)?,
|
||||||
Token::VarStore(name) => self.op_store(&name)?,
|
Token::VarStore(name) => self.op_store(&name)?,
|
||||||
Token::MacroInvoke((name, args)) => match name.as_str() {
|
Token::MacroInvoke((name, args)) => match name.as_str() {
|
||||||
|
|
|
@ -144,6 +144,27 @@ impl<'a> Interpreter<'a> {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
pub fn op_upper_u(&mut self) -> InterpreterResult<()> {
|
||||||
|
let mut output = String::from("Base units:\n");
|
||||||
|
|
||||||
|
for u in &self.unit_system.base_units() {
|
||||||
|
output.push_str(&format!("{}, ", u.symbol));
|
||||||
|
}
|
||||||
|
output.pop();
|
||||||
|
output.pop();
|
||||||
|
output.push_str("\n\nDerived units:\n");
|
||||||
|
|
||||||
|
for u in &self.unit_system.derived_units() {
|
||||||
|
output.push_str(&format!(
|
||||||
|
"{} = {} ({}) + {}\n",
|
||||||
|
u.symbol, u.scale, u.exponents, u.offset
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
(self.output)(Output::Message(output));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
pub fn op_s(&mut self) -> InterpreterResult<()> {
|
pub fn op_s(&mut self) -> InterpreterResult<()> {
|
||||||
let target = self.stack.pop().ok_or(InterpreterError::StackUnderflow)?;
|
let target = self.stack.pop().ok_or(InterpreterError::StackUnderflow)?;
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,22 @@ impl UnitSystem {
|
||||||
pub fn push_derived_unit(&mut self, unit: DerivedUnit) {
|
pub fn push_derived_unit(&mut self, unit: DerivedUnit) {
|
||||||
self.derived_units.insert(unit.symbol.clone(), unit);
|
self.derived_units.insert(unit.symbol.clone(), unit);
|
||||||
}
|
}
|
||||||
|
pub fn base_units(&self) -> Vec<BaseUnit> {
|
||||||
|
let mut base_units = Vec::new();
|
||||||
|
for unit in self.base_units.values() {
|
||||||
|
base_units.push(unit.clone());
|
||||||
|
}
|
||||||
|
base_units.sort_by(|a, b| a.symbol.cmp(&b.symbol));
|
||||||
|
base_units
|
||||||
|
}
|
||||||
|
pub fn derived_units(&self) -> Vec<DerivedUnit> {
|
||||||
|
let mut derived_units = Vec::new();
|
||||||
|
for unit in self.derived_units.values() {
|
||||||
|
derived_units.push(unit.clone());
|
||||||
|
}
|
||||||
|
derived_units.sort_by(|a, b| format!("{}", a.exponents).cmp(&format!("{}", b.exponents)));
|
||||||
|
derived_units
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
|
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
|
||||||
|
|
|
@ -152,6 +152,7 @@ impl<R: std::io::Read> Tokenizer<R> {
|
||||||
Some('d') => Ok(Some(Token::Operator('d'))),
|
Some('d') => Ok(Some(Token::Operator('d'))),
|
||||||
Some('r') => Ok(Some(Token::Operator('r'))),
|
Some('r') => Ok(Some(Token::Operator('r'))),
|
||||||
Some('s') => Ok(Some(Token::Operator('s'))),
|
Some('s') => Ok(Some(Token::Operator('s'))),
|
||||||
|
Some('U') => Ok(Some(Token::Operator('U'))),
|
||||||
Some('#') => {
|
Some('#') => {
|
||||||
while let Some(c) = self.next_char().map_err(TokenizerError::IOError)? {
|
while let Some(c) = self.next_char().map_err(TokenizerError::IOError)? {
|
||||||
match c {
|
match c {
|
||||||
|
|
Loading…
Add table
Reference in a new issue