RustãšNimã¯ãç§ããã©ããŒããŠãã2ã€ã®æ°ããããã°ã©ãã³ã°èšèªã§ãã Rustã«é¢ããæåã®æçš¿ã®çŽåŸã«ã Nim 0.10.2ããªãªãŒã¹ãããŸãã ã ããã«ãããNimãããå¯æ¥ã«ç¥ããèªç¶ã«Rustãšæ¯èŒããããã«ãªããŸããã
ãã®æçš¿ã§ã¯ãNimãšRustã§äœæããã2ã€ã®ç°¡åãªããã°ã©ã ãšãå®è¡æéã®å€§ãŸããªæ¯èŒã瀺ãããããã®èšèªã§ã®ããã°ã©ãã³ã°ã®äž»èŠ³çãªå°è±¡ãè¡šçŸããŸãã
äŸ1ïŒåèªã®ã«ãŠã³ãïŒwordcountïŒ
ãã®äŸã§ã¯ããã¡ã€ã«I / Oãæ£èŠè¡šçŸãããã·ã¥ããŒãã«ïŒé£æ³é åïŒãããã³ã³ãã³ãã«æž¡ããã解æåŒæ°ã䜿çšããŸãã ååã瀺ãããã«ãããã°ã©ã ã¯filesãŸãã¯stdinå ã®åèªã®æ°ãã«ãŠã³ãããŸãã
䜿çšäŸïŒ
Usage: wordcount [OPTIONS] [FILES] Options: -o:NAME set output file name -i --ignore-case ignore case -h --help print this help menu
-iåŒæ°ãæž¡ããšãçµæã¯æ¬¡ã®ããã«ãªããŸãã
2 case 1 file 1 files 1 h 2 help ...
NimããŒãžã§ã³
Nimã®ããã°ã©ã ã¯éåžžã«åçŽã§ãã ããŒãã«ã䜿çšããŸãã åèªã«ãŠã³ãçšã®CountTable parseopt2 ã ã³ãã³ãåŒæ°ãšsequtilsã解æããããã®getopt ã æ©èœçãªãããã³ã°æäœã®ããã®mapIt ã æ£èŠè¡šçŸã«ã€ããŠã¯ã reã§ã¯ãªãNimã®ããã¥ã¡ã³ãã§æšå¥šãããŠããpegsã¢ãžã¥ãŒã«ãéžæããŸããã
ãã£ã¬ã¯ãã£ã{.raisesïŒ[IOError]ã} 3è¡ç®ã§ã¯ã doWorkããã·ãŒãžã£ãIOErroräŸå€ã®ã¿ãã¹ããŒããããã«ããŠããŸãã ãããè¡ãã«ã¯ã input.findAllïŒpeg "\ w +"ïŒã21è¡ç®ã®tryåŒå ã«é 眮ããŠãçè«çã«çºçããå¯èœæ§ã®ããäŸå€ããã£ããããŸãã
wordcount.nimã³ãŒãã®äžéšïŒ
proc doWork(inFilenames: seq[string] = nil, outFilename: string = nil, ignoreCase: bool = false) {.raises: [IOError].} = # Open files var infiles: seq[File] = @[stdin] outfile: File = stdout if inFilenames != nil and inFilenames.len > 0: infiles = inFilenames.mapIt(File, (proc (filename: string): File = if not open(result, filename): raise newException(IOError, "Failed to open file: " & filename) )(it)) if outFilename != nil and outFilename.len > 0 and not open(outfile, outFilename, fmWrite): raise newException(IOError, "Failed to open file: " & outFilename) # Parse words var counts = initCountTable[string]() for infile in infiles: for line in infile.lines: let input = if ignoreCase: line.tolower() else: line let words = try: input.findAll(peg"\w+") except: @[] for word in words: counts.inc(word) # Write counts var words = toSeq(counts.keys) sort(words, cmp) for word in words: outfile.writeln(counts[word], '\t', word)
éããŒãžã§ã³
Rustãããããç解ããããã«ã ã³ã¬ã¯ã·ã§ã³:: BTreeMapã«äŒŒãã·ã³ãã«ãªBTreeMapæ§é ãå®è£ ããŸããããæçµçã«Nimãšã®å ¬æ£ãªæ¯èŒã®ããã«ã³ã¬ã¯ã·ã§ã³:: HashMapã䜿çšããŸããïŒã¬ãã¥ãŒã®ããã«BTreeMapã³ãŒãã¯ãªããžããªã«æ®ããŸããïŒã getoptsããã±ãŒãžã¯ãã³ãã³ãåŒæ°ã解æããŠConfigæ§é äœã«ããããã«äœ¿çšãããŸãã ããã«ããã¹ãŠãæ確ã§ãªããã°ãªããŸããã
ç§ã®éã¯ãŒãã«ãŠã³ããããžã§ã¯ãã®ã³ãŒãã®äžéšïŒ
fn do_work(cfg: &config::Config) -> io::Result<()> { // Open input and output files let mut readers = Vec::with_capacity(std::cmp::max(1, cfg.input.len())); if cfg.input.is_empty() { readers.push(BufReader::new(Box::new(io::stdin()) as Box<Read>)); } else { for name in &cfg.input { let file = try!(File::open(name)); readers.push(BufReader::new(Box::new(file) as Box<Read>)); } } let mut writer = match cfg.output { Some(ref name) => { let file = try!(File::create(name)); Box::new(BufWriter::new(file)) as Box<Write> } None => { Box::new(io::stdout()) as Box<Write> } }; // Parse words let mut map = collections::HashMap::<String, u32>::new(); let re = regex!(r"\w+"); // let re = Regex::new(r"\w+").unwrap(); // let re = regex!(r"[a-zA-Z0-9_]+"); // let re = Regex::new(r"[a-zA-Z0-9_]+").unwrap(); for reader in &mut readers { for line in reader.lines() { for caps in re.captures_iter(&line.unwrap()) { if let Some(cap) = caps.at(0) { let word = match cfg.ignore_case { true => cap.to_ascii_lowercase(), false => cap.to_string(), }; match map.entry(word) { Occupied(mut view) => { *view.get_mut() += 1; } Vacant(view) => { view.insert(1); } } } } } } // Write counts let mut words: Vec<&String> = map.keys().collect(); words.sort(); for &word in &words { if let Some(count) = map.get(word) { try!(writeln!(writer, "{}\t{}", count, word)); } } Ok(()) }
Zachary Dremannã¯ãfind_iterã䜿çšãããã«ãªã¯ãšã¹ããææ¡ããŸãã ã NimããŒãžã§ã³ãšã®äžè²«æ§ã®ããã«captures_iterãæ®ããŸããã ãã³ãŒããå°ãæ¹åããŸããã
ã©ã³ã¿ã€ã æ¯èŒ
Nimã®-dïŒãªãªãŒã¹ãã©ã°ãšRustã®--releaseã䜿çšããŠã³ãŒããã³ã³ãã€ã«ããŸããã ããšãã°ãNimã³ã³ãã€ã©ãœãŒã¹ããã³ã³ãã€ã«ããã5ã¡ã¬ãã€ãã®ãã¡ã€ã«ãåããŸããã
$ cat c_code/3_3/*.c > /tmp/input.txt $ wc /tmp/input.txt 217898 593776 5503592 /tmp/input.txt
ããã°ã©ã ãéå§ããã³ãã³ãïŒ
$ time ./wordcount -i -o:result.txt input.txt
2.3 GHz Intel Core i7ããã»ããµãš8 GBã¡ã¢ãªãæèŒããMac miniã®çµæã¯æ¬¡ã®ãšããã§ãïŒïŒ1x = 0.88ç§ïŒ
ãã³ | æ£èŠè¡šçŸïŒ \ w | æ£èŠè¡šçŸ\ w | æ£èŠè¡šçŸïŒ [...] | æ£èŠè¡šçŸ[...] | ãã |
ãªãªãŒã¹ã-i | 1å | 1.30x | 0.44x | 1.14x | 0.75x |
解æŸãã | 1.07x | 1.33x | 0.50x | 1.24x | 0.73x |
ãããã°ã-i | 12.65x | 20.14x | 8.77x | 19.42x | 3.51x |
ãããã° | 12.41x | 20.09x | 8.84x | 19.33x | 3.25x |
泚ïŒ
- Rustã®æ£èŠè¡šçŸã§ïŒ Regexãããé«éã«åäœãã r "[a-zA-Z0-9 _] +"㯠r "\ w +"ãããé«éã§ãã 4ã€ã®çµã¿åãããã¹ãŠããã¹ããããŠããŸãã
- ãããã°ããŒãžã§ã³ã¯æ¯èŒçšã§ã
- Nimã¯ããã©ã°--boundChecksïŒonã§1-2ïŒ
é
ããªããŸããããã®çµæãäŸã«è¿œå ããŸããã§ããã
äŸ2ïŒã²ãŒã ãLifeã
ãã®äŸã§ã¯ããã£ãŒã«ãã®ãµã€ãºãšãã³ãã¬ãŒããåºå®ãããã³ã³ãœãŒã«ã§Lifeãèµ·åããŸãïŒãµã€ãºãŸãã¯ãã³ãã¬ãŒããå€æŽããã«ã¯ããœãŒã¹ã³ãŒããç·šéããŸãïŒã ANSI CSIã³ãŒãã䜿çšããŠç»é¢ãåæç»ããŸãã
éå§åŸãç»é¢ã¯æ¬¡ã®ããã«ãªããŸãã
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (). (). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (). . . (). . . . . . . . . . . . . . . . . . . . . . . . . (). . . . . . . (). . . . . . . . . . . . ()(). . . . . . . . . . . . . . ()()()(). . . . (). . . . (). . . . . . . . ()(). . ()(). . . . . . . . . ()(). (). (). . . . (). . . . . . . . . . . . . . . . ()(). . . . . . . . ()()(). (). . (). . . (). . . (). . . . . . . . . . . . . . . . . . . . . . . ()(). (). (). . . . . . (). (). . . . . . . . . . . . . . . . . . . . . . . . ()()()(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (). (). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ()(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ()()(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . n = 300 Press ENTER to exit
ããã°ã©ã ã¯å¥ã®ã¹ããªãŒã ã䜿çšããŠstdinããèªã¿åãããã£ã©ã¯ã¿ãŒãåä¿¡ããããšã²ãŒã ãäžæããŸãã
NimããŒãžã§ã³
Nim conwayãããžã§ã¯ãã®ã³ãŒãã®äžéšã次ã«ç€ºããŸãã
type Cell = bool ConwayMap* = array[0.. <mapHeight, array[0.. <mapWidth, Cell]] proc init*(map: var ConwayMap, pattern: openarray[string]) = ## Initialise the map. let ix = min(mapWidth, max(@pattern.mapIt(int, it.len))) iy = min(mapHeight, pattern.len) dx = int((mapWidth - ix) / 2) dy = int((mapHeight - iy) / 2) for y in 0.. <iy: for x in 0.. <ix: if x < pattern[y].len and pattern[y][x] notin Whitespace: map[y + dy][x + dx] = true proc print*(map: ConwayMap) = ## Display the map. ansi.csi(AnsiOp.Clear) ansi.csi(AnsiOp.CursorPos, 1, 1) for row in map: for cell in row: let s = if cell: "()" else: ". " stdout.write(s) stdout.write("\n") proc next*(map: var ConwayMap) = ## Iterate to next state. let oldmap = map for i in 0.. <mapHeight: for j in 0.. <mapWidth: var nlive = 0 for i2 in max(i-1, 0)..min(i+1, mapHeight-1): for j2 in max(j-1, 0)..min(j+1, mapWidth-1): if oldmap[i2][j2] and (i2 != i or j2 != j): inc nlive if map[i][j]: map[i][j] = nlive >= 2 and nlive <= 3 else: map[i][j] = nlive == 3
éããŒãžã§ã³
Rust conwayãããžã§ã¯ãã®ã³ãŒãã®äžéšã次ã«ç€ºããŸãã
type Cell = bool; #[derive(Copy)] pub struct Conway { map: [[Cell; MAP_WIDTH]; MAP_HEIGHT], } impl Conway { pub fn new() -> Conway { Conway { map: [[false; MAP_WIDTH]; MAP_HEIGHT], } } pub fn init(&mut self, pattern: &[&str]) { let h = pattern.len(); let h0 = (MAP_HEIGHT - h) / 2; for i in 0..(h) { let row = pattern[i]; let w = row.len(); let w0 = (MAP_WIDTH - w) / 2; for (j, c) in row.chars().enumerate() { self.map[i + h0][j + w0] = c == '1'; } } } /// Iterate to next state. Return false if the state remains unchanged. pub fn next(&mut self) -> bool { let mut newmap = [[false; MAP_WIDTH]; MAP_HEIGHT]; for i in 0..(MAP_HEIGHT) { for j in 0..(MAP_WIDTH) { let mut nlive = 0; for i2 in i.saturating_sub(1)..cmp::min(i+2, MAP_HEIGHT) { for j2 in j.saturating_sub(1)..cmp::min(j+2, MAP_WIDTH) { if self.map[i2][j2] && (i2 != i || j2 != j) { nlive += 1; } } } newmap[i][j] = match (self.map[i][j], nlive) { (true, 2) | (true, 3) => true, (true, _) => false, (false, 3) => true, (false, _) => false, }; } } // let changed = self.map != newmap; let changed = true; self.map = newmap; changed } } impl fmt::Display for Conway { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { for row in self.map.iter() { for cell in row.iter() { try!(write!(f, "{}", if *cell { "()" } else { ". " })); } try!(write!(f, "\n")); } Ok(()) } }
49è¡ç®ã§ã衚瀺ã®å€æŽã远跡ããå€æ°ãå®çŸ©ããŸãããã self.mapïŒ= Newmapã®åçŽãªæ¯èŒã¯ãPartialEq traitãå®è£ ãããŸã§32èŠçŽ ããé·ãé åã§ã¯æ©èœããŸããã
main.rsã§å®å šã§ãªãlibc :: exitã䜿çšããããšã«æ³šæããŠãã ãã ãããã¯Rustã«ã¯äžè¬çã§ã¯ãããŸããã Zachary Dremannã¯ã selectãã¯ãã䜿çšããŠlibc :: exitããšã¬ã¬ã³ãã«åé¿ãããã«ãªã¯ãšã¹ããææ¡ããŸããïŒ ãã³ããããã³ã°ã¿ã€ããŒã ããªããèŠãŠã¿ãããããããŸããã
ã©ã³ã¿ã€ã æ¯èŒ
ã©ã³ã¿ã€ã ãæ¯èŒããã«ã¯ãã³ãŒãã«ããã€ãã®å€æŽãå ããå¿ èŠããããŸãã
- conway.nimã®ã¹ãªãŒãã³ãŒã«ãã³ã¡ã³ãåãã
main.rs
- ã«ãŒãã®å埩åæ°ã300ãã3000ã«å€æŽããŸã
- ãã£ãŒã«ãã®åæç»ã«ã¯å€ãã®æéããããããã2ã€ã®æž¬å®ãè¡ãããŸããïŒ1ïŒåæç»ãããšïŒ2ïŒãªãïŒã€ãŸãã conway.nimãšmain.rsã§ãã£ãŒã«ããå°å·ããããã®è¡ãã³ã¡ã³ãã¢ãŠã ïŒ
Nimã®-dïŒãªãªãŒã¹ãã©ã°ãšRustã®--releaseã§ã³ã³ãã€ã«ããå Žåã®çµæã¯æ¬¡ã®ãšããã§ãã
ãã³ | ãã | Nim / bcïŒãªã³ | n = 30000 | |
ïŒ1ïŒå°å³å°å·ãã | 1å | 1.75x | 1.87x | 1x = 3.33s |
ïŒ2ïŒå°å³å°å·ãªã | 1å | 1.15x | 1.72x | 1x = 0.78 |
ãªããªã Rustã¯ããªã¹ãã®å€ã«åºãããã«ãã§ãã¯ãè¡ããŸããæ£çŸ©ã®ããã« ã -boundChecksïŒonãã©ã°ã§ã³ã³ãã€ã«ãããNimããŒãžã§ã³ã®Nim / bcïŒonåãè¿œå ããŸããã
ãã ãŸãã¯é
NimãšRustã¯åªããããã©ãŒãã³ã¹ãæåŸ ããŠã³ã³ãã€ã«ãããèšèªã§ããããããã¯éåžžã«ç°ãªã£ãŠããŸãã ç§ã«ãšã£ãŠããããã®é¡äŒŒç¹ã¯æ¬¡ã®ãšããã§ãã
- ã³ã³ãã€ã«ããã³éçåä»ã
- è¯å¥œãªããã©ãŒãã³ã¹ãåŸãããã®èšç®ïŒåããã°ã©ã ã¯ãããã°ã©ã ã®å®è£
ãšãã®æé©åã«å¿ããŠããé«éã«åäœããŸãïŒ
- ç¶æ¿ã§ã¯ãªãæ§æïŒæ°ããèšèªã®åŸåã«äŒŒãŠããŸããïŒïŒ
- Cã®åçŽãªæ
- äžè¬çãªèšèªã®å©ç¹ïŒãžã§ããªãã¯ãã¯ããŒãžã£ãæ©èœçã¢ãããŒããåæšè«ããã¯ããã¹ããŒãã¡ã³ãæŒç®åãªã©
ãããããããã®éãã¯ããèå³æ·±ããã®ã§ãã
å²åŠïŒèªç±ãŸãã¯èŠåŸ
Nimã§ããã°ã©ãã³ã°ãããšãã¹ã¯ãªããèšèªã§æžããŠãããããªæèŠãåŸãããŸãã 圌ã¯æ¬åœã«è¡ãæ¶å»ããŸãã Nimã¯ãã³ãŒãå ã®ãã€ãºãå¯èœãªéãåãé€ãããããåãã§ããã°ã©ãã³ã°ããããšããŸãã
ãã ãããã®ãããªèªç±ã«ã¯è£è¿ãããããŸããæ確ããçŽåºŠãæç¶å¯èœæ§ãæãªãããå¯èœæ§ããããŸãã å°ããªäŸã次ã«ç€ºããŸããNimã®ã€ã³ããŒãã§ã¯ããã¹ãŠã®ã¢ãžã¥ãŒã«åãããŒã ã¹ããŒã¹ã«ã€ã³ããŒããããŸãã ã€ã³ããŒããããã¢ãžã¥ãŒã«ããã®ååã¯ãæ§æmodule.symbolã䜿çšããããååã®å¶åŸ¡ãããã€ã³ããŒãã®ããã«from module import nilã䜿çšããŠå¶éã§ããŸãããããã䜿çšããã®ã¯èª°ã§ããïŒ ããã«ããã®ã¢ãããŒãã¯Nimã«ã¯äžè¬çã§ã¯ãããŸããã ãã®çµæãä»ã®èª°ãã®ã³ãŒãïŒãŸãã¯èªåã®ã³ãŒãïŒãèªã¿åããšãã«ãã©ã®ã¢ãžã¥ãŒã«ããã©ã®ååãä»ããããã®ããç解ã§ããŸããïŒæ®å¿µãªããããã®ãããªå ŽåãNimã¯ããšãã«ãã¬ãããåé¢ãããããååã®ç«¶åã¯çºçããŸããïŒã
ãã®ä»ã®äŸïŒ UFCSã§ã¯ã len ïŒxïŒ ã len x ã x.lenïŒïŒãŸãã¯x.lenãå¿ èŠã«å¿ããŠäœ¿çšã§ããŸãã ååãã¢ã³ããŒã¹ã³ã¢ãšç°ãªã倧æåã§åºåããªãã®ã§ã mapWidth ã mapwidthããã³map_widthã¯åãååã«å€æãããŸãïŒããŒãžã§ã³0.10.2ã«ãéšåçãªå€§æåãšå°æåã®åºå¥ãã®ã«ãŒã«ãå«ãŸããŠããŠã Fooãšfooã¯ç°ãªãååãšèŠãªãããŸãïŒ ; ç©äºã®é åºã§åæåãããŠããªãå€æ°ã®äœ¿çšã§ãã çè«çã«ã¯ãå³å¯ãªã³ãŒãã£ã³ã°ååã«åŸãããšãã§ããŸãããNimã§ããã°ã©ãã³ã°ãããšãã¯ããããªã©ãã¯ã¹ããæ°åã«ãªããŸãã
äžæ¹ãéã¯èŠåŸãå°éããŸãã ãã®ã³ã³ãã€ã©ã¯éåžžã«å³æ Œã§ãã ãã¹ãŠãéåžžã«æ確ã§ãªããã°ãªããŸããã äºåã«é©åãªã¢ãããŒããååŸããŸãã ãããŸããã¯Rustã³ãŒãã«é¢ãããã®ã§ã¯ãããŸãã...
ãã®ã¢ãããŒãã¯ãååãšããŠãé·åœã®ãããžã§ã¯ããšæç¶å¯èœæ§ã«é©ããŠããŸãããRustã§ããã°ã©ãã³ã°ãè¡ãå Žåã¯ããŸã£ããé¢å¿ã®ãªããããªè©³çŽ°ã®åŠçãéå§ããŸãã ã¿ã¹ã¯ã®åªå äºé ã§ã¯ãªãå Žåã§ããã¡ã¢ãªã®äœ¿çšãããã©ãŒãã³ã¹ã®åäžã«ã€ããŠèããããã«ãªããŸãã Rustã«ãããèŠåŸãåäžããŸãã
ã©ã¡ãã«ãé·æãšçæããããŸãã ããã°ã©ããŒãšããŠãç§ã¯Nimããã£ãšæ¥œããã§ããŸãã ã¡ã³ãããŒãšããŠãRustã§æžããã補åã®æ¹ãè¯ãã§ãããã
ããžã¥ã¢ã«ã¹ã¿ã€ã«ïŒPythonãŸãã¯C ++
Pythonãšåæ§ã«ãNimã¯ã€ã³ãã³ãã䜿çšããŠã³ãŒããããã¯ãåé¢ãã æåæ°ãæžãããŠããŸã ã Rustã¯C ++ã«äŒŒãŠããŸãã {} ã :: ã <> ãããã³ïŒã¯ãC ++ããã°ã©ããŒã«ã¯ããªãã¿ã§ããããã«ãRustã¯'aã®ãããªæ°ãããã®ãè¿œå ããŸãã
æã ããã ã¯æåéãããããããããŸããã ããšãã°ãRustã®äžèŽæ§æãèããŸãã
match key.cmp(&node.key) { Less => return insert(&mut node.left, key, value), Greater => return insert(&mut node.right, key, value), Equal => node.value = value, }
Nimã®caseåŒããããããã«èŠããŸãã
case key of "help", "h": echo usageString of "ignore-case", "i": ignoreCase = true of "o": outFilename = val else: discard
ããããå šäœçã«ãNimã³ãŒãã¯ãã€ãºãå°ãªãã§ãã ç§ã®æèŠã§ã¯ãRustã®ç¹å¥ãªæ··ä¹±ã¯åç¶æéãã©ã¡ãŒã¿ãŒã«ãã£ãŠå°å ¥ãããããã¯å€æŽãããŸããã
ã¡ã¢ãªç®¡çïŒã¬ããŒãžã³ã¬ã¯ã¿ãŒãŸãã¯æå管ç
Nimã¯å®å šã§ãªãã¡ã¢ãªç®¡çãå¯èœã«ããããäºæž¬å¯èœãªåäœã®ããã«ã©ã³ã¿ã€ã ã§ã¬ããŒãžã³ã¬ã¯ã¿ã管çããããã®ãµããŒããæäŸããŸããã ããã¯ãŸã ã¬ããŒãžã³ã¬ã¯ã¿ãŒãåããèšèªã§ãããããã«é·æãšçæããããŸãã Nimã®ãªããžã§ã¯ãã«ã¯ãå€ã®ã³ããŒãå²ãåœãŠãããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒãã¿ã¹ã¯ã«å¹²æžããªãå ŽåãNimã§ã¡ã¢ãªã管çããŠãåé¡ã¯çºçããŸããã
Rustã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®éå®çãªãµããŒããæäŸããŸãããå€ãã®å Žåãã¡ã¢ãªç®¡çã§ã¯ããã¥ã¢ã·ã¹ãã ã«äŸåããŠããŸãã Rustããã°ã©ããŒãšããŠãåå¿è ã«ãšã£ãŠæåã®éå£ãšãªãããã°ã©ã ãå¹ççã«äœæããåã«ã圌ã®ã¡ã¢ãªç®¡çã¢ãã«ïŒæææš©ãåçšã寿åœïŒãå®å šã«ç解ããå¿ èŠããããŸãã
äžæ¹ãRustã®åŒ·ã¿ã¯ããã«ãããŸããã¬ããŒãžã³ã¬ã¯ã¿ãŒã䜿çšããªãå®å šãªã¡ã¢ãªç®¡çã§ãã Rustã¯ããã«ã€ããŠçŽ æŽãããä»äºãããŸãã å ±æãªãœãŒã¹ã®ã»ãã¥ãªãã£ã競åããããŒã¿ã¢ã¯ã»ã¹ã®ã»ãã¥ãªãã£ãããã³NULLãã€ã³ã¿ãŒã®åé€ã«å ããŠãRustã¯å®è¡æã®ãªãœãŒã¹æ¶è²»ã®ãªãŒããŒãããã®ãªãéåžžã«ä¿¡é Œæ§ã®é«ãããã°ã©ãã³ã°èšèªã§ãã
èŠä»¶ã«å¿ããŠãNimã¬ããŒãžã³ã¬ã¯ã¿ãŒã§ååã§ããããéžæãRustã«ãªããŸãã
ãã®ä»ã®éã
ãã ã®åŒ·ã¿ïŒ
- çç£æ§ïŒåãæéæ ã§ãNimã§ããå€ãã®æ©èœãå©çšã§ããŸã
- ç¿åŸãç°¡å
- ã¹ã¯ãªããèšèªãšããŠã³ã³ãã€ã«ãããèšèªã¯ãã¿ã€ãã³ã°ãã€ã³ã¿ã©ã¯ãã£ããªèª¿æ»ããããåŠçãªã©ã«é©ããŠããŸãã
- ãããïŒ
- ã¡ãœããã®ãªãŒããŒã©ã€ã
- æ°ããæŒç®åã®å®çŸ©
- ååä»ãåŒæ°ãšããã©ã«ãå€
- 匷åãªãã¯ã
ãã³ã®åŒ·ãïŒ
- å®éã®ã·ã¹ãã ããã°ã©ãã³ã°èšèªïŒçµã¿èŸŒã¿ãã¬ããŒãžã³ã¬ã¯ã¿ãŒãªãã ããŒããŠã§ã¢ã«è¿ã
- å®å šãèŠåŸãä¿¡é Œæ§
- 匷åãªã«ãŒãã«ããŒã ãšæŽ»çºãªã³ãã¥ããã£
- ãããïŒ
- åªãããã¿ãŒã³ãããã³ã°ã®å®è£
- enums ããã ãNimã§ã¯enumãè¯ã
- varã®ä»£ããã«mutãããŸããã ïŒå°ãããéèŠãªããšïŒ
- æ§æãéåç §ãã匷åãªæ§é
ãšã©ãŒåŠçïŒNimã¯äžè¬çãªäŸå€ã¡ã«ããºã ã䜿çšããRustã¯æ»ãå€åResult ïŒããã³ãããã¯ãã¯ãïŒ ïŒã䜿çšããŸãã ç§ã¯ããã奜ã¿ãŸãããããã®éãã«èšåããããšãéèŠã§ããããšãããããŸããã
éäžãªãªãŒã¹1.0
NimãšRustã¯ä»å¹ŽãªãªãŒã¹ãããäºå®ã§ãïŒRustã¯ãªãªãŒã¹ãããŸãã ïŒ ã ããã¯ãšãŠãã¯ãŒã«ã§ãïŒ Rustã¯ãã§ã«å€ãã®æ³šç®ãéããŠããŸããããã ã¯ããæåã«ãªã£ãŠããŸãã å³ã¯ãŸã£ããç°ãªããŸãããã©ã¡ããçŽ æŽãããæ°ããããã°ã©ãã³ã°èšèªã§ãã Rustã¯ããã©ãŒãã³ã¹ãšã»ãã¥ãªãã£ã®ç¹ã§æåãå°œãããŸãã Nimã¯ã¢ãžã£ã€ã«ïŒãããïŒNimã¯æ©æã§ãïŒã§è¡šçŸåè±ãã§ãã¹ã¯ãªããèšèªãšã³ã³ãã€ã«èšèªã®é·æãå®çŸããŠããŸãã ã©ã¡ããããŒã«ãããã«è¿œå ããã®ã«æé©ã§ãã
ãã®èšäºãèªãã åŸããããã®ããã°ã©ãã³ã°èšèªã«ã€ããŠæ±ºããããšãé¡ã£ãŠããŸãã