ad37f0ee9f399d38cac940eb0ca94f16f3e71ef1 — Martin Angers 8 months ago
initial attempt
2 files changed, 64 insertions(+), 0 deletions(-)

A README.md
A syntax/overview.snow
A  => README.md +6 -0
@@ 1,6 @@
+# snow - a small, natively compiled, statically-typed programming language
+
+* Use qbe as initial backend
+* Small number of orthogonal concepts
+* Developer-friendly, fun to work with
+* Little magic

A  => syntax/overview.snow +58 -0
@@ 1,58 @@
+# `mod` defines the current module name.
+# A module is the namespace for the symbols defined inside it,
+# and must be used to reference such a symbol when imported in
+# a different module.
+mod example
+
+# `import` imports a module. If the import path is a valid identifier,
+# it may be specified without quotes; otherwise, the import path is
+# specified in quotes and resolved based on the compiler's module
+# search path.
+import http, json, "github.com/some3rdparty/other"
+
+# This is a single-line comment. There is no multiline comment.
+
+# `var` declares a (mutable) variable. Top-level variables are global to the
+# module.
+var s str
+
+# A block can be started after most keywords (`var`, `let`, `import`,
+# `type`, etc.) and the included statements all have that keyword apply, so the
+# following declares 4 variables.
+var {
+  x i8
+  y i32
+  z u64
+  b bool
+}
+
+# `let` declares a read-only "variable" or constant. It must be assigned
+# before use, and can only be assigned once.
+let pi = 3.1415
+
+# Primitive types are the usual suspects:
+#
+# u8, u16, u32, u64 => unsigned integers
+# i8, i16, i32, i64 => signed integers
+# f32, f64 => floating-point numbers
+# bool => boolean (true, false)
+
+# The array is a built-in aggregate data type. It holds values of the same type.
+var ar [4]u8 = [1, 2, 3, 4]
+
+# The struct is another built-in aggregate data type. It holds a pre-defined number
+# of values of possibly different types. A new data type is introduced by the
+# `type` keyword.
+type Person struct {
+  # fields of a struct can be mutable or not.
+  var age i8
+  let id u32
+
+  # methods are defined by implementing a function inside the struct block.
+  # There is an implicit `self` argument, but it is seldom required to type
+  # because unknown variables are automatically resolved by looking at the
+  # struct fields.
+  fn print() {
+    printf("person: {}, age {}", id, age)
+  }
+}