Execution Wires vs Expressions: Why Verse Has No "White Wire"
The main lesson said "the execution wire has no counterpart in Verse", speaking structurally. This page answers the same question from further down: Blueprints use two colors of wire to cut the world into "doing" and "computing", and Verse simply decided those are the same thing.
1. Blueprints Cut the World in Half
You may never have framed it this way, but a Blueprint graph is really two graphs laid on top of each other:
- The white-wire graph: it carries the nodes that "do a thing" — Set, Print String, Destroy Actor, Delay. They have an order, they queue up, and one finishes before the next gets a turn.
- The colored-wire graph: it carries the nodes that "compute a value" — Add, Get, Make Vector, Greater Than. They have no order; whoever needs one goes and pulls it.
That dividing line has a formal name in programming languages: statements versus expressions. A statement does a thing and has no value, so you cannot plug a statement into another thing's input pin; an expression computes a value, has a value, and can be wired elsewhere. C++, C# and Java all keep that line; Blueprints just draw it in two colors.
The line causes one very concrete headache. Picture the most ordinary requirement there is: fill a string variable with different content depending on whether there is ammo. In Blueprints, there is only one way to do it: create a String variable Label in the variables panel, drop a Branch, wire a Set Label node filled with "Loaded" onto the True path, wire another Set Label node filled with "Empty" onto the False path, then merge the two paths and Get Label downstream. Three nodes, one variable and four wires, just to express one "value that is one of two things". Why the ceremony? Because Branch is a statement — it hangs on the white wire, it has no value, and you cannot plug its output into another input pin. The variable is a pure go-between here.
2. In Verse, Everything Is an Expression
Verse deleted that line entirely: every piece of code is an expression, and every expression has a value. if has a value, code blocks have values, loops have values, and function calls obviously do. Some expressions have the value void (meaning "no useful value"), which you simply ignore — but grammatically it is still a value, and that's all that matters.
Start with if. That same "one of two strings" is a single line in Verse:
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/Diagnostics }
turret_device := class(creative_device):
var Ammo:int = 1
OnBegin<override>()<suspends>:void =
# The whole if's value lands straight onto a name tag
Label := if (Ammo > 0) { "Loaded" } else { "Empty" }
Print(Label)
Count what vanished: the String variable is gone (Label is a constant — it doesn't even need var), both Set nodes are gone, and "merging the two paths" is no longer something you have to think about. If the if passes it produces "Loaded"; if it doesn't, it produces "Empty"; the value of the whole if expression is whichever it produced.
Needing several lines inside a branch changes nothing — switch to the indentation layout, and the value is still that of the last expression in each block:
Label := if (Ammo > 0):
Print("Checking the magazine")
"Loaded"
else:
Print("Checking the magazine")
"Empty"
Now for code blocks. Verse has a block expression whose whole job is fencing several lines into one block, and per the official docs, unless something exits early, the block's value is the value of the last expression executed in it. So "compute an intermediate result" can be fenced off on the spot, without leaking the temporary names outward:
Total := block:
Base := 10
Bonus := 20
Base + Bonus
# Base and Bonus expire with the block; only Total = 30 survives outside
Print("{Total}")
What does that map to in Blueprints? To "compute a value out of a pile of Pure nodes, then drag one wire out of it" — except in Blueprints those intermediate nodes stay scattered on the graph forever, and anyone can drag another wire off them. block shuts them behind a door, and once the door closes only the result is left.
Incidentally, this is also why Verse functions don't need a Return node: a function body is a block, a block's value is the function's return value, so the value of the last expression in the body automatically becomes the return value (this is called "implicit return", covered in Lesson 19). That lonely Return Node from Blueprints has no counterpart in Verse — because the function body already carries a value.
3. What This Means for a Blueprint Author
First, a great many "go-between variables" can disappear. Think back over the Blueprints you've written: how many variables exist for the sole purpose of carrying something a Branch or ForEach computed down to whatever comes next? Nearly all of them can be deleted in Verse, with the expression's value wired straight through. One fewer variable is one fewer instance of "who changed this, and when". And it's not just tidiness: the main lesson noted that Verse defaults to immutable, and go-between variables are exactly the kind that force you to write var. Delete them and your var count drops visibly — and every remaining var genuinely means "there is mutable state here".
Second, "doing" and "computing" can be written together. This cuts both ways. The upside is that if (Item := Inventory[0]) { Print("{Item}") } — checking and fetching in one move — is extremely comfortable. The downside is that a couple of layers of nesting makes it unreadable. That's precisely why Verse layout conventions matter so much: when to break things apart and when to string them on one line is the subject of technique page x3.
Third, "does this have side effects" is no longer told by wire color. In Blueprints you can see at a glance whether a node hangs on the white wire, and therefore whether it can change state. In Verse everything looks alike — so where did that information go? It moved into the function signature's effect specifiers, and it is enforced by the compiler, which beats reading wire colors. That's the subject of deep dive page x2.
Which finally answers the title: Verse has no "white wire" not because Epic forgot to draw it, but because the two categories that wire distinguishes are one category in Verse. When a graph is down to a single kind of wire, that wire no longer needs drawing.
4. Quick Quiz
What is if in Verse?
Sources
Compiled from Epic's official documentation: block expression (official docs) ↗ · Verse Language Quick Reference (official docs) ↗ · Book of Verse (official language book) ↗