This commit is contained in:
2026-01-25 04:58:39 +01:00
parent 957e3a4762
commit 2e425571ca
139 changed files with 5078 additions and 73 deletions
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html" class="active">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html" class="active">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+27 -1
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html" class="active">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
@@ -104,12 +107,26 @@
<article>
<h1>API Reference</h1>
<p>Wren-CLI provides 28 built-in modules covering networking, file I/O, data processing, system operations, and more. All modules are imported using the <code>import</code> statement.</p>
<p>Wren-CLI provides 29 built-in modules covering networking, file I/O, data processing, system operations, and more. All modules are imported using the <code>import</code> statement.</p>
<pre><code>import "http" for Http
import "json" for Json
import "io" for File</code></pre>
<h2>Core Types</h2>
<p>Extended methods on built-in types, available without imports.</p>
<div class="card-grid">
<div class="card">
<h3><a href="string.html">String</a></h3>
<p>Case conversion, character testing, padding, splitting, reversing, and more on all strings.</p>
</div>
<div class="card">
<h3><a href="number.html">Num</a></h3>
<p>Query predicates, hyperbolic functions, base conversion, formatting, GCD/LCM, and more on all numbers.</p>
</div>
</div>
<h2>Networking</h2>
<p>Modules for HTTP, WebSocket, and low-level network operations.</p>
@@ -198,6 +215,10 @@ import "io" for File</code></pre>
<h3><a href="io.html">io</a></h3>
<p>File and directory operations, stdin/stdout handling.</p>
</div>
<div class="card">
<h3><a href="pathlib.html">pathlib</a></h3>
<p>Object-oriented filesystem paths with glob, walk, and tree operations.</p>
</div>
</div>
<h2>Data & Time</h2>
@@ -345,6 +366,11 @@ import "io" for File</code></pre>
<td>File, Directory, Stdin, Stdout</td>
<td>File I/O</td>
</tr>
<tr>
<td><a href="pathlib.html">pathlib</a></td>
<td>Path, PurePath</td>
<td>Filesystem paths</td>
</tr>
<tr>
<td><a href="scheduler.html">scheduler</a></td>
<td>Scheduler</td>
+4 -1
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html" class="active">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
@@ -274,7 +277,7 @@ backup.call("important.txt")</code></pre>
<footer class="page-footer">
<a href="timer.html" class="prev">timer</a>
<a href="scheduler.html" class="next">scheduler</a>
<a href="pathlib.html" class="next">pathlib</a>
</footer>
</main>
</div>
+42
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
@@ -119,6 +122,7 @@
<li><a href="#tests">Tests</a></li>
<li><a href="#macros">Macros</a></li>
<li><a href="#template-inheritance">Template Inheritance</a></li>
<li><a href="#markdown-tags">Markdown Tags</a></li>
</ul>
</li>
<li><a href="#filters-reference">Filters Reference</a></li>
@@ -357,6 +361,34 @@ var template = env.getTemplate("page.html") // Loads ./templates/page.html</cod
This long text will be truncated to 50 characters...
{% endfilter %}</code></pre>
<h3 id="markdown-tags">Markdown Tags</h3>
<p>Convert between Markdown and HTML within templates using block tags:</p>
<h4>markdowntohtml</h4>
<p>Converts Markdown content to HTML:</p>
<pre><code>{% markdowntohtml %}
# Heading
This is **bold** text.
{% endmarkdowntohtml %}</code></pre>
<p>Variables are resolved before conversion:</p>
<pre><code>{% markdowntohtml %}
# {{ title }}
{{ description }}
{% endmarkdowntohtml %}</code></pre>
<h4>markdownfromhtml</h4>
<p>Converts HTML content back to Markdown:</p>
<pre><code>{% markdownfromhtml %}
&lt;h1&gt;Heading&lt;/h1&gt;
&lt;p&gt;This is &lt;strong&gt;bold&lt;/strong&gt; text.&lt;/p&gt;
{% endmarkdownfromhtml %}</code></pre>
<p>Corresponding filters are also available for inline use:</p>
<pre><code>{{ markdown_text|markdown }}
{{ html_content|markdownfromhtml }}</code></pre>
<h3 id="comments">Comments</h3>
<p>Comments are not included in the output:</p>
@@ -527,6 +559,16 @@ var template = env.getTemplate("page.html") // Loads ./templates/page.html</cod
<td>URL-encode string</td>
<td><code>{{ "hello world"|urlencode }}</code> &rarr; hello+world</td>
</tr>
<tr>
<td><code>markdown</code></td>
<td>Convert Markdown to HTML</td>
<td><code>{{ md_text|markdown }}</code></td>
</tr>
<tr>
<td><code>markdownfromhtml</code></td>
<td>Convert HTML to Markdown</td>
<td><code>{{ html_content|markdownfromhtml }}</code></td>
</tr>
</table>
<h3>List/Collection Filters</h3>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html" class="active">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+493
View File
@@ -0,0 +1,493 @@
<!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>Num - 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="../getting-started/index.html">Overview</a></li>
<li><a href="../getting-started/installation.html">Installation</a></li>
<li><a href="../getting-started/first-script.html">First Script</a></li>
<li><a href="../getting-started/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="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html" class="active">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
<li><a href="net.html">net</a></li>
<li><a href="dns.html">dns</a></li>
<li><a href="json.html">json</a></li>
<li><a href="base64.html">base64</a></li>
<li><a href="regex.html">regex</a></li>
<li><a href="jinja.html">jinja</a></li>
<li><a href="crypto.html">crypto</a></li>
<li><a href="os.html">os</a></li>
<li><a href="env.html">env</a></li>
<li><a href="signal.html">signal</a></li>
<li><a href="subprocess.html">subprocess</a></li>
<li><a href="sqlite.html">sqlite</a></li>
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="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>
</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>
</ul>
</div>
</nav>
</aside>
<main class="content">
<nav class="breadcrumb">
<a href="../index.html">Home</a>
<span class="separator">/</span>
<a href="index.html">API Reference</a>
<span class="separator">/</span>
<span>Num</span>
</nav>
<article>
<h1>Num</h1>
<p>The <code>Num</code> class is the core numeric type in Wren. All numbers are double-precision floating point. The class provides arithmetic, trigonometric, bitwise, rounding, query, conversion, and formatting methods.</p>
<h2>Static Constants</h2>
<div class="method-signature">
<span class="method-name">Num.pi</span><span class="type">Num</span>
</div>
<p>The ratio of a circle's circumference to its diameter (3.14159...).</p>
<div class="method-signature">
<span class="method-name">Num.tau</span><span class="type">Num</span>
</div>
<p>Two times pi (6.28318...).</p>
<div class="method-signature">
<span class="method-name">Num.e</span><span class="type">Num</span>
</div>
<p>Euler's number (2.71828...).</p>
<div class="method-signature">
<span class="method-name">Num.infinity</span><span class="type">Num</span>
</div>
<p>Positive infinity.</p>
<div class="method-signature">
<span class="method-name">Num.nan</span><span class="type">Num</span>
</div>
<p>Not-a-number value.</p>
<div class="method-signature">
<span class="method-name">Num.largest</span><span class="type">Num</span>
</div>
<p>The largest representable double value.</p>
<div class="method-signature">
<span class="method-name">Num.smallest</span><span class="type">Num</span>
</div>
<p>The smallest positive representable double value.</p>
<div class="method-signature">
<span class="method-name">Num.maxSafeInteger</span><span class="type">Num</span>
</div>
<p>The largest integer representable without loss of precision (9007199254740991).</p>
<div class="method-signature">
<span class="method-name">Num.minSafeInteger</span><span class="type">Num</span>
</div>
<p>The smallest integer representable without loss of precision (-9007199254740991).</p>
<h3>Static Methods</h3>
<div class="method-signature">
<span class="method-name">Num.fromString</span>(<span class="param">string</span>) → <span class="type">Num|null</span>
</div>
<p>Parses a string as a number. Returns <code>null</code> if the string is not a valid number.</p>
<pre><code>Num.fromString("42") // 42
Num.fromString("3.14") // 3.14
Num.fromString("nope") // null</code></pre>
<h2>Query Methods</h2>
<div class="method-signature">
<span class="method-name">isInteger</span><span class="type">Bool</span>
</div>
<p>Whether the number is an integer (has no fractional part).</p>
<div class="method-signature">
<span class="method-name">isNan</span><span class="type">Bool</span>
</div>
<p>Whether the number is NaN.</p>
<div class="method-signature">
<span class="method-name">isInfinity</span><span class="type">Bool</span>
</div>
<p>Whether the number is positive or negative infinity.</p>
<div class="method-signature">
<span class="method-name">isFinite</span><span class="type">Bool</span>
</div>
<p>Whether the number is finite (not infinity and not NaN).</p>
<pre><code>42.isFinite // true
(1/0).isFinite // false
(0/0).isFinite // false</code></pre>
<div class="method-signature">
<span class="method-name">isZero</span><span class="type">Bool</span>
</div>
<p>Whether the number equals zero.</p>
<div class="method-signature">
<span class="method-name">isPositive</span><span class="type">Bool</span>
</div>
<p>Whether the number is strictly greater than zero.</p>
<div class="method-signature">
<span class="method-name">isNegative</span><span class="type">Bool</span>
</div>
<p>Whether the number is strictly less than zero.</p>
<div class="method-signature">
<span class="method-name">isEven</span><span class="type">Bool</span>
</div>
<p>Whether the number is an even integer.</p>
<div class="method-signature">
<span class="method-name">isOdd</span><span class="type">Bool</span>
</div>
<p>Whether the number is an odd integer.</p>
<div class="method-signature">
<span class="method-name">isBetween</span>(<span class="param">min</span>, <span class="param">max</span>) → <span class="type">Bool</span>
</div>
<p>Whether the number is within the inclusive range [min, max].</p>
<pre><code>5.isBetween(1, 10) // true
0.isBetween(1, 10) // false
10.isBetween(1, 10) // true</code></pre>
<div class="method-signature">
<span class="method-name">sign</span><span class="type">Num</span>
</div>
<p>Returns 1 for positive, -1 for negative, or 0 for zero.</p>
<h2>Arithmetic</h2>
<div class="method-signature">
<span class="method-name">abs</span><span class="type">Num</span>
</div>
<p>Absolute value.</p>
<div class="method-signature">
<span class="method-name">min</span>(<span class="param">other</span>) → <span class="type">Num</span>
</div>
<p>Returns the smaller of this number and <code>other</code>.</p>
<div class="method-signature">
<span class="method-name">max</span>(<span class="param">other</span>) → <span class="type">Num</span>
</div>
<p>Returns the larger of this number and <code>other</code>.</p>
<div class="method-signature">
<span class="method-name">clamp</span>(<span class="param">min</span>, <span class="param">max</span>) → <span class="type">Num</span>
</div>
<p>Constrains this number to the range [min, max].</p>
<pre><code>15.clamp(0, 10) // 10
5.clamp(0, 10) // 5
(-3).clamp(0, 10) // 0</code></pre>
<div class="method-signature">
<span class="method-name">pow</span>(<span class="param">exponent</span>) → <span class="type">Num</span>
</div>
<p>Raises this number to the given power.</p>
<h2>Rounding</h2>
<div class="method-signature">
<span class="method-name">ceil</span><span class="type">Num</span>
</div>
<p>Rounds up to the nearest integer.</p>
<div class="method-signature">
<span class="method-name">floor</span><span class="type">Num</span>
</div>
<p>Rounds down to the nearest integer.</p>
<div class="method-signature">
<span class="method-name">round</span><span class="type">Num</span>
</div>
<p>Rounds to the nearest integer.</p>
<div class="method-signature">
<span class="method-name">truncate</span><span class="type">Num</span>
</div>
<p>Removes the fractional part, rounding toward zero.</p>
<div class="method-signature">
<span class="method-name">fraction</span><span class="type">Num</span>
</div>
<p>Returns the fractional part of the number.</p>
<h2>Roots &amp; Exponents</h2>
<div class="method-signature">
<span class="method-name">sqrt</span><span class="type">Num</span>
</div>
<p>Square root.</p>
<div class="method-signature">
<span class="method-name">cbrt</span><span class="type">Num</span>
</div>
<p>Cube root.</p>
<div class="method-signature">
<span class="method-name">exp</span><span class="type">Num</span>
</div>
<p>Returns e raised to this power.</p>
<h2>Logarithms</h2>
<div class="method-signature">
<span class="method-name">log</span><span class="type">Num</span>
</div>
<p>Natural logarithm (base e).</p>
<div class="method-signature">
<span class="method-name">log2</span><span class="type">Num</span>
</div>
<p>Base-2 logarithm.</p>
<div class="method-signature">
<span class="method-name">log10</span><span class="type">Num</span>
</div>
<p>Base-10 logarithm.</p>
<pre><code>100.log10 // 2
1000.log10 // 3
1.log10 // 0</code></pre>
<h2>Trigonometry</h2>
<div class="method-signature">
<span class="method-name">sin</span><span class="type">Num</span>
</div>
<p>Sine (argument in radians).</p>
<div class="method-signature">
<span class="method-name">cos</span><span class="type">Num</span>
</div>
<p>Cosine (argument in radians).</p>
<div class="method-signature">
<span class="method-name">tan</span><span class="type">Num</span>
</div>
<p>Tangent (argument in radians).</p>
<div class="method-signature">
<span class="method-name">asin</span><span class="type">Num</span>
</div>
<p>Arc sine, returns radians.</p>
<div class="method-signature">
<span class="method-name">acos</span><span class="type">Num</span>
</div>
<p>Arc cosine, returns radians.</p>
<div class="method-signature">
<span class="method-name">atan</span><span class="type">Num</span>
</div>
<p>Arc tangent, returns radians.</p>
<div class="method-signature">
<span class="method-name">atan</span>(<span class="param">x</span>) → <span class="type">Num</span>
</div>
<p>Two-argument arc tangent (atan2). Returns the angle between the positive x-axis and the point (x, this).</p>
<h3>Hyperbolic Functions</h3>
<div class="method-signature">
<span class="method-name">sinh</span><span class="type">Num</span>
</div>
<p>Hyperbolic sine.</p>
<div class="method-signature">
<span class="method-name">cosh</span><span class="type">Num</span>
</div>
<p>Hyperbolic cosine.</p>
<div class="method-signature">
<span class="method-name">tanh</span><span class="type">Num</span>
</div>
<p>Hyperbolic tangent.</p>
<pre><code>0.sinh // 0
0.cosh // 1
0.tanh // 0</code></pre>
<h2>Angle Conversion</h2>
<div class="method-signature">
<span class="method-name">toDegrees</span><span class="type">Num</span>
</div>
<p>Converts radians to degrees.</p>
<div class="method-signature">
<span class="method-name">toRadians</span><span class="type">Num</span>
</div>
<p>Converts degrees to radians.</p>
<pre><code>Num.pi.toDegrees // 180
180.toRadians // 3.14159...</code></pre>
<h2>Conversion</h2>
<div class="method-signature">
<span class="method-name">toString</span><span class="type">String</span>
</div>
<p>Converts the number to its string representation.</p>
<div class="method-signature">
<span class="method-name">toChar</span><span class="type">String</span>
</div>
<p>Returns the Unicode character for this code point.</p>
<pre><code>65.toChar // "A"
97.toChar // "a"</code></pre>
<div class="method-signature">
<span class="method-name">toBase</span>(<span class="param">radix</span>) → <span class="type">String</span>
</div>
<p>Converts the integer part to a string in the given base (2-36).</p>
<pre><code>255.toBase(16) // "ff"
255.toBase(2) // "11111111"
255.toBase(8) // "377"</code></pre>
<div class="method-signature">
<span class="method-name">toHex</span><span class="type">String</span>
</div>
<p>Shorthand for <code>toBase(16)</code>.</p>
<div class="method-signature">
<span class="method-name">toBinary</span><span class="type">String</span>
</div>
<p>Shorthand for <code>toBase(2)</code>.</p>
<div class="method-signature">
<span class="method-name">toOctal</span><span class="type">String</span>
</div>
<p>Shorthand for <code>toBase(8)</code>.</p>
<h2>Formatting</h2>
<div class="method-signature">
<span class="method-name">format</span>(<span class="param">decimals</span>) → <span class="type">String</span>
</div>
<p>Formats the number with a fixed number of decimal places (0-20).</p>
<pre><code>3.14159.format(2) // "3.14"
42.format(3) // "42.000"
(-1.5).format(1) // "-1.5"</code></pre>
<h2>Integer Operations</h2>
<div class="method-signature">
<span class="method-name">gcd</span>(<span class="param">other</span>) → <span class="type">Num</span>
</div>
<p>Greatest common divisor using the Euclidean algorithm. Operates on absolute values.</p>
<pre><code>12.gcd(8) // 4
54.gcd(24) // 6
7.gcd(13) // 1</code></pre>
<div class="method-signature">
<span class="method-name">lcm</span>(<span class="param">other</span>) → <span class="type">Num</span>
</div>
<p>Least common multiple.</p>
<pre><code>4.lcm(6) // 12
3.lcm(5) // 15</code></pre>
<div class="method-signature">
<span class="method-name">digits</span><span class="type">List</span>
</div>
<p>Returns a list of the individual digits of the integer's absolute value. Aborts if the number is not an integer.</p>
<pre><code>123.digits // [1, 2, 3]
0.digits // [0]
(-456).digits // [4, 5, 6]</code></pre>
<h2>Bitwise Operations</h2>
<p>Bitwise operators work on 32-bit unsigned integers.</p>
<table>
<tr>
<th>Operator</th>
<th>Description</th>
</tr>
<tr><td><code>&amp;(other)</code></td><td>Bitwise AND</td></tr>
<tr><td><code>|(other)</code></td><td>Bitwise OR</td></tr>
<tr><td><code>^(other)</code></td><td>Bitwise XOR</td></tr>
<tr><td><code>&lt;&lt;(other)</code></td><td>Left shift</td></tr>
<tr><td><code>&gt;&gt;(other)</code></td><td>Right shift</td></tr>
<tr><td><code>~</code></td><td>Bitwise NOT</td></tr>
</table>
<h2>Ranges</h2>
<div class="method-signature">
<span class="method-name">..</span>(<span class="param">to</span>) → <span class="type">Range</span>
</div>
<p>Creates an inclusive range from this number to <code>to</code>.</p>
<div class="method-signature">
<span class="method-name">...</span>(<span class="param">to</span>) → <span class="type">Range</span>
</div>
<p>Creates an exclusive range from this number to <code>to</code> (excludes the end).</p>
<pre><code>for (i in 1..5) System.print(i) // 1 2 3 4 5
for (i in 1...5) System.print(i) // 1 2 3 4</code></pre>
</article>
<footer class="page-footer">
<a href="string.html" class="prev">String</a>
<a href="http.html" class="next">http</a>
</footer>
</main>
</div>
<script src="../js/main.js"></script>
</body>
</html>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+659
View File
@@ -0,0 +1,659 @@
<!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>pathlib - 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="../getting-started/index.html">Overview</a></li>
<li><a href="../getting-started/installation.html">Installation</a></li>
<li><a href="../getting-started/first-script.html">First Script</a></li>
<li><a href="../getting-started/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="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
<li><a href="net.html">net</a></li>
<li><a href="dns.html">dns</a></li>
<li><a href="json.html">json</a></li>
<li><a href="base64.html">base64</a></li>
<li><a href="regex.html">regex</a></li>
<li><a href="jinja.html">jinja</a></li>
<li><a href="crypto.html">crypto</a></li>
<li><a href="os.html">os</a></li>
<li><a href="env.html">env</a></li>
<li><a href="signal.html">signal</a></li>
<li><a href="subprocess.html">subprocess</a></li>
<li><a href="sqlite.html">sqlite</a></li>
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html" class="active">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
<li><a href="html.html">html</a></li>
<li><a href="argparse.html">argparse</a></li>
<li><a href="wdantic.html">wdantic</a></li>
<li><a href="dataset.html">dataset</a></li>
<li><a href="markdown.html">markdown</a></li>
<li><a href="web.html">web</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">API Reference</a>
<span class="separator">/</span>
<span>pathlib</span>
</nav>
<article>
<h1>pathlib</h1>
<p>The <code>pathlib</code> module provides object-oriented filesystem path operations. Inspired by Python's <code>pathlib</code>, it offers immutable <code>Path</code> objects that combine path manipulation with filesystem I/O in a single interface.</p>
<pre><code>import "pathlib" for Path</code></pre>
<div class="toc">
<h4>On This Page</h4>
<ul>
<li><a href="#purepath-class">PurePath Class</a></li>
<li><a href="#path-class">Path Class</a></li>
<li><a href="#path-properties">Path Properties</a></li>
<li><a href="#path-manipulation">Path Manipulation</a></li>
<li><a href="#filesystem-operations">Filesystem Operations</a></li>
<li><a href="#directory-operations">Directory Operations</a></li>
<li><a href="#symlink-operations">Symlink Operations</a></li>
<li><a href="#examples">Examples</a></li>
</ul>
</div>
<h2 id="purepath-class">PurePath Class</h2>
<div class="class-header">
<h3>PurePath</h3>
<p>String-only path operations without filesystem access. Base class for <code>Path</code>.</p>
</div>
<h3>Constructor</h3>
<div class="method-signature">
<span class="method-name">PurePath.new</span>(<span class="param">path</span>) &#8594; <span class="type">PurePath</span>
</div>
<p>Creates a new PurePath from a string or another PurePath.</p>
<pre><code>var p = PurePath.new("/home/user/file.txt")</code></pre>
<h3>Properties</h3>
<div class="method-signature">
<span class="method-name">parts</span> &#8594; <span class="type">List</span>
</div>
<p>The individual components of the path.</p>
<pre><code>var p = Path.new("/home/user/file.txt")
System.print(p.parts) // [/, home, user, file.txt]</code></pre>
<div class="method-signature">
<span class="method-name">name</span> &#8594; <span class="type">String</span>
</div>
<p>The final component of the path (filename with extension).</p>
<pre><code>var p = Path.new("/home/user/file.tar.gz")
System.print(p.name) // file.tar.gz</code></pre>
<div class="method-signature">
<span class="method-name">stem</span> &#8594; <span class="type">String</span>
</div>
<p>The filename without the last extension.</p>
<pre><code>var p = Path.new("/home/user/file.tar.gz")
System.print(p.stem) // file.tar</code></pre>
<div class="method-signature">
<span class="method-name">suffix</span> &#8594; <span class="type">String</span>
</div>
<p>The last file extension, including the leading dot.</p>
<pre><code>var p = Path.new("/home/user/file.tar.gz")
System.print(p.suffix) // .gz</code></pre>
<div class="method-signature">
<span class="method-name">suffixes</span> &#8594; <span class="type">List</span>
</div>
<p>All file extensions as a list.</p>
<pre><code>var p = Path.new("/home/user/file.tar.gz")
System.print(p.suffixes) // [.tar, .gz]</code></pre>
<div class="method-signature">
<span class="method-name">parent</span> &#8594; <span class="type">Path</span>
</div>
<p>The logical parent of the path.</p>
<pre><code>var p = Path.new("/home/user/file.txt")
System.print(p.parent) // /home/user</code></pre>
<div class="method-signature">
<span class="method-name">parents</span> &#8594; <span class="type">List</span>
</div>
<p>A list of all ancestor paths, from immediate parent to root.</p>
<pre><code>var p = Path.new("/home/user/docs/file.txt")
for (ancestor in p.parents) {
System.print(ancestor)
}
// /home/user/docs
// /home/user
// /home
// /</code></pre>
<div class="method-signature">
<span class="method-name">drive</span> &#8594; <span class="type">String</span>
</div>
<p>The drive letter (Windows only). Returns empty string on POSIX.</p>
<div class="method-signature">
<span class="method-name">root</span> &#8594; <span class="type">String</span>
</div>
<p>The root of the path. Returns <code>"/"</code> for absolute paths, empty string for relative.</p>
<div class="method-signature">
<span class="method-name">anchor</span> &#8594; <span class="type">String</span>
</div>
<p>The concatenation of drive and root.</p>
<div class="method-signature">
<span class="method-name">isAbsolute</span> &#8594; <span class="type">Bool</span>
</div>
<p>True if the path is absolute (has a root).</p>
<pre><code>System.print(Path.new("/etc/hosts").isAbsolute) // true
System.print(Path.new("relative/path").isAbsolute) // false</code></pre>
<h2 id="path-manipulation">Path Manipulation</h2>
<div class="method-signature">
<span class="method-name">path</span> / <span class="param">other</span> &#8594; <span class="type">Path</span>
</div>
<p>Joins two paths using the <code>/</code> operator. If <code>other</code> is absolute, it replaces the current path.</p>
<pre><code>var base = Path.new("/home/user")
var full = base / "documents" / "file.txt"
System.print(full) // /home/user/documents/file.txt</code></pre>
<div class="method-signature">
<span class="method-name">joinpath</span>(<span class="param">other</span>) &#8594; <span class="type">Path</span>
</div>
<p>Joins paths. Accepts a string, Path, or List of components.</p>
<pre><code>var p = Path.new("/home").joinpath("user").joinpath("file.txt")
System.print(p) // /home/user/file.txt
var q = Path.new("/home").joinpath(["user", "docs", "file.txt"])
System.print(q) // /home/user/docs/file.txt</code></pre>
<div class="method-signature">
<span class="method-name">withName</span>(<span class="param">newName</span>) &#8594; <span class="type">Path</span>
</div>
<p>Returns a new path with the filename replaced.</p>
<pre><code>var p = Path.new("/home/user/old.txt")
System.print(p.withName("new.txt")) // /home/user/new.txt</code></pre>
<div class="method-signature">
<span class="method-name">withStem</span>(<span class="param">newStem</span>) &#8594; <span class="type">Path</span>
</div>
<p>Returns a new path with the stem replaced, keeping the extension.</p>
<pre><code>var p = Path.new("/data/archive.tar.gz")
System.print(p.withStem("backup")) // /data/backup.gz</code></pre>
<div class="method-signature">
<span class="method-name">withSuffix</span>(<span class="param">newSuffix</span>) &#8594; <span class="type">Path</span>
</div>
<p>Returns a new path with the extension replaced.</p>
<pre><code>var p = Path.new("/data/file.txt")
System.print(p.withSuffix(".md")) // /data/file.md</code></pre>
<div class="method-signature">
<span class="method-name">relativeTo</span>(<span class="param">base</span>) &#8594; <span class="type">Path</span>
</div>
<p>Returns a relative path from <code>base</code> to this path. Aborts if the path is not relative to <code>base</code>.</p>
<pre><code>var p = Path.new("/home/user/docs/file.txt")
System.print(p.relativeTo("/home/user")) // docs/file.txt</code></pre>
<div class="method-signature">
<span class="method-name">match</span>(<span class="param">pattern</span>) &#8594; <span class="type">Bool</span>
</div>
<p>Matches the filename against a glob pattern. Supports <code>*</code> and <code>?</code> wildcards.</p>
<pre><code>var p = Path.new("/home/user/notes.txt")
System.print(p.match("*.txt")) // true
System.print(p.match("*.md")) // false</code></pre>
<div class="method-signature">
<span class="method-name">asPosix</span> &#8594; <span class="type">String</span>
</div>
<p>Returns the path string with forward slashes (converts backslashes on Windows).</p>
<div class="method-signature">
<span class="method-name">expanduser</span>() &#8594; <span class="type">Path</span>
</div>
<p>Expands a leading <code>~</code> to the user's home directory.</p>
<pre><code>var p = Path.new("~/.config/app")
System.print(p.expanduser()) // /home/alice/.config/app</code></pre>
<h3>Operators</h3>
<div class="method-signature">
<span class="method-name">==</span>(<span class="param">other</span>) &#8594; <span class="type">Bool</span>
</div>
<p>Compares two paths for equality by their string representation.</p>
<div class="method-signature">
<span class="method-name">!=</span>(<span class="param">other</span>) &#8594; <span class="type">Bool</span>
</div>
<p>Compares two paths for inequality.</p>
<div class="method-signature">
<span class="method-name">toString</span> &#8594; <span class="type">String</span>
</div>
<p>Returns the path as a string.</p>
<h2 id="path-class">Path Class</h2>
<div class="class-header">
<h3>Path</h3>
<p>Extends PurePath with filesystem operations. This is the primary class for working with paths.</p>
</div>
<h3>Constructor</h3>
<div class="method-signature">
<span class="method-name">Path.new</span>(<span class="param">path</span>) &#8594; <span class="type">Path</span>
</div>
<p>Creates a new Path from a string or another Path.</p>
<pre><code>var p = Path.new("/home/user/file.txt")</code></pre>
<h3>Class Properties</h3>
<div class="method-signature">
<span class="method-name">Path.cwd</span> &#8594; <span class="type">Path</span>
</div>
<p>The current working directory as a Path.</p>
<pre><code>System.print(Path.cwd) // /home/user/projects</code></pre>
<div class="method-signature">
<span class="method-name">Path.home</span> &#8594; <span class="type">Path</span>
</div>
<p>The current user's home directory as a Path.</p>
<pre><code>System.print(Path.home) // /home/alice</code></pre>
<h2 id="filesystem-operations">Filesystem Operations</h2>
<div class="method-signature">
<span class="method-name">exists</span>() &#8594; <span class="type">Bool</span>
</div>
<p>Returns true if the path points to an existing file or directory.</p>
<pre><code>if (Path.new("/etc/hosts").exists()) {
System.print("File exists")
}</code></pre>
<div class="method-signature">
<span class="method-name">isFile</span>() &#8594; <span class="type">Bool</span>
</div>
<p>Returns true if the path points to a regular file.</p>
<div class="method-signature">
<span class="method-name">isDir</span>() &#8594; <span class="type">Bool</span>
</div>
<p>Returns true if the path points to a directory.</p>
<div class="method-signature">
<span class="method-name">isSymlink</span>() &#8594; <span class="type">Bool</span>
</div>
<p>Returns true if the path is a symbolic link.</p>
<div class="method-signature">
<span class="method-name">stat</span>() &#8594; <span class="type">Stat</span>
</div>
<p>Returns a Stat object with file metadata (size, mode, timestamps).</p>
<pre><code>var s = Path.new("/etc/hosts").stat()
System.print(s.size) // 234</code></pre>
<div class="method-signature">
<span class="method-name">lstat</span>() &#8594; <span class="type">Stat</span>
</div>
<p>Like <code>stat()</code> but does not follow symbolic links.</p>
<div class="method-signature">
<span class="method-name">readText</span>() &#8594; <span class="type">String</span>
</div>
<p>Reads the entire file contents as a string.</p>
<pre><code>var content = Path.new("config.json").readText()
System.print(content)</code></pre>
<div class="method-signature">
<span class="method-name">readBytes</span>() &#8594; <span class="type">String</span>
</div>
<p>Reads the entire file contents as bytes.</p>
<div class="method-signature">
<span class="method-name">writeText</span>(<span class="param">content</span>)
</div>
<p>Writes a string to the file, creating or overwriting it.</p>
<pre><code>Path.new("output.txt").writeText("Hello, World!")</code></pre>
<div class="method-signature">
<span class="method-name">writeBytes</span>(<span class="param">content</span>)
</div>
<p>Writes bytes to the file, creating or overwriting it.</p>
<div class="method-signature">
<span class="method-name">touch</span>()
</div>
<p>Creates an empty file if it does not exist, or updates its modification time if it does.</p>
<pre><code>Path.new("marker.txt").touch()</code></pre>
<div class="method-signature">
<span class="method-name">unlink</span>()
</div>
<p>Deletes the file.</p>
<div class="method-signature">
<span class="method-name">rename</span>(<span class="param">target</span>) &#8594; <span class="type">Path</span>
</div>
<p>Moves or renames the file to <code>target</code>. Returns the new Path.</p>
<pre><code>var old = Path.new("draft.txt")
var published = old.rename("article.txt")
System.print(published) // article.txt</code></pre>
<div class="method-signature">
<span class="method-name">replace</span>(<span class="param">target</span>) &#8594; <span class="type">Path</span>
</div>
<p>Alias for <code>rename()</code>. Replaces the target if it exists.</p>
<div class="method-signature">
<span class="method-name">copyfile</span>(<span class="param">dest</span>)
</div>
<p>Copies this file to <code>dest</code>.</p>
<pre><code>Path.new("original.txt").copyfile("backup.txt")</code></pre>
<div class="method-signature">
<span class="method-name">chmod</span>(<span class="param">mode</span>)
</div>
<p>Changes the file permissions. Mode is an octal number.</p>
<pre><code>Path.new("script.sh").chmod(0x1ed) // 0755 in octal</code></pre>
<div class="method-signature">
<span class="method-name">resolve</span>() &#8594; <span class="type">Path</span>
</div>
<p>Returns the absolute real path, resolving any symlinks.</p>
<pre><code>var real = Path.new("./relative/../file.txt").resolve()
System.print(real) // /home/user/file.txt</code></pre>
<div class="method-signature">
<span class="method-name">samefile</span>(<span class="param">other</span>) &#8594; <span class="type">Bool</span>
</div>
<p>Returns true if this path and <code>other</code> refer to the same file (compares inodes).</p>
<div class="method-signature">
<span class="method-name">owner</span>() &#8594; <span class="type">String</span>
</div>
<p>Returns the username of the file owner (POSIX only).</p>
<div class="method-signature">
<span class="method-name">group</span>() &#8594; <span class="type">String</span>
</div>
<p>Returns the group name of the file (POSIX only).</p>
<h2 id="directory-operations">Directory Operations</h2>
<div class="method-signature">
<span class="method-name">mkdir</span>()
</div>
<p>Creates the directory.</p>
<div class="method-signature">
<span class="method-name">mkdir</span>(<span class="param">parents</span>)
</div>
<p>Creates the directory. If <code>parents</code> is true, creates all intermediate directories.</p>
<pre><code>Path.new("/tmp/a/b/c").mkdir(true)</code></pre>
<div class="method-signature">
<span class="method-name">rmdir</span>()
</div>
<p>Removes an empty directory.</p>
<div class="method-signature">
<span class="method-name">rmtree</span>()
</div>
<p>Recursively deletes the directory and all its contents.</p>
<pre><code>Path.new("/tmp/build_output").rmtree()</code></pre>
<div class="method-signature">
<span class="method-name">iterdir</span>() &#8594; <span class="type">List</span>
</div>
<p>Returns a list of Path objects for each entry in the directory.</p>
<pre><code>for (entry in Path.new(".").iterdir()) {
System.print(entry.name)
}</code></pre>
<div class="method-signature">
<span class="method-name">glob</span>(<span class="param">pattern</span>) &#8594; <span class="type">List</span>
</div>
<p>Returns paths matching the glob pattern in this directory. Supports <code>*</code> and <code>?</code> wildcards.</p>
<pre><code>var txtFiles = Path.new(".").glob("*.txt")
for (f in txtFiles) {
System.print(f.name)
}</code></pre>
<div class="method-signature">
<span class="method-name">rglob</span>(<span class="param">pattern</span>) &#8594; <span class="type">List</span>
</div>
<p>Recursively matches files in this directory and all subdirectories.</p>
<pre><code>var allWren = Path.cwd.rglob("*.wren")
System.print("Found %(allWren.count) Wren files")</code></pre>
<div class="method-signature">
<span class="method-name">walk</span>() &#8594; <span class="type">List</span>
</div>
<p>Recursively walks the directory tree top-down. Returns a list of <code>[dirPath, dirNames, fileNames]</code> tuples.</p>
<pre><code>for (entry in Path.new("src").walk()) {
var dir = entry[0]
var dirs = entry[1]
var files = entry[2]
for (f in files) {
System.print(dir / f)
}
}</code></pre>
<div class="method-signature">
<span class="method-name">walk</span>(<span class="param">topDown</span>) &#8594; <span class="type">List</span>
</div>
<p>Walks the directory tree. If <code>topDown</code> is false, visits child directories before parents.</p>
<h2 id="symlink-operations">Symlink Operations</h2>
<div class="method-signature">
<span class="method-name">symlinkTo</span>(<span class="param">target</span>)
</div>
<p>Creates a symbolic link at this path pointing to <code>target</code>.</p>
<pre><code>Path.new("/tmp/link").symlinkTo("/etc/hosts")</code></pre>
<div class="method-signature">
<span class="method-name">hardlinkTo</span>(<span class="param">target</span>)
</div>
<p>Creates a hard link at this path pointing to <code>target</code>.</p>
<div class="method-signature">
<span class="method-name">readlink</span>() &#8594; <span class="type">String</span>
</div>
<p>Returns the target of the symbolic link.</p>
<h2 id="examples">Examples</h2>
<h3>Configuration File Management</h3>
<pre><code>import "pathlib" for Path
import "json" for Json
var configDir = Path.home / ".config" / "myapp"
if (!configDir.exists()) {
configDir.mkdir(true)
}
var configFile = configDir / "settings.json"
if (!configFile.exists()) {
configFile.writeText(Json.stringify({
"theme": "dark",
"language": "en"
}, 2))
}
var settings = Json.parse(configFile.readText())
System.print("Theme: %(settings["theme"])")</code></pre>
<h3>Batch File Processing</h3>
<pre><code>import "pathlib" for Path
var dataDir = Path.new("./data")
for (file in dataDir.glob("*.csv")) {
var size = file.stat().size
System.print("%(file.name): %(size) bytes")
}
var total = 0
for (wren in Path.cwd.rglob("*.wren")) {
total = total + 1
}
System.print("Found %(total) Wren source files")</code></pre>
<h3>Directory Tree Traversal</h3>
<pre><code>import "pathlib" for Path
var src = Path.new("src")
for (entry in src.walk()) {
var dir = entry[0]
var files = entry[2]
if (files.count > 0) {
System.print("%(dir.relativeTo(src)):")
for (f in files) {
System.print(" %(f)")
}
}
}</code></pre>
<h3>Path Manipulation</h3>
<pre><code>import "pathlib" for Path
var p = Path.new("/home/user/documents/report.tar.gz")
System.print(p.name) // report.tar.gz
System.print(p.stem) // report.tar
System.print(p.suffix) // .gz
System.print(p.suffixes) // [.tar, .gz]
System.print(p.parent) // /home/user/documents
var backup = p.withSuffix(".bak")
System.print(backup) // /home/user/documents/report.tar.bak
var renamed = p.withName("summary.pdf")
System.print(renamed) // /home/user/documents/summary.pdf</code></pre>
<h3>Temporary File Cleanup</h3>
<pre><code>import "pathlib" for Path
var tmpDir = Path.new("/tmp/build_artifacts")
if (tmpDir.exists()) {
tmpDir.rmtree()
}
tmpDir.mkdir(true)
(tmpDir / "output.o").touch()
(tmpDir / "output.bin").touch()
var count = tmpDir.iterdir().count
System.print("%(count) files in build directory")
tmpDir.rmtree()</code></pre>
<h3>Home Directory Expansion</h3>
<pre><code>import "pathlib" for Path
var shortcuts = [
Path.new("~/.bashrc"),
Path.new("~/.config"),
Path.new("~/Documents")
]
for (p in shortcuts) {
var expanded = p.expanduser()
System.print("%(p) -> %(expanded) (exists: %(expanded.exists()))")
}</code></pre>
<div class="admonition note">
<div class="admonition-title">Note</div>
<p>Path objects are immutable. Methods like <code>withName()</code>, <code>withSuffix()</code>, and <code>joinpath()</code> return new Path objects rather than modifying the original.</p>
</div>
<div class="admonition tip">
<div class="admonition-title">Tip</div>
<p>Use the <code>/</code> operator for readable path construction: <code>Path.home / ".config" / "myapp" / "settings.json"</code> reads naturally and handles separator insertion automatically.</p>
</div>
</article>
<footer class="page-footer">
<a href="io.html" class="prev">io</a>
<a href="scheduler.html" class="next">scheduler</a>
</footer>
</main>
</div>
<script src="../js/main.js"></script>
</body>
</html>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+4 -1
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html" class="active">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
@@ -183,7 +186,7 @@ for (f in fibers) f.call()
</article>
<footer class="page-footer">
<a href="io.html" class="prev">io</a>
<a href="pathlib.html" class="prev">pathlib</a>
<a href="math.html" class="next">math</a>
</footer>
</main>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+454
View File
@@ -0,0 +1,454 @@
<!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>String - 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="../getting-started/index.html">Overview</a></li>
<li><a href="../getting-started/installation.html">Installation</a></li>
<li><a href="../getting-started/first-script.html">First Script</a></li>
<li><a href="../getting-started/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="index.html">Overview</a></li>
<li><a href="string.html" class="active">String</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
<li><a href="net.html">net</a></li>
<li><a href="dns.html">dns</a></li>
<li><a href="json.html">json</a></li>
<li><a href="base64.html">base64</a></li>
<li><a href="regex.html">regex</a></li>
<li><a href="jinja.html">jinja</a></li>
<li><a href="crypto.html">crypto</a></li>
<li><a href="os.html">os</a></li>
<li><a href="env.html">env</a></li>
<li><a href="signal.html">signal</a></li>
<li><a href="subprocess.html">subprocess</a></li>
<li><a href="sqlite.html">sqlite</a></li>
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
<li><a href="html.html">html</a></li>
<li><a href="argparse.html">argparse</a></li>
<li><a href="wdantic.html">wdantic</a></li>
<li><a href="dataset.html">dataset</a></li>
<li><a href="markdown.html">markdown</a></li>
<li><a href="web.html">web</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">API Reference</a>
<span class="separator">/</span>
<span>String</span>
</nav>
<article>
<h1>String</h1>
<p>The <code>String</code> class is a core type available globally without imports. Strings in Wren are immutable sequences of bytes, typically representing UTF-8 encoded text. All methods return new strings rather than modifying the original.</p>
<pre><code>var s = "Hello World"
System.print(s.lower) // hello world
System.print(s.upper) // HELLO WORLD
System.print(s.title) // Hello World
System.print(s.reverse) // dlroW olleH</code></pre>
<h2>Case Conversion</h2>
<div class="method-signature">
<span class="method-name">lower</span> &#8594; <span class="type">String</span>
</div>
<p>Returns the string with all ASCII uppercase characters converted to lowercase.</p>
<pre><code>"Hello World".lower // "hello world"
"ABC 123".lower // "abc 123"</code></pre>
<div class="method-signature">
<span class="method-name">upper</span> &#8594; <span class="type">String</span>
</div>
<p>Returns the string with all ASCII lowercase characters converted to uppercase.</p>
<pre><code>"Hello World".upper // "HELLO WORLD"
"abc 123".upper // "ABC 123"</code></pre>
<div class="method-signature">
<span class="method-name">capitalize</span> &#8594; <span class="type">String</span>
</div>
<p>Returns the string with the first character uppercased and the rest lowercased.</p>
<pre><code>"hello world".capitalize // "Hello world"
"HELLO".capitalize // "Hello"</code></pre>
<div class="method-signature">
<span class="method-name">title</span> &#8594; <span class="type">String</span>
</div>
<p>Returns the string with the first character of each word capitalized and the rest lowercased. Words are separated by whitespace.</p>
<pre><code>"hello world".title // "Hello World"
"HELLO WORLD".title // "Hello World"</code></pre>
<div class="method-signature">
<span class="method-name">swapCase</span> &#8594; <span class="type">String</span>
</div>
<p>Returns the string with uppercase characters converted to lowercase and vice versa.</p>
<pre><code>"Hello World".swapCase // "hELLO wORLD"</code></pre>
<h2>Character Testing</h2>
<div class="method-signature">
<span class="method-name">isLower</span> &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if the string contains at least one alphabetic character and all alphabetic characters are lowercase.</p>
<pre><code>"hello".isLower // true
"hello1".isLower // true
"Hello".isLower // false
"123".isLower // false</code></pre>
<div class="method-signature">
<span class="method-name">isUpper</span> &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if the string contains at least one alphabetic character and all alphabetic characters are uppercase.</p>
<pre><code>"HELLO".isUpper // true
"HELLO1".isUpper // true
"Hello".isUpper // false</code></pre>
<div class="method-signature">
<span class="method-name">isDigit</span> &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if the string is non-empty and all bytes are ASCII digits (0-9).</p>
<pre><code>"12345".isDigit // true
"123a5".isDigit // false
"".isDigit // false</code></pre>
<div class="method-signature">
<span class="method-name">isAlpha</span> &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if the string is non-empty and all bytes are ASCII letters (a-z, A-Z).</p>
<pre><code>"hello".isAlpha // true
"hello1".isAlpha // false</code></pre>
<div class="method-signature">
<span class="method-name">isAlphaNumeric</span> &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if the string is non-empty and all bytes are ASCII letters or digits.</p>
<pre><code>"hello123".isAlphaNumeric // true
"hello!".isAlphaNumeric // false</code></pre>
<div class="method-signature">
<span class="method-name">isSpace</span> &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if the string is non-empty and all bytes are ASCII whitespace (space, tab, newline, carriage return, form feed, vertical tab).</p>
<pre><code>" ".isSpace // true
" \t\n".isSpace // true
"hello".isSpace // false</code></pre>
<div class="method-signature">
<span class="method-name">isAscii</span> &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if all bytes in the string are less than 128. Returns <code>true</code> for empty strings.</p>
<pre><code>"hello".isAscii // true
"".isAscii // true</code></pre>
<h2>Search</h2>
<div class="method-signature">
<span class="method-name">lastIndexOf</span>(<span class="param">search</span>) &#8594; <span class="type">Num</span>
</div>
<p>Returns the byte index of the last occurrence of <code>search</code> in the string, or <code>-1</code> if not found.</p>
<ul class="param-list">
<li><span class="param-name">search</span> <span class="param-type">(String)</span> - The substring to search for</li>
<li><span class="returns">Returns:</span> Byte index or -1</li>
</ul>
<pre><code>"hello world hello".lastIndexOf("hello") // 12
"hello".lastIndexOf("x") // -1</code></pre>
<div class="method-signature">
<span class="method-name">lastIndexOf</span>(<span class="param">search</span>, <span class="param">start</span>) &#8594; <span class="type">Num</span>
</div>
<p>Returns the byte index of the last occurrence of <code>search</code> at or before <code>start</code>, or <code>-1</code> if not found.</p>
<ul class="param-list">
<li><span class="param-name">search</span> <span class="param-type">(String)</span> - The substring to search for</li>
<li><span class="param-name">start</span> <span class="param-type">(Num)</span> - Maximum byte index to search from</li>
<li><span class="returns">Returns:</span> Byte index or -1</li>
</ul>
<pre><code>"hello world hello".lastIndexOf("hello", 11) // 0
"hello world hello".lastIndexOf("hello", 12) // 12</code></pre>
<h2>Transformation</h2>
<div class="method-signature">
<span class="method-name">reverse</span> &#8594; <span class="type">String</span>
</div>
<p>Returns the string with characters in reverse order. Code point aware for UTF-8 strings.</p>
<pre><code>"hello".reverse // "olleh"
"abcde".reverse // "edcba"</code></pre>
<div class="method-signature">
<span class="method-name">center</span>(<span class="param">width</span>) &#8594; <span class="type">String</span>
</div>
<p>Centers the string in a field of <code>width</code> characters, padded with spaces.</p>
<pre><code>"hi".center(10) // " hi "</code></pre>
<div class="method-signature">
<span class="method-name">center</span>(<span class="param">width</span>, <span class="param">char</span>) &#8594; <span class="type">String</span>
</div>
<p>Centers the string in a field of <code>width</code> characters, padded with the given fill character.</p>
<pre><code>"hi".center(10, "-") // "----hi----"</code></pre>
<div class="method-signature">
<span class="method-name">lpad</span>(<span class="param">width</span>, <span class="param">char</span>) &#8594; <span class="type">String</span>
</div>
<p>Left-pads the string to <code>width</code> characters using the given fill character.</p>
<pre><code>"42".lpad(5, "0") // "00042"</code></pre>
<div class="method-signature">
<span class="method-name">rpad</span>(<span class="param">width</span>, <span class="param">char</span>) &#8594; <span class="type">String</span>
</div>
<p>Right-pads the string to <code>width</code> characters using the given fill character.</p>
<pre><code>"hi".rpad(5, ".") // "hi..."</code></pre>
<div class="method-signature">
<span class="method-name">zfill</span>(<span class="param">width</span>) &#8594; <span class="type">String</span>
</div>
<p>Pads the string with leading zeros to <code>width</code> characters. Preserves a leading <code>-</code> or <code>+</code> sign.</p>
<pre><code>"42".zfill(5) // "00042"
"-42".zfill(6) // "-00042"
"+42".zfill(6) // "+00042"</code></pre>
<div class="method-signature">
<span class="method-name">removePrefix</span>(<span class="param">prefix</span>) &#8594; <span class="type">String</span>
</div>
<p>If the string starts with <code>prefix</code>, returns the string with the prefix removed. Otherwise returns the original string.</p>
<pre><code>"HelloWorld".removePrefix("Hello") // "World"
"HelloWorld".removePrefix("World") // "HelloWorld"</code></pre>
<div class="method-signature">
<span class="method-name">removeSuffix</span>(<span class="param">suffix</span>) &#8594; <span class="type">String</span>
</div>
<p>If the string ends with <code>suffix</code>, returns the string with the suffix removed. Otherwise returns the original string.</p>
<pre><code>"HelloWorld".removeSuffix("World") // "Hello"
"HelloWorld".removeSuffix("Hello") // "HelloWorld"</code></pre>
<h2>Splitting &amp; Conversion</h2>
<div class="method-signature">
<span class="method-name">splitLines</span> &#8594; <span class="type">List</span>
</div>
<p>Splits the string by line endings (<code>\n</code>, <code>\r\n</code>, <code>\r</code>) and returns a list of strings.</p>
<pre><code>"line1\nline2\nline3".splitLines // ["line1", "line2", "line3"]
"a\r\nb\r\nc".splitLines // ["a", "b", "c"]</code></pre>
<div class="method-signature">
<span class="method-name">chars</span> &#8594; <span class="type">List</span>
</div>
<p>Returns a list of individual characters (code points) in the string.</p>
<pre><code>"abc".chars // ["a", "b", "c"]
"".chars // []</code></pre>
<div class="method-signature">
<span class="method-name">toNum</span> &#8594; <span class="type">Num</span> | <span class="type">Null</span>
</div>
<p>Parses the string as a number. Returns <code>null</code> if the string cannot be parsed.</p>
<pre><code>"42".toNum // 42
"3.14".toNum // 3.14
"-7".toNum // -7
"abc".toNum // null</code></pre>
<h2>Comparison</h2>
<p>Strings support lexicographic comparison using the standard comparison operators. Comparison is byte-by-byte using the raw byte values, which produces correct results for ASCII and UTF-8 encoded text.</p>
<div class="method-signature">
<span class="method-name">&lt;</span>(<span class="param">other</span>) &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if this string is lexicographically less than <code>other</code>.</p>
<ul class="param-list">
<li><span class="param-name">other</span> <span class="param-type">(String)</span> - The string to compare against</li>
</ul>
<pre><code>"apple" < "banana" // true
"abc" < "abd" // true
"abc" < "abcd" // true (prefix is less than longer string)</code></pre>
<div class="method-signature">
<span class="method-name">&gt;</span>(<span class="param">other</span>) &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if this string is lexicographically greater than <code>other</code>.</p>
<ul class="param-list">
<li><span class="param-name">other</span> <span class="param-type">(String)</span> - The string to compare against</li>
</ul>
<pre><code>"banana" > "apple" // true
"abd" > "abc" // true
"abcd" > "abc" // true</code></pre>
<div class="method-signature">
<span class="method-name">&lt;=</span>(<span class="param">other</span>) &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if this string is lexicographically less than or equal to <code>other</code>.</p>
<ul class="param-list">
<li><span class="param-name">other</span> <span class="param-type">(String)</span> - The string to compare against</li>
</ul>
<pre><code>"abc" <= "abc" // true
"abc" <= "abd" // true
"abd" <= "abc" // false</code></pre>
<div class="method-signature">
<span class="method-name">&gt;=</span>(<span class="param">other</span>) &#8594; <span class="type">Bool</span>
</div>
<p>Returns <code>true</code> if this string is lexicographically greater than or equal to <code>other</code>.</p>
<ul class="param-list">
<li><span class="param-name">other</span> <span class="param-type">(String)</span> - The string to compare against</li>
</ul>
<pre><code>"abc" >= "abc" // true
"abd" >= "abc" // true
"abc" >= "abd" // false</code></pre>
<div class="admonition tip">
<div class="admonition-title">Tip</div>
<p>String comparison is byte-based, so uppercase letters sort before lowercase letters in ASCII order (e.g., <code>"Z" &lt; "a"</code> is <code>true</code>). If you need case-insensitive comparison, convert both strings to the same case first using <code>lower</code> or <code>upper</code>.</p>
</div>
<h2>Existing Methods</h2>
<p>The following methods are also available on all strings as part of the core VM.</p>
<table>
<tr>
<th>Method</th>
<th>Description</th>
</tr>
<tr>
<td><code>contains(s)</code></td>
<td>Returns true if the string contains <code>s</code></td>
</tr>
<tr>
<td><code>startsWith(s)</code></td>
<td>Returns true if the string starts with <code>s</code></td>
</tr>
<tr>
<td><code>endsWith(s)</code></td>
<td>Returns true if the string ends with <code>s</code></td>
</tr>
<tr>
<td><code>indexOf(s)</code></td>
<td>Returns the byte index of <code>s</code>, or -1</td>
</tr>
<tr>
<td><code>indexOf(s, start)</code></td>
<td>Returns the byte index of <code>s</code> starting from <code>start</code></td>
</tr>
<tr>
<td><code>split(delim)</code></td>
<td>Splits by delimiter, returns a list</td>
</tr>
<tr>
<td><code>replace(from, to)</code></td>
<td>Replaces all occurrences of <code>from</code> with <code>to</code></td>
</tr>
<tr>
<td><code>trim()</code></td>
<td>Removes leading and trailing whitespace</td>
</tr>
<tr>
<td><code>trimStart()</code></td>
<td>Removes leading whitespace</td>
</tr>
<tr>
<td><code>trimEnd()</code></td>
<td>Removes trailing whitespace</td>
</tr>
<tr>
<td><code>bytes</code></td>
<td>Returns a sequence of byte values</td>
</tr>
<tr>
<td><code>codePoints</code></td>
<td>Returns a sequence of code point values</td>
</tr>
<tr>
<td><code>count</code></td>
<td>Number of code points in the string</td>
</tr>
<tr>
<td><code>isEmpty</code></td>
<td>Returns true if the string has no characters</td>
</tr>
<tr>
<td><code>*(n)</code></td>
<td>Repeats the string <code>n</code> times</td>
</tr>
</table>
<div class="admonition note">
<div class="admonition-title">Note</div>
<p>String is a core type available globally. No <code>import</code> statement is needed. All string methods operate on ASCII characters. Multi-byte UTF-8 characters are preserved but case conversion applies only to ASCII letters (a-z, A-Z).</p>
</div>
</article>
<footer class="page-footer">
<a href="index.html" class="prev">Overview</a>
<a href="http.html" class="next">http</a>
</footer>
</main>
</div>
<script src="../js/main.js"></script>
</body>
</html>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+370
View File
@@ -0,0 +1,370 @@
<!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>tempfile - 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="../getting-started/index.html">Overview</a></li>
<li><a href="../getting-started/installation.html">Installation</a></li>
<li><a href="../getting-started/first-script.html">First Script</a></li>
<li><a href="../getting-started/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="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
<li><a href="net.html">net</a></li>
<li><a href="dns.html">dns</a></li>
<li><a href="json.html">json</a></li>
<li><a href="base64.html">base64</a></li>
<li><a href="regex.html">regex</a></li>
<li><a href="jinja.html">jinja</a></li>
<li><a href="crypto.html">crypto</a></li>
<li><a href="os.html">os</a></li>
<li><a href="env.html">env</a></li>
<li><a href="signal.html">signal</a></li>
<li><a href="subprocess.html">subprocess</a></li>
<li><a href="sqlite.html">sqlite</a></li>
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="tempfile.html" class="active">tempfile</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
<li><a href="html.html">html</a></li>
<li><a href="argparse.html">argparse</a></li>
<li><a href="wdantic.html">wdantic</a></li>
<li><a href="dataset.html">dataset</a></li>
<li><a href="markdown.html">markdown</a></li>
<li><a href="web.html">web</a></li>
</ul>
</div>
<div class="section">
<span class="section-title">Tutorials</span>
<ul>
<li><a href="../tutorials/index.html">Tutorial List</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>
</ul>
</div>
</nav>
</aside>
<main class="content">
<nav class="breadcrumb">
<a href="../index.html">Home</a>
<span class="separator">/</span>
<a href="index.html">API Reference</a>
<span class="separator">/</span>
<span>tempfile</span>
</nav>
<article>
<h1>tempfile</h1>
<p>The <code>tempfile</code> module provides utilities for creating temporary files and directories. It mirrors Python's <code>tempfile</code> API with three classes: <code>TempFile</code> for low-level operations, <code>NamedTemporaryFile</code> for temporary files with automatic cleanup, and <code>TemporaryDirectory</code> for temporary directories with recursive cleanup.</p>
<pre><code>import "tempfile" for TempFile, NamedTemporaryFile, TemporaryDirectory</code></pre>
<h2>TempFile Class</h2>
<div class="class-header">
<h3>TempFile</h3>
<p>Low-level temporary file and directory utilities</p>
</div>
<h3>Static Properties</h3>
<div class="method-signature">
<span class="method-name">TempFile.tempdir</span><span class="type">String|Null</span>
</div>
<p>Gets or sets a global override for the temporary directory. When set, <code>gettempdir()</code> returns this value instead of checking environment variables.</p>
<pre><code>TempFile.tempdir = "/my/custom/tmp"
System.print(TempFile.gettempdir()) // /my/custom/tmp
TempFile.tempdir = null // Reset to default</code></pre>
<h3>Static Methods</h3>
<div class="method-signature">
<span class="method-name">TempFile.gettempdir</span>() → <span class="type">String</span>
</div>
<p>Returns the resolved temporary directory path. Checks in order: the <code>tempdir</code> override, then <code>TMPDIR</code>, <code>TEMP</code>, <code>TMP</code> environment variables, and falls back to <code>/tmp</code> on POSIX or <code>C:\Temp</code> on Windows.</p>
<div class="method-signature">
<span class="method-name">TempFile.gettempprefix</span>() → <span class="type">String</span>
</div>
<p>Returns the default prefix for temporary file names: <code>"tmp"</code>.</p>
<div class="method-signature">
<span class="method-name">TempFile.mktemp</span>() → <span class="type">String</span><br>
<span class="method-name">TempFile.mktemp</span>(<span class="param">suffix</span>) → <span class="type">String</span><br>
<span class="method-name">TempFile.mktemp</span>(<span class="param">suffix</span>, <span class="param">prefix</span>) → <span class="type">String</span><br>
<span class="method-name">TempFile.mktemp</span>(<span class="param">suffix</span>, <span class="param">prefix</span>, <span class="param">dir</span>) → <span class="type">String</span>
</div>
<p>Generates a unique temporary file path without creating any file. The generated name consists of the prefix, 8 random hexadecimal characters, and the suffix.</p>
<ul class="param-list">
<li><span class="param-name">suffix</span> <span class="param-type">(String)</span> - Suffix for the filename (default: <code>""</code>)</li>
<li><span class="param-name">prefix</span> <span class="param-type">(String)</span> - Prefix for the filename (default: <code>"tmp"</code>)</li>
<li><span class="param-name">dir</span> <span class="param-type">(String)</span> - Directory for the path (default: <code>gettempdir()</code>)</li>
<li><span class="returns">Returns:</span> A file path string (file is not created)</li>
</ul>
<pre><code>var name = TempFile.mktemp(".txt", "data_")
System.print(name) // e.g., /tmp/data_a1b2c3d4.txt</code></pre>
<div class="method-signature">
<span class="method-name">TempFile.mkstemp</span>() → <span class="type">String</span><br>
<span class="method-name">TempFile.mkstemp</span>(<span class="param">suffix</span>) → <span class="type">String</span><br>
<span class="method-name">TempFile.mkstemp</span>(<span class="param">suffix</span>, <span class="param">prefix</span>) → <span class="type">String</span><br>
<span class="method-name">TempFile.mkstemp</span>(<span class="param">suffix</span>, <span class="param">prefix</span>, <span class="param">dir</span>) → <span class="type">String</span>
</div>
<p>Creates a temporary file atomically using exclusive creation flags (<code>O_EXCL</code>), preventing race conditions. Retries up to 100 times on name collisions.</p>
<ul class="param-list">
<li><span class="param-name">suffix</span> <span class="param-type">(String)</span> - Suffix for the filename (default: <code>""</code>)</li>
<li><span class="param-name">prefix</span> <span class="param-type">(String)</span> - Prefix for the filename (default: <code>"tmp"</code>)</li>
<li><span class="param-name">dir</span> <span class="param-type">(String)</span> - Directory for the file (default: <code>gettempdir()</code>)</li>
<li><span class="returns">Returns:</span> The path of the newly created file</li>
</ul>
<pre><code>import "io" for File
var path = TempFile.mkstemp(".dat", "work_")
System.print(path) // e.g., /tmp/work_e5f6a7b8.dat
File.delete(path) // Caller must clean up</code></pre>
<div class="method-signature">
<span class="method-name">TempFile.mkdtemp</span>() → <span class="type">String</span><br>
<span class="method-name">TempFile.mkdtemp</span>(<span class="param">suffix</span>) → <span class="type">String</span><br>
<span class="method-name">TempFile.mkdtemp</span>(<span class="param">suffix</span>, <span class="param">prefix</span>) → <span class="type">String</span><br>
<span class="method-name">TempFile.mkdtemp</span>(<span class="param">suffix</span>, <span class="param">prefix</span>, <span class="param">dir</span>) → <span class="type">String</span>
</div>
<p>Creates a temporary directory. Retries up to 100 times on name collisions.</p>
<ul class="param-list">
<li><span class="param-name">suffix</span> <span class="param-type">(String)</span> - Suffix for the directory name (default: <code>""</code>)</li>
<li><span class="param-name">prefix</span> <span class="param-type">(String)</span> - Prefix for the directory name (default: <code>"tmp"</code>)</li>
<li><span class="param-name">dir</span> <span class="param-type">(String)</span> - Parent directory (default: <code>gettempdir()</code>)</li>
<li><span class="returns">Returns:</span> The path of the newly created directory</li>
</ul>
<pre><code>import "io" for Directory
var dir = TempFile.mkdtemp("_work")
System.print(dir) // e.g., /tmp/tmp9c0d1e2f_work
Directory.delete(dir) // Caller must clean up</code></pre>
<h2>NamedTemporaryFile Class</h2>
<div class="class-header">
<h3>NamedTemporaryFile</h3>
<p>A temporary file with a visible name that is optionally deleted on close</p>
</div>
<h3>Constructors</h3>
<div class="method-signature">
<span class="method-name">NamedTemporaryFile.new</span>() → <span class="type">NamedTemporaryFile</span><br>
<span class="method-name">NamedTemporaryFile.new</span>(<span class="param">suffix</span>) → <span class="type">NamedTemporaryFile</span><br>
<span class="method-name">NamedTemporaryFile.new</span>(<span class="param">suffix</span>, <span class="param">prefix</span>) → <span class="type">NamedTemporaryFile</span><br>
<span class="method-name">NamedTemporaryFile.new</span>(<span class="param">suffix</span>, <span class="param">prefix</span>, <span class="param">dir</span>) → <span class="type">NamedTemporaryFile</span><br>
<span class="method-name">NamedTemporaryFile.new</span>(<span class="param">suffix</span>, <span class="param">prefix</span>, <span class="param">dir</span>, <span class="param">delete</span>) → <span class="type">NamedTemporaryFile</span>
</div>
<ul class="param-list">
<li><span class="param-name">suffix</span> <span class="param-type">(String)</span> - Suffix for the filename (default: <code>""</code>)</li>
<li><span class="param-name">prefix</span> <span class="param-type">(String)</span> - Prefix for the filename (default: <code>"tmp"</code>)</li>
<li><span class="param-name">dir</span> <span class="param-type">(String|Null)</span> - Directory for the file (default: <code>null</code>, uses <code>TempFile.gettempdir()</code>)</li>
<li><span class="param-name">delete</span> <span class="param-type">(Bool)</span> - Whether to delete the file on close (default: <code>true</code>)</li>
</ul>
<h3>Properties</h3>
<div class="method-signature">
<span class="method-name">.name</span><span class="type">String</span>
</div>
<p>The full path of the temporary file.</p>
<div class="method-signature">
<span class="method-name">.path</span><span class="type">Path</span>
</div>
<p>A <code>Path</code> object for the temporary file.</p>
<div class="method-signature">
<span class="method-name">.delete</span><span class="type">Bool</span>
</div>
<p>Whether the file will be deleted on close. Can be set.</p>
<div class="method-signature">
<span class="method-name">.closed</span><span class="type">Bool</span>
</div>
<p>Whether the file has been closed.</p>
<h3>Methods</h3>
<div class="method-signature">
<span class="method-name">.write</span>(<span class="param">content</span>)
</div>
<p>Writes string content to the file, replacing any existing content.</p>
<div class="method-signature">
<span class="method-name">.read</span>() → <span class="type">String</span>
</div>
<p>Reads and returns the file content as a string.</p>
<div class="method-signature">
<span class="method-name">.close</span>()
</div>
<p>Closes the file. If <code>delete</code> is <code>true</code>, the file is deleted from disk.</p>
<div class="method-signature">
<span class="method-name">.use</span>(<span class="param">fn</span>) → <span class="type">*</span>
</div>
<p>Executes <code>fn</code> with the file as argument and guarantees cleanup afterwards, even if an error occurs. Equivalent to Python's <code>with</code> statement.</p>
<pre><code>NamedTemporaryFile.new(".txt").use {|f|
f.write("temporary data")
System.print(f.read())
}
// File is automatically deleted here</code></pre>
<h2>TemporaryDirectory Class</h2>
<div class="class-header">
<h3>TemporaryDirectory</h3>
<p>A temporary directory with recursive cleanup support</p>
</div>
<h3>Constructors</h3>
<div class="method-signature">
<span class="method-name">TemporaryDirectory.new</span>() → <span class="type">TemporaryDirectory</span><br>
<span class="method-name">TemporaryDirectory.new</span>(<span class="param">suffix</span>) → <span class="type">TemporaryDirectory</span><br>
<span class="method-name">TemporaryDirectory.new</span>(<span class="param">suffix</span>, <span class="param">prefix</span>) → <span class="type">TemporaryDirectory</span><br>
<span class="method-name">TemporaryDirectory.new</span>(<span class="param">suffix</span>, <span class="param">prefix</span>, <span class="param">dir</span>) → <span class="type">TemporaryDirectory</span><br>
<span class="method-name">TemporaryDirectory.new</span>(<span class="param">suffix</span>, <span class="param">prefix</span>, <span class="param">dir</span>, <span class="param">delete</span>) → <span class="type">TemporaryDirectory</span>
</div>
<ul class="param-list">
<li><span class="param-name">suffix</span> <span class="param-type">(String)</span> - Suffix for the directory name (default: <code>""</code>)</li>
<li><span class="param-name">prefix</span> <span class="param-type">(String)</span> - Prefix for the directory name (default: <code>"tmp"</code>)</li>
<li><span class="param-name">dir</span> <span class="param-type">(String|Null)</span> - Parent directory (default: <code>null</code>, uses <code>TempFile.gettempdir()</code>)</li>
<li><span class="param-name">delete</span> <span class="param-type">(Bool)</span> - Whether to delete the directory on cleanup (default: <code>true</code>)</li>
</ul>
<h3>Properties</h3>
<div class="method-signature">
<span class="method-name">.name</span><span class="type">String</span>
</div>
<p>The full path of the temporary directory.</p>
<div class="method-signature">
<span class="method-name">.path</span><span class="type">Path</span>
</div>
<p>A <code>Path</code> object for the temporary directory.</p>
<div class="method-signature">
<span class="method-name">.delete</span><span class="type">Bool</span>
</div>
<p>Whether the directory will be deleted on cleanup. Can be set.</p>
<div class="method-signature">
<span class="method-name">.closed</span><span class="type">Bool</span>
</div>
<p>Whether the directory has been cleaned up.</p>
<h3>Methods</h3>
<div class="method-signature">
<span class="method-name">.cleanup</span>()
</div>
<p>Removes the directory and all its contents recursively (using <code>Path.rmtree()</code>). If <code>delete</code> is <code>false</code>, the directory is not removed.</p>
<div class="method-signature">
<span class="method-name">.use</span>(<span class="param">fn</span>) → <span class="type">*</span>
</div>
<p>Executes <code>fn</code> with the directory as argument and guarantees cleanup afterwards, even if an error occurs.</p>
<pre><code>TemporaryDirectory.new().use {|d|
var path = d.name + "/data.txt"
// Create files, do work...
}
// Directory and all contents automatically removed</code></pre>
<h2>Examples</h2>
<h3>Processing Files Safely</h3>
<pre><code>import "tempfile" for NamedTemporaryFile
import "pathlib" for Path
NamedTemporaryFile.new(".csv", "report_").use {|tmp|
tmp.write("name,value\nalice,42\nbob,17")
var data = tmp.read()
System.print("Processing %(tmp.name)")
System.print(data)
}</code></pre>
<h3>Working Directory for Build Output</h3>
<pre><code>import "tempfile" for TemporaryDirectory
import "pathlib" for Path
TemporaryDirectory.new("_build").use {|build|
var src = Path.new(build.name) / "output.txt"
src.writeText("Build artifact")
System.print("Build dir: %(build.name)")
}
// Build directory cleaned up automatically</code></pre>
<h3>Persistent Temporary Files</h3>
<pre><code>import "tempfile" for NamedTemporaryFile
var tmp = NamedTemporaryFile.new(".log", "app_", null, false)
tmp.write("Application started")
tmp.close()
// File persists at tmp.name after close
System.print("Log file: %(tmp.name)")</code></pre>
<div class="admonition note">
<div class="admonition-title">Note</div>
<p>File creation via <code>mkstemp</code> uses exclusive creation flags (<code>O_EXCL</code>) for atomic file creation, preventing race conditions between checking for existence and creating the file. Random suffixes are generated using <code>Crypto.randomBytes</code> for cryptographic quality randomness.</p>
</div>
</article>
<footer class="page-footer">
<a href="pathlib.html" class="prev">pathlib</a>
<a href="scheduler.html" class="next">scheduler</a>
</footer>
</main>
</div>
<script src="../js/main.js"></script>
</body>
</html>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html" class="active">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html" class="active">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html" class="active">uuid</a></li>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
<li><a href="uuid.html">uuid</a></li>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="index.html">Overview</a></li>
<li><a href="string.html">String</a></li>
<li><a href="number.html">Num</a></li>
<li><a href="http.html">http</a></li>
<li><a href="websocket.html" class="active">websocket</a></li>
<li><a href="tls.html">tls</a></li>
@@ -58,6 +60,7 @@
<li><a href="datetime.html">datetime</a></li>
<li><a href="timer.html">timer</a></li>
<li><a href="io.html">io</a></li>
<li><a href="pathlib.html">pathlib</a></li>
<li><a href="scheduler.html">scheduler</a></li>
<li><a href="math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+6 -3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
@@ -139,7 +142,7 @@ sudo apt-get install build-essential libssl-dev 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 && make</code></pre>
make build</code></pre>
<p>The binary will be created at <code>bin/wren_cli</code>.</p>
@@ -221,7 +224,7 @@ cd projects/make.bsd && gmake</code></pre>
<pre><code>bin/wren_cli --version</code></pre>
<p>Run the test suite:</p>
<pre><code>python3 util/test.py</code></pre>
<pre><code>make tests</code></pre>
<p>Start the REPL:</p>
<pre><code>bin/wren_cli</code></pre>
@@ -242,7 +245,7 @@ cd projects/make.bsd && gmake</code></pre>
<h3>Build Errors</h3>
<p>Try cleaning and rebuilding:</p>
<pre><code>make clean
make</code></pre>
make build</code></pre>
<h3>Test Failures</h3>
<p>Run a specific test module to isolate issues:</p>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+4 -1
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
@@ -391,7 +394,7 @@ System.print("Total size: %(size) bytes")</code></pre>
<div class="admonition tip">
<div class="admonition-title">See Also</div>
<p>For full API documentation, see the <a href="../api/io.html">IO module reference</a>.</p>
<p>For full API documentation, see the <a href="../api/io.html">IO module reference</a>. For object-oriented path manipulation with glob, walk, and tree operations, see the <a href="../api/pathlib.html">pathlib module reference</a>.</p>
</div>
</article>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+2
View File
@@ -58,6 +58,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="api/scheduler.html">scheduler</a></li>
<li><a href="api/math.html">math</a></li>
</ul>
@@ -148,6 +149,7 @@
<a href="api/signal.html" class="module-card">signal</a>
<a href="api/subprocess.html" class="module-card">subprocess</a>
<a href="api/io.html" class="module-card">io</a>
<a href="api/pathlib.html" class="module-card">pathlib</a>
</div>
<h3>Data & Time</h3>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+8
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
@@ -215,6 +218,11 @@ System.print(data["name"])</code></pre>
<td>File I/O</td>
<td>File, Directory, Stdin</td>
</tr>
<tr>
<td><a href="../api/pathlib.html">pathlib</a></td>
<td>Filesystem paths</td>
<td>Path, PurePath</td>
</tr>
<tr>
<td><a href="../api/scheduler.html">scheduler</a></td>
<td>Async scheduling</td>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>
+3
View File
@@ -40,6 +40,8 @@
<span class="section-title">API Reference</span>
<ul>
<li><a href="../api/index.html">Overview</a></li>
<li><a href="../api/string.html">String</a></li>
<li><a href="../api/number.html">Num</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>
@@ -58,6 +60,7 @@
<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/pathlib.html">pathlib</a></li>
<li><a href="../api/scheduler.html">scheduler</a></li>
<li><a href="../api/math.html">math</a></li>
</ul>