From ea9f83a749138c84c18f45789a08b641907181f8 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sat, 5 Sep 2020 15:53:20 -0500 Subject: [PATCH] small bugfixes; started writing example programs with docs --- .vimspector.json | 2 +- core/array.onyx | 4 +- core/stdio.onyx | 11 ++- docs/plan | 4 + examples/01_hello_world.onyx | 60 ++++++++++++ examples/02_variables.onyx | 30 ++++++ examples/03_basics.onyx | 178 +++++++++++++++++++++++++++++++++++ misc/onyx.vim | 4 +- onyx | Bin 607128 -> 607176 bytes progs/poly_test.onyx | 3 + src/onyxwasm.c | 4 +- 11 files changed, 292 insertions(+), 8 deletions(-) create mode 100644 examples/01_hello_world.onyx create mode 100644 examples/02_variables.onyx create mode 100644 examples/03_basics.onyx diff --git a/.vimspector.json b/.vimspector.json index 899b511c..2e8fdc8b 100644 --- a/.vimspector.json +++ b/.vimspector.json @@ -6,7 +6,7 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/onyx", - "args": ["-verbose", "progs/poly_test.onyx"], + "args": ["-verbose", "examples/02_variables.onyx"], "stopAtEntry": true, "cwd": "${workspaceFolder}", "environment": [], diff --git a/core/array.onyx b/core/array.onyx index 0d314deb..d6a58069 100644 --- a/core/array.onyx +++ b/core/array.onyx @@ -75,7 +75,7 @@ array_fast_delete :: proc (arr: ^[..] $T, idx: u32) { } array_contains :: proc (arr: ^[..] $T, x: T) -> bool { - for i: 0 .. arr.count do if arr.data[i] == x do return true; + for it: *arr do if it == x do return true; return false; } @@ -120,5 +120,5 @@ array_fold :: proc (arr: ^[..] $T, init: $R, f: proc (T, R) -> R) -> R { } array_map :: proc (arr: ^[..] $T, f: proc (T) -> T) { - for i: 0 .. arr.count do arr.data[i] = f(arr.data[i]); + for ^it: *arr do *it = f(*it); } diff --git a/core/stdio.onyx b/core/stdio.onyx index f4c4cd6f..e2cfac11 100644 --- a/core/stdio.onyx +++ b/core/stdio.onyx @@ -22,10 +22,19 @@ print_i32 :: proc (n: i32, base := 10) do string_builder_append(^print_buff print_bool :: proc (b: bool) do string_builder_append(^print_buffer, b); print_ptr :: proc (p: rawptr) do string_builder_append(^print_buffer, cast(i64) p, 16l); +print_range :: proc (r: range, sep := " ") { + for i: r { + print(i); + if i + r.step < r.high do print(sep); + } + print("\n"); +} + print :: proc #overloaded { print_string, print_cstring, print_i64, print_i32, print_bool, print_ptr, + print_range, } // This works on both slices and arrays @@ -44,7 +53,7 @@ print_buffer_flush :: proc { ^print_buffer |> string_builder_to_string() |> system.output_string(); - + ^print_buffer |> string_builder_clear(); } diff --git a/docs/plan b/docs/plan index 8b0c0b62..d11718c2 100644 --- a/docs/plan +++ b/docs/plan @@ -241,6 +241,10 @@ HOW: * slice * dynamic array + [ ] Don't include foreign functions unless they're used + - Do multiple passes if needed + - Some APIs like WebGL have a ton of foreigns, and most of them aren't even used + [ ] baked parameters - Compile time known parameters - Removes the argument from the list and replaces the function with the diff --git a/examples/01_hello_world.onyx b/examples/01_hello_world.onyx new file mode 100644 index 00000000..4e1e7e68 --- /dev/null +++ b/examples/01_hello_world.onyx @@ -0,0 +1,60 @@ +package main +// Every file is part of a package, which is specified on the first line of the file. +// If no package name is specified, the file is implicitly part of the 'main' package. +// So, the package specification above is redudant, but is there for sake of completeness. + +// There are many source files that make up the 'core' package. While you can include them +// all separately, they can all be included by including 'core/std/'. +// +// Right now, there are two targets, wasi and js. They are mostly the same, except the js +// target does not include functionality for file systems, since js does not have direct +// access to the file system like wasi does. +// +// It is important to note, that these 'includes' are not C-style includes. They are NOT +// textual substitutions. They simply tell the compiler that another file should be +// added to the queue of files to load. When all files in the queue have been parsed, +// the compiler can continue with the compilation process. You can also include the +// same file as many times as you want. The redudant copies will be discarded. +#include_file "core/std/wasi" + +// All of the functionality we need is in the 'core' package. Unlike other package systems, +// there is no way to reference symbols in a package without specifically 'using' it. This +// prevents a cluttered global namespace. +// +// In Onyx, there are a couple way to control the 'use package' statement. The example below +// brings in ALL symbols from the 'core' package to the current package scope. This is handy, +// but if there are symbols with the same name in multiple packages, there will be conflicts. +// To address this, Onyx has two ways of controlling which symbols are included. +// +// use package core as core_pkg +// +// The above makes all symbols in the 'core' package available under the 'core_pkg' symbol, +// i.e. core_pkg.some_symbol. This is called a qualified use. The name does not have to be +// different from the package name, so you could say something like, 'use package core as core'. +// +// use package core { some_symbol, some_other_symbol as sos } +// +// This next exmaple makes the symbol, 'some_symbol', accessible in the current package scope. +// This is useful if there is only one thing you need from a package and you do not want to +// worry about conflicting symbol names in the future. This example also makes the symbol, +// 'some_other_symbol', accessible in the current package scope under the name, 'sos'. This +// is useful if a symbol name is long and you use it a lot in a package. +// +// As you may expect, you can also combine both of these features into one statement, such as, +// +// use package core as core_pkg { some_symbol, some_other_symbol as sos } +use package core + +// This is the main procedure. It is a convention when using the 'core/std/...' files that this +// procedure is called when the program starts. There is nothing really special going on here; +// you can go look in core/sys/wasi.onyx to see how the actual _start procedure works. At the +// end it simply calls main.main, which is this procedure. By convention, main takes a slice +// of cstrings, which were the arguments passed from the command line. We will talk about +// slices later. +main :: proc (args: [] cstring) { + + // This is the actual call to print, which will print the message 'Hello World!\n' onto the screen. + // It is not too important to know how this works, but if you are interested you can find the + // definition for print at core/stdio.onyx. + print("Hello World!\n"); +} diff --git a/examples/02_variables.onyx b/examples/02_variables.onyx new file mode 100644 index 00000000..253c7fb7 --- /dev/null +++ b/examples/02_variables.onyx @@ -0,0 +1,30 @@ +// This time, we are not adding, 'package main' to the top of the file, since +// every file is automatically part of the main package unless specified otherwise. + +#include_file "core/std/wasi" + +use package core + +main :: proc (args: [] cstring) { + + // This is the syntax for declaring a local variable in a procedure. + foo: i32; + foo = 10; + + // You don't have to put the declaration and assignment on different lines. + footwo: i32 = 10; + + // If you leave the type out between the : and the =, the type is automatically + // inferred from the right hand side of the equals. + bar := 15; + + print("foo is "); + print(foo); + print("\n"); + print("footwo is "); + print(footwo); + print("\n"); + print("bar is "); + print(bar); + print("\n"); +} diff --git a/examples/03_basics.onyx b/examples/03_basics.onyx new file mode 100644 index 00000000..0ce0ecbd --- /dev/null +++ b/examples/03_basics.onyx @@ -0,0 +1,178 @@ +// Now, lets go over the basic types and control flow mechanisms in Onyx. + +#include_file "core/std/wasi" + +use package core + +main :: proc (args: [] cstring) { + // Here is a list of all the builtin types: + // void + // bool + // i8 u8 (signed vs unsigned variants) + // i16 u16 + // i32 u32 + // i64 u64 + // f32 f64 + // rawptr + // string + // cstring + // range + // + // If you look in core/builtin.onyx, you can see the definition for some + // of these types in terms of other types. Let's look at some of those types. + + // A pointer in Onyx is written as ^. This is read as 'a pointer to a '. + // I will not type to explain what a pointer is here, but it is something to note + // that pointers in Onyx are only 4-bytes instead of 8-bytes, since Onyx's compile + // target is WASM32. + // + // Here foo is an i32. The unary prefix ^ operator takes the address of a value. + // The type of foo_ptr is ^i32, or a pointer to an i32. Another example of a pointer + // is the cstring builtin. It is ^u8, which is what C would call a char*. + foo := 10; + foo_ptr := ^foo; + + print("foo is "); + print(foo); + print("\n"); + print("foo_ptr is "); + print(foo_ptr); + print("\n"); + + + // An important type to know before proceeding is the range type. When designing + // the language, there were a couple places where the idea of a range as very + // natural, such as for loop iteration, and making slices. The range type in + // Onyx is simply defined as a structure with 3 members: low, high, and step. + // A range represents values between low and high, including low but not including + // high, with a certain step between them. For example a range with values 5, 25, 2, + // represents the numbers 5, 7, 9, .. 21, 23. While you can use the range structure, + // it is more common to use a range literal, which is written below. 'rng' represents + // a range with a low of 5, a high of 25, and a step of 1. Currently there is no way + // to specify the step in a range literal. + rng := 5 .. 25; + print("rng is "); + print(rng); + + // Onyx has 3 different array-like types: + // * Fixed-size arrays, written [N] , where N is a compile time know integer. + // * Slices, written [] . + // * Dynamic arrays, written [..] . + // + // Fixed size arrays are not commonly used because of their limited flexibility. + // They are commonly seen as struct members or local variables. Here is an example + // of creating and using a fixed size array. This uses a for-loop which we have not + // looked at yet, but the example should be self-explanitory. + fixed_arr : [10] i32; + for i: 0 .. 10 { + fixed_arr[i] = i * i; + } + print("fixed_arr[3] is "); + print(fixed_arr[3]); + print("\n"); + + + // Slices are a concept not unique to Onyx. They represent a pointer and a count, + // which allows them to be passed around conveying multiple pieces of information. + // To create a slice, you either need a pointer or a fixed size array. Simply, do + // an array access with the type of the index being a range. This creates a slice. + // + // Think of this example as letting slice_arr be a sub-array of fixed_arr. When + // the 3rd element of slice_arr is accessed, it corresponds to the 6th element + // of fixed_arr. It is important to know that this does NOT make a copy of the + // data. It simply points into the same memory as fixed_arr. + slice_arr := fixed_arr[3 .. 9]; + print("slice_arr[3] is "); + print(slice_arr[3]); + print("\n"); + + + // Dynamic arrays are the most common arrays used in practice. They represent a + // pointer, a count, and a capacity. The extra capacity field allows implementations + // to know how many elements can fit into the space allocated for the array, and not + // just how many elements are currently in the array. To facilitate using dynamic + // arrays, there are many array_ procedures in the core package. Take this example. + dyn_arr : [..] i32; + array_init(^dyn_arr); + defer array_free(^dyn_arr); + + for i: 0 .. 100 { + array_push(^dyn_arr, i * i * i); + } + + print("dyn_arr is "); + print_array(dyn_arr); + + + + // I think that's enough about types for now. Lets look at the ways to manage control + // flow in an Onyx program. + + // An important things to know before looking at control flow are the different ways + // Onyx allows you to create a block. Blocks are used by all methods of control flow + // and can be declared in one of three ways: + // * { ... } - Curly braces surrounding a set of semi-colon delimited statements. + // * do ... - The do keyword followed by one statement. + // * --- - The empty block which has no statements, equivalent to {}. + + // Onyx has standard if statement semantics. Each if statement contains a condition, + // followed by a block. For this reason if-elseif chains have to be written with an + // elseif keyword. Otherwise, you would have to write 'else do if', which I find to + // be very ugly to read and is technically different, more on that later. + + if_var := 5 * 2 + 3; + if if_var == 13 { + print("if_var was 13\n"); + print("another statement here!\n"); + } + elseif if_var == 14 do print("if_var was actually 14\n"); + else do print("if_var wasn't 13 or 14\n"); + + // Ifs, as well as whiles and switch statements, can have a single initialized variable + // that is scoped to the blocks of the if statement and all else statements. + + if hidden_if_var := 6; hidden_if_var > 5 { + print("hidden_if_var was greater than 5!\n"); + } + + // If you uncomment this line, you will get an error, since hidden_if_var is only accessible + // inside the if's block. + // print(hidden_if_var); + + + // Onyx has the standard top-test while loop, whose syntax is very similar to an if + // statement. The only unique thing about Onyx's while loops, is that they can have + // a 'else' clause. If the body of the loop is never run, i.e. the condition was + // false originally, then the else clause is used. Try changing the initial value + // for i to be 11. + + while i := 0; i < 10 { + print(i); + print(" "); + i += 1; + } else { + print("The while loop never ran..."); + } + + print("\n"); + + + // Onyx also has the standard 'break' and 'continue' statement found in many other + // imperative programming languages, but with a slight twist. It is not uncommon to + // be in a nested loop and want to either completely break out of all of the loops, + // or to skip to the next iteration of an outer loop. For this reason, Onyx allows + // you to place as many 'break' or 'continue' statements in a row as you need to + // break or continue the loop that you want to. Take this example. + while i := 0; i < 10 { + while j := 0; j < 10 { + print(i); + print(" "); + print(j); + print("\n"); + + if i == 1 && j == 2 do break break; + j += 1; + } + i += 1; + } +} diff --git a/misc/onyx.vim b/misc/onyx.vim index eceb008a..1f1c588e 100644 --- a/misc/onyx.vim +++ b/misc/onyx.vim @@ -10,7 +10,7 @@ endif let s:cpo_save = &cpo set cpo&vim -syn keyword onyxKeyword package struct proc use global +syn keyword onyxKeyword package struct enum proc use global syn keyword onyxKeyword if elseif else syn keyword onyxKeyword for while do syn keyword onyxKeyword switch case @@ -32,7 +32,7 @@ syn keyword onyxCommentStart contained TODO NOTE BUG HACK syn region onyxComment start="//" end="$" keepend contains=onyxCommentStart -syn region onyxDirective start="#" end=" " keepend +syn region onyxDirective start="#" end=" " syn region onyxString display start=+"+ skip=+\\\\\|\\"+ end=+"+ keepend diff --git a/onyx b/onyx index 4bf58d112dfa464587c19338e2baab937a0090ad..63595b46e8f882a0dceb690f5844b2561bdc3630 100755 GIT binary patch delta 19138 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 SBK8fi)8gLV` delta 19144 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 get_range() |> by(3); print(r); print_array(^s.a); + print("A has 22? "); + print(array_contains(^s.a, 22)); + print("\n"); // NOTE: Iterating by value for vec: s.c { diff --git a/src/onyxwasm.c b/src/onyxwasm.c index bddcf32e..4e8fb945 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -564,7 +564,7 @@ EMIT_FUNC(store_instruction, Type* type, u32 offset) { i32 store_size = type_size_of(type); i32 is_basic = type->kind == Type_Kind_Basic || type->kind == Type_Kind_Pointer; i32 is_pointer = is_basic && (type->Basic.flags & Basic_Flag_Pointer); - i32 is_integer = is_basic && (type->Basic.flags & Basic_Flag_Integer); + i32 is_integer = is_basic && ((type->Basic.flags & Basic_Flag_Integer) || (type->Basic.flags & Basic_Flag_Boolean)); i32 is_float = is_basic && (type->Basic.flags & Basic_Flag_Float); if (is_pointer) { @@ -615,7 +615,7 @@ EMIT_FUNC(load_instruction, Type* type, u32 offset) { i32 load_size = type_size_of(type); i32 is_basic = type->kind == Type_Kind_Basic || type->kind == Type_Kind_Pointer; i32 is_pointer = is_basic && (type->Basic.flags & Basic_Flag_Pointer); - i32 is_integer = is_basic && (type->Basic.flags & Basic_Flag_Integer); + i32 is_integer = is_basic && ((type->Basic.flags & Basic_Flag_Integer) || (type->Basic.flags & Basic_Flag_Boolean)); i32 is_float = is_basic && (type->Basic.flags & Basic_Flag_Float); i32 is_unsigned = is_basic && (type->Basic.flags & Basic_Flag_Unsigned); -- 2.25.1