feat: add example scripts for argparse, bytes, dataset, html, markdown, uuid, wdantic, and web chat modules

Add comprehensive demo scripts showcasing the usage of multiple Wren modules including argument parsing, byte manipulation, in-memory dataset operations, HTML encoding/slugification, markdown-to-HTML conversion, UUID generation/validation, schema validation with wdantic, and a full web chat application with REST endpoints.
This commit is contained in:
2026-01-24 22:40:22 +00:00
parent 0a65272f80
commit 5a4054ec66
105 changed files with 23275 additions and 94 deletions
+303
View File
@@ -0,0 +1,303 @@
<!DOCTYPE html>
<!-- retoor <retoor@molodetz.nl> -->
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>First Script - Wren-CLI Manual</title>
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<button class="mobile-menu-toggle">Menu</button>
<div class="container">
<aside class="sidebar">
<div class="sidebar-header">
<h1><a href="../index.html">Wren-CLI</a></h1>
<div class="version">v0.4.0</div>
</div>
<nav class="sidebar-nav">
<div class="section">
<span class="section-title">Getting Started</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="installation.html">Installation</a></li>
<li><a href="first-script.html" class="active">First Script</a></li>
<li><a href="repl.html">Using the REPL</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Language</span>
<ul>
<li><a href="../language/index.html">Syntax Overview</a></li>
<li><a href="../language/classes.html">Classes</a></li>
<li><a href="../language/methods.html">Methods</a></li>
<li><a href="../language/control-flow.html">Control Flow</a></li>
<li><a href="../language/fibers.html">Fibers</a></li>
<li><a href="../language/modules.html">Modules</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/http.html">http</a></li>
<li><a href="../api/websocket.html">websocket</a></li>
<li><a href="../api/tls.html">tls</a></li>
<li><a href="../api/net.html">net</a></li>
<li><a href="../api/dns.html">dns</a></li>
<li><a href="../api/json.html">json</a></li>
<li><a href="../api/base64.html">base64</a></li>
<li><a href="../api/regex.html">regex</a></li>
<li><a href="../api/jinja.html">jinja</a></li>
<li><a href="../api/crypto.html">crypto</a></li>
<li><a href="../api/os.html">os</a></li>
<li><a href="../api/env.html">env</a></li>
<li><a href="../api/signal.html">signal</a></li>
<li><a href="../api/subprocess.html">subprocess</a></li>
<li><a href="../api/sqlite.html">sqlite</a></li>
<li><a href="../api/datetime.html">datetime</a></li>
<li><a href="../api/timer.html">timer</a></li>
<li><a href="../api/io.html">io</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Tutorials</span>
<ul>
<li><a href="../tutorials/index.html">Tutorial List</a></li>
<li><a href="../tutorials/http-client.html">HTTP Client</a></li>
<li><a href="../tutorials/websocket-chat.html">WebSocket Chat</a></li>
<li><a href="../tutorials/database-app.html">Database App</a></li>
<li><a href="../tutorials/template-rendering.html">Templates</a></li>
<li><a href="../tutorials/cli-tool.html">CLI Tool</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">How-To Guides</span>
<ul>
<li><a href="../howto/index.html">How-To List</a></li>
<li><a href="../howto/http-requests.html">HTTP Requests</a></li>
<li><a href="../howto/json-parsing.html">JSON Parsing</a></li>
<li><a href="../howto/regex-patterns.html">Regex Patterns</a></li>
<li><a href="../howto/file-operations.html">File Operations</a></li>
<li><a href="../howto/async-operations.html">Async Operations</a></li>
<li><a href="../howto/error-handling.html">Error Handling</a></li>
</ul>
</div>
</nav>
</aside>
<main class="content">
<nav class="breadcrumb">
<a href="../index.html">Home</a>
<span class="separator">/</span>
<a href="index.html">Getting Started</a>
<span class="separator">/</span>
<span>First Script</span>
</nav>
<article>
<h1>First Script</h1>
<p>This guide walks you through creating and running your first Wren script. You will learn the basics of printing output, using variables, and importing modules.</p>
<h2>Hello World</h2>
<p>Create a file named <code>hello.wren</code> with the following content:</p>
<pre><code>System.print("Hello, World!")</code></pre>
<p>Run it:</p>
<pre><code>bin/wren_cli hello.wren</code></pre>
<div class="example-output">Hello, World!</div>
<p>The <code>System.print</code> method outputs text to the console followed by a newline.</p>
<h2>Variables and Types</h2>
<p>Wren is dynamically typed. Use <code>var</code> to declare variables:</p>
<pre><code>var name = "Wren"
var version = 0.4
var features = ["fast", "small", "class-based"]
var active = true
System.print("Language: %(name)")
System.print("Version: %(version)")
System.print("Features: %(features)")
System.print("Active: %(active)")</code></pre>
<div class="example-output">Language: Wren
Version: 0.4
Features: [fast, small, class-based]
Active: true</div>
<p>The <code>%(expression)</code> syntax is string interpolation. It evaluates the expression and inserts the result into the string.</p>
<h2>Working with Lists and Maps</h2>
<pre><code>var numbers = [1, 2, 3, 4, 5]
System.print("Count: %(numbers.count)")
System.print("First: %(numbers[0])")
System.print("Last: %(numbers[-1])")
var person = {
"name": "Alice",
"age": 30,
"city": "Amsterdam"
}
System.print("Name: %(person["name"])")</code></pre>
<div class="example-output">Count: 5
First: 1
Last: 5
Name: Alice</div>
<h2>Control Flow</h2>
<pre><code>var score = 85
if (score >= 90) {
System.print("Grade: A")
} else if (score >= 80) {
System.print("Grade: B")
} else {
System.print("Grade: C")
}
for (i in 1..5) {
System.print("Count: %(i)")
}</code></pre>
<div class="example-output">Grade: B
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5</div>
<h2>Functions</h2>
<p>Functions in Wren are created using block syntax:</p>
<pre><code>var greet = Fn.new { |name|
return "Hello, %(name)!"
}
System.print(greet.call("World"))
var add = Fn.new { |a, b| a + b }
System.print(add.call(3, 4))</code></pre>
<div class="example-output">Hello, World!
7</div>
<h2>Classes</h2>
<pre><code>class Person {
construct new(name, age) {
_name = name
_age = age
}
name { _name }
age { _age }
greet() {
System.print("Hello, I'm %(_name)")
}
}
var alice = Person.new("Alice", 30)
alice.greet()
System.print("Age: %(alice.age)")</code></pre>
<div class="example-output">Hello, I'm Alice
Age: 30</div>
<h2>Using Modules</h2>
<p>Wren-CLI provides many built-in modules. Import them to use their functionality:</p>
<pre><code>import "io" for File
var content = File.read("hello.wren")
System.print("File contents:")
System.print(content)</code></pre>
<h3>Making HTTP Requests</h3>
<pre><code>import "http" for Http
import "json" for Json
var response = Http.get("https://httpbin.org/get")
System.print("Status: %(response.status)")
var data = Json.parse(response.body)
System.print("Origin: %(data["origin"])")</code></pre>
<h3>Working with JSON</h3>
<pre><code>import "json" for Json
var data = {
"name": "Wren",
"version": 0.4,
"features": ["fast", "small"]
}
var jsonString = Json.stringify(data)
System.print(jsonString)
var parsed = Json.parse(jsonString)
System.print("Name: %(parsed["name"])")</code></pre>
<h2>Error Handling</h2>
<p>Use <code>Fiber.try</code> to catch runtime errors:</p>
<pre><code>var fiber = Fiber.new {
var x = 1 / 0
}
var error = fiber.try()
if (error) {
System.print("Error: %(error)")
}</code></pre>
<h2>Script Arguments</h2>
<p>Access command-line arguments via <code>Process.arguments</code>:</p>
<pre><code>import "os" for Process
System.print("Script arguments:")
for (arg in Process.arguments) {
System.print(" %(arg)")
}</code></pre>
<p>Run with arguments:</p>
<pre><code>bin/wren_cli script.wren arg1 arg2 arg3</code></pre>
<h2>Exit Codes</h2>
<p>Wren-CLI uses these exit codes:</p>
<table>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
<tr>
<td>0</td>
<td>Success</td>
</tr>
<tr>
<td>65</td>
<td>Compile error (syntax error)</td>
</tr>
<tr>
<td>70</td>
<td>Runtime error</td>
</tr>
</table>
<h2>Next Steps</h2>
<ul>
<li><a href="repl.html">Using the REPL</a> - Interactive experimentation</li>
<li><a href="../language/index.html">Language Reference</a> - Deep dive into Wren syntax</li>
<li><a href="../tutorials/index.html">Tutorials</a> - Build real applications</li>
</ul>
</article>
<footer class="page-footer">
<a href="installation.html" class="prev">Installation</a>
<a href="repl.html" class="next">Using the REPL</a>
</footer>
</main>
</div>
<script src="../js/main.js"></script>
</body>
</html>
+202
View File
@@ -0,0 +1,202 @@
<!DOCTYPE html>
<!-- retoor <retoor@molodetz.nl> -->
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Getting Started - Wren-CLI Manual</title>
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<button class="mobile-menu-toggle">Menu</button>
<div class="container">
<aside class="sidebar">
<div class="sidebar-header">
<h1><a href="../index.html">Wren-CLI</a></h1>
<div class="version">v0.4.0</div>
</div>
<nav class="sidebar-nav">
<div class="section">
<span class="section-title">Getting Started</span>
<ul>
<li><a href="index.html" class="active">Overview</a></li>
<li><a href="installation.html">Installation</a></li>
<li><a href="first-script.html">First Script</a></li>
<li><a href="repl.html">Using the REPL</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Language</span>
<ul>
<li><a href="../language/index.html">Syntax Overview</a></li>
<li><a href="../language/classes.html">Classes</a></li>
<li><a href="../language/methods.html">Methods</a></li>
<li><a href="../language/control-flow.html">Control Flow</a></li>
<li><a href="../language/fibers.html">Fibers</a></li>
<li><a href="../language/modules.html">Modules</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/http.html">http</a></li>
<li><a href="../api/websocket.html">websocket</a></li>
<li><a href="../api/tls.html">tls</a></li>
<li><a href="../api/net.html">net</a></li>
<li><a href="../api/dns.html">dns</a></li>
<li><a href="../api/json.html">json</a></li>
<li><a href="../api/base64.html">base64</a></li>
<li><a href="../api/regex.html">regex</a></li>
<li><a href="../api/jinja.html">jinja</a></li>
<li><a href="../api/crypto.html">crypto</a></li>
<li><a href="../api/os.html">os</a></li>
<li><a href="../api/env.html">env</a></li>
<li><a href="../api/signal.html">signal</a></li>
<li><a href="../api/subprocess.html">subprocess</a></li>
<li><a href="../api/sqlite.html">sqlite</a></li>
<li><a href="../api/datetime.html">datetime</a></li>
<li><a href="../api/timer.html">timer</a></li>
<li><a href="../api/io.html">io</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Tutorials</span>
<ul>
<li><a href="../tutorials/index.html">Tutorial List</a></li>
<li><a href="../tutorials/http-client.html">HTTP Client</a></li>
<li><a href="../tutorials/websocket-chat.html">WebSocket Chat</a></li>
<li><a href="../tutorials/database-app.html">Database App</a></li>
<li><a href="../tutorials/template-rendering.html">Templates</a></li>
<li><a href="../tutorials/cli-tool.html">CLI Tool</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">How-To Guides</span>
<ul>
<li><a href="../howto/index.html">How-To List</a></li>
<li><a href="../howto/http-requests.html">HTTP Requests</a></li>
<li><a href="../howto/json-parsing.html">JSON Parsing</a></li>
<li><a href="../howto/regex-patterns.html">Regex Patterns</a></li>
<li><a href="../howto/file-operations.html">File Operations</a></li>
<li><a href="../howto/async-operations.html">Async Operations</a></li>
<li><a href="../howto/error-handling.html">Error Handling</a></li>
</ul>
</div>
</nav>
</aside>
<main class="content">
<nav class="breadcrumb">
<a href="../index.html">Home</a>
<span class="separator">/</span>
<span>Getting Started</span>
</nav>
<article>
<h1>Getting Started</h1>
<p>Welcome to Wren-CLI, a command-line interface for the Wren programming language extended with powerful modules for networking, file I/O, databases, and more.</p>
<div class="toc">
<h4>In This Section</h4>
<ul>
<li><a href="installation.html">Installation</a> - Build from source on Linux, macOS, or FreeBSD</li>
<li><a href="first-script.html">First Script</a> - Write and run your first Wren program</li>
<li><a href="repl.html">Using the REPL</a> - Interactive experimentation</li>
</ul>
</div>
<h2>What is Wren?</h2>
<p>Wren is a small, fast, class-based scripting language. It has a familiar syntax, first-class functions, and a fiber-based concurrency model. Wren-CLI extends the core language with modules for:</p>
<ul>
<li>HTTP and WebSocket networking</li>
<li>File and directory operations</li>
<li>SQLite database access</li>
<li>JSON and regex processing</li>
<li>Template rendering (Jinja2-compatible)</li>
<li>Cryptographic operations</li>
<li>Process and signal handling</li>
</ul>
<h2>Quick Start</h2>
<p>If you want to dive right in, here is the fastest path to running your first script:</p>
<h3>1. Build</h3>
<pre><code>git clone https://github.com/wren-lang/wren-cli.git
cd wren-cli
cd projects/make && make</code></pre>
<h3>2. Create a Script</h3>
<p>Create a file named <code>hello.wren</code>:</p>
<pre><code>System.print("Hello, Wren!")</code></pre>
<h3>3. Run</h3>
<pre><code>bin/wren_cli hello.wren</code></pre>
<div class="example-output">Hello, Wren!</div>
<h2>Key Concepts</h2>
<p>Before diving deeper, understand these fundamental Wren concepts:</p>
<h3>Everything is an Object</h3>
<p>In Wren, everything is an object, including numbers, strings, and functions. Every object is an instance of a class.</p>
<pre><code>var name = "Wren"
System.print(name.count) // 4
System.print(name.bytes[0]) // 87 (ASCII for 'W')</code></pre>
<h3>Fibers for Concurrency</h3>
<p>Wren uses fibers (cooperative threads) for concurrency. The scheduler module manages async operations.</p>
<pre><code>import "timer" for Timer
Timer.sleep(1000) // Pauses for 1 second
System.print("Done waiting")</code></pre>
<h3>Module System</h3>
<p>Functionality is organized into modules that you import as needed:</p>
<pre><code>import "http" for Http
import "json" for Json
var response = Http.get("https://api.example.com/data")
var data = Json.parse(response.body)</code></pre>
<h2>System Requirements</h2>
<table>
<tr>
<th>Platform</th>
<th>Requirements</th>
</tr>
<tr>
<td>Linux</td>
<td>GCC, Make, OpenSSL development libraries</td>
</tr>
<tr>
<td>macOS</td>
<td>Xcode Command Line Tools, OpenSSL (via Homebrew)</td>
</tr>
<tr>
<td>FreeBSD</td>
<td>GCC or Clang, gmake, OpenSSL</td>
</tr>
</table>
<h2>Next Steps</h2>
<p>Continue with the following sections to learn more:</p>
<ul>
<li><a href="installation.html">Installation</a> - Detailed build instructions for all platforms</li>
<li><a href="first-script.html">First Script</a> - A more detailed walkthrough of your first program</li>
<li><a href="../language/index.html">Language Reference</a> - Learn the Wren language syntax</li>
<li><a href="../api/index.html">API Reference</a> - Explore all available modules</li>
</ul>
</article>
<footer class="page-footer">
<a href="../index.html" class="prev">Home</a>
<a href="installation.html" class="next">Installation</a>
</footer>
</main>
</div>
<script src="../js/main.js"></script>
</body>
</html>
+260
View File
@@ -0,0 +1,260 @@
<!DOCTYPE html>
<!-- retoor <retoor@molodetz.nl> -->
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Installation - Wren-CLI Manual</title>
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<button class="mobile-menu-toggle">Menu</button>
<div class="container">
<aside class="sidebar">
<div class="sidebar-header">
<h1><a href="../index.html">Wren-CLI</a></h1>
<div class="version">v0.4.0</div>
</div>
<nav class="sidebar-nav">
<div class="section">
<span class="section-title">Getting Started</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="installation.html" class="active">Installation</a></li>
<li><a href="first-script.html">First Script</a></li>
<li><a href="repl.html">Using the REPL</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Language</span>
<ul>
<li><a href="../language/index.html">Syntax Overview</a></li>
<li><a href="../language/classes.html">Classes</a></li>
<li><a href="../language/methods.html">Methods</a></li>
<li><a href="../language/control-flow.html">Control Flow</a></li>
<li><a href="../language/fibers.html">Fibers</a></li>
<li><a href="../language/modules.html">Modules</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/http.html">http</a></li>
<li><a href="../api/websocket.html">websocket</a></li>
<li><a href="../api/tls.html">tls</a></li>
<li><a href="../api/net.html">net</a></li>
<li><a href="../api/dns.html">dns</a></li>
<li><a href="../api/json.html">json</a></li>
<li><a href="../api/base64.html">base64</a></li>
<li><a href="../api/regex.html">regex</a></li>
<li><a href="../api/jinja.html">jinja</a></li>
<li><a href="../api/crypto.html">crypto</a></li>
<li><a href="../api/os.html">os</a></li>
<li><a href="../api/env.html">env</a></li>
<li><a href="../api/signal.html">signal</a></li>
<li><a href="../api/subprocess.html">subprocess</a></li>
<li><a href="../api/sqlite.html">sqlite</a></li>
<li><a href="../api/datetime.html">datetime</a></li>
<li><a href="../api/timer.html">timer</a></li>
<li><a href="../api/io.html">io</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Tutorials</span>
<ul>
<li><a href="../tutorials/index.html">Tutorial List</a></li>
<li><a href="../tutorials/http-client.html">HTTP Client</a></li>
<li><a href="../tutorials/websocket-chat.html">WebSocket Chat</a></li>
<li><a href="../tutorials/database-app.html">Database App</a></li>
<li><a href="../tutorials/template-rendering.html">Templates</a></li>
<li><a href="../tutorials/cli-tool.html">CLI Tool</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">How-To Guides</span>
<ul>
<li><a href="../howto/index.html">How-To List</a></li>
<li><a href="../howto/http-requests.html">HTTP Requests</a></li>
<li><a href="../howto/json-parsing.html">JSON Parsing</a></li>
<li><a href="../howto/regex-patterns.html">Regex Patterns</a></li>
<li><a href="../howto/file-operations.html">File Operations</a></li>
<li><a href="../howto/async-operations.html">Async Operations</a></li>
<li><a href="../howto/error-handling.html">Error Handling</a></li>
</ul>
</div>
</nav>
</aside>
<main class="content">
<nav class="breadcrumb">
<a href="../index.html">Home</a>
<span class="separator">/</span>
<a href="index.html">Getting Started</a>
<span class="separator">/</span>
<span>Installation</span>
</nav>
<article>
<h1>Installation</h1>
<p>Wren-CLI must be built from source. This page covers the build process for Linux, macOS, and FreeBSD.</p>
<div class="toc">
<h4>On This Page</h4>
<ul>
<li><a href="#prerequisites">Prerequisites</a></li>
<li><a href="#linux">Building on Linux</a></li>
<li><a href="#macos">Building on macOS</a></li>
<li><a href="#freebsd">Building on FreeBSD</a></li>
<li><a href="#configurations">Build Configurations</a></li>
<li><a href="#verification">Verifying Installation</a></li>
</ul>
</div>
<h2 id="prerequisites">Prerequisites</h2>
<p>All platforms require:</p>
<ul>
<li>Git</li>
<li>C compiler (GCC or Clang)</li>
<li>Make</li>
<li>OpenSSL development libraries (for TLS/HTTPS support)</li>
<li>Python 3 (for running tests)</li>
</ul>
<h2 id="linux">Building on Linux</h2>
<h3>Install Dependencies</h3>
<p>On Debian/Ubuntu:</p>
<pre><code>sudo apt-get update
sudo apt-get install build-essential libssl-dev git python3</code></pre>
<p>On Fedora/RHEL:</p>
<pre><code>sudo dnf install gcc make openssl-devel git python3</code></pre>
<p>On Arch Linux:</p>
<pre><code>sudo pacman -S base-devel openssl git python</code></pre>
<h3>Build</h3>
<pre><code>git clone https://github.com/wren-lang/wren-cli.git
cd wren-cli
cd projects/make && make</code></pre>
<p>The binary will be created at <code>bin/wren_cli</code>.</p>
<h3>Install System-Wide (Optional)</h3>
<pre><code>sudo cp bin/wren_cli /usr/local/bin/wren</code></pre>
<h2 id="macos">Building on macOS</h2>
<h3>Install Dependencies</h3>
<p>Install Xcode Command Line Tools:</p>
<pre><code>xcode-select --install</code></pre>
<p>Install OpenSSL via Homebrew:</p>
<pre><code>brew install openssl</code></pre>
<h3>Build</h3>
<pre><code>git clone https://github.com/wren-lang/wren-cli.git
cd wren-cli
cd projects/make.mac && make</code></pre>
<div class="admonition note">
<div class="admonition-title">Note</div>
<p>If OpenSSL is not found, you may need to set the library path:</p>
<pre><code>export LDFLAGS="-L/opt/homebrew/opt/openssl/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl/include"</code></pre>
</div>
<h2 id="freebsd">Building on FreeBSD</h2>
<h3>Install Dependencies</h3>
<pre><code>sudo pkg install gmake git python3</code></pre>
<h3>Build</h3>
<pre><code>git clone https://github.com/wren-lang/wren-cli.git
cd wren-cli
cd projects/make.bsd && gmake</code></pre>
<h2 id="configurations">Build Configurations</h2>
<p>Several build configurations are available:</p>
<table>
<tr>
<th>Configuration</th>
<th>Description</th>
</tr>
<tr>
<td><code>release_64bit</code></td>
<td>Default optimized 64-bit build</td>
</tr>
<tr>
<td><code>release_32bit</code></td>
<td>Optimized 32-bit build</td>
</tr>
<tr>
<td><code>debug_64bit</code></td>
<td>Debug build with symbols</td>
</tr>
<tr>
<td><code>debug_32bit</code></td>
<td>32-bit debug build</td>
</tr>
<tr>
<td><code>release_64bit-no-nan-tagging</code></td>
<td>Without NaN tagging optimization</td>
</tr>
<tr>
<td><code>debug_64bit-no-nan-tagging</code></td>
<td>Debug without NaN tagging</td>
</tr>
</table>
<p>To use a specific configuration:</p>
<pre><code>make config=debug_64bit</code></pre>
<p>Debug builds output to <code>bin/wren_cli_d</code>.</p>
<h2 id="verification">Verifying Installation</h2>
<p>Verify the build was successful:</p>
<pre><code>bin/wren_cli --version</code></pre>
<p>Run the test suite:</p>
<pre><code>python3 util/test.py</code></pre>
<p>Start the REPL:</p>
<pre><code>bin/wren_cli</code></pre>
<div class="example-output">> </div>
<p>Type <code>System.print("Hello")</code> and press Enter to verify the REPL works.</p>
<h2>Troubleshooting</h2>
<h3>OpenSSL Not Found</h3>
<p>If you see errors about missing OpenSSL headers:</p>
<ul>
<li>Verify OpenSSL development packages are installed</li>
<li>On macOS, ensure Homebrew OpenSSL path is in your environment</li>
</ul>
<h3>Build Errors</h3>
<p>Try cleaning and rebuilding:</p>
<pre><code>make clean
make</code></pre>
<h3>Test Failures</h3>
<p>Run a specific test module to isolate issues:</p>
<pre><code>python3 util/test.py json</code></pre>
</article>
<footer class="page-footer">
<a href="index.html" class="prev">Overview</a>
<a href="first-script.html" class="next">First Script</a>
</footer>
</main>
</div>
<script src="../js/main.js"></script>
</body>
</html>
+251
View File
@@ -0,0 +1,251 @@
<!DOCTYPE html>
<!-- retoor <retoor@molodetz.nl> -->
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Using the REPL - Wren-CLI Manual</title>
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<button class="mobile-menu-toggle">Menu</button>
<div class="container">
<aside class="sidebar">
<div class="sidebar-header">
<h1><a href="../index.html">Wren-CLI</a></h1>
<div class="version">v0.4.0</div>
</div>
<nav class="sidebar-nav">
<div class="section">
<span class="section-title">Getting Started</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="installation.html">Installation</a></li>
<li><a href="first-script.html">First Script</a></li>
<li><a href="repl.html" class="active">Using the REPL</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Language</span>
<ul>
<li><a href="../language/index.html">Syntax Overview</a></li>
<li><a href="../language/classes.html">Classes</a></li>
<li><a href="../language/methods.html">Methods</a></li>
<li><a href="../language/control-flow.html">Control Flow</a></li>
<li><a href="../language/fibers.html">Fibers</a></li>
<li><a href="../language/modules.html">Modules</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/http.html">http</a></li>
<li><a href="../api/websocket.html">websocket</a></li>
<li><a href="../api/tls.html">tls</a></li>
<li><a href="../api/net.html">net</a></li>
<li><a href="../api/dns.html">dns</a></li>
<li><a href="../api/json.html">json</a></li>
<li><a href="../api/base64.html">base64</a></li>
<li><a href="../api/regex.html">regex</a></li>
<li><a href="../api/jinja.html">jinja</a></li>
<li><a href="../api/crypto.html">crypto</a></li>
<li><a href="../api/os.html">os</a></li>
<li><a href="../api/env.html">env</a></li>
<li><a href="../api/signal.html">signal</a></li>
<li><a href="../api/subprocess.html">subprocess</a></li>
<li><a href="../api/sqlite.html">sqlite</a></li>
<li><a href="../api/datetime.html">datetime</a></li>
<li><a href="../api/timer.html">timer</a></li>
<li><a href="../api/io.html">io</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Tutorials</span>
<ul>
<li><a href="../tutorials/index.html">Tutorial List</a></li>
<li><a href="../tutorials/http-client.html">HTTP Client</a></li>
<li><a href="../tutorials/websocket-chat.html">WebSocket Chat</a></li>
<li><a href="../tutorials/database-app.html">Database App</a></li>
<li><a href="../tutorials/template-rendering.html">Templates</a></li>
<li><a href="../tutorials/cli-tool.html">CLI Tool</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">How-To Guides</span>
<ul>
<li><a href="../howto/index.html">How-To List</a></li>
<li><a href="../howto/http-requests.html">HTTP Requests</a></li>
<li><a href="../howto/json-parsing.html">JSON Parsing</a></li>
<li><a href="../howto/regex-patterns.html">Regex Patterns</a></li>
<li><a href="../howto/file-operations.html">File Operations</a></li>
<li><a href="../howto/async-operations.html">Async Operations</a></li>
<li><a href="../howto/error-handling.html">Error Handling</a></li>
</ul>
</div>
</nav>
</aside>
<main class="content">
<nav class="breadcrumb">
<a href="../index.html">Home</a>
<span class="separator">/</span>
<a href="index.html">Getting Started</a>
<span class="separator">/</span>
<span>Using the REPL</span>
</nav>
<article>
<h1>Using the REPL</h1>
<p>The REPL (Read-Eval-Print Loop) is an interactive environment for experimenting with Wren code. It is useful for testing ideas, exploring APIs, and learning the language.</p>
<h2>Starting the REPL</h2>
<p>Run <code>wren_cli</code> without arguments to start the REPL:</p>
<pre><code>bin/wren_cli</code></pre>
<p>You will see a prompt:</p>
<div class="example-output">> </div>
<h2>Basic Usage</h2>
<p>Type expressions and press Enter to evaluate them:</p>
<pre><code>> 1 + 2
3
> "hello".count
5
> [1, 2, 3].map { |x| x * 2 }
[2, 4, 6]</code></pre>
<h2>Multi-line Input</h2>
<p>The REPL automatically detects incomplete expressions and waits for more input:</p>
<pre><code>> class Person {
| construct new(name) {
| _name = name
| }
| name { _name }
| }
null
> var p = Person.new("Alice")
null
> p.name
Alice</code></pre>
<p>The <code>|</code> prompt indicates the REPL is waiting for more input.</p>
<h2>Importing Modules</h2>
<p>Modules can be imported in the REPL just like in scripts:</p>
<pre><code>> import "json" for Json
null
> Json.stringify({"name": "Wren"})
{"name":"Wren"}
> import "math" for Math
null
> Math.sqrt(16)
4</code></pre>
<h2>Variables Persist</h2>
<p>Variables defined in the REPL persist across lines:</p>
<pre><code>> var x = 10
null
> var y = 20
null
> x + y
30</code></pre>
<h2>Examining Values</h2>
<p>Use <code>System.print</code> for formatted output:</p>
<pre><code>> var data = {"name": "Wren", "version": 0.4}
null
> System.print(data)
{name: Wren, version: 0.4}</code></pre>
<p>Check the type of a value:</p>
<pre><code>> 42.type
Num
> "hello".type
String
> [1, 2, 3].type
List</code></pre>
<h2>Exploring Classes</h2>
<p>Examine what methods a class provides:</p>
<pre><code>> String
String
> "test".bytes
[116, 101, 115, 116]
> "test".codePoints.toList
[116, 101, 115, 116]</code></pre>
<h2>Error Handling</h2>
<p>Errors are displayed but do not crash the REPL:</p>
<pre><code>> 1 / 0
infinity
> "test"[10]
Subscript out of bounds.
> undefined_variable
[repl line 1] Error at 'undefined_variable': Variable is used but not defined.</code></pre>
<p>You can continue using the REPL after errors.</p>
<h2>REPL Tips</h2>
<h3>Quick Testing</h3>
<p>Use the REPL to quickly test regular expressions:</p>
<pre><code>> import "regex" for Regex
null
> Regex.new("\\d+").test("abc123")
true
> Regex.new("\\d+").match("abc123def").text
123</code></pre>
<h3>Exploring APIs</h3>
<p>Test module functionality before using it in scripts:</p>
<pre><code>> import "base64" for Base64
null
> Base64.encode("Hello, World!")
SGVsbG8sIFdvcmxkIQ==
> Base64.decode("SGVsbG8sIFdvcmxkIQ==")
Hello, World!</code></pre>
<h3>Date and Time</h3>
<pre><code>> import "datetime" for DateTime
null
> DateTime.now
2024-01-15T10:30:45
> DateTime.now.year
2024</code></pre>
<h2>Exiting the REPL</h2>
<p>Exit the REPL by pressing <code>Ctrl+D</code> (Unix) or <code>Ctrl+Z</code> followed by Enter (Windows).</p>
<h2>Limitations</h2>
<ul>
<li>No command history navigation (arrow keys)</li>
<li>No tab completion</li>
<li>No line editing beyond basic backspace</li>
<li>Cannot redefine classes once defined</li>
</ul>
<div class="admonition tip">
<div class="admonition-title">Tip</div>
<p>For complex experimentation, write code in a file and run it with <code>wren_cli script.wren</code>. The REPL is best for quick tests and exploration.</p>
</div>
<h2>Next Steps</h2>
<ul>
<li><a href="../language/index.html">Language Reference</a> - Learn Wren syntax in detail</li>
<li><a href="../api/index.html">API Reference</a> - Explore available modules</li>
<li><a href="../tutorials/index.html">Tutorials</a> - Build real applications</li>
</ul>
</article>
<footer class="page-footer">
<a href="first-script.html" class="prev">First Script</a>
<a href="../language/index.html" class="next">Language Reference</a>
</footer>
</main>
</div>
<script src="../js/main.js"></script>
</body>
</html>