
A guided tour of the Vary language, organized by topic. Each page is self-contained and links to detailed reference pages.

<style>
.example-tabs {
  display: flex; gap: 0; border: 1px solid rgba(0,0,0,0.15);
  border-bottom: none; flex-wrap: wrap; margin-bottom: 0;
}
.example-tab {
  padding: 7px 18px; border: none; background: transparent; cursor: pointer;
  font-family: var(--font-mono); font-size: 13px; color: var(--color-muted);
  transition: background 0.15s, color 0.15s; white-space: nowrap;
}
.example-tab.active { background: var(--color-panel); color: #fff; }
.example-block { display: none; }
.example-block.active { display: block; }
.example-block pre {
  margin-top: 0 !important; border-top-left-radius: 0 !important;
  border-top-right-radius: 0 !important;
  height: 360px; overflow-y: auto;
}
</style>

<div style="margin: 1.5rem 0 2.5rem;">
<div class="example-tabs" id="example-tabs">
  <button class="example-tab active" data-ex="basics" onclick="showExample('basics')">Basics</button>
  <button class="example-tab" data-ex="functions" onclick="showExample('functions')">Functions</button>
  <button class="example-tab" data-ex="types" onclick="showExample('types')">Types</button>
  <button class="example-tab" data-ex="collections" onclick="showExample('collections')">Collections</button>
  <button class="example-tab" data-ex="matching" onclick="showExample('matching')">Matching</button>
  <button class="example-tab" data-ex="testing" onclick="showExample('testing')">Testing</button>
</div>
<div class="example-block active" id="ex-basics"><pre style="background-color: var(--color-panel); color: rgba(255,255,255,0.85); padding: 1em 1.25em; overflow-x: auto; font-size: 15px; line-height: 1.5; font-family: var(--font-mono);"><code># Variables and types
let name = "Vary"
let version: Float = 0.1
mut count = 0
<span style="opacity:0"> </span>
# Optionals
let maybe: Str? = None
if maybe is not None {
    print(maybe)       # narrowed to Str
}
<span style="opacity:0"> </span>
# String interpolation
print("Hello from ${name} v${version}")</code></pre></div>
<div class="example-block" id="ex-functions"><pre style="background-color: var(--color-panel); color: rgba(255,255,255,0.85); padding: 1em 1.25em; overflow-x: auto; font-size: 15px; line-height: 1.5; font-family: var(--font-mono);"><code>def greet(name: Str, loud: Bool = False) -&gt; Str {
    if loud {
        return "HELLO, ${name.upper()}!"
    }
    return "Hello, ${name}"
}
<span style="opacity:0"> </span>
# Lambdas
let double = (x: Int) -&gt; Int : x * 2
<span style="opacity:0"> </span>
# Contracts
def withdraw(balance: Int, amount: Int) -&gt; Int {
    in { assert amount &gt; 0 }
    out result { assert result &gt;= 0 }
    return balance - amount
}</code></pre></div>
<div class="example-block" id="ex-types"><pre style="background-color: var(--color-panel); color: rgba(255,255,255,0.85); padding: 1em 1.25em; overflow-x: auto; font-size: 15px; line-height: 1.5; font-family: var(--font-mono);"><code># Classes with constructors
class Person(name: Str, age: Int) {
    def greeting() -&gt; Str {
        return "I'm ${name}, age ${age}"
    }
}
<span style="opacity:0"> </span>
# Data types (auto equals, hashCode, toString)
data Point { x: Int; y: Int }
<span style="opacity:0"> </span>
# Enums with payloads
enum Shape {
    Circle(radius: Float)
    Rect(w: Float, h: Float)
}
<span style="opacity:0"> </span>
# Interfaces
interface Drawable {
    def draw() -&gt; Str
}</code></pre></div>
<div class="example-block" id="ex-collections"><pre style="background-color: var(--color-panel); color: rgba(255,255,255,0.85); padding: 1em 1.25em; overflow-x: auto; font-size: 15px; line-height: 1.5; font-family: var(--font-mono);"><code># Lists
let nums = [1, 2, 3, 4, 5]
let evens = nums.filter((n: Int) -&gt; Bool : n % 2 == 0)
<span style="opacity:0"> </span>
# Dicts
let scores: Dict[Str, Int] = {
    "Alice": 95,
    "Bob": 87
}
<span style="opacity:0"> </span>
# Comprehensions
let squares = [x * x for x in range(10) if x % 2 == 0]
<span style="opacity:0"> </span>
# Iteration
for name in scores.keys() {
    print("${name}: ${scores[name]}")
}</code></pre></div>
<div class="example-block" id="ex-matching"><pre style="background-color: var(--color-panel); color: rgba(255,255,255,0.85); padding: 1em 1.25em; overflow-x: auto; font-size: 15px; line-height: 1.5; font-family: var(--font-mono);"><code>enum Expr {
    Num(val: Int)
    Add(left: Expr, right: Expr)
    Neg(inner: Expr)
}
<span style="opacity:0"> </span>
def eval(e: Expr) -&gt; Int {
    match e {
        case Num(val) { return val }
        case Add(left, right) {
            return eval(left) + eval(right)
        }
        case Neg(inner) {
            return -eval(inner)
        }
    }
}
<span style="opacity:0"> </span>
let expr = Add(Num(1), Neg(Num(2)))
print(eval(expr))  # -1</code></pre></div>
<div class="example-block" id="ex-testing"><pre style="background-color: var(--color-panel); color: rgba(255,255,255,0.85); padding: 1em 1.25em; overflow-x: auto; font-size: 15px; line-height: 1.5; font-family: var(--font-mono);"><code>def fibonacci(n: Int) -&gt; Int {
    if n &lt;= 1 { return n }
    return fibonacci(n - 1) + fibonacci(n - 2)
}
<span style="opacity:0"> </span>
test "fibonacci base cases" {
    expect_eq(fibonacci(0), 0)
    expect_eq(fibonacci(1), 1)
}
<span style="opacity:0"> </span>
test "fibonacci recursive" {
    expect_eq(fibonacci(10), 55)
}
<span style="opacity:0"> </span>
test "fibonacci is always non-negative" {
    for i in range(15) {
        expect_true(fibonacci(i) &gt;= 0)
    }
}</code></pre></div>
</div>
<script>
function showExample(id) {
  document.querySelectorAll('.example-block').forEach(function(b) { b.classList.remove('active'); });
  document.querySelectorAll('.example-tab').forEach(function(t) { t.classList.remove('active'); });
  document.getElementById('ex-' + id).classList.add('active');
  document.querySelector('.example-tab[data-ex="' + id + '"]').classList.add('active');
}
</script>

<table>
  <tr><th class="docs-index-title">Page</th><th>Covers</th></tr>
  <tr><td class="docs-index-title"><a href="/docs/tour/basics/" style="color: var(--color-navy);">Basics</a></td><td>Comments, variables, types, optionals, strings</td></tr>
  <tr><td class="docs-index-title"><a href="/docs/tour/collections/" style="color: var(--color-navy);">Collections</a></td><td>Lists, dicts, sets, comprehensions</td></tr>
  <tr><td class="docs-index-title"><a href="/docs/tour/functions/" style="color: var(--color-navy);">Functions</a></td><td>Functions, lambdas, operators</td></tr>
  <tr><td class="docs-index-title"><a href="/docs/tour/control-flow/" style="color: var(--color-navy);">Control flow</a></td><td>If/elif/else, while, for, match/case</td></tr>
  <tr><td class="docs-index-title"><a href="/docs/tour/types-and-data/" style="color: var(--color-navy);">Types and data</a></td><td>Classes, data types, interfaces, enums, generics</td></tr>
  <tr><td class="docs-index-title"><a href="/docs/tour/error-handling/" style="color: var(--color-navy);">Error handling</a></td><td>Contracts, try/except, Result type, defer</td></tr>
  <tr><td class="docs-index-title"><a href="/docs/tour/modules-and-more/" style="color: var(--color-navy);">Modules and more</a></td><td>Imports, concurrency, testing, embedded DSLs</td></tr>
</table>
