diff --git a/README.md b/README.md index eda70de..4d61420 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Parameterize! (compile time meta-programming) # [๐Ÿ”ฅ With blocks: with my_struct(1) as v](tutorials/with-blocks-for-struct-parametric-minimal-raise.md) with blocks from struct (parametric/minimal/raise) -# [๐Ÿƒ (SPEED) Parametric struct through CPU registers](tutorials/parametric-struct-trough-cpu-registers.md) +# [๐Ÿƒ (SPEED) Parametric struct through CPU registers](tutorials/parametric-struct-through-cpu-registers.md) the @register_passable decorator # [๐Ÿž๏ธ getattr: dynamic and static struct members](tutorials/getattr-dynamic-and-static-struct-members.md) @@ -47,7 +47,7 @@ example: wrap python functions mojo build program.mojo -D... # [๐Ÿ•ฏ๏ธ reader.read\[Int32,"swap"\](3) in 45 lines](tutorials/reader-in-few-lines-with-endian-ness.md) -v0.4.0: powerfull magic +v0.4.0: powerful magic # [๐Ÿ”ฎ Autotune: optimization made easy](tutorials/autotune-optimize-by-search-and-benchmark.md) Easy to use @@ -62,7 +62,7 @@ when do del get called on instance # [๐Ÿ—๏ธ moveinit ๐Ÿ’ฟ๐Ÿ’ฟ copyinit ๐Ÿฟ๏ธ takeinit](tutorials/moveinit-copyinit-takeinit.md) implement in struct: copy of instance, move, taking move -# ๐Ÿค™ [callbacks trough parameters](tutorials/callbacks-trough-parameters.md) +# ๐Ÿค™ [callbacks through parameters](tutorials/callbacks-through-parameters.md) toy markdown generator as an example # [๐ŸŒŠ 256Hz: simd cosine and plot it](tutorials/vectorise-simd-cosine.md) diff --git a/introduction.md b/introduction.md index 65430cc..eafc161 100644 --- a/introduction.md +++ b/introduction.md @@ -51,7 +51,7 @@ fn main() raises: mylib.print_from_mylib(time.monotonic_ns()) ``` ### object with small footprint -Object comparable to thoses of Python, Javascript, Ruby, Lua, out of the box. +Object comparable to those of Python, Javascript, Ruby, Lua, out of the box. ```python #Around 38kb fn take_object(o: object): @@ -87,7 +87,7 @@ fn main(): It can of great help to peoples that need to react to changes in their industry quickly. -It is usefull to be able to explore new ideas without using a lot of time. +It is useful to be able to explore new ideas without using a lot of time. Before: ```python diff --git a/tutorials/README.md b/tutorials/README.md index 92e1caa..a785dc4 100644 --- a/tutorials/README.md +++ b/tutorials/README.md @@ -33,7 +33,7 @@ Parameterize! (compile time meta-programming) # [๐Ÿ”ฅ With blocks: with my_struct(1) as v ](with-blocks-for-struct-parametric-minimal-raise.md) with blocks from struct (parametric/minimal/raise) -# [๐Ÿƒ (SPEED) Parametric struct through CPU registers](parametric-struct-trough-cpu-registers.md) +# [๐Ÿƒ (SPEED) Parametric struct through CPU registers](parametric-struct-through-cpu-registers.md) the @register_passable decorator # [๐Ÿž๏ธ getattr: dynamic and static struct members](getattr-dynamic-and-static-struct-members.md) @@ -50,7 +50,7 @@ example: wrap python functions mojo build program.mojo -D... # [๐Ÿ•ฏ๏ธ reader.read\[Int32,"swap"\](3) in 45 lines](reader-in-few-lines-with-endian-ness.md) -v0.4.0: powerfull magic +v0.4.0: powerful magic # [๐Ÿ”ฎ Autotune: optimization made easy](autotune-optimize-by-search-and-benchmark.md) Easy to use @@ -64,7 +64,7 @@ when do del get called on instance # [๐Ÿ—๏ธ moveinit ๐Ÿ’ฟ๐Ÿ’ฟ copyinit ๐Ÿฟ๏ธ takeinit](moveinit-copyinit-takeinit.md) implement in struct: copy of instance, move, taking move -# ๐Ÿค™ [callbacks trough parameters](callbacks-trough-parameters.md) +# ๐Ÿค™ [callbacks through parameters](callbacks-through-parameters.md) toy markdown generator as an example # [๐ŸŒŠ 256Hz: simd cosine and plot it](vectorise-simd-cosine.md) diff --git a/tutorials/autotune-optimize-by-search-and-benchmark.md b/tutorials/autotune-optimize-by-search-and-benchmark.md index 0e1093c..f355664 100644 --- a/tutorials/autotune-optimize-by-search-and-benchmark.md +++ b/tutorials/autotune-optimize-by-search-and-benchmark.md @@ -14,7 +14,7 @@ In that example, we are optimizing for speed, and will measure it using ```now() ```python from autotune import autotune, search -#let's grab it to demonstate the autotune +#let's grab it to demonstrate the autotune from algorithm import vectorize #to determine the maximum value of an integer diff --git a/tutorials/callbacks-through-parameters.md b/tutorials/callbacks-through-parameters.md new file mode 100644 index 0000000..41b7050 --- /dev/null +++ b/tutorials/callbacks-through-parameters.md @@ -0,0 +1,52 @@ +# ๐Ÿค™ callbacks trough parameters +```python +@value +struct markdown: + var content: String + + fn __init__(inout self): + self.content = "" + + def render_page[f: def()->object](self,file="none"): + self.content = "" + f() + + fn __ior__(inout self,t:String): + self.content+=t + +var md = markdown() + +def readme(): + md |= ''' + # hello mojo + this is markdown + ```python + fn main(): + print("ok") + ``` + ''' + footer() + +def footer(): + md |= ''' + > Page generated + ''' + +def main(): + md = markdown() + md.render_page[readme](file="README.md") + print(md.content) +``` + +output: + + +# hello mojo +this is markdown +```python +fn main(): + print("ok") +``` + +> Page generated + diff --git a/tutorials/callbacks-trough-parameters.md b/tutorials/callbacks-trough-parameters.md index 41b7050..680ce89 100644 --- a/tutorials/callbacks-trough-parameters.md +++ b/tutorials/callbacks-trough-parameters.md @@ -1,52 +1,2 @@ -# ๐Ÿค™ callbacks trough parameters -```python -@value -struct markdown: - var content: String - - fn __init__(inout self): - self.content = "" - - def render_page[f: def()->object](self,file="none"): - self.content = "" - f() - - fn __ior__(inout self,t:String): - self.content+=t - -var md = markdown() - -def readme(): - md |= ''' - # hello mojo - this is markdown - ```python - fn main(): - print("ok") - ``` - ''' - footer() - -def footer(): - md |= ''' - > Page generated - ''' - -def main(): - md = markdown() - md.render_page[readme](file="README.md") - print(md.content) -``` - -output: - - -# hello mojo -this is markdown -```python -fn main(): - print("ok") -``` - -> Page generated +The new location is [callbacks through parameters](callbacks-through-parameters.md) diff --git a/tutorials/calling-mojo-functions-in-python.md b/tutorials/calling-mojo-functions-in-python.md index 635195d..268af6a 100644 --- a/tutorials/calling-mojo-functions-in-python.md +++ b/tutorials/calling-mojo-functions-in-python.md @@ -7,7 +7,7 @@ -Building a wrapper with all thoses features: +Building a wrapper with all those features: - [VariadicList](https://docs.modular.com/mojo/stdlib/utils/list.html#variadiclist) for the arguments types - [@noncapturing](https://docs.modular.com/mojo/changelog.html#week-of-2023-04-10) to keep the global scope clean - [import_module](https://docs.modular.com/mojo/stdlib/python/python.html#import_module) diff --git a/tutorials/env-argv-param_env-for-parameters.md b/tutorials/env-argv-param_env-for-parameters.md index c8c5c73..2d6cf1a 100644 --- a/tutorials/env-argv-param_env-for-parameters.md +++ b/tutorials/env-argv-param_env-for-parameters.md @@ -8,7 +8,7 @@ ```param_env```: for alias, available at compile time ## param_env -They are retreived when mojo build the program. +They are retrieved when mojo build the program. So they can be used to do compile-time logic. diff --git a/tutorials/getattr-dynamic-and-static-struct-members.md b/tutorials/getattr-dynamic-and-static-struct-members.md index 28f59a7..a1bedbf 100644 --- a/tutorials/getattr-dynamic-and-static-struct-members.md +++ b/tutorials/getattr-dynamic-and-static-struct-members.md @@ -57,7 +57,7 @@ struct PackageHelper: def __getattr__(inout self,name:StringLiteral) ->PythonObject: return self.my_package.__getattr__(name) ``` -The ```__getattr__()``` implementation is quite small, but is powerfull: +The ```__getattr__()``` implementation is quite small, but is powerful: If a struct do not define a requested attribute, it will call that function and pass the name of it. @@ -103,7 +103,7 @@ def main(): - temp_value = PythonObject(1.0) - temp_value is of PythonObject type - temp_value = 1.5 - - instanciated by PythonObject again + - instantiated by PythonObject again ```try:``` and ```except:``` blocks can be placed in both ```def()``` and ```fn()``` functions diff --git a/tutorials/lists-of-structs-magic-operators-pre-lifetimes.md b/tutorials/lists-of-structs-magic-operators-pre-lifetimes.md index 289ffa0..46b2d64 100644 --- a/tutorials/lists-of-structs-magic-operators-pre-lifetimes.md +++ b/tutorials/lists-of-structs-magic-operators-pre-lifetimes.md @@ -52,7 +52,7 @@ More about it can be read on the website of mojo aswell. - documentation in [Roadmap: shap edges](https://docs.modular.com/mojo/roadmap.html#sharp-edges) - ```__get_address_as_lvalue(address) = other_instance ``` - will call ``` __del__()``` on existing value at the address (cannot contains nothing) - - get an copy instance trough ```__copyinit__```: + - get an copy instance through ```__copyinit__```: - ```var x = __get_address_as_lvalue(address)``` @@ -142,4 +142,4 @@ see the [ASAP](https://docs.modular.com/mojo/programming-manual.html#behavior-of > one revision on Nov 6 2023 -[contribute corrections](/contribute.md) \ No newline at end of file +[contribute corrections](/contribute.md) diff --git a/tutorials/make-test-builds-using-a-custom-flag.md b/tutorials/make-test-builds-using-a-custom-flag.md index 2078e06..4186a86 100644 --- a/tutorials/make-test-builds-using-a-custom-flag.md +++ b/tutorials/make-test-builds-using-a-custom-flag.md @@ -1,5 +1,5 @@ # ๐Ÿณ๏ธ make test builds using a custom flag -In mojo, it is possible to do it trough programming! +In mojo, it is possible to do it through programming! For serious testing, the assert functions provided mojo standard library should be used instead. diff --git a/tutorials/memory-asap-and-destructor-behaviours.md b/tutorials/memory-asap-and-destructor-behaviours.md index 703b6a1..cec4bef 100644 --- a/tutorials/memory-asap-and-destructor-behaviours.md +++ b/tutorials/memory-asap-and-destructor-behaviours.md @@ -3,7 +3,7 @@ ##### *this page is a community effort and may contains errors. please contribute any corrections if needed.* -It's wonderfull because mojo free memory as soon as possible. +It's wonderful because mojo free memory as soon as possible. Lifetimes is on the roadmap: [Ownership and Lifetimes](https://docs.modular.com/mojo/roadmap.html#ownership-and-lifetimes). diff --git a/tutorials/moveinit-copyinit-takeinit.md b/tutorials/moveinit-copyinit-takeinit.md index 4fceacc..f62cc5e 100644 --- a/tutorials/moveinit-copyinit-takeinit.md +++ b/tutorials/moveinit-copyinit-takeinit.md @@ -1,7 +1,7 @@ # ๐Ÿ—๏ธ moveinit ๐Ÿ’ฟ๐Ÿ’ฟ copyinit ๐Ÿฟ๏ธ takeinit > using v0.4.0 -Let's have a look at theses features trough an example, +Let's have a look at theses features through an example, they looks like this : @@ -13,11 +13,11 @@ they looks like this : - original is owned, ```__del__``` will never be called on it - original can't be used in the program anymore - **^ transfer suffix** is used to call moveinit - - usefull for making sure an instance don't have copies thus is unique + - useful for making sure an instance don't have copies thus is unique - ```fn __takeinit__(inout self, inout original: Self)``` - original can be modified - ```__del()__``` will get called on original on last use - - usefull to affect a conditional in ```__del__()``` + - useful to affect a conditional in ```__del__()``` - example: don't free pointer if self.dontfree == true ### The illustration: @@ -102,7 +102,7 @@ we moved original to still_original and took original as ```owned```:   -## why moveinit is important and usefull +## why moveinit is important and useful We can make sure that an instance have no copies in the program, when we to pass it to a function, the function could return it: @@ -145,7 +145,7 @@ fn __takeinit__(inout self, inout original: Self) ``` - original can be modified - ```__del()__``` will get called on original on last use - - usefull to affect a conditional in ```__del__()``` + - useful to affect a conditional in ```__del__()``` - example: don't free pointer if self.dontfree == true ### Example @@ -207,4 +207,4 @@ But with ```__takeinit()__```,original can be modified:   -> Need further work and help for \_\_takeinit\_\_(), the page will get updated \ No newline at end of file +> Need further work and help for \_\_takeinit\_\_(), the page will get updated diff --git a/tutorials/multi-core-parallelize-with-simd .md b/tutorials/multi-core-parallelize-with-simd.md similarity index 95% rename from tutorials/multi-core-parallelize-with-simd .md rename to tutorials/multi-core-parallelize-with-simd.md index 0194748..f5865bd 100644 --- a/tutorials/multi-core-parallelize-with-simd .md +++ b/tutorials/multi-core-parallelize-with-simd.md @@ -34,7 +34,7 @@ fn main(): # simd instructions: - # a. fill them whith numbers from 0 to 7 + # a. fill them with numbers from 0 to 7 numbers = math.iota[DType.uint8,8](0) # b. x*x for each numbers @@ -47,7 +47,7 @@ fn main(): # ๐Ÿš ๐Ÿš ๐Ÿ›ฃ๏ธ simd in parallel -it is like 4 autobus advancing on 4 seperate highway lanes toward a destination. +it is like 4 autobus advancing on 4 separate highway lanes toward a destination. they reach destination more or less at the same time and in the same amount of time it would have taken with only one autobus in a single highway lane. (single core, non multi-core) diff --git a/tutorials/parameters-alias-struct-parameter-deduction.md b/tutorials/parameters-alias-struct-parameter-deduction.md index 35d9759..4b56c77 100644 --- a/tutorials/parameters-alias-struct-parameter-deduction.md +++ b/tutorials/parameters-alias-struct-parameter-deduction.md @@ -16,7 +16,7 @@ Let's learn how to parametrize! That example also covers "Struct parameters deduction". -It is very usefull, try to practice playing with it in order to remember and understand it. +It is very useful, try to practice playing with it in order to remember and understand it. Notice how the deduction "works its way" up the struct and fill the blanks. @@ -253,7 +253,7 @@ fn main(): --- #### Parameter default value and keyword -Parameters can have default values and be refered by keyword. +Parameters can have default values and be referred by keyword. The ones that have default values need to be defined after the ones that don't (order). - ```example[no_default:Int, got_default:Int=1]``` diff --git a/tutorials/parametric-struct-trough-cpu-registers.md b/tutorials/parametric-struct-through-cpu-registers.md similarity index 91% rename from tutorials/parametric-struct-trough-cpu-registers.md rename to tutorials/parametric-struct-through-cpu-registers.md index fff38c5..4333279 100644 --- a/tutorials/parametric-struct-trough-cpu-registers.md +++ b/tutorials/parametric-struct-through-cpu-registers.md @@ -30,7 +30,7 @@ struct naive_register_tuple[T_FIRST:AnyType,T_SECOND:AnyType]: var first:T_FIRST var second:T_SECOND - #need to return Self type, wich is naive_register_tuple + #need to return Self type, which is naive_register_tuple fn __init__(arg_one:T_FIRST,arg_two:T_SECOND) -> Self: var tmp = Self{ @@ -49,7 +49,7 @@ struct naive_register_tuple[T_FIRST:AnyType,T_SECOND:AnyType]: fn main(): - #explicitely specify the types: + #explicitly specify the types: var tmp = naive_register_tuple[Bool,Bool](True,True) #with struct parameter deduction: @@ -90,7 +90,7 @@ Examples: ### register_passable -> Thoses values will be passed trough CPU registers +> Those values will be passed trough CPU registers The ```__init__()``` function looks different than usual, it returns ```Self```. @@ -102,11 +102,11 @@ register_passable is slightly different in that aspect. ### trivial It means that we can get a copy of a value and that we can move it. -There is no need to implement thoses methods. (```copyinit```, ```moveinit```, ```takeinit```, ```del```) +There is no need to implement those methods. (```copyinit```, ```moveinit```, ```takeinit```, ```del```) Think about it, theses are just "sequences of bytes" that can be copied as they are from one register to another. -A way to think about thoses is in term of "bags of bits" (see mojo documentation). +A way to think about those is in term of "bags of bits" (see mojo documentation). diff --git a/tutorials/python-world-mojo-world.md b/tutorials/python-world-mojo-world.md index d970497..e5e2264 100644 --- a/tutorials/python-world-mojo-world.md +++ b/tutorials/python-world-mojo-world.md @@ -1,8 +1,8 @@ # ๐Ÿ” Python land and mojo land, PythonObject [PythonObject](https://docs.modular.com/mojo/stdlib/python/object.html) is a mojo type that can store python objects of any python class (int, list,ndarray..) -- can "travel" trough **mojo functions**, as a PythonObject, but can also be passed to **python functions**, as a PythonObject. -- can go back and forth between thoses two worlds. +- can "travel" through **mojo functions**, as a PythonObject, but can also be passed to **python functions**, as a PythonObject. +- can go back and forth between those two worlds. - is understood both by python and mojo ### mojo->python @@ -68,7 +68,7 @@ fn numpy_array_from_mojo() raises -> PythonObject: #mojo have ranges too, that one is a mojo one https://docs.modular.com/mojo/stdlib/builtin/range.html for i in range(range_size): #i is a mojo Int #append is a python function, mojo find it inside the PythonObject - x.append(i) #i get converted to a python object trough the __init__ function of PythonObject + x.append(i) #i get converted to a python object through the __init__ function of PythonObject return np.cos(np.array(x)*np.pi*2.0/256.0) #np.cos return a python object of class ndarray diff --git a/tutorials/traits.md b/tutorials/traits.md index 4f443a2..267d498 100644 --- a/tutorials/traits.md +++ b/tutorials/traits.md @@ -18,7 +18,7 @@ What if multiples types implement the same method signature but differently ? Can we sort of group them? -Yes, it is partially why traits are usefull. +Yes, it is partially why traits are useful. A trait is like a checklist, it allows mojo to verify if a type comply with a list of things. @@ -27,7 +27,7 @@ For now, only methods can be "added" to that check list. That checklist can then be used to accept different types as argument for example. -*(It is not exacly a checklist, but it helps to think about it that way, in order to start understanding)* +*(It is not exactly a checklist, but it helps to think about it that way, in order to start understanding)* @@ -57,7 +57,7 @@ The requirement is simple: the value passed as an argument has to be an ```Int6 What if we want to be able to pass a value of either ```Int64``` or ```Int32``` type ? -We can specify thoses requirements in a new trait! +We can specify those requirements in a new trait! But let's choose an existing trait for now! (```Intable```) @@ -118,7 +118,7 @@ fn main(): ``` It is necessary to have two sets of the same requirements, -because the arguments could be of differents ```Intable``` compliant types. +because the arguments could be of different ```Intable``` compliant types. One could be ```Int64``` and the other ```Int32```. @@ -377,7 +377,7 @@ In the future, we might be able to provides a default implementation there. ### 1๏ธโƒฃ2๏ธโƒฃโœ… The power of traits -In the begining, the only requirement available was type equality. (```รŒnt64```) +In the beginning, the only requirement available was type equality. (```รŒnt64```) It was only possible pass a value of that type to that function argument: @@ -507,7 +507,7 @@ It is fantastic, the ```@value``` struct decorator can synthesize the required methods of that specific trait. -That decorator synthesize exacly 3 functions and 2 of them are thoses. +That decorator synthesize exactly 3 functions and 2 of them are those. - ```__copyinit__()``` - ```__moveinit__()``` @@ -663,7 +663,7 @@ fn main(): *In the future, we might be able to provide fields and default methods implementations to traits!* -*But don't worry, it is already very powerfull and liberative!* +*But don't worry, it is already very powerful and liberative!* @@ -709,7 +709,7 @@ There are more ways to select a default implementation: - [param_env](https://docs.modular.com/mojo/stdlib/sys/param_env.html) - [@parameter if](https://docs.modular.com/mojo/manual/decorators/parameter.html#parametric-if-statement) -```@staticmethod``` is usefull to make namespace types that dont need an instance for example. +```@staticmethod``` is useful to make namespace types that dont need an instance for example. @@ -747,7 +747,7 @@ This tutorial is a community effort โค๏ธ , it can contains error and will be u   -Make sure to navigate the official site of mojo, wich contains the best ressources for learning! +Make sure to navigate the official site of mojo, which contains the best resources for learning! Mojo also have it's documentation available on it's github [repository](https://github.com/modularml/mojo/tree/main/docs) ! diff --git a/tutorials/try-and-except-errors-handling.md b/tutorials/try-and-except-errors-handling.md index 9578e67..9eacee4 100644 --- a/tutorials/try-and-except-errors-handling.md +++ b/tutorials/try-and-except-errors-handling.md @@ -1,9 +1,9 @@ # [Try & Except: โœ‹->โš ๏ธ->โ›‘๏ธ->๐Ÿฉน->๐Ÿ‘ ]() > with v0.4.0 -There are explainations further down the page, +There are explanations further down the page, -This example accompany thoses: +This example accompany those: ```python from random import random_float64,seed @@ -37,7 +37,7 @@ fn main() raises: count_to_5() except e: print("error inside main(): ",e) - #main: errror e + #main: error e if e.__repr__() == "โš ๏ธ we stopped at three": print("main: three โ›‘๏ธ") print("main: four โ›‘๏ธ") @@ -88,4 +88,4 @@ If fixed, the the execution continue on the first line after the except block. If it is not possible to fix it, it is possible to Raise an error: either the same or another. -The error will be transfered to the next Except: block. (see example) +The error will be transferred to the next Except: block. (see example) diff --git a/tutorials/what-have-change-when-there-is-a-new-update.md b/tutorials/what-have-change-when-there-is-a-new-update.md index 0a9cfcc..68884b2 100644 --- a/tutorials/what-have-change-when-there-is-a-new-update.md +++ b/tutorials/what-have-change-when-there-is-a-new-update.md @@ -7,7 +7,7 @@ The changelogs are availables for us [here](https://docs.modular.com/mojo/change ## What is a changelog It is an entry that describe the changes made, new features and bug fixed of an update. -## How are they usefull +## How are they useful Provides a clear listing of new features that are now availables. @@ -15,7 +15,7 @@ They also helps to maintain existing code by adapting to changes. ## Practical example -Lets understand how usefull it is by partially analysing a real changelog. +Let's understand how useful it is by partially analysing a real changelog. ### [v0.5.0 (2023-11-2)](https://docs.modular.com/mojo/changelog.html#v0.5.0-2023-11-2) From a glance, we can see that SIMD got a new function: diff --git a/tutorials/with-blocks-for-struct-parametric-minimal-raise.md b/tutorials/with-blocks-for-struct-parametric-minimal-raise.md index 5943f03..487d5fc 100644 --- a/tutorials/with-blocks-for-struct-parametric-minimal-raise.md +++ b/tutorials/with-blocks-for-struct-parametric-minimal-raise.md @@ -35,7 +35,7 @@ fn main(): with my_struct(1.5) as value: print(value) - #explicitely specify type: + #explicitly specify type: with my_struct[Bool](True) as value: print(value) ``` @@ -107,7 +107,7 @@ fn main() raises: #The error got re-thrown here print("โŒ Error 'received' by main : ",err) - #Lets consider it handled. + #Let's consider it handled. print("โœ… Handled in main") #Program will continue, below in the main function @@ -115,7 +115,7 @@ fn main() raises: print("Main: all good") ``` -Depending on wich error is thrown (see the commented one), +Depending on which error is thrown (see the commented one), the program produce one of theses two outputs: #### A: diff --git a/why.md b/why.md index 0600c98..aed5cea 100644 --- a/why.md +++ b/why.md @@ -7,8 +7,8 @@ ## Why learning Mojo? **Unifying** the **high level** world and the **low level** world into a **single language** provides many great things: -- **choose how time is used on any part of the app** by switching from high level to low level (usefull when prototyping or exploring ideas). -- **explore new lands/platforms** that were not steppable before (freedom, versatiliy and opportunities) +- **choose how time is used on any part of the app** by switching from high level to low level (useful when prototyping or exploring ideas). +- **explore new lands/platforms** that were not steppable before (freedom, versatility and opportunities) - **a progressive path to learn and grow** (by choosing the current level of abstraction). @@ -35,7 +35,7 @@ It is easy to imagine that one person knowing mojo could one day be able to do: - part of it being an ai running on a graphic card? - filtering audio signals as a web service? - provide to the front-end chart images? -- ๐Ÿ’ป Desktop softwares +- ๐Ÿ’ป Desktop software - ๐Ÿ“ฑ Mobile apps - โง Robotics and IOT using micro-controllers - ๐Ÿค– Performant A.I @@ -45,7 +45,7 @@ It is easy to imagine that one person knowing mojo could one day be able to do: ### Let's take the time to say thank you to the modular/mojo team. -### This repository is just a community effort, the ressources +### This repository is just a community effort, the resources ### available on the official website of modular/mojo ### are the best if you want to learn! ### Here are some links to theses: @@ -67,4 +67,4 @@ Getting started: - #### [Using Mojo๐Ÿ”ฅ with Docker containers](https://www.youtube.com/watch?v=cHyYmF-RhUk) - #### [Using the Mojo ๐Ÿ”ฅ Visual Studio Extension ๐Ÿš€](https://www.youtube.com/watch?v=KYEAiTBbNT8) ---- \ No newline at end of file +---