Hello,
I have been learning rust and want to make something exciting so I though why not build a Lisp compiler in Rust B)
so here what I did today. https://gist.github.com/anon2834678263/bcaa06e934f7b478be79203553f170ee
the tokenizer isn't ready and might have horrible bugs but at least I got comfortable declaring immutable variable by default, not surrounding stuff with parentheses unnecessarily. oh and also Enums which is most powerful thing in rust as people say.
I am still not satisfied though since the code looks more like C than Rust xD
maybe some experienced people can correct me :)
Well first thing, I'd recommend saving the gist with a
.rsextension so we get syntax highlighting :)You should convert your loop to iterate over
input.chars()instead. Your current loop will have issues if someone writes, for example, "naïveté" due to some of those letters being multiple bytes long in UTF-8 (which is the encodingstrandStringuse). What you can do is:This also lets you
input.peek()in the body to look at the next character without taking it from the iterator.input.peek().is_some()tells you if there's more data (andis_nonetells if you're at the end of the input).Even in C, I'd have made the big if-chain use if-else to avoid evaluating conditions that are known to be false. However, here I'd convert it to a big
matchstatement:As an optional (and more advanced) thing, you can return slices into the input instead of copies of those slices:
If you want to do this, you should do
.char_indices()instead of.chars()so you know where to slice the input string at.Otherwise, you can use
std::mem::take(&mut current_token)to replacecurrent_tokenwith an empty string and take (without cloning) the existing value out of that variable:Thank you kind stranger!
I will take notes and will make these changes. after improving this I will move to create AST which would be more fun! again thank :)
FYI once you're done you should take a look at some of the parsing libraries out there. Some I'd recommend looking at: