examples: vfmt calculator.v
parent
1c9e02094c
commit
bb60b4227e
|
@ -1,6 +1,5 @@
|
||||||
// Q: What's this?
|
// Q: What's this?
|
||||||
// A: This is a mini "home-made" calculator. You may also regard it as a very elementary version of "interpreter".
|
// A: This is a mini "home-made" calculator. You may also regard it as a very elementary version of "interpreter".
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -23,8 +22,7 @@ fn expr_to_rev_pol(expr string) ?[]string {
|
||||||
if end_pos > pos {
|
if end_pos > pos {
|
||||||
stack << expr[pos..end_pos]
|
stack << expr[pos..end_pos]
|
||||||
pos = end_pos
|
pos = end_pos
|
||||||
}
|
} else if end_pos == pos {
|
||||||
else if end_pos==pos {
|
|
||||||
op := expr[pos].str()
|
op := expr[pos].str()
|
||||||
match op {
|
match op {
|
||||||
'(' {
|
'(' {
|
||||||
|
@ -52,7 +50,7 @@ fn expr_to_rev_pol(expr string) ?[]string {
|
||||||
stack.delete(stack.len - 1)
|
stack.delete(stack.len - 1)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return error('err: invalid character `${op}`')
|
return error('err: invalid character `$op`')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pos++
|
pos++
|
||||||
|
@ -72,17 +70,22 @@ fn eval_rev_pol(rev_pol []string) ?f64 {
|
||||||
for item in rev_pol {
|
for item in rev_pol {
|
||||||
if is_num_string(item) {
|
if is_num_string(item) {
|
||||||
stack << item.f64()
|
stack << item.f64()
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if stack.len >= 2 {
|
if stack.len >= 2 {
|
||||||
oprand_r := stack.last()
|
oprand_r := stack.last()
|
||||||
stack.delete(stack.len - 1)
|
stack.delete(stack.len - 1)
|
||||||
oprand_l := stack.last()
|
oprand_l := stack.last()
|
||||||
stack.delete(stack.len - 1)
|
stack.delete(stack.len - 1)
|
||||||
match item {
|
match item {
|
||||||
'+' { stack << oprand_l+oprand_r }
|
'+' {
|
||||||
'-' { stack << oprand_l-oprand_r }
|
stack << oprand_l + oprand_r
|
||||||
'*' { stack << oprand_l*oprand_r }
|
}
|
||||||
|
'-' {
|
||||||
|
stack << oprand_l - oprand_r
|
||||||
|
}
|
||||||
|
'*' {
|
||||||
|
stack << oprand_l * oprand_r
|
||||||
|
}
|
||||||
'/' {
|
'/' {
|
||||||
if oprand_r == 0 {
|
if oprand_r == 0 {
|
||||||
return error('err: divide by zero')
|
return error('err: divide by zero')
|
||||||
|
@ -91,8 +94,7 @@ fn eval_rev_pol(rev_pol []string) ?f64 {
|
||||||
}
|
}
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return error('err: invalid expression')
|
return error('err: invalid expression')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,10 +111,9 @@ fn is_num_string(str string) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println('Please enter the expression you want to calculate, e.g. 1e2+(3-2.5)*6/1.5 .')
|
println('Please enter the expression you want to calculate, e.g. 1e2+(3-2.5)*6/1.5 .')
|
||||||
println('Enter \'exit\' or \'EXIT\' to quit.')
|
println("Enter \'exit\' or \'EXIT\' to quit.")
|
||||||
mut expr_count := 0
|
mut expr_count := 0
|
||||||
for {
|
for {
|
||||||
expr_count++
|
expr_count++
|
||||||
|
|
Loading…
Reference in New Issue