Devlog

29th August 2024

Long Time No See

  • Last on week was more execution and less learning

  • Applying things learned and using it, helps you build better knowledge

  • What did I execute? Created WebPage for OpenGeometry, created WASM package along with example to validate OpenMaths

  • More on MVP coming soon

22nd August 2024

More on Match

  • Match works with tuples as well, either all the elements can be tested for a match or even some elements in a partocular order can be tested as well.

match vector {
  (0, ..) => println!("First Element is 0"),
  (.., 0) => println!("Last Element is 0"),
  (0, 0, 0) => ("Zero Vector"),
  _ => println!("Default Case, don't bind to anything"),
}
  • Match also works with array and can be tested for a value or can be indexed as well. The value needs to be mentioned explicitly and the index can be defined like variables and the values are binded to it

  • @ creates a slice of remaining elements and stores it inside rest

  • enums can be tested using match as well

  • more on binding later

Functions

  • Declared using fn keyword, return type specified by ->

  • There is a unique type of functions as well, called associated functions. They can be associated to a particular type. I like them!

21st August 2024

Loop

  • Loop is created using loop keyword, break keyword will break the loop and continue skips the rest of the implementation and starts over

  • Loops can be nested and should be anotated with ' with a name to it, e.g. 'outer: loop {}

  • To break or continue the nested loop it can be done like this, break 'outer

  • Loop can return value, if the value is attached after the break keyword. e.g. break result

While

  • A while loop can be used until the condition is satisfied

For Loops

  • for in can be used to iterate through Iterator, it is not anywhere close to TS

  • The iterator initial value and final value should contain .. notation.

  • In the above case loop will run until n is 9. To include 10 as well, loop should be like this for n in 1..=10

Match like Switch

  • Works just like any other switch statement

  • Match can be used as an expression as well and used later on. e.g. let switchStatement = match incomeTax { .... }

20th August 2024

TryFrom and TryInto

  • Useful when doing type conversion that have some chances of failing and need special handling

  • From and Into are for perfect conversions

  • TryFrom and TryInto checks if the conversion can go bad, it is always better to use TryFrom and TryInto rather than relying on From (more safe)

String Operations

  • String can be parsed using "5".parse().unwrap()

  • type can be converted to string using e.g. rectangle.to_string()

Expressions

  • Blocks are expressions too, the last statement is a return value of that block

Flow

  • if-else is similar. The condition doesn't need to be surronded by ()

  • All blocks return a value and the last expression does the same here

19th August 2024

Casting Continued..

  • Casting works in some cases and not always, e.g. it is not possible to cast float to char

  • Cast needs to be used wisely

Literals

  • Numerical literals can be type annoted, the type needs to be added after the value

  • e.g. let i = 3iu8

Inference & Aliasing

  • Type inference can check for the array elements and infer the type based upon it's use

  • Types can be renamed using aliasing method, for e.g. type KG = u32

  • When using type aliasing, the types should UpperCamelCase names to prevent compiler warnings

Conversion

  • From trait allows the way to create itself from another type

  • Into is similar to From but it doesn't take value, rather called upon the variable

  • From and Into are interchangeable

18th August 2024

More on Custom Types

  • const and static can be used in Rust the same way done in another langauges like TS

Variable Bindings

  • Rust provides type safety via statis typing, in most cases compiler infer type based on context

  • By default, the variables are non-mutable in Rust, to create a mutable(ability to change) variable you need to use mut keyword.

  • Shadow binding is allowed when a variable is declared in different scopes

  • Redeclaration is allowed as well, this shadows the previous bindings

Casting

  • Explicit Casting is possible using as keyword. let pi_int = pi_decimal as i32

17th August 2024

Strutctures

  • Three types - Tuples, C type structs and Unit struct which are fieldless

  • Structs can be destructured as well let Date { year, month, day, day_of_week } = date;

  • Tuples and Struct appear to be same but the way they are accessed are different, structs cannot be indexed. There can be confusions when using tuple, I might avoid it as of now

Enums

  • Allows the creation of type which can have one or more variant inside it

  • It is recommended to keep enums in uppercase

  • Didn't understood this well, need to come back later to this example

16th August 2024

Publishing to Rust Crates

  • openmath seems to be already take, renaming the project to openmaths. I'm not obssesed with names, users don't care about name, they need something that works(IMO)

  • Also, Crates- Package Registery for Rust, doesn't allow scoped crates, so the crate(package) name needs to be unique

  • No sane person would publish a package in the first weeks of development, there are two things, I can't contain my excitement and second my aim is build and publish the library so I need to check the feasibility as well.

  • Before you can push packages to crate, you have to login - cargo login

  • Push the latest changes to git and then cargo package - creates a .crate file with source code

  • License and Description are mandatory if you are building crates

  • To publish the package - cargo publish

Basic Know-How

  • Variables can be type annotated, also rust can infer types from context. Make sure to type annotate everything that is being used

  • i32 is signed 32-bit integer and u32 is unsigned 32-bit integer

  • Why type annotation is important? - println!("1 - 2 = {}", 1u32 - 2); when we run this, a compile error is thrown and it is easier to catch silly issues like this early on!

  • _ using an underscore can improve readibility when dealing with large numbers, println!("One million is written as {}", 1_000_000u32); this will omit an underscore and 100000 will be printed to the console

  • Camel Case notation is discouraged when creating variables, instead using an underscore is preferrred. Coming from JS this feels a little daunting but I hope it grows on me

  • let numArr ⚠️

  • let num_arr

Tuples

  • Tuples is a collection of data, it can be of similar data type or mixed

  • It can be passed as a function parameter and can be used to return data as well

  • It can be destructured like what we do with javascript objects

  • Values can be extracted from tuple using index, e.g. let tup = ('i', 'n', 'd') when printed using println!("{}", tup.1) will print n

  • Tuples can have multiple tuple within them - nested tuples

  • Tuple can be printed, but it does not print more than 12 tuple memebers

  • If a tuple contains a single value it should be separated by a comma, else rust considers it as a integer. (5u32,) - way to write single element tuple

Return of the function

  • I found one thing strange, rust doesn't force you to mention return keyword unlike JS

  • Don't let being perfectly idiomatic stop you from writing what you believe to be good code, I will use return

Array and Slices

  • Similar to other languages, array is a collection of the same type T, stored in contiguous memory. Length is known at compile time

  • let xs: [i32; 5] - here i32 is the type of elements present inside the xs array and 5 states the number of elements

  • Length of an array can be fethced using array.len()

  • Memory size can be computed using mem::size_of_val(&xs))

  • Slices seem to be complex, need to look more deep into it!

Custom

  • Custom types are created using struct and enum

  • Constants can be created using const and static keyword

15th August 2024

Baby Steps

  • Started follwing rust by example

  • Cargo.toml file contains the dependencies, every dependecy is similar to a package/library in other programming languages

  • To add dependency - cargo add packageName

  • Using the package - use packageName

  • disable unused code warning - #[allow(dead_code)], don't use it really - always keep your code clean

14th August 2024

Rust vs C++

  • I have came to a conclusion that I need a robust math library for the Kernel Operations

  • When I went to look for how these Math Libraries are structured, I found that the best solution these day is to use Native Code + WebAssembly.

  • But I struggled to decide, with so many options, two langauges are mentioned the most C++ and Rust

  • I'm no where a expert what is best, and then I thought why not create a package using both?

  • This is not going to hurt me, surely I will have to invest double time, but I'm confident that this learning wouldn't go away!

Installing Rust and Project Setup

  • On a mac, run this command curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

  • Verify the installation by cargo --version, remember to close your terminal after the rust is installed

  • Create new project - cargo new projectName

Last updated