Commit c6fff3b2c0

Andrew Kelley <superjoe30@gmail.com>
2015-12-07 05:55:28
update README
1 parent daa3b6b
Changed files (1)
README.md
@@ -2,82 +2,118 @@
 
 An experiment in writing a low-level programming language with the intent to
 replace C. Zig intends to be a small language, yet powerful enough to write
-readable, safe, optimal, and concise code to solve any computing problem.
+optimal, readable, safe, and concise code to solve any computing problem.
+
+Porting a C project to Zig should be a pleasant experience - every C feature
+needs a corresponding Zig feature which solves the problem equivalently or
+better.
+
+Zig is not afraid to roll the major version number of the language if it
+improves simplicity, fixes poor design decisions, or adds a new feature which
+compromises backward compatibility.
 
 ## Goals
 
- * Ability to run arbitrary code at compile time and generate code.
  * Completely compatible with C libraries with no wrapper necessary.
- * Creating a C library should be a primary use case. Should be easy to export
-   an auto-generated .h file.
- * Generics such as containers.
+ * In addition to creating executables, creating a C library is a primary use
+   case. You can export an auto-generated .h file.
  * Do not depend on libc unless explicitly imported.
- * First class error code support.
- * Include documentation generator.
- * Eliminate the need for make, cmake, etc.
- * Friendly toward package maintainers.
- * Eliminate the need for C headers (when using zig internally).
- * Ability to declare dependencies as Git URLS with commit locking (can
-   provide a tag or sha1).
+ * Provide standard library which competes with the C standard library and is
+   always compiled against statically in source form.
+ * Generics so that one can write efficient data structures that work for any
+   data type.
+ * Ability to run arbitrary code at compile time and generate code.
+ * A type which represents an error and has some convenience syntax with
+   regards to resources.
+ * Defer statement.
+ * Memory zeroed by default, unless you explicitly ask for uninitialized memory.
+ * Eliminate the need for configure, make, cmake, etc.
+ * Eliminate the need for header files (when using zig internally).
  * Tagged union enum type.
- * Opinionated when it makes life easier.
-   - Tab character in source code is a compile error.
-   - Whitespace at the end of line is a compile error.
  * Resilient to parsing errors to make IDE integration work well.
  * Source code is UTF-8.
- * Shebang line OK so language can be used for "scripting" as well.
  * Ability to mark functions as test and automatically run them in test mode.
    This mode should automatically provide test coverage.
- * Memory zeroed by default, unless you initialize with "uninitialized".
+ * Friendly toward package maintainers.
+ * Ability to declare dependencies as Git URLS with commit locking (can
+   provide a tag or sha1).
+ * Include documentation generator.
+ * Shebang line OK so language can be used for "scripting" as well.
 
-### Building
+### Current Status
 
-```
-mkdir build
-cd build
-cmake ..
-make
-./run_tests
-```
+ * Core language features are lacking such as structs, enums, loops.
+ * Have a look in the examples/ folder to see some code examples.
+ * Optimized machine code that Zig produces is indistinguishable from
+   optimized machine code produced from equivalent C program.
+ * Generating dynamic libraries, executables, object files, and C header files
+   works.
 
-## Roadmap
+### Roadmap
 
- * loops
  * structs
- * tagged enums
+ * loops
+ * enums
  * calling external variadic functions and exporting variadic functions
  * inline assembly and syscalls
  * conditional compilation and ability to check target platform and architecture
  * main function with command line arguments
+ * void pointer constant
+ * sizeof
+ * static initializers
+ * assert
+ * function pointers
  * running code at compile time
- * print! macro that takes var args
- * panic! macro that prints a stack trace to stderr in debug mode and calls
-   abort() in release mode
+ * standard library print functions
+ * panic! macro or statement that prints a stack trace to stderr in debug mode
+   and calls abort() in release mode
  * unreachable codegen to panic("unreachable") in debug mode, and nothing in
    release mode
  * implement a simple game using SDL2
- * How should the Widget use case be solved? In Genesis I'm using C++ and inheritance.
-
-### Primitive Numeric Types:
-
-zig    | C equivalent | Description
--------|--------------|-------------------------------
-  bool |         bool |  unsigned 1-bit integer
-    i8 |       int8_t |    signed 8-bit integer
-    u8 |      uint8_t |  unsigned 8-bit integer
-   i16 |      int16_t |   signed 16-bit integer
-   u16 |     uint16_t | unsigned 16-bit integer
-   i32 |      int32_t |   signed 32-bit integer
-   u32 |     uint32_t | unsigned 32-bit integer
-   i64 |      int64_t |   signed 64-bit integer
-   u64 |     uint64_t | unsigned 64-bit integer
-   f32 |        float |  32-bit IEE754 floating point
-   f64 |       double |  64-bit IEE754 floating point
-  f128 |  long double | 128-bit IEE754 floating point
- isize |     intptr_t |   signed pointer sized integer
- usize |    uintptr_t | unsigned pointer sized integer
-
-### Grammar
+ * implement a GUI with several types of widgets and investigate whether we need
+   any OOP features
+
+## Building
+
+```
+mkdir build
+cd build
+cmake ..
+make
+./run_tests
+```
+
+## Primitive Numeric Types:
+
+zig          |        C equivalent | Description
+-------------|---------------------|-------------------------------
+        bool |                bool |  unsigned 1-bit integer
+          i8 |              int8_t |    signed 8-bit integer
+          u8 |             uint8_t |  unsigned 8-bit integer
+         i16 |             int16_t |   signed 16-bit integer
+         u16 |            uint16_t | unsigned 16-bit integer
+         i32 |             int32_t |   signed 32-bit integer
+         u32 |            uint32_t | unsigned 32-bit integer
+         i64 |             int64_t |   signed 64-bit integer
+         u64 |            uint64_t | unsigned 64-bit integer
+         f32 |               float |  32-bit IEE754 floating point
+         f64 |              double |  64-bit IEE754 floating point
+        f128 |         long double | 128-bit IEE754 floating point
+       isize |            intptr_t |   signed pointer sized integer
+       usize |           uintptr_t | unsigned pointer sized integer
+      c_char |                char | for API compatibility with C
+     c_schar |         signed char | for API compatibility with C
+     c_uchar |       unsigned char | for API compatibility with C
+     c_short |               short | for API compatibility with C
+    c_ushort |      unsigned short | for API compatibility with C
+       c_int |                 int | for API compatibility with C
+      c_uint |        unsigned int | for API compatibility with C
+      c_long |                long | for API compatibility with C
+     c_ulong |       unsigned long | for API compatibility with C
+  c_longlong |           long long | for API compatibility with C
+ c_ulonglong |  unsigned long long | for API compatibility with C
+
+## Grammar
 
 ```
 Root : many(TopLevelDecl) token(EOF)
@@ -116,7 +152,9 @@ Label: token(Symbol) token(Colon)
 
 Expression : BlockExpression | NonBlockExpression
 
-NonBlockExpression : ReturnExpression | VariableDeclaration | BoolOrExpression
+NonBlockExpression : ReturnExpression | VariableDeclaration | AssignmentExpression
+
+AssignmentExpression : BoolOrExpression token(Equal) BoolOrExpression | BoolOrExpression
 
 BlockExpression : IfExpression | Block
 
@@ -124,7 +162,7 @@ BoolOrExpression : BoolAndExpression token(BoolOr) BoolAndExpression | BoolAndEx
 
 ReturnExpression : token(Return) option(Expression)
 
-VariableDeclaration : token(Let) token(Symbole) (token(Eq) Expression | token(Colon) Type option(token(Eq) Expression))
+VariableDeclaration : token(Let) option(token(Mut)) token(Symbol) (token(Eq) Expression | token(Colon) Type option(token(Eq) Expression))
 
 IfExpression : token(If) Expression Block option(Else | ElseIf)
 
@@ -173,7 +211,7 @@ GroupedExpression : token(LParen) Expression token(RParen)
 KeywordLiteral : token(Unreachable) | token(Void) | token(True) | token(False)
 ```
 
-### Operator Precedence
+## Operator Precedence
 
 ```
 x()