Rustã¯å®è¡å¹çãå®å šæ§ãéèŠãã人æ°ã®ããã°ã©ãã³ã°èšèªã§ãããé£ãããšèšãããããšããããŸããæ¬é£èŒã§ã¯ãããããªæåã¢ã«ãŽãªãºã ãè§£ãããšã§Rustã«æ £ããŠãããŸããä»åã¯ãRPNé»åãå®è£ ããŠã¿ãŸãããããŸããšã©ãŒåŠçã«ã€ããŠã玹ä»ããŸãã
RPNé»åãšã¯
RPNé»åãšã¯ãéããŒã©ã³ãèšæ³ãå©çšããŠèšè¿°ããèšç®åŒãèšç®ããé»åã®ããšã§ããéããŒã©ã³ãèšæ³(ãããã¯ãåŸçœ®èšæ³)ãšã¯ãæ°åãªã©è¢«æŒç®åã®åŸã§æŒç®åãèšè¿°ããèšè¿°æ¹æ³ã§ãã
äŸãã°ãã8 + 9ããšããèšç®åŒãéããŒã©ã³ãèšæ³ã§èšè¿°ãããšã8 9 +ããšãªããŸãããã®ãããªæžãæ¹ã¯ãèªã¿ã¥ããæãããããããŸããããæ¥æ¬èªã§èšç®ãèšã衚ããšããç¡æèã«ãã®èšæ³ã䜿ã£ãŠããŸããæ°åã®åŸã«å©è©ãè¶³ããŠèŠããšãã8ã«9ã+(è¶³ã)ããšãªããŸãã
éããŒã©ã³ãèšæ³ã𿥿¬èªã®çžæ§ã®è¯ãã¯æçŸ€ã§ãã(2 à 3 + 4)÷2ãã®ãããªé·ãèšç®åŒã衚çŸããå Žåããã2ã«3ãÃ(æããŠ)4ã+(è¶³ããŠ)2ã§Ã·(å²ã)ãã®ããã«ãèªç¶ãªæ¥æ¬èªã§è¡šçŸã§ããŸãã
éããŒã©ã³ãèšæ³ã¯ã¹ã¿ãã¯ã䜿ããšç°¡åã«èšç®ã§ãã
éããŒã©ã³ãèšæ³ã¯ã³ã³ãã¥ãŒã¿ãŒãšçžæ§ãè¯ããã¹ã¿ãã¯æ§é ã䜿ãããšã§ç°¡åã«èšç®ã§ããŸããæ¬¡ã®ãããªæé ã§èšç®ã§ããŸãã
(1) æååã空çœã§ããŒã¯ã³ã«åºåã
(2) ããŒã¯ã³ã1ã€èªã
(3) æ°å€ãªããã¹ã¿ãã¯ã«ç©ã
(4) æŒç®åãªããã¹ã¿ãã¯ãã2ã€å€ãåãåºããŠèšç®ããŠã¹ã¿ãã¯ã«ç©ã
(5) ããŒã¯ã³ã空ã§ãªããã°(2)ã«æ»ã
(6) ã¹ã¿ãã¯ã«æ®ã£ãŠããå€ãçããšãªã
äŸãã°ãéããŒã©ã³ãèšæ³ã2 3 * 4 + 2 /ãã®èšç®ã®æ§åãå³ã§ç¢ºèªããŠã¿ãŸããããç¹ã«ã¹ã¿ãã¯ã®æ§åã«æ³šç®ããŠã¿ãŠãã ãããæ¬¡ã®ããã«ãªããŸãã
æ°å€ãªãã°ãã®ãŸãŸã¹ã¿ãã¯ãžå ¥ããŠãæŒç®åãªãã¹ã¿ãã¯ããåãåºããŠèšç®ããŠçµæãã¹ã¿ãã¯ã«å ¥ãããšããåçŽãªä»çµã¿ã§ããããšãåããã§ãããã
RPNé»åã®ããã°ã©ã
ããã§ã¯ãäžèšã®æé ãå ã«ããŠããã°ã©ã ãäœæããŠã¿ãŸãããã以äžã®ããã°ã©ã ããrpn.rsããšãããã¡ã€ã«åã§ä¿åããŸãã
// éããŒã©ã³ãèšæ³ãèšç®ãã颿° --- (*1)
fn calc_rpn(text: &str) -> f64 {
// èšç®çšã®ã¹ã¿ãã¯ãåæå --- (*2)
let mut stack: Vec<f64> = vec![];
// éããŒã©ã³ãèšæ³ã®åŒãã¹ããŒã¹ã§åºåã --- (*3)
let tokens = text.split(' ');
// ã¹ããŒã¹ã§åºåãããããŒã¯ã³ãäžã€ãã€åŠç --- (*4)
for tok in tokens {
// 空ãªãã°ç¡èŠãã
let tok = tok.trim();
if tok.len() == 0 { continue; }
// æ°å€å€æã詊ã¿ã --- (*5)
match tok.parse::<f64>() {
// 倿æåãªãã¹ã¿ãã¯ã«è¿œå --- (*6)
Ok(num) => {
stack.push(num);
continue;
},
// 倱æãªãæŒç®å
Err(_) => {}
};
// æŒç®åãªãã¹ã¿ãã¯ãã2ã€å€ãåŸã --- (*7)
let b = stack.pop().unwrap_or(0.0);
let a = stack.pop().unwrap_or(0.0);
// èšç®çµæãã¹ã¿ãã¯ã«è¿œå --- (*8)
match tok {
"+" => stack.push(a + b),
"-" => stack.push(a - b),
"*" => stack.push(a * b),
"/" => stack.push(a / b),
"%" => stack.push(a % b),
_ => { println!("[ERROR] {}", tok); }
}
}
// æåŸã«ã¹ã¿ãã¯ã«æ®ã£ãŠããå€ãèšç®çµæ --- (*9)
return stack.pop().unwrap_or(0.0);
}
fn main() {
// ç°¡åãªåé¡ãè§£ã --- (*10)
let expr = "8 9 +";
println!("{} = {}", expr, calc_rpn(expr));
// è€éãªåé¡ãè§£ã1
let expr = "2 3 * 4 + 2 /";
println!("{} = {}", expr, calc_rpn(expr));
// è€éãªåé¡ãè§£ã2
let expr = "6 4 + 2 / 3 +";
println!("{} = {}", expr, calc_rpn(expr));
}
ããã°ã©ã ãå®è¡ããŠã¿ãŸããããWindowsãªãPowerShellãmacOSãªãã¿ãŒããã«.appãèµ·åããŠã³ãã³ããå®è¡ããŸãã(Windowsã®å Žåã/ãããï¿¥ãã«èªã¿æ¿ããŠãã ããã)
# ã³ã³ãã€ã«
$ rustc ./rpn.rs
# å®è¡
$ ./rpn
ãããšæ¬¡ã®ããã«å®è¡çµæã衚瀺ãããŸããã8 9 +ããšã2 3 * 4 + 2 /ããšã6 4 + 2 / 3 +ãã®å®è¡çµæãæ£ç¢ºã«è¡šç€ºãããŸããã
ããã°ã©ã ã確èªããŠã¿ãŸãããã
(ïŒ1)ã§ã¯éããŒã©ã³ãèšæ³ãèšç®ãã颿°calc_rpnãå®çŸ©ããŸããæåååç §(&str)ãåãåãã64ãããæµ®åå°æ°ç¹(f64)åã®å€ãè¿ã颿°ã§ãã
(ïŒ2)ã§ã¯èšç®ã«äœ¿ãã¹ã¿ãã¯ãåæåããŸããã¹ã¿ãã¯ã¯èšç®ãããããã64ãããæµ®åå°æ°ç¹ã®ãã¯ã¿åãšããŸãããã¯ã¿ãšã¯åçã«è€æ°ã®å€ã远å ã»åé€ã§ããããŒã¿åã§ãã
(ïŒ3)ã§ã¯åŒæ°ãšããŠäžããããéããŒã©ã³ãèšæ³ã®ããã¹ããã¹ããŒã¹ã§åºåããŸãããããŠã(ïŒ4)以éã§ã¯åºåã£ã1ã€ãã€ã®å€(ããŒã¯ã³ãšåŒã³ãŸã)ãforæã§1ã€ãã€åŠçããŸãã
(ïŒ5)ã§ã¯å šãŠã®ããŒã¯ã³ãæ°å€ã«å€æããããšè©Šã¿ãŸããmatchã䜿ããšãparseã¡ãœãããæåããæ(Ok)ãšå€±æããæ(Err)ãåå²ãããããšãã§ããŸããæåããæã«ã¯ã(ïŒ6)ã§ã¹ã¿ãã¯ã«æ°å€ã远å ããŸãã
(ïŒ7)以éã¯æ°å€ä»¥å€ã®æã®åŠçãèšè¿°ããŸããããã§ã¯æ°å€ä»¥å€ã§ã¯æŒç®åãããªãã®ã§ãæŒç®åã®æã¯ãã¹ã¿ãã¯ãã2ã€å€ãååŸããŸãã
(ïŒ8)ã§ã¯matchãå©çšããŠæŒç®åã®çš®é¡ã«åãããŠèšç®ãè¡ããŸãããããŠãçµæãã¹ã¿ãã¯ã«è¿œå ããŸãããã®ããã«ãmatchã¯å¹ åºããã¿ãŒã³ãããã³ã°ã«å¯Ÿå¿ããŸãã
ããŒã¯ã³ãå šãŠèªã¿çµãã£ãåŸã(ïŒ9)ã§ã¯ã¹ã¿ãã¯ãã1ã€å€ãåãåºããŠãããã颿°ã®æ»ãå€ãšããŸãã
æåŸã®(ïŒ10)ã§ã¯ãmain颿°ã®äžã§ã3åã颿°calc_rpnãåŒã³åºããŠçµæã衚瀺ããŸãã
Rustã®ãšã©ãŒåŠçã«ã€ããŠ
Rustã§ã¯å®å
šã«åŠçãè¡ãããã«ã倱æããå¯èœæ§ãããã¡ãœããã«ã¯ãResult
fn main() {
let s = "3.1415";
let f = match s.parse::<f64>() {
Ok(num) => num,
Err(_) => 0.0
};
println!("{}", f);
}
ãã ããã¡ãã£ãšããããšã§æ¯åmatchã䜿ãã®ã¯é¢åã§ããããããã§ãmatchã䜿ããªããŠãæåããæã倱æããæã®å€ãæè»œã«æå®ã§ããæ¹æ³ãçšæãããŠããŸããããããunwrapãunwrap_orã¡ãœããã§ããäžèšã®matchã䜿ã£ãããã°ã©ã ãunwrap_orã§æžãçŽããšä»¥äžã®ããã«ãªããŸãã
fn main() {
let s = "3.1415";
let f = s.parse::<f64>().unwrap_or(0.0);
println!("{}", f);
}
matchã䜿ã£ããã®ãšæ¯ã¹ããšãããªãçããªããŸãããRustã§ã¯unwrapãunwrap_orãããåºãŠããŸããããããèŠãããšã©ãŒåŠçãçãæžããŠãããšããã®ãåãããŸãã
ãŸãšã
以äžãä»åã¯RPNé»åã®äœæã«ææŠããŠã¿ãŸãããPythonãªã©ä»ã®ããã°ã©ãã³ã°èšèªãšæ¯ã¹ããšãmatchãå©çšãããšã©ãŒåŠçãå°ãç¬ç¹ã«èŠããŸãããããããã®ä»ã®éšåã¯ããã»ã©éããããããã§ã¯ãããŸãããããæããšãä»åã®ããã°ã©ã ã«é¢ããŠã¯ãRustã®ãšã©ãŒåŠçã«ç²ŸéããŠããŸãã°ãèŠãªã䜿ãããªããããã«ãªãã®ãããããŸããã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠãããçŽè¿ã§ã¯ããã·ãŽããã¯ãã©ã PythonèªååŠçã®æç§æž(ãã€ããåºç)ããããã«äœ¿ãã!æ¥åã§å®è·µã§ãã! Pythonã«ããAIã»æ©æ¢°åŠç¿ã»æ·±å±€åŠç¿ã¢ããªã®ã€ããæ¹ TensorFlow2察å¿(ãœã·ã )ãããã³ã¬ã§ãã£ããåŠã¶Python(ãã€ããåºç)ããªã©ã


