[INFO] updating cached repository kenpratt/rusty_scheme [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/kenpratt/rusty_scheme [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/kenpratt/rusty_scheme" "work/ex/clippy-test-run/sources/stable/gh/kenpratt/rusty_scheme"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/kenpratt/rusty_scheme'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/kenpratt/rusty_scheme" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/kenpratt/rusty_scheme"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/kenpratt/rusty_scheme'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] 2020c424a065882e064cfee97341219e0da605fd [INFO] sha for GitHub repo kenpratt/rusty_scheme: 2020c424a065882e064cfee97341219e0da605fd [INFO] validating manifest of kenpratt/rusty_scheme on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of kenpratt/rusty_scheme on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing kenpratt/rusty_scheme [INFO] finished frobbing kenpratt/rusty_scheme [INFO] frobbed toml for kenpratt/rusty_scheme written to work/ex/clippy-test-run/sources/stable/gh/kenpratt/rusty_scheme/Cargo.toml [INFO] started frobbing kenpratt/rusty_scheme [INFO] finished frobbing kenpratt/rusty_scheme [INFO] frobbed toml for kenpratt/rusty_scheme written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/kenpratt/rusty_scheme/Cargo.toml [INFO] crate kenpratt/rusty_scheme has a lockfile. skipping [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting kenpratt/rusty_scheme against stable+rustflags=-Dclippy::into_iter_on_array for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-6/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/kenpratt/rusty_scheme:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid -Dclippy::into_iter_on_array" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] 2232fadf6e2fa58186b748fe1e6acb8cf85b2e69ed453e3499a416b9d30e86bd [INFO] running `"docker" "start" "-a" "2232fadf6e2fa58186b748fe1e6acb8cf85b2e69ed453e3499a416b9d30e86bd"` [INFO] [stderr] Checking libc v0.1.6 [INFO] [stderr] Checking log v0.3.1 [INFO] [stderr] Checking getopts v0.2.11 [INFO] [stderr] Checking rusty_scheme v0.0.2 (/opt/crater/workdir) [INFO] [stderr] warning: 5th binding whose name is just one char [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:664:42 [INFO] [stderr] | [INFO] [stderr] 664 | Some(v) => v, [INFO] [stderr] | ^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::many_single_char_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#many_single_char_names [INFO] [stderr] [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:955:13 [INFO] [stderr] | [INFO] [stderr] 955 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::println_empty_string)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:836:5 [INFO] [stderr] | [INFO] [stderr] 836 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] warning: 5th binding whose name is just one char [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:664:42 [INFO] [stderr] | [INFO] [stderr] 664 | Some(v) => v, [INFO] [stderr] | ^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::many_single_char_names)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#many_single_char_names [INFO] [stderr] [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:955:13 [INFO] [stderr] | [INFO] [stderr] 955 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::println_empty_string)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] warning: using `println!("")` [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:836:5 [INFO] [stderr] | [INFO] [stderr] 836 | println!(""); [INFO] [stderr] | ^^^^^^^^^^^^ help: replace it with: `println!()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#println_empty_string [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/interpreter/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | pub mod interpreter; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::module_inception)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:714:13 [INFO] [stderr] | [INFO] [stderr] 714 | return Ok(Value::List(new_elements)) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(Value::List(new_elements))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:738:5 [INFO] [stderr] | [INFO] [stderr] 738 | return Ok(Value::List(first_vec)) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(Value::List(first_vec))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: module has the same name as its containing module [INFO] [stderr] --> src/interpreter/mod.rs:1:1 [INFO] [stderr] | [INFO] [stderr] 1 | pub mod interpreter; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::module_inception)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#module_inception [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:714:13 [INFO] [stderr] | [INFO] [stderr] 714 | return Ok(Value::List(new_elements)) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(Value::List(new_elements))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:738:5 [INFO] [stderr] | [INFO] [stderr] 738 | return Ok(Value::List(first_vec)) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Ok(Value::List(first_vec))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/reader/lexer.rs:83:9 [INFO] [stderr] | [INFO] [stderr] 83 | / loop { [INFO] [stderr] 84 | | match self.current() { [INFO] [stderr] 85 | | Some(c) => { [INFO] [stderr] 86 | | match c { [INFO] [stderr] ... | [INFO] [stderr] 170 | | } [INFO] [stderr] 171 | | }; [INFO] [stderr] | |_________^ help: try: `while let Some(c) = self.current() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: Negation by multiplying with -1 [INFO] [stderr] --> src/reader/lexer.rs:132:83 [INFO] [stderr] | [INFO] [stderr] 132 | self.tokens.push(Token::Integer(if c == '-' { -1 * val } else { val })); [INFO] [stderr] | ^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::neg_multiply)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#neg_multiply [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/reader/lexer.rs:177:9 [INFO] [stderr] | [INFO] [stderr] 177 | / loop { [INFO] [stderr] 178 | | match self.current() { [INFO] [stderr] 179 | | Some(c) => { [INFO] [stderr] 180 | | match c { [INFO] [stderr] ... | [INFO] [stderr] 189 | | } [INFO] [stderr] 190 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(c) = self.current() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/reader/lexer.rs:218:9 [INFO] [stderr] | [INFO] [stderr] 218 | / loop { [INFO] [stderr] 219 | | match self.current() { [INFO] [stderr] 220 | | Some(c) => { [INFO] [stderr] 221 | | match c { [INFO] [stderr] ... | [INFO] [stderr] 235 | | } [INFO] [stderr] 236 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(c) = self.current() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/reader/lexer.rs:266:9 [INFO] [stderr] | [INFO] [stderr] 266 | / match self.current() { [INFO] [stderr] 267 | | Some(c) => { [INFO] [stderr] 268 | | match c { [INFO] [stderr] 269 | | _ if c.is_whitespace() => (), [INFO] [stderr] ... | [INFO] [stderr] 277 | | None => () [INFO] [stderr] 278 | | }; [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 266 | if let Some(c) = self.current() { [INFO] [stderr] 267 | match c { [INFO] [stderr] 268 | _ if c.is_whitespace() => (), [INFO] [stderr] 269 | ')' => { [INFO] [stderr] 270 | self.tokens.push(Token::CloseParen); [INFO] [stderr] 271 | self.advance(); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/reader/parser.rs:6:22 [INFO] [stderr] | [INFO] [stderr] 6 | pub fn parse(tokens: &Vec) -> Result, ParseError> { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/reader/parser.rs:45:22 [INFO] [stderr] | [INFO] [stderr] 45 | fn parse(tokens: &Vec) -> Result, ParseError> { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/reader/parser.rs:110:47 [INFO] [stderr] | [INFO] [stderr] 110 | Ok(Some(Node::Integer(val.clone()))) [INFO] [stderr] | ^^^^^^^^^^^ help: try dereferencing it: `*val` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/reader/parser.rs:113:47 [INFO] [stderr] | [INFO] [stderr] 113 | Ok(Some(Node::Boolean(val.clone()))) [INFO] [stderr] | ^^^^^^^^^^^ help: try dereferencing it: `*val` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/core/repl.rs:26:12 [INFO] [stderr] | [INFO] [stderr] 26 | if cs.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!cs.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/core/repl.rs:39:20 [INFO] [stderr] | [INFO] [stderr] 39 | if input.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!input.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: this call to `as_ref` does nothing [INFO] [stderr] --> src/interpreter/interpreter.rs:38:15 [INFO] [stderr] | [INFO] [stderr] 38 | match t.as_ref() { [INFO] [stderr] | ^^^^^^^^^^ help: try this: `t` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_asref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_asref [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/interpreter/interpreter.rs:66:38 [INFO] [stderr] | [INFO] [stderr] 66 | pub fn run_file(&self, filename: &String) { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: methods called `as_*` usually take self by reference or self by mutable reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:76:18 [INFO] [stderr] | [INFO] [stderr] 76 | fn as_symbol(self) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::wrong_self_convention)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: methods called `as_*` usually take self by reference or self by mutable reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:83:19 [INFO] [stderr] | [INFO] [stderr] 83 | fn as_integer(self) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: methods called `as_*` usually take self by reference or self by mutable reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:104:16 [INFO] [stderr] | [INFO] [stderr] 104 | fn as_list(self) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:219:12 [INFO] [stderr] | [INFO] [stderr] 219 | if vec.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!vec.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:221:19 [INFO] [stderr] | [INFO] [stderr] 221 | while vec.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!vec.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:252:9 [INFO] [stderr] | [INFO] [stderr] 252 | / match self { [INFO] [stderr] 253 | | &List::Cell(_, ref cdr) => 1 + cdr.len(), [INFO] [stderr] 254 | | &List::Null => 0 [INFO] [stderr] 255 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 252 | match *self { [INFO] [stderr] 253 | List::Cell(_, ref cdr) => 1 + cdr.len(), [INFO] [stderr] 254 | List::Null => 0 [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: methods called `to_*` usually take self by reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:287:17 [INFO] [stderr] | [INFO] [stderr] 287 | fn to_value(self) -> Value { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: methods called `to_*` usually take self by reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:291:15 [INFO] [stderr] | [INFO] [stderr] 291 | fn to_vec(self) -> Vec { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:294:9 [INFO] [stderr] | [INFO] [stderr] 294 | / loop { [INFO] [stderr] 295 | | match l.shift() { [INFO] [stderr] 296 | | Some((car, cdr)) => { [INFO] [stderr] 297 | | out.push(car); [INFO] [stderr] ... | [INFO] [stderr] 301 | | } [INFO] [stderr] 302 | | } [INFO] [stderr] | |_________^ help: try: `while let Some((car, cdr)) = l.shift() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:628:8 [INFO] [stderr] | [INFO] [stderr] 628 | if exprs.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `exprs.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:761:9 [INFO] [stderr] | [INFO] [stderr] 761 | / if self.values.contains_key(&key) { [INFO] [stderr] 762 | | runtime_error!("Duplicate define: {:?}", key) [INFO] [stderr] 763 | | } else { [INFO] [stderr] 764 | | self.values.insert(key, value); [INFO] [stderr] 765 | | Ok(()) [INFO] [stderr] 766 | | } [INFO] [stderr] | |_________^ help: consider using: `self.values.entry(key)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_entry)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:783:24 [INFO] [stderr] | [INFO] [stderr] 783 | fn get(&self, key: &String) -> Option { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:952:16 [INFO] [stderr] | [INFO] [stderr] 952 | if args.len() != 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!args.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `interpreter::ast_walk_interpreter::Interpreter` [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:18:5 [INFO] [stderr] | [INFO] [stderr] 18 | / pub fn new() -> Interpreter { [INFO] [stderr] 19 | | Interpreter { root: Environment::new_root() } [INFO] [stderr] 20 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 17 | impl Default for interpreter::ast_walk_interpreter::Interpreter { [INFO] [stderr] 18 | fn default() -> Self { [INFO] [stderr] 19 | Self::new() [INFO] [stderr] 20 | } [INFO] [stderr] 21 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:195:9 [INFO] [stderr] | [INFO] [stderr] 195 | / if self.values.contains_key(&key) { [INFO] [stderr] 196 | | runtime_error!("Duplicate define: {:?}", key) [INFO] [stderr] 197 | | } else { [INFO] [stderr] 198 | | self.values.insert(key, value); [INFO] [stderr] 199 | | Ok(()) [INFO] [stderr] 200 | | } [INFO] [stderr] | |_________^ help: consider using: `self.values.entry(key)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:217:24 [INFO] [stderr] | [INFO] [stderr] 217 | fn get(&self, key: &String) -> Option { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:248:5 [INFO] [stderr] | [INFO] [stderr] 248 | / match value { [INFO] [stderr] 249 | | &Value::Symbol(ref v) => { [INFO] [stderr] 250 | | match env.borrow().get(v) { [INFO] [stderr] 251 | | Some(val) => Ok(val), [INFO] [stderr] ... | [INFO] [stderr] 266 | | &Value::Macro(ref a, ref b) => Ok(Value::Macro(a.clone(), b.clone())), [INFO] [stderr] 267 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 248 | match *value { [INFO] [stderr] 249 | Value::Symbol(ref v) => { [INFO] [stderr] 250 | match env.borrow().get(v) { [INFO] [stderr] 251 | Some(val) => Ok(val), [INFO] [stderr] 252 | None => runtime_error!("Identifier not found: {:?}", value) [INFO] [stderr] 253 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:259:16 [INFO] [stderr] | [INFO] [stderr] 259 | if vec.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!vec.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:271:5 [INFO] [stderr] | [INFO] [stderr] 271 | / match value { [INFO] [stderr] 272 | | &Value::Symbol(ref v) => Ok(Value::Symbol(v.clone())), [INFO] [stderr] 273 | | &Value::Integer(v) => Ok(Value::Integer(v)), [INFO] [stderr] 274 | | &Value::Boolean(v) => Ok(Value::Boolean(v)), [INFO] [stderr] ... | [INFO] [stderr] 290 | | &Value::Macro(ref a, ref b) => Ok(Value::Macro(a.clone(), b.clone())), [INFO] [stderr] 291 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 271 | match *value { [INFO] [stderr] 272 | Value::Symbol(ref v) => Ok(Value::Symbol(v.clone())), [INFO] [stderr] 273 | Value::Integer(v) => Ok(Value::Integer(v)), [INFO] [stderr] 274 | Value::Boolean(v) => Ok(Value::Boolean(v)), [INFO] [stderr] 275 | Value::String(ref v) => Ok(Value::String(v.clone())), [INFO] [stderr] 276 | Value::List(ref vec) => { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:278:25 [INFO] [stderr] | [INFO] [stderr] 278 | if quasi && vec.len() > 0 && vec[0] == Value::Symbol("unquote".to_string()) { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!vec.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:294:32 [INFO] [stderr] | [INFO] [stderr] 294 | fn evaluate_expression(values: &Vec, env: Rc>) -> Result { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Value]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:295:8 [INFO] [stderr] | [INFO] [stderr] 295 | if values.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `values.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/reader/lexer.rs:83:9 [INFO] [stderr] | [INFO] [stderr] 83 | / loop { [INFO] [stderr] 84 | | match self.current() { [INFO] [stderr] 85 | | Some(c) => { [INFO] [stderr] 86 | | match c { [INFO] [stderr] ... | [INFO] [stderr] 170 | | } [INFO] [stderr] 171 | | }; [INFO] [stderr] | |_________^ help: try: `while let Some(c) = self.current() { .. }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::while_let_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:307:5 [INFO] [stderr] | [INFO] [stderr] 307 | / match func { [INFO] [stderr] 308 | | &Function::Native(native_fn) => { [INFO] [stderr] 309 | | native_fn(args, env) [INFO] [stderr] 310 | | }, [INFO] [stderr] ... | [INFO] [stderr] 326 | | } [INFO] [stderr] 327 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 307 | match *func { [INFO] [stderr] 308 | Function::Native(native_fn) => { [INFO] [stderr] 309 | native_fn(args, env) [INFO] [stderr] 310 | }, [INFO] [stderr] 311 | Function::Scheme(ref arg_names, ref body, ref func_env) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: Negation by multiplying with -1 [INFO] [stderr] --> src/reader/lexer.rs:132:83 [INFO] [stderr] | [INFO] [stderr] 132 | self.tokens.push(Token::Integer(if c == '-' { -1 * val } else { val })); [INFO] [stderr] | ^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::neg_multiply)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#neg_multiply [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:347:17 [INFO] [stderr] | [INFO] [stderr] 347 | substitutions.get(s).unwrap().clone() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&substitutions[s]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/reader/lexer.rs:177:9 [INFO] [stderr] | [INFO] [stderr] 177 | / loop { [INFO] [stderr] 178 | | match self.current() { [INFO] [stderr] 179 | | Some(c) => { [INFO] [stderr] 180 | | match c { [INFO] [stderr] ... | [INFO] [stderr] 189 | | } [INFO] [stderr] 190 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(c) = self.current() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/reader/lexer.rs:218:9 [INFO] [stderr] | [INFO] [stderr] 218 | / loop { [INFO] [stderr] 219 | | match self.current() { [INFO] [stderr] 220 | | Some(c) => { [INFO] [stderr] 221 | | match c { [INFO] [stderr] ... | [INFO] [stderr] 235 | | } [INFO] [stderr] 236 | | } [INFO] [stderr] | |_________^ help: try: `while let Some(c) = self.current() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:372:16 [INFO] [stderr] | [INFO] [stderr] 372 | if list.len() < 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `list.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/reader/lexer.rs:266:9 [INFO] [stderr] | [INFO] [stderr] 266 | / match self.current() { [INFO] [stderr] 267 | | Some(c) => { [INFO] [stderr] 268 | | match c { [INFO] [stderr] 269 | | _ if c.is_whitespace() => (), [INFO] [stderr] ... | [INFO] [stderr] 277 | | None => () [INFO] [stderr] 278 | | }; [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 266 | if let Some(c) = self.current() { [INFO] [stderr] 267 | match c { [INFO] [stderr] 268 | _ if c.is_whitespace() => (), [INFO] [stderr] 269 | ')' => { [INFO] [stderr] 270 | self.tokens.push(Token::CloseParen); [INFO] [stderr] 271 | self.advance(); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:403:16 [INFO] [stderr] | [INFO] [stderr] 403 | if list.len() < 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `list.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:428:8 [INFO] [stderr] | [INFO] [stderr] 428 | if args.len() < 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `args.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/reader/parser.rs:6:22 [INFO] [stderr] | [INFO] [stderr] 6 | pub fn parse(tokens: &Vec) -> Result, ParseError> { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/reader/parser.rs:45:22 [INFO] [stderr] | [INFO] [stderr] 45 | fn parse(tokens: &Vec) -> Result, ParseError> { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Token]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/reader/parser.rs:110:47 [INFO] [stderr] | [INFO] [stderr] 110 | Ok(Some(Node::Integer(val.clone()))) [INFO] [stderr] | ^^^^^^^^^^^ help: try dereferencing it: `*val` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/reader/parser.rs:113:47 [INFO] [stderr] | [INFO] [stderr] 113 | Ok(Some(Node::Boolean(val.clone()))) [INFO] [stderr] | ^^^^^^^^^^^ help: try dereferencing it: `*val` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/core/repl.rs:26:12 [INFO] [stderr] | [INFO] [stderr] 26 | if cs.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!cs.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/core/repl.rs:39:20 [INFO] [stderr] | [INFO] [stderr] 39 | if input.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!input.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: this call to `as_ref` does nothing [INFO] [stderr] --> src/interpreter/interpreter.rs:38:15 [INFO] [stderr] | [INFO] [stderr] 38 | match t.as_ref() { [INFO] [stderr] | ^^^^^^^^^^ help: try this: `t` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::useless_asref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#useless_asref [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:655:45 [INFO] [stderr] | [INFO] [stderr] 655 | Value::List(l) => Ok(Value::Boolean(l.len() == 0)), [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: methods called `as_*` usually take self by reference or self by mutable reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:76:18 [INFO] [stderr] | [INFO] [stderr] 76 | fn as_symbol(self) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::wrong_self_convention)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:673:16 [INFO] [stderr] | [INFO] [stderr] 673 | if l.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: methods called `as_*` usually take self by reference or self by mutable reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:83:19 [INFO] [stderr] | [INFO] [stderr] 83 | fn as_integer(self) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: methods called `as_*` usually take self by reference or self by mutable reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:104:16 [INFO] [stderr] | [INFO] [stderr] 104 | fn as_list(self) -> Result { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:690:16 [INFO] [stderr] | [INFO] [stderr] 690 | if l.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:833:8 [INFO] [stderr] | [INFO] [stderr] 833 | if args.len() != 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!args.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:219:12 [INFO] [stderr] | [INFO] [stderr] 219 | if vec.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!vec.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:221:19 [INFO] [stderr] | [INFO] [stderr] 221 | while vec.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!vec.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:252:9 [INFO] [stderr] | [INFO] [stderr] 252 | / match self { [INFO] [stderr] 253 | | &List::Cell(_, ref cdr) => 1 + cdr.len(), [INFO] [stderr] 254 | | &List::Null => 0 [INFO] [stderr] 255 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_ref_pats)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 252 | match *self { [INFO] [stderr] 253 | List::Cell(_, ref cdr) => 1 + cdr.len(), [INFO] [stderr] 254 | List::Null => 0 [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: methods called `to_*` usually take self by reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:287:17 [INFO] [stderr] | [INFO] [stderr] 287 | fn to_value(self) -> Value { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: methods called `to_*` usually take self by reference; consider choosing a less ambiguous name [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:291:15 [INFO] [stderr] | [INFO] [stderr] 291 | fn to_vec(self) -> Vec { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#wrong_self_convention [INFO] [stderr] [INFO] [stderr] warning: this loop could be written as a `while let` loop [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:294:9 [INFO] [stderr] | [INFO] [stderr] 294 | / loop { [INFO] [stderr] 295 | | match l.shift() { [INFO] [stderr] 296 | | Some((car, cdr)) => { [INFO] [stderr] 297 | | out.push(car); [INFO] [stderr] ... | [INFO] [stderr] 301 | | } [INFO] [stderr] 302 | | } [INFO] [stderr] | |_________^ help: try: `while let Some((car, cdr)) = l.shift() { .. }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#while_let_loop [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:628:8 [INFO] [stderr] | [INFO] [stderr] 628 | if exprs.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `exprs.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:761:9 [INFO] [stderr] | [INFO] [stderr] 761 | / if self.values.contains_key(&key) { [INFO] [stderr] 762 | | runtime_error!("Duplicate define: {:?}", key) [INFO] [stderr] 763 | | } else { [INFO] [stderr] 764 | | self.values.insert(key, value); [INFO] [stderr] 765 | | Ok(()) [INFO] [stderr] 766 | | } [INFO] [stderr] | |_________^ help: consider using: `self.values.entry(key)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_entry)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:783:24 [INFO] [stderr] | [INFO] [stderr] 783 | fn get(&self, key: &String) -> Option { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/cps_interpreter.rs:952:16 [INFO] [stderr] | [INFO] [stderr] 952 | if args.len() != 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!args.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you should consider adding a `Default` implementation for `interpreter::ast_walk_interpreter::Interpreter` [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:18:5 [INFO] [stderr] | [INFO] [stderr] 18 | / pub fn new() -> Interpreter { [INFO] [stderr] 19 | | Interpreter { root: Environment::new_root() } [INFO] [stderr] 20 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 17 | impl Default for interpreter::ast_walk_interpreter::Interpreter { [INFO] [stderr] 18 | fn default() -> Self { [INFO] [stderr] 19 | Self::new() [INFO] [stderr] 20 | } [INFO] [stderr] 21 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: usage of `contains_key` followed by `insert` on a `HashMap` [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:195:9 [INFO] [stderr] | [INFO] [stderr] 195 | / if self.values.contains_key(&key) { [INFO] [stderr] 196 | | runtime_error!("Duplicate define: {:?}", key) [INFO] [stderr] 197 | | } else { [INFO] [stderr] 198 | | self.values.insert(key, value); [INFO] [stderr] 199 | | Ok(()) [INFO] [stderr] 200 | | } [INFO] [stderr] | |_________^ help: consider using: `self.values.entry(key)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_entry [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:217:24 [INFO] [stderr] | [INFO] [stderr] 217 | fn get(&self, key: &String) -> Option { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:248:5 [INFO] [stderr] | [INFO] [stderr] 248 | / match value { [INFO] [stderr] 249 | | &Value::Symbol(ref v) => { [INFO] [stderr] 250 | | match env.borrow().get(v) { [INFO] [stderr] 251 | | Some(val) => Ok(val), [INFO] [stderr] ... | [INFO] [stderr] 266 | | &Value::Macro(ref a, ref b) => Ok(Value::Macro(a.clone(), b.clone())), [INFO] [stderr] 267 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 248 | match *value { [INFO] [stderr] 249 | Value::Symbol(ref v) => { [INFO] [stderr] 250 | match env.borrow().get(v) { [INFO] [stderr] 251 | Some(val) => Ok(val), [INFO] [stderr] 252 | None => runtime_error!("Identifier not found: {:?}", value) [INFO] [stderr] 253 | } [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:259:16 [INFO] [stderr] | [INFO] [stderr] 259 | if vec.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!vec.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:271:5 [INFO] [stderr] | [INFO] [stderr] 271 | / match value { [INFO] [stderr] 272 | | &Value::Symbol(ref v) => Ok(Value::Symbol(v.clone())), [INFO] [stderr] 273 | | &Value::Integer(v) => Ok(Value::Integer(v)), [INFO] [stderr] 274 | | &Value::Boolean(v) => Ok(Value::Boolean(v)), [INFO] [stderr] ... | [INFO] [stderr] 290 | | &Value::Macro(ref a, ref b) => Ok(Value::Macro(a.clone(), b.clone())), [INFO] [stderr] 291 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 271 | match *value { [INFO] [stderr] 272 | Value::Symbol(ref v) => Ok(Value::Symbol(v.clone())), [INFO] [stderr] 273 | Value::Integer(v) => Ok(Value::Integer(v)), [INFO] [stderr] 274 | Value::Boolean(v) => Ok(Value::Boolean(v)), [INFO] [stderr] 275 | Value::String(ref v) => Ok(Value::String(v.clone())), [INFO] [stderr] 276 | Value::List(ref vec) => { [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:278:25 [INFO] [stderr] | [INFO] [stderr] 278 | if quasi && vec.len() > 0 && vec[0] == Value::Symbol("unquote".to_string()) { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!vec.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:294:32 [INFO] [stderr] | [INFO] [stderr] 294 | fn evaluate_expression(values: &Vec, env: Rc>) -> Result { [INFO] [stderr] | ^^^^^^^^^^^ help: change this to: `&[Value]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:295:8 [INFO] [stderr] | [INFO] [stderr] 295 | if values.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `values.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you don't need to add `&` to all patterns [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:307:5 [INFO] [stderr] | [INFO] [stderr] 307 | / match func { [INFO] [stderr] 308 | | &Function::Native(native_fn) => { [INFO] [stderr] 309 | | native_fn(args, env) [INFO] [stderr] 310 | | }, [INFO] [stderr] ... | [INFO] [stderr] 326 | | } [INFO] [stderr] 327 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_ref_pats [INFO] [stderr] help: instead of prefixing all patterns with `&`, you can dereference the expression [INFO] [stderr] | [INFO] [stderr] 307 | match *func { [INFO] [stderr] 308 | Function::Native(native_fn) => { [INFO] [stderr] 309 | native_fn(args, env) [INFO] [stderr] 310 | }, [INFO] [stderr] 311 | Function::Scheme(ref arg_names, ref body, ref func_env) => { [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:347:17 [INFO] [stderr] | [INFO] [stderr] 347 | substitutions.get(s).unwrap().clone() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&substitutions[s]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:372:16 [INFO] [stderr] | [INFO] [stderr] 372 | if list.len() < 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `list.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:403:16 [INFO] [stderr] | [INFO] [stderr] 403 | if list.len() < 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `list.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to one [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:428:8 [INFO] [stderr] | [INFO] [stderr] 428 | if args.len() < 1 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `args.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:655:45 [INFO] [stderr] | [INFO] [stderr] 655 | Value::List(l) => Ok(Value::Boolean(l.len() == 0)), [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:673:16 [INFO] [stderr] | [INFO] [stderr] 673 | if l.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:690:16 [INFO] [stderr] | [INFO] [stderr] 690 | if l.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/interpreter/ast_walk_interpreter.rs:833:8 [INFO] [stderr] | [INFO] [stderr] 833 | if args.len() != 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!args.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: unused macro definition [INFO] [stderr] --> src/main.rs:57:1 [INFO] [stderr] | [INFO] [stderr] 57 | / macro_rules! assert_execute_all { [INFO] [stderr] 58 | | ($src:expr, $res:expr) => ( [INFO] [stderr] 59 | | assert_execute_ast_walk!($src, $res); [INFO] [stderr] 60 | | assert_execute_cps!($src, $res); [INFO] [stderr] 61 | | ) [INFO] [stderr] 62 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(unused_macros)] on by default [INFO] [stderr] [INFO] [stderr] warning: unused macro definition [INFO] [stderr] --> src/main.rs:64:1 [INFO] [stderr] | [INFO] [stderr] 64 | / macro_rules! assert_execute_fail_all { [INFO] [stderr] 65 | | ($src:expr, $res:expr) => ( [INFO] [stderr] 66 | | assert_execute_fail_ast_walk!($src, $res); [INFO] [stderr] 67 | | assert_execute_fail_cps!($src, $res); [INFO] [stderr] 68 | | ) [INFO] [stderr] 69 | | } [INFO] [stderr] | |_^ [INFO] [stderr] [INFO] [stderr] warning: unused macro definition [INFO] [stderr] --> src/main.rs:71:1 [INFO] [stderr] | [INFO] [stderr] 71 | / macro_rules! assert_execute_ast_walk { [INFO] [stderr] 72 | | ($src:expr, $res:expr) => (assert_eq!(interpreter::new("ast_walk").execute($src).unwrap(), $res)); [INFO] [stderr] 73 | | } [INFO] [stderr] | |_^ [INFO] [stderr] [INFO] [stderr] warning: unused macro definition [INFO] [stderr] --> src/main.rs:75:1 [INFO] [stderr] | [INFO] [stderr] 75 | / macro_rules! assert_execute_fail_ast_walk { [INFO] [stderr] 76 | | ($src:expr, $res:expr) => (assert_eq!(interpreter::new("ast_walk").execute($src).err().unwrap(), $res)); [INFO] [stderr] 77 | | } [INFO] [stderr] | |_^ [INFO] [stderr] [INFO] [stderr] warning: unused macro definition [INFO] [stderr] --> src/main.rs:79:1 [INFO] [stderr] | [INFO] [stderr] 79 | / macro_rules! assert_execute_cps { [INFO] [stderr] 80 | | ($src:expr, $res:expr) => (assert_eq!(interpreter::new("cps").execute($src).unwrap(), $res)); [INFO] [stderr] 81 | | } [INFO] [stderr] | |_^ [INFO] [stderr] [INFO] [stderr] warning: unused macro definition [INFO] [stderr] --> src/main.rs:83:1 [INFO] [stderr] | [INFO] [stderr] 83 | / macro_rules! assert_execute_fail_cps { [INFO] [stderr] 84 | | ($src:expr, $res:expr) => (assert_eq!(interpreter::new("cps").execute($src).err().unwrap(), $res)); [INFO] [stderr] 85 | | } [INFO] [stderr] | |_^ [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 6.55s [INFO] running `"docker" "inspect" "2232fadf6e2fa58186b748fe1e6acb8cf85b2e69ed453e3499a416b9d30e86bd"` [INFO] running `"docker" "rm" "-f" "2232fadf6e2fa58186b748fe1e6acb8cf85b2e69ed453e3499a416b9d30e86bd"` [INFO] [stdout] 2232fadf6e2fa58186b748fe1e6acb8cf85b2e69ed453e3499a416b9d30e86bd