summaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md180
1 files changed, 170 insertions, 10 deletions
diff --git a/README.md b/README.md
index 0c5bd0a..bf4962e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,12 @@
<div align="center">
+[English](README.md) • [简体中文](README_ZH_CN.md) • [繁體中文](README_ZH_TW.md) • [Español](README_ES.md)
+
+</div>
+
+<div align="center">
+
# Zen C
**Modern Ergonomics. Zero Overhead. Pure C.**
@@ -43,9 +49,11 @@ Join the discussion, share demos, ask questions, or report bugs in the official
- [Arrays](#arrays)
- [Tuples](#tuples)
- [Structs](#structs)
+ - [Opaque Structs](#opaque-structs)
- [Enums](#enums)
- [Unions](#unions)
- [Type Aliases](#type-aliases)
+ - [Opaque Type Aliases](#opaque-type-aliases)
- [4. Functions & Lambdas](#4-functions--lambdas)
- [Functions](#functions)
- [Const Arguments](#const-arguments)
@@ -91,6 +99,7 @@ Join the discussion, share demos, ask questions, or report bugs in the official
- [Volatile](#volatile)
- [Named Constraints](#named-constraints)
- [15. Build Directives](#15-build-directives)
+ - [16. Keywords](#16-keywords)
- [Standard Library](#standard-library)
- [Tooling](#tooling)
- [Language Server (LSP)](#language-server-lsp)
@@ -100,6 +109,8 @@ Join the discussion, share demos, ask questions, or report bugs in the official
- [Building with Zig](#building-with-zig)
- [C++ Interop](#c-interop)
- [CUDA Interop](#cuda-interop)
+ - [Objective-C Interop](#objective-c-interop)
+ - [C23 Support](#c23-support)
- [Contributing](#contributing)
- [Attributions](#attributions)
@@ -154,7 +165,7 @@ zc repl
### Environment Variables
-You can set `ZC_ROOT` to specify the location of the Standard Library (standard imports like `import "std/vector.zc"`). This allows you to run `zc` from any directory.
+You can set `ZC_ROOT` to specify the location of the Standard Library (standard imports like `import "std/vec.zc"`). This allows you to run `zc` from any directory.
```bash
export ZC_ROOT=/path/to/Zen-C
@@ -187,6 +198,8 @@ let y: const int = 10; // Read-only (Type qualified)
// y = 20; // Error: cannot assign to const
```
+> **Type Inference**: Zen C automatically infers types for initialized variables. It compiles to C23 `auto` on supported compilers, or GCC's `__auto_type` extension otherwise.
+
### 2. Primitive Types
| Type | C Equivalent | Description |
@@ -201,6 +214,8 @@ let y: const int = 10; // Read-only (Type qualified)
| `char` | `char` | Single character |
| `string` | `char*` | C-string (null-terminated) |
| `U0`, `u0`, `void` | `void` | Empty type |
+| `iN` (for example, `i256`) | `_BitInt(N)` | Arbitrary bit-width signed integer (C23) |
+| `uN` (for example, `u42`) | `unsigned _BitInt(N)` | Arbitrary bit-width unsigned integer (C23) |
### 3. Aggregate Types
@@ -261,6 +276,29 @@ struct Flags {
> **Note**: Structs use [Move Semantics](#move-semantics--copy-safety) by default. Fields can be accessed via `.` even on pointers (Auto-Dereference).
+#### Opaque Structs
+You can define a struct as `opaque` to restrict access to its fields to the defining module only, while still allowing the struct to be allocated on the stack (size is known).
+
+```zc
+// In user.zc
+opaque struct User {
+ id: int;
+ name: string;
+}
+
+fn new_user(name: string) -> User {
+ return User{id: 1, name: name}; // OK: Inside module
+}
+
+// In main.zc
+import "user.zc";
+
+fn main() {
+ let u = new_user("Alice");
+ // let id = u.id; // Error: Cannot access private field 'id'
+}
+```
+
#### Enums
Tagged unions (Sum types) capable of holding data.
```zc
@@ -287,6 +325,27 @@ alias ID = int;
alias PointMap = Map<string, Point>;
```
+#### Opaque Type Aliases
+You can define a type alias as `opaque` to create a new type that is distinct from its underlying type outside of the defining module. This provides strong encapsulation and type safety without the runtime overhead of a wrapper struct.
+
+```zc
+// In library.zc
+opaque alias Handle = int;
+
+fn make_handle(v: int) -> Handle {
+ return v; // Implicit conversion allowed inside module
+}
+
+// In main.zc
+import "library.zc";
+
+fn main() {
+ let h: Handle = make_handle(42);
+ // let i: int = h; // Error: Type validation failed
+ // let h2: Handle = 10; // Error: Type validation failed
+}
+```
+
### 4. Functions & Lambdas
#### Functions
@@ -435,8 +494,15 @@ for i in 0..<10 { ... } // Exclusive (Explicit)
for i in 0..=10 { ... } // Inclusive (0 to 10)
for i in 0..10 step 2 { ... }
-// Iterator (Vec, Array, or custom Iterable)
-for item in collection { ... }
+// Iterator (Vec or custom Iterable)
+for item in vec { ... }
+
+// Iterate over fixed-size arrays directly
+let arr: int[5] = [1, 2, 3, 4, 5];
+for val in arr {
+ // val is int
+ println "{val}";
+}
// While
while x < 10 { ... }
@@ -478,6 +544,11 @@ Zen C supports operator overloading for user-defined structs by implementing spe
| **Index** | `a[i]` | `get(a, i)` |
| | `a[i] = v` | `set(a, i, v)` |
+> **Note on String Equality**:
+> - `string == string` performs **value comparison** (equivalent to `strcmp`).
+> - `char* == char*` performs **pointer comparison** (checks memory addresses).
+> - Mixed comparisons (e.g. `string == char*`) default to **pointer comparison**.
+
**Example:**
```zc
impl Point {
@@ -543,7 +614,7 @@ Zen C supports a shorthand for prompting user input using the `?` prefix.
- `? "Enter age: " (age)`: Prints prompt and scans input into the variable `age`.
- Format specifiers are automatically inferred based on variable type.
-```c
+```zc
let age: int;
? "How old are you? " (age);
println "You are {age} years old.";
@@ -875,9 +946,10 @@ Decorate functions and structs to modify compiler behavior.
| `@host` | Fn | CUDA: Host function (`__host__`). |
| `@comptime` | Fn | Helper function available for compile-time execution. |
| `@derive(...)` | Struct | Auto-implement traits. Supports `Debug`, `Eq` (Smart Derive), `Copy`, `Clone`. |
+| `@ctype("type")` | Fn Param | Overrides generated C type for a parameter. |
| `@<custom>` | Any | Passes generic attributes to C (e.g. `@flatten`, `@alias("name")`). |
-### Custom Attributes
+#### Custom Attributes
Zen C supports a powerful **Custom Attribute** system that allows you to use any GCC/Clang `__attribute__` directly in your code. Any attribute that is not explicitly recognized by the Zen C compiler is treated as a generic attribute and passed through to the generated C code.
@@ -889,7 +961,7 @@ Zen C attributes are mapped directly to C attributes:
- `@name(args)` → `__attribute__((name(args)))`
- `@name("string")` → `__attribute__((name("string")))`
-### Smart Derives
+#### Smart Derives
Zen C provides "Smart Derives" that respect Move Semantics:
@@ -955,12 +1027,33 @@ Zen C supports special comments at the top of your source file to configure the
| `//> link:` | `-lfoo` or `path/to/lib.a` | Link against a library or object file. |
| `//> lib:` | `path/to/libs` | Add a library search path (`-L`). |
| `//> include:` | `path/to/headers` | Add an include search path (`-I`). |
+| `//> framework:` | `Cocoa` | Link against a macOS framework. |
| `//> cflags:` | `-Wall -O3` | Pass arbitrary flags to the C compiler. |
| `//> define:` | `MACRO` or `KEY=VAL` | Define a preprocessor macro (`-D`). |
| `//> pkg-config:` | `gtk+-3.0` | Run `pkg-config` and append `--cflags` and `--libs`. |
| `//> shell:` | `command` | Execute a shell command during the build. |
| `//> get:` | `http://url/file` | Download a file if specific file does not exist. |
+#### Features
+
+**1. OS Guarding**
+Prefix directives with an OS name to apply them only on specific platforms.
+Supported prefixes: `linux:`, `windows:`, `macos:` (or `darwin:`).
+
+```zc
+//> linux: link: -lm
+//> windows: link: -lws2_32
+//> macos: framework: Cocoa
+```
+
+**2. Environment Variable Expansion**
+Use `${VAR}` syntax to expand environment variables in your directives.
+
+```zc
+//> include: ${HOME}/mylib/include
+//> lib: ${ZC_ROOT}/std
+```
+
#### Examples
```zc
@@ -975,6 +1068,29 @@ import "raylib.h"
fn main() { ... }
```
+### 16. Keywords
+
+The following keywords are reserved in Zen C.
+
+#### Declarations
+`alias`, `def`, `enum`, `fn`, `impl`, `import`, `let`, `module`, `opaque`, `struct`, `trait`, `union`, `use`
+
+#### Control Flow
+`async`, `await`, `break`, `catch`, `continue`, `defer`, `else`, `for`, `goto`, `guard`, `if`, `loop`, `match`, `return`, `try`, `unless`, `while`
+
+#### Special
+`asm`, `assert`, `autofree`, `comptime`, `const`, `embed`, `launch`, `ref`, `sizeof`, `static`, `test`, `volatile`
+
+#### Constants
+`true`, `false`, `null`
+
+#### C Reserved
+The following identifiers are reserved because they are keywords in C11:
+`auto`, `case`, `char`, `default`, `do`, `double`, `extern`, `float`, `inline`, `int`, `long`, `register`, `restrict`, `short`, `signed`, `switch`, `typedef`, `unsigned`, `void`, `_Atomic`, `_Bool`, `_Complex`, `_Generic`, `_Imaginary`, `_Noreturn`, `_Static_assert`, `_Thread_local`
+
+#### Operators
+`and`, `or`
+
---
## Standard Library
@@ -997,6 +1113,13 @@ Zen C includes a standard library (`std`) covering essential functionality.
| **`std/result.zc`** | Error handling (`Ok`/`Err`). | [Docs](docs/std/result.md) |
| **`std/path.zc`** | Cross-platform path manipulation. | [Docs](docs/std/path.md) |
| **`std/env.zc`** | Process environment variables. | [Docs](docs/std/env.md) |
+| **`std/net.zc`** | TCP networking (Sockets). | [Docs](docs/std/net.md) |
+| **`std/thread.zc`** | Threads and Synchronization. | [Docs](docs/std/thread.md) |
+| **`std/time.zc`** | Time measurement and sleep. | [Docs](docs/std/time.md) |
+| **`std/json.zc`** | JSON parsing and serialization. | [Docs](docs/std/json.md) |
+| **`std/stack.zc`** | LIFO Stack `Stack<T>`. | [Docs](docs/std/stack.md) |
+| **`std/set.zc`** | Generic Hash Set `Set<T>`. | [Docs](docs/std/set.md) |
+| **`std/process.zc`** | Process execution and management. | [Docs](docs/std/process.md) |
---
@@ -1185,7 +1308,7 @@ fn add_kernel(a: float*, b: float*, c: float*, n: int) {
}
fn main() {
- const N = 1024;
+ def N = 1024;
let d_a = cuda_alloc<float>(N);
let d_b = cuda_alloc<float>(N);
let d_c = cuda_alloc<float>(N);
@@ -1227,6 +1350,45 @@ let tid = local_id();
> **Note:** The `--cuda` flag sets `nvcc` as the compiler and implies `--cpp` mode. Requires the NVIDIA CUDA Toolkit.
+### C23 Support
+
+Zen C supports modern C23 features when using a compatible backend compiler (GCC 14+, Clang 14+, TCC (partial)).
+
+- **`auto`**: Zen C automatically maps type inference to standard C23 `auto` if `__STDC_VERSION__ >= 202300L`.
+- **`_BitInt(N)`**: Use `iN` and `uN` types (e.g., `i256`, `u12`, `i24`) to access C23 arbitrary-width integers.
+
+### Objective-C Interop
+
+Zen C can compile to Objective-C (`.m`) using the `--objc` flag, allowing you to use Objective-C frameworks (like Cocoa/Foundation) and syntax.
+
+```bash
+# Compile with clang (or gcc/gnustep)
+zc app.zc --objc --cc clang
+```
+
+#### Using Objective-C in Zen C
+
+Use `include` for headers and `raw` blocks for Objective-C syntax (`@interface`, `[...]`, `@""`).
+
+```zc
+//> macos: framework: Foundation
+//> linux: cflags: -fconstant-string-class=NSConstantString -D_NATIVE_OBJC_EXCEPTIONS
+//> linux: link: -lgnustep-base -lobjc
+
+include <Foundation/Foundation.h>
+
+fn main() {
+ raw {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ NSLog(@"Hello from Objective-C!");
+ [pool drain];
+ }
+ println "Zen C works too!";
+}
+```
+
+> **Note:** Zen C string interpolation works with Objective-C objects (`id`) by calling `debugDescription` or `description`.
+
---
## Contributing
@@ -1267,10 +1429,8 @@ make test
## Attributions
-This project uses the following third-party libraries:
-
+This project uses third-party libraries. Full license texts can be found in the `LICENSES/` directory.
* **[cJSON](https://github.com/DaveGamble/cJSON)** (MIT License): Used for JSON parsing and generation in the Language Server.
- * Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
* **[zc-ape](https://github.com/OEvgeny/zc-ape)** (MIT License): The original Actually Portable Executable port of Zen-C by [Eugene Olonov](https://github.com/OEvgeny).
* **[Cosmopolitan Libc](https://github.com/jart/cosmopolitan)** (ISC License): The foundational library that makes APE possible.